|
15 | 15 | #include "db_sta/SpefWriter.hh" |
16 | 16 | #include "db_sta/dbNetwork.hh" |
17 | 17 | #include "grt/GlobalRouter.h" |
| 18 | +#include "odb/dbShape.h" |
18 | 19 | #include "sta/ArcDelayCalc.hh" |
19 | 20 | #include "sta/Corner.hh" |
20 | 21 | #include "sta/DcalcAnalysisPt.hh" |
@@ -716,8 +717,10 @@ void EstimateParasitics::estimateWireParasiticSteiner(const Pin* drvr_pin, |
716 | 717 | parasitics_->makeResistor(parasitic, resistor_id++, res, n1, n2); |
717 | 718 | parasitics_->incrCap(n2, cap / 2.0); |
718 | 719 | } |
719 | | - parasiticNodeConnectPins(parasitic, n1, tree, steiner_pt1, resistor_id); |
720 | | - parasiticNodeConnectPins(parasitic, n2, tree, steiner_pt2, resistor_id); |
| 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 | 724 | } |
722 | 725 | if (spef_writer) { |
723 | 726 | spef_writer->writeNet(corner, net, parasitic); |
@@ -840,16 +843,39 @@ void EstimateParasitics::parasiticNodeConnectPins(Parasitic* parasitic, |
840 | 843 | ParasiticNode* node, |
841 | 844 | SteinerTree* tree, |
842 | 845 | SteinerPt pt, |
843 | | - size_t& resistor_id) |
| 846 | + size_t& resistor_id, |
| 847 | + Corner* corner, |
| 848 | + const bool is_clk) |
844 | 849 | { |
845 | 850 | const PinSeq* pins = tree->pins(pt); |
846 | 851 | if (pins) { |
| 852 | + odb::dbTechLayer* tree_layer = is_clk ? clk_layers_[0] : signal_layers_[0]; |
847 | 853 | for (const Pin* pin : *pins) { |
848 | 854 | ParasiticNode* pin_node |
849 | 855 | = parasitics_->ensureParasiticNode(parasitic, pin, network_); |
850 | | - // Use a small resistor to keep the connectivity intact. |
851 | | - parasitics_->makeResistor( |
852 | | - parasitic, resistor_id++, 1.0e-3, node, pin_node); |
| 856 | + if (tree_layer != nullptr && !layer_res_.empty()) { |
| 857 | + odb::dbTechLayer* pin_layer = getPinLayer(pin); |
| 858 | + |
| 859 | + for (int layer_number = pin_layer->getNumber(); |
| 860 | + layer_number < tree_layer->getNumber(); |
| 861 | + layer_number++) { |
| 862 | + odb::dbTechLayer* via_layer = db_->getTech()->findLayer(layer_number); |
| 863 | + if (via_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 | + } |
| 872 | + } |
| 873 | + } |
| 874 | + } else { |
| 875 | + // Use a small resistor to keep the connectivity intact. |
| 876 | + parasitics_->makeResistor( |
| 877 | + parasitic, resistor_id++, 1.0e-3, node, pin_node); |
| 878 | + } |
853 | 879 | } |
854 | 880 | } |
855 | 881 | } |
|
0 commit comments