Skip to content

Commit e5ca513

Browse files
committed
est: avoid adding multiple via resistances for the same pin
Signed-off-by: Eder Monteiro <[email protected]>
1 parent 0bdd9a4 commit e5ca513

File tree

2 files changed

+52
-28
lines changed

2 files changed

+52
-28
lines changed

src/est/include/est/EstimateParasitics.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,7 @@ class EstimateParasitics : public dbStaState
256256
SteinerPt pt,
257257
size_t& resistor_id,
258258
Corner* corner,
259+
std::set<const Pin*> connected_pins,
259260
bool is_clk);
260261
void net2Pins(const Net* net, const Pin*& pin1, const Pin*& pin2) const;
261262
double dbuToMeters(int dist) const;

src/est/src/EstimateParasitics.cpp

Lines changed: 51 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)