MCPcopy Create free account
hub / github.com/PKU-IDEA/OpenPARF / ExtractChainFromOneInst

Function ExtractChainFromOneInst

openparf/database/placedb.cpp:584–678  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

582namespace {
583
584std::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

Callers 1

buildChainMethod · 0.70

Calls 15

reverseFunction · 0.85
dbMethod · 0.80
topModuleInstMethod · 0.80
modelPinMethod · 0.80
signalDirectMethod · 0.80
frontMethod · 0.80
pinMethod · 0.80
idMethod · 0.45
modelIdMethod · 0.45
modelPinIdMethod · 0.45
clearMethod · 0.45
pushMethod · 0.45

Tested by

no test coverage detected