Skip to content

Commit 0bdd9a4

Browse files
committed
est: use average cut layer res when no layers are defined for Steiner tree
Signed-off-by: Eder Monteiro <[email protected]>
1 parent ee6e069 commit 0bdd9a4

File tree

2 files changed

+38
-9
lines changed

2 files changed

+38
-9
lines changed

src/est/include/est/EstimateParasitics.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,7 @@ class EstimateParasitics : public dbStaState
249249
float cap_per_micron,
250250
SteinerPt pt) const;
251251
odb::dbTechLayer* getPinLayer(const Pin* pin);
252+
double computeAverageCutResistance(Corner* corner);
252253
void parasiticNodeConnectPins(Parasitic* parasitic,
253254
ParasiticNode* node,
254255
SteinerTree* tree,

src/est/src/EstimateParasitics.cpp

Lines changed: 37 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
842873
void 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

Comments
 (0)