Skip to content

Commit b010789

Browse files
authored
Merge pull request #7399 from The-OpenROAD-Project-staging/rsz-repair-ideal-clk-slew
rsz: Use ideal clk slew in driver repair if applicable
2 parents 0a32af9 + 852210c commit b010789

4 files changed

Lines changed: 135 additions & 106 deletions

File tree

src/rsz/src/RepairDesign.cc

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ using sta::Port;
5050
using sta::TimingArc;
5151
using sta::TimingArcSet;
5252
using sta::TimingRole;
53+
using sta::VertexInEdgeIterator;
5354

5455
RepairDesign::RepairDesign(Resizer* resizer) : resizer_(resizer)
5556
{
@@ -728,6 +729,7 @@ bool RepairDesign::performGainBuffering(Net* net,
728729

729730
void RepairDesign::checkDriverArcSlew(const Corner* corner,
730731
const Instance* inst,
732+
const Edge* edge,
731733
const TimingArc* arc,
732734
float load_cap,
733735
float limit,
@@ -739,8 +741,11 @@ void RepairDesign::checkDriverArcSlew(const Corner* corner,
739741
Pin* in_pin = network_->findPin(inst, arc->from()->name());
740742

741743
if (model && in_pin) {
742-
Slew in_slew = sta_->graph()->slew(
743-
graph_->pinLoadVertex(in_pin), in_rf, dcalc_ap->index());
744+
Vertex* vertex = graph_->pinLoadVertex(in_pin);
745+
// edgeFromSlew returns the graph slew value for the pin, or the ideal
746+
// clock slew if applicable
747+
Slew in_slew
748+
= graph_delay_calc_->edgeFromSlew(vertex, in_rf, edge, dcalc_ap);
744749
const Pvt* pvt = dcalc_ap->operatingConditions();
745750

746751
ArcDelay arc_delay;
@@ -784,17 +789,25 @@ bool RepairDesign::repairDriverSlew(const Corner* corner, const Pin* drvr_pin)
784789
if (limit_exists) {
785790
float limit_w_margin = maxSlewMargined(limit);
786791

787-
for (TimingArcSet* arc_set : size_cell->timingArcSets()) {
792+
VertexInEdgeIterator edge_iter(graph_->pinDrvrVertex(drvr_pin),
793+
graph_);
794+
while (edge_iter.hasNext()) {
795+
Edge* edge = edge_iter.next();
796+
TimingArcSet* arc_set = edge->timingArcSet();
788797
const TimingRole* role = arc_set->role();
789798
if (!role->isTimingCheck() && role != TimingRole::tristateDisable()
790799
&& role != TimingRole::tristateEnable()
791800
&& role != TimingRole::clockTreePathMin()
792801
&& role != TimingRole::clockTreePathMax()) {
793-
for (TimingArc* arc : arc_set->arcs()) {
794-
if (arc->to() == port) {
795-
checkDriverArcSlew(
796-
corner, inst, arc, load_cap, limit_w_margin, violation);
797-
}
802+
TimingArcSet* size_arc_set = size_cell->findTimingArcSet(arc_set);
803+
for (TimingArc* arc : size_arc_set->arcs()) {
804+
checkDriverArcSlew(corner,
805+
inst,
806+
edge,
807+
arc,
808+
load_cap,
809+
limit_w_margin,
810+
violation);
798811
}
799812
}
800813
}

src/rsz/src/RepairDesign.hh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ enum class ParasiticsSrc;
2222
using sta::Corner;
2323
using sta::dbNetwork;
2424
using sta::dbSta;
25+
using sta::Edge;
2526
using sta::LibertyCell;
2627
using sta::LibertyPort;
2728
using sta::MinMax;
@@ -92,6 +93,7 @@ class RepairDesign : dbStaState
9293

9394
void checkDriverArcSlew(const Corner* corner,
9495
const Instance* inst,
96+
const Edge* edge,
9597
const TimingArc* arc,
9698
float load_cap,
9799
float limit,

test/ibex_sky130hd.metrics

Lines changed: 101 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -3,133 +3,147 @@
33
"IFP::instance_count": "15696",
44
"floorplan__design__io": 264,
55
"design__io__hpwl": 69322388,
6-
"design__instance__displacement__total": 35094.7,
7-
"design__instance__displacement__mean": 1.529,
6+
"design__instance__displacement__total": 35077.4,
7+
"design__instance__displacement__mean": 1.528,
88
"design__instance__displacement__max": 13.07,
9-
"route__wirelength__estimated": 707932,
10-
"RSZ::repair_design_buffer_count": "484",
9+
"route__wirelength__estimated": 707929,
10+
"RSZ::repair_design_buffer_count": "480",
1111
"RSZ::max_slew_slack": "30.107261037234757",
1212
"RSZ::max_fanout_slack": "100.0",
1313
"RSZ::max_capacitance_slack": "65.66070541260767",
1414
"design__instance__displacement__total": 1367.27,
1515
"design__instance__displacement__mean": 0.058,
1616
"design__instance__displacement__max": 13.6,
17-
"route__wirelength__estimated": 728751,
18-
"design__instance__count__setup_buffer": 130,
17+
"route__wirelength__estimated": 728748,
18+
"design__instance__count__setup_buffer": 126,
1919
"design__instance__count__hold_buffer": 0,
2020
"RSZ::worst_slack_min": "0.3789708654155415",
21-
"RSZ::worst_slack_max": "-0.9000906941214466",
22-
"RSZ::tns_max": "-4.559287298970523",
21+
"RSZ::worst_slack_max": "-0.900084476872333",
22+
"RSZ::tns_max": "-4.559224238300941",
2323
"RSZ::hold_buffer_count": "0",
24-
"design__instance__displacement__total": 751.386,
25-
"design__instance__displacement__mean": 0.032,
24+
"design__instance__displacement__total": 744.217,
25+
"design__instance__displacement__mean": 0.031,
2626
"design__instance__displacement__max": 12.533,
27-
"route__wirelength__estimated": 741523,
28-
"DPL::utilization": "28.3",
29-
"DPL::design_area": "171354",
30-
"route__net": 15311,
27+
"route__wirelength__estimated": 741521,
28+
"DPL::utilization": "28.2",
29+
"DPL::design_area": "171313",
30+
"route__net": 15303,
3131
"route__net__special": 2,
32-
"global_route__vias": 142479,
33-
"global_route__wirelength": 1304044,
34-
"grt__global_route__vias": 8602,
35-
"grt__global_route__vias": 774,
36-
"grt__antenna_diodes_count": 196,
32+
"global_route__vias": 142461,
33+
"global_route__wirelength": 1304162,
34+
"grt__global_route__vias": 8233,
35+
"grt__global_route__vias": 1461,
36+
"grt__global_route__vias": 211,
37+
"grt__antenna_diodes_count": 216,
3738
"grt__antenna__violating__nets": 0,
3839
"grt__antenna__violating__pins": 0,
3940
"GRT::ANT::errors": "0",
40-
"route__net": 15311,
41+
"route__net": 15303,
4142
"route__net__special": 2,
42-
"route__drc_errors__iter:0": 5697,
43-
"route__wirelength__iter:0": 948936,
44-
"route__drc_errors__iter:1": 1406,
45-
"route__wirelength__iter:1": 944696,
46-
"route__drc_errors__iter:2": 1333,
47-
"route__wirelength__iter:2": 943538,
48-
"route__drc_errors__iter:3": 227,
49-
"route__wirelength__iter:3": 943582,
50-
"route__drc_errors__iter:4": 86,
51-
"route__wirelength__iter:4": 943499,
52-
"route__drc_errors__iter:5": 29,
53-
"route__wirelength__iter:5": 943490,
54-
"route__drc_errors__iter:6": 4,
55-
"route__wirelength__iter:6": 943501,
43+
"route__drc_errors__iter:0": 5574,
44+
"route__wirelength__iter:0": 949721,
45+
"route__drc_errors__iter:1": 1348,
46+
"route__wirelength__iter:1": 945245,
47+
"route__drc_errors__iter:2": 1076,
48+
"route__wirelength__iter:2": 944425,
49+
"route__drc_errors__iter:3": 177,
50+
"route__wirelength__iter:3": 944285,
51+
"route__drc_errors__iter:4": 26,
52+
"route__wirelength__iter:4": 944236,
53+
"route__drc_errors__iter:5": 13,
54+
"route__wirelength__iter:5": 944221,
55+
"route__drc_errors__iter:6": 2,
56+
"route__wirelength__iter:6": 944215,
5657
"route__drc_errors__iter:7": 0,
57-
"route__wirelength__iter:7": 943493,
58+
"route__wirelength__iter:7": 944212,
5859
"route__drc_errors": 0,
59-
"route__wirelength": 943493,
60+
"route__wirelength": 944212,
6061
"route__vias": 131392,
6162
"route__vias__singlecut": 131392,
6263
"route__vias__multicut": 0,
6364
"DRT::drv": "0",
64-
"drt__repair_antennas__pre_repair__antenna__violating__nets": 47,
65-
"drt__repair_antennas__pre_repair__antenna__violating__pins": 62,
66-
"drt__repair_antennas__iter_0__global_route__vias": 1401,
67-
"drt__repair_antennas__iter_0__antenna_diodes_count": 259,
68-
"drt__repair_antennas__iter_0__route__drc_errors__iter:0": 922,
69-
"drt__repair_antennas__iter_0__route__wirelength__iter:0": 942103,
70-
"drt__repair_antennas__iter_0__route__drc_errors__iter:1": 349,
71-
"drt__repair_antennas__iter_0__route__wirelength__iter:1": 942066,
72-
"drt__repair_antennas__iter_0__route__drc_errors__iter:2": 266,
73-
"drt__repair_antennas__iter_0__route__wirelength__iter:2": 942024,
74-
"drt__repair_antennas__iter_0__route__drc_errors__iter:3": 25,
75-
"drt__repair_antennas__iter_0__route__wirelength__iter:3": 942000,
76-
"drt__repair_antennas__iter_0__route__drc_errors__iter:4": 4,
77-
"drt__repair_antennas__iter_0__route__wirelength__iter:4": 941999,
65+
"drt__repair_antennas__pre_repair__antenna__violating__nets": 41,
66+
"drt__repair_antennas__pre_repair__antenna__violating__pins": 50,
67+
"drt__repair_antennas__iter_0__global_route__vias": 1328,
68+
"drt__repair_antennas__iter_0__antenna_diodes_count": 267,
69+
"drt__repair_antennas__iter_0__route__drc_errors__iter:0": 786,
70+
"drt__repair_antennas__iter_0__route__wirelength__iter:0": 943604,
71+
"drt__repair_antennas__iter_0__route__drc_errors__iter:1": 264,
72+
"drt__repair_antennas__iter_0__route__wirelength__iter:1": 943487,
73+
"drt__repair_antennas__iter_0__route__drc_errors__iter:2": 260,
74+
"drt__repair_antennas__iter_0__route__wirelength__iter:2": 943482,
75+
"drt__repair_antennas__iter_0__route__drc_errors__iter:3": 20,
76+
"drt__repair_antennas__iter_0__route__wirelength__iter:3": 943466,
77+
"drt__repair_antennas__iter_0__route__drc_errors__iter:4": 6,
78+
"drt__repair_antennas__iter_0__route__wirelength__iter:4": 943462,
7879
"drt__repair_antennas__iter_0__route__drc_errors__iter:5": 0,
79-
"drt__repair_antennas__iter_0__route__wirelength__iter:5": 942002,
80+
"drt__repair_antennas__iter_0__route__wirelength__iter:5": 943462,
8081
"drt__repair_antennas__iter_0__route__drc_errors": 0,
81-
"drt__repair_antennas__iter_0__route__wirelength": 942002,
82-
"drt__repair_antennas__iter_0__route__vias": 131554,
83-
"drt__repair_antennas__iter_0__route__vias__singlecut": 131554,
82+
"drt__repair_antennas__iter_0__route__wirelength": 943462,
83+
"drt__repair_antennas__iter_0__route__vias": 131524,
84+
"drt__repair_antennas__iter_0__route__vias__singlecut": 131524,
8485
"drt__repair_antennas__iter_0__route__vias__multicut": 0,
85-
"drt__repair_antennas__iter_0__antenna__violating__nets": 3,
86-
"drt__repair_antennas__iter_0__antenna__violating__pins": 4,
87-
"drt__repair_antennas__iter_1__global_route__vias": 160,
88-
"drt__repair_antennas__iter_1__antenna_diodes_count": 263,
89-
"drt__repair_antennas__iter_1__route__drc_errors__iter:0": 32,
90-
"drt__repair_antennas__iter_1__route__wirelength__iter:0": 942019,
91-
"drt__repair_antennas__iter_1__route__drc_errors__iter:1": 4,
92-
"drt__repair_antennas__iter_1__route__wirelength__iter:1": 942006,
93-
"drt__repair_antennas__iter_1__route__drc_errors__iter:2": 2,
94-
"drt__repair_antennas__iter_1__route__wirelength__iter:2": 942012,
86+
"drt__repair_antennas__iter_0__antenna__violating__nets": 6,
87+
"drt__repair_antennas__iter_0__antenna__violating__pins": 9,
88+
"drt__repair_antennas__iter_1__global_route__vias": 275,
89+
"drt__repair_antennas__iter_1__antenna_diodes_count": 276,
90+
"drt__repair_antennas__iter_1__route__drc_errors__iter:0": 154,
91+
"drt__repair_antennas__iter_1__route__wirelength__iter:0": 943409,
92+
"drt__repair_antennas__iter_1__route__drc_errors__iter:1": 28,
93+
"drt__repair_antennas__iter_1__route__wirelength__iter:1": 943353,
94+
"drt__repair_antennas__iter_1__route__drc_errors__iter:2": 14,
95+
"drt__repair_antennas__iter_1__route__wirelength__iter:2": 943347,
9596
"drt__repair_antennas__iter_1__route__drc_errors__iter:3": 0,
96-
"drt__repair_antennas__iter_1__route__wirelength__iter:3": 942021,
97+
"drt__repair_antennas__iter_1__route__wirelength__iter:3": 943344,
9798
"drt__repair_antennas__iter_1__route__drc_errors": 0,
98-
"drt__repair_antennas__iter_1__route__wirelength": 942021,
99-
"drt__repair_antennas__iter_1__route__vias": 131563,
100-
"drt__repair_antennas__iter_1__route__vias__singlecut": 131563,
99+
"drt__repair_antennas__iter_1__route__wirelength": 943344,
100+
"drt__repair_antennas__iter_1__route__vias": 131583,
101+
"drt__repair_antennas__iter_1__route__vias__singlecut": 131583,
101102
"drt__repair_antennas__iter_1__route__vias__multicut": 0,
102103
"drt__repair_antennas__iter_1__antenna__violating__nets": 1,
103104
"drt__repair_antennas__iter_1__antenna__violating__pins": 2,
104-
"drt__repair_antennas__iter_2__global_route__vias": 139,
105-
"drt__repair_antennas__iter_2__antenna_diodes_count": 265,
106-
"drt__repair_antennas__iter_2__route__drc_errors__iter:0": 9,
107-
"drt__repair_antennas__iter_2__route__wirelength__iter:0": 942040,
108-
"drt__repair_antennas__iter_2__route__drc_errors__iter:1": 1,
109-
"drt__repair_antennas__iter_2__route__wirelength__iter:1": 942037,
105+
"drt__repair_antennas__iter_2__global_route__vias": 151,
106+
"drt__repair_antennas__iter_2__antenna_diodes_count": 278,
107+
"drt__repair_antennas__iter_2__route__drc_errors__iter:0": 13,
108+
"drt__repair_antennas__iter_2__route__wirelength__iter:0": 943390,
109+
"drt__repair_antennas__iter_2__route__drc_errors__iter:1": 2,
110+
"drt__repair_antennas__iter_2__route__wirelength__iter:1": 943390,
110111
"drt__repair_antennas__iter_2__route__drc_errors__iter:2": 0,
111-
"drt__repair_antennas__iter_2__route__wirelength__iter:2": 942040,
112+
"drt__repair_antennas__iter_2__route__wirelength__iter:2": 943393,
112113
"drt__repair_antennas__iter_2__route__drc_errors": 0,
113-
"drt__repair_antennas__iter_2__route__wirelength": 942040,
114-
"drt__repair_antennas__iter_2__route__vias": 131571,
115-
"drt__repair_antennas__iter_2__route__vias__singlecut": 131571,
114+
"drt__repair_antennas__iter_2__route__wirelength": 943393,
115+
"drt__repair_antennas__iter_2__route__vias": 131598,
116+
"drt__repair_antennas__iter_2__route__vias__singlecut": 131598,
116117
"drt__repair_antennas__iter_2__route__vias__multicut": 0,
117-
"drt__repair_antennas__iter_2__antenna__violating__nets": 0,
118-
"drt__repair_antennas__iter_2__antenna__violating__pins": 0,
118+
"drt__repair_antennas__iter_2__antenna__violating__nets": 1,
119+
"drt__repair_antennas__iter_2__antenna__violating__pins": 1,
120+
"drt__repair_antennas__iter_3__global_route__vias": 130,
121+
"drt__repair_antennas__iter_3__antenna_diodes_count": 279,
122+
"drt__repair_antennas__iter_3__route__drc_errors__iter:0": 7,
123+
"drt__repair_antennas__iter_3__route__wirelength__iter:0": 943373,
124+
"drt__repair_antennas__iter_3__route__drc_errors__iter:1": 0,
125+
"drt__repair_antennas__iter_3__route__wirelength__iter:1": 943368,
126+
"drt__repair_antennas__iter_3__route__drc_errors": 0,
127+
"drt__repair_antennas__iter_3__route__wirelength": 943368,
128+
"drt__repair_antennas__iter_3__route__vias": 131592,
129+
"drt__repair_antennas__iter_3__route__vias__singlecut": 131592,
130+
"drt__repair_antennas__iter_3__route__vias__multicut": 0,
131+
"drt__repair_antennas__iter_3__antenna__violating__nets": 0,
132+
"drt__repair_antennas__iter_3__antenna__violating__pins": 0,
119133
"drt__antenna__violating__nets": 0,
120134
"drt__antenna__violating__pins": 0,
121135
"DRT::ANT::errors": "0",
122136
"design__violations": 0,
123137
"timing__drv__floating__nets": 0,
124138
"timing__drv__floating__pins": 0,
125-
"DRT::worst_slack_min": "-0.1731081993414379",
126-
"DRT::worst_slack_max": "-2.0968711804857425",
127-
"DRT::tns_max": "-27.234595793875542",
128-
"DRT::clock_skew": "3.112362455853368",
129-
"DRT::max_slew_slack": "-4.379382488830554",
139+
"DRT::worst_slack_min": "0.0432647263594376",
140+
"DRT::worst_slack_max": "-1.8257600392752509",
141+
"DRT::tns_max": "-20.79393605048584",
142+
"DRT::clock_skew": "2.910018530733028",
143+
"DRT::max_slew_slack": "-28.604712801827542",
130144
"DRT::max_fanout_slack": "100.0",
131-
"DRT::max_capacitance_slack": "-6.870626425463941",
145+
"DRT::max_capacitance_slack": "-32.489018655616455",
132146
"DRT::clock_period": "15.155000",
133-
"flow__warnings__count": 888,
147+
"flow__warnings__count": 379,
134148
"flow__errors__count": 0
135149
}

test/ibex_sky130hd.metrics_limits

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
11
{
22
"IFP::instance_count" : "18835.2"
3-
,"DPL::design_area" : "205624.8"
4-
,"DPL::utilization" : "33.96"
5-
,"RSZ::repair_design_buffer_count" : "580"
3+
,"DPL::design_area" : "205575.6"
4+
,"DPL::utilization" : "33.839999999999996"
5+
,"RSZ::repair_design_buffer_count" : "576"
66
,"RSZ::max_slew_slack" : "0"
77
,"RSZ::max_capacitance_slack" : "0"
88
,"RSZ::max_fanout_slack" : "0"
99
,"RSZ::worst_slack_min" : "-1.1365291345844586"
10-
,"RSZ::worst_slack_max" : "-2.4155906941214464"
11-
,"RSZ::tns_max" : "-2383.288087298971"
10+
,"RSZ::worst_slack_max" : "-2.415584476872333"
11+
,"RSZ::tns_max" : "-2383.288024238301"
1212
,"RSZ::hold_buffer_count" : "0"
1313
,"GRT::ANT::errors" : "0"
1414
,"DRT::drv" : "0"
15-
,"DRT::worst_slack_min" : "-1.688608199341438"
16-
,"DRT::worst_slack_max" : "-3.6123711804857424"
17-
,"DRT::tns_max" : "-2405.963395793876"
18-
,"DRT::clock_skew" : "3.7348349470240416"
19-
,"DRT::max_slew_slack" : "-5.255258986596665"
20-
,"DRT::max_capacitance_slack" : "-8.244751710556729"
15+
,"DRT::worst_slack_min" : "-1.4722352736405624"
16+
,"DRT::worst_slack_max" : "-3.3412600392752507"
17+
,"DRT::tns_max" : "-2399.522736050486"
18+
,"DRT::clock_skew" : "3.4920222368796336"
19+
,"DRT::max_slew_slack" : "-34.32565536219305"
20+
,"DRT::max_capacitance_slack" : "-38.986822386739746"
2121
,"DRT::max_fanout_slack" : "0"
2222
,"DRT::clock_period" : "15.155"
2323
,"DRT::ANT::errors" : "0"

0 commit comments

Comments
 (0)