@@ -839,6 +839,37 @@ odb::dbTechLayer* EstimateParasitics::getPinLayer(const Pin* pin)
839839 return pin_layer;
840840}
841841
842+ double EstimateParasitics::computeAverageCutResistance (Corner* corner)
843+ {
844+ double total_resistance = 0.0 ;
845+ int count = 0 ;
846+
847+ int min_layer = block_->getMinRoutingLayer ();
848+ int max_layer = block_->getMaxRoutingLayer ();
849+
850+ if (max_layer < 0 ) {
851+ max_layer = db_->getTech ()->getRoutingLayerCount () / 2 ;
852+ }
853+
854+ odb::dbTechLayer* min_tech_layer
855+ = db_->getTech ()->findRoutingLayer (min_layer);
856+ odb::dbTechLayer* max_tech_layer
857+ = db_->getTech ()->findRoutingLayer (max_layer);
858+
859+ for (int layer_idx = min_tech_layer->getNumber ();
860+ layer_idx <= max_tech_layer->getNumber ();
861+ layer_idx++) {
862+ odb::dbTechLayer* layer = db_->getTech ()->findLayer (layer_idx);
863+ if (layer && layer->getType () == odb::dbTechLayerType::CUT) {
864+ const float resistance = layer_res_[layer_idx][corner->index ()];
865+ total_resistance += resistance;
866+ count++;
867+ }
868+ }
869+
870+ return count > 0 ? total_resistance / count : 0.0 ;
871+ }
872+
842873void EstimateParasitics::parasiticNodeConnectPins (Parasitic* parasitic,
843874 ParasiticNode* node,
844875 SteinerTree* tree,
@@ -861,20 +892,17 @@ void EstimateParasitics::parasiticNodeConnectPins(Parasitic* parasitic,
861892 layer_number++) {
862893 odb::dbTechLayer* cut_layer = db_->getTech ()->findLayer (layer_number);
863894 if (cut_layer->getType () == odb::dbTechLayerType::CUT) {
864- float cut_res = layer_res_[layer_number][corner->index ()];
865- if (cut_res > 0.0 ) {
866- parasitics_->makeResistor (
867- parasitic, resistor_id++, cut_res, node, pin_node);
868- } else {
869- parasitics_->makeResistor (
870- parasitic, resistor_id++, 1.0e-3 , node, pin_node);
871- }
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);
872899 }
873900 }
874901 } else {
875902 // Use a small resistor to keep the connectivity intact.
903+ double cut_res = std::max (computeAverageCutResistance (corner), 1.0e-3 );
876904 parasitics_->makeResistor (
877- parasitic, resistor_id++, 1.0e-3 , node, pin_node);
905+ parasitic, resistor_id++, cut_res , node, pin_node);
878906 }
879907 }
880908 }
0 commit comments