| 582 | namespace { |
| 583 | |
| 584 | std::vector<PlaceDB::IndexType> ExtractChainFromOneInst(PlaceDB &placedb, |
| 585 | std::vector<bool> &visited_mark, |
| 586 | Design::IndexType module_id, |
| 587 | const database::Inst &source_inst) { |
| 588 | using database::Inst; |
| 589 | using database::Model; |
| 590 | using database::Net; |
| 591 | using database::Pin; |
| 592 | const Design &design = placedb.db()->design(); |
| 593 | const Layout &layout = placedb.db()->layout(); |
| 594 | auto top_module_inst = design.topModuleInst(); |
| 595 | auto const &netlist = top_module_inst->netlist(); |
| 596 | const Model &model = design.model(module_id); |
| 597 | std::vector<PlaceDB::IndexType> ordinal_inst_ids; |
| 598 | std::vector<PlaceDB::IndexType> reversed_inst_ids; |
| 599 | std::queue<PlaceDB::IndexType> que; |
| 600 | auto IsVisited = [&visited_mark](const Inst &inst) -> bool { return visited_mark[inst.id()] == true; }; |
| 601 | auto IsChain = [&module_id](const Inst &inst) -> bool { return inst.attr().modelId() == module_id; }; |
| 602 | auto SetVisited = [&visited_mark](const Inst &inst) { visited_mark[inst.id()] = true; }; |
| 603 | auto IsCascadedInPin = [&model](const Pin &pin) { |
| 604 | const auto &model_pin = model.modelPin(pin.modelPinId()); |
| 605 | return model_pin.signalDirect() == SignalDirection::kInput && model_pin.signalType() == SignalType::kCascade; |
| 606 | }; |
| 607 | auto IsCascadedOutPin = [&model](const Pin &pin) { |
| 608 | const auto &model_pin = model.modelPin(pin.modelPinId()); |
| 609 | return model_pin.signalDirect() == SignalDirection::kOutput && model_pin.signalType() == SignalType::kCascade; |
| 610 | }; |
| 611 | |
| 612 | SetVisited(source_inst); |
| 613 | openparfAssert(IsChain(source_inst)); |
| 614 | |
| 615 | /* only search fomr cascaded output pin to cascaded input pin */ { |
| 616 | ordinal_inst_ids.clear(); |
| 617 | que.push(source_inst.id()); |
| 618 | ordinal_inst_ids.push_back(source_inst.id()); |
| 619 | while (!que.empty()) { |
| 620 | auto inst_id = que.front(); |
| 621 | const Inst &inst = netlist.inst(inst_id); |
| 622 | que.pop(); |
| 623 | for (auto pin_id : inst.pinIds()) { |
| 624 | const Pin &pin = netlist.pin(pin_id); |
| 625 | if (!IsCascadedOutPin(pin)) continue; |
| 626 | const Net &net = netlist.net(pin.netId()); |
| 627 | for (auto adjacent_pin_id : net.pinIds()) { |
| 628 | const Pin &adjacent_pin = netlist.pin(adjacent_pin_id); |
| 629 | auto adjacent_inst_id = adjacent_pin.instId(); |
| 630 | const Inst &adjacent_inst = netlist.inst(adjacent_inst_id); |
| 631 | if (!IsChain(adjacent_inst) || IsVisited(adjacent_inst) || !IsCascadedInPin(adjacent_pin)) { |
| 632 | continue; |
| 633 | } |
| 634 | SetVisited(adjacent_inst); |
| 635 | que.push(adjacent_inst_id); |
| 636 | ordinal_inst_ids.push_back(adjacent_inst_id); |
| 637 | } |
| 638 | } |
| 639 | } |
| 640 | } |
| 641 |
no test coverage detected