@@ -653,6 +653,7 @@ void EstimateParasitics::estimateWireParasiticSteiner(const Pin* drvr_pin,
653653 " estimate wire {}" ,
654654 sdc_network_->pathName (net));
655655 for (Corner* corner : *sta_->corners ()) {
656+ std::set<const Pin*> connected_pins;
656657 const sta::ParasiticAnalysisPt* parasitics_ap
657658 = corner->findParasiticAnalysisPt (max_);
658659 Parasitic* parasitic
@@ -717,10 +718,22 @@ void EstimateParasitics::estimateWireParasiticSteiner(const Pin* drvr_pin,
717718 parasitics_->makeResistor (parasitic, resistor_id++, res, n1, n2);
718719 parasitics_->incrCap (n2, cap / 2.0 );
719720 }
720- parasiticNodeConnectPins (
721- parasitic, n1, tree, steiner_pt1, resistor_id, corner, is_clk);
722- parasiticNodeConnectPins (
723- parasitic, n2, tree, steiner_pt2, resistor_id, corner, is_clk);
721+ parasiticNodeConnectPins (parasitic,
722+ n1,
723+ tree,
724+ steiner_pt1,
725+ resistor_id,
726+ corner,
727+ connected_pins,
728+ is_clk);
729+ parasiticNodeConnectPins (parasitic,
730+ n2,
731+ tree,
732+ steiner_pt2,
733+ resistor_id,
734+ corner,
735+ connected_pins,
736+ is_clk);
724737 }
725738 if (spef_writer) {
726739 spef_writer->writeNet (corner, net, parasitic);
@@ -870,39 +883,49 @@ double EstimateParasitics::computeAverageCutResistance(Corner* corner)
870883 return count > 0 ? total_resistance / count : 0.0 ;
871884}
872885
873- void EstimateParasitics::parasiticNodeConnectPins (Parasitic* parasitic,
874- ParasiticNode* node,
875- SteinerTree* tree,
876- SteinerPt pt,
877- size_t & resistor_id,
878- Corner* corner,
879- const bool is_clk)
886+ void EstimateParasitics::parasiticNodeConnectPins (
887+ Parasitic* parasitic,
888+ ParasiticNode* node,
889+ SteinerTree* tree,
890+ SteinerPt pt,
891+ size_t & resistor_id,
892+ Corner* corner,
893+ std::set<const Pin*> connected_pins,
894+ const bool is_clk)
880895{
881896 const PinSeq* pins = tree->pins (pt);
882897 if (pins) {
883898 odb::dbTechLayer* tree_layer = is_clk ? clk_layers_[0 ] : signal_layers_[0 ];
884899 for (const Pin* pin : *pins) {
885900 ParasiticNode* pin_node
886901 = parasitics_->ensureParasiticNode (parasitic, pin, network_);
887- if (tree_layer != nullptr && !layer_res_.empty ()) {
888- odb::dbTechLayer* pin_layer = getPinLayer (pin);
889-
890- for (int layer_number = pin_layer->getNumber ();
891- layer_number < tree_layer->getNumber ();
892- layer_number++) {
893- odb::dbTechLayer* cut_layer = db_->getTech ()->findLayer (layer_number);
894- if (cut_layer->getType () == odb::dbTechLayerType::CUT) {
895- double cut_res
896- = std::max (layer_res_[layer_number][corner->index ()], 1.0e-3 );
897- parasitics_->makeResistor (
898- parasitic, resistor_id++, cut_res, node, pin_node);
902+ if (connected_pins.find (pin) != connected_pins.end ()) {
903+ // If pin was already connected with via resistances, use a small
904+ // resistor to keep connectivity intact.
905+ parasitics_->makeResistor (
906+ parasitic, resistor_id++, 1.0e-3 , node, pin_node);
907+ } else {
908+ if (tree_layer != nullptr && !layer_res_.empty ()) {
909+ odb::dbTechLayer* pin_layer = getPinLayer (pin);
910+ for (int layer_number = pin_layer->getNumber ();
911+ layer_number < tree_layer->getNumber ();
912+ layer_number++) {
913+ odb::dbTechLayer* cut_layer
914+ = db_->getTech ()->findLayer (layer_number);
915+ if (cut_layer->getType () == odb::dbTechLayerType::CUT) {
916+ double cut_res
917+ = std::max (layer_res_[layer_number][corner->index ()], 1.0e-3 );
918+ parasitics_->makeResistor (
919+ parasitic, resistor_id++, cut_res, node, pin_node);
920+ }
899921 }
922+ } else {
923+ double cut_res
924+ = std::max (computeAverageCutResistance (corner), 1.0e-3 );
925+ parasitics_->makeResistor (
926+ parasitic, resistor_id++, cut_res, node, pin_node);
900927 }
901- } else {
902- // Use a small resistor to keep the connectivity intact.
903- double cut_res = std::max (computeAverageCutResistance (corner), 1.0e-3 );
904- parasitics_->makeResistor (
905- parasitic, resistor_id++, cut_res, node, pin_node);
928+ connected_pins.insert (pin);
906929 }
907930 }
908931 }
0 commit comments