@@ -37,17 +37,26 @@ def gen_rule_file(
3737
3838 # Notes
3939 # - Apply tighter margin on timing__setup__ws than timing__setup__tns
40- # because WNS is more important.
40+ # because WNS is more important than TNS .
4141 # - Apply the consistent margins on timing__setup__* and timing__hold__*
42- # - 'min_max_period' is used for timing__setup__* and timing__hold__*
43- # to give small margin based on clock period to avoid failures by
44- # small violations.
42+ # - 'period_padding' mode is used for timing__setup__* and timing__hold__*
43+ # to give small margin based on clock period to avoid failures by small
44+ # violations.
4545
4646 # dict format
4747 # 'metric_name': {
48+ # 'mode': <str>, one of ['direct', 'sum_fixed', 'period', 'padding',
49+ # 'period_padding', 'abs_padding', 'metric']
4850 # 'padding': <float>, percentage of padding to use
4951 # 'fixed': <float>, sum this number instead of using % padding
5052 # 'round_value': <bool>, use the rounded value for the rule
53+ # 'compare': <str>, one of ['<', '>', '<=', '>=', '==', '!=']
54+ # 'metric': <str>, when mode is 'metric', use this metric to compute
55+ # the rule value
56+ # 'min_max': <function>, one of [min, max], optional
57+ # 'min_max_direct': <float>, optional
58+ # 'min_max_sum': <float>, optional
59+ # 'min_max_period': <float>, optional
5160 # }
5261
5362 rules_dict = {
@@ -99,34 +108,26 @@ def gen_rule_file(
99108 "compare" : "<=" ,
100109 },
101110 "cts__timing__setup__ws" : {
102- "mode" : "padding " ,
111+ "mode" : "period_padding " ,
103112 "padding" : 5 ,
104- "min_max" : min ,
105- "min_max_period" : 5 ,
106113 "round_value" : False ,
107114 "compare" : ">=" ,
108115 },
109116 "cts__timing__setup__tns" : {
110- "mode" : "padding " ,
117+ "mode" : "period_padding " ,
111118 "padding" : 20 ,
112- "min_max" : min ,
113- "min_max_period" : 5 ,
114119 "round_value" : False ,
115120 "compare" : ">=" ,
116121 },
117122 "cts__timing__hold__ws" : {
118- "mode" : "padding " ,
123+ "mode" : "period_padding " ,
119124 "padding" : 5 ,
120- "min_max" : min ,
121- "min_max_period" : 5 ,
122125 "round_value" : False ,
123126 "compare" : ">=" ,
124127 },
125128 "cts__timing__hold__tns" : {
126- "mode" : "padding " ,
129+ "mode" : "period_padding " ,
127130 "padding" : 20 ,
128- "min_max" : min ,
129- "min_max_period" : 5 ,
130131 "round_value" : False ,
131132 "compare" : ">=" ,
132133 },
@@ -141,34 +142,26 @@ def gen_rule_file(
141142 "compare" : "<=" ,
142143 },
143144 "globalroute__timing__setup__ws" : {
144- "mode" : "padding " ,
145+ "mode" : "period_padding " ,
145146 "padding" : 5 ,
146- "min_max" : min ,
147- "min_max_period" : 5 ,
148147 "round_value" : False ,
149148 "compare" : ">=" ,
150149 },
151150 "globalroute__timing__setup__tns" : {
152- "mode" : "padding " ,
151+ "mode" : "period_padding " ,
153152 "padding" : 20 ,
154- "min_max" : min ,
155- "min_max_period" : 5 ,
156153 "round_value" : False ,
157154 "compare" : ">=" ,
158155 },
159156 "globalroute__timing__hold__ws" : {
160- "mode" : "padding " ,
157+ "mode" : "period_padding " ,
161158 "padding" : 5 ,
162- "min_max" : min ,
163- "min_max_period" : 5 ,
164159 "round_value" : False ,
165160 "compare" : ">=" ,
166161 },
167162 "globalroute__timing__hold__tns" : {
168- "mode" : "padding " ,
163+ "mode" : "period_padding " ,
169164 "padding" : 20 ,
170- "min_max" : min ,
171- "min_max_period" : 5 ,
172165 "round_value" : False ,
173166 "compare" : ">=" ,
174167 },
@@ -199,67 +192,51 @@ def gen_rule_file(
199192 "compare" : "<=" ,
200193 },
201194 "detailedroute__timing__setup__ws" : {
202- "mode" : "padding " ,
195+ "mode" : "period_padding " ,
203196 "padding" : 5 ,
204- "min_max" : min ,
205- "min_max_period" : 5 ,
206197 "round_value" : False ,
207198 "compare" : ">=" ,
208199 },
209200 "detailedroute__timing__setup__tns" : {
210- "mode" : "padding " ,
201+ "mode" : "period_padding " ,
211202 "padding" : 20 ,
212- "min_max" : min ,
213- "min_max_period" : 5 ,
214203 "round_value" : False ,
215204 "compare" : ">=" ,
216205 },
217206 "detailedroute__timing__hold__ws" : {
218- "mode" : "padding " ,
207+ "mode" : "period_padding " ,
219208 "padding" : 5 ,
220- "min_max" : min ,
221- "min_max_period" : 5 ,
222209 "round_value" : False ,
223210 "compare" : ">=" ,
224211 },
225212 "detailedroute__timing__hold__tns" : {
226- "mode" : "padding " ,
213+ "mode" : "period_padding " ,
227214 "padding" : 20 ,
228- "min_max" : min ,
229- "min_max_period" : 5 ,
230215 "round_value" : False ,
231216 "compare" : ">=" ,
232217 },
233218 # finish
234219 "finish__timing__setup__ws" : {
235- "mode" : "padding " ,
220+ "mode" : "period_padding " ,
236221 "padding" : 5 ,
237- "min_max" : min ,
238- "min_max_period" : 5 ,
239222 "round_value" : False ,
240223 "compare" : ">=" ,
241224 },
242225 "finish__timing__setup__tns" : {
243- "mode" : "padding " ,
226+ "mode" : "period_padding " ,
244227 "padding" : 20 ,
245- "min_max" : min ,
246- "min_max_period" : 5 ,
247228 "round_value" : False ,
248229 "compare" : ">=" ,
249230 },
250231 "finish__timing__hold__ws" : {
251- "mode" : "padding " ,
232+ "mode" : "period_padding " ,
252233 "padding" : 5 ,
253- "min_max" : min ,
254- "min_max_period" : 5 ,
255234 "round_value" : False ,
256235 "compare" : ">=" ,
257236 },
258237 "finish__timing__hold__tns" : {
259- "mode" : "padding " ,
238+ "mode" : "period_padding " ,
260239 "padding" : 20 ,
261- "min_max" : min ,
262- "min_max_period" : 5 ,
263240 "round_value" : False ,
264241 "compare" : ">=" ,
265242 },
@@ -323,6 +300,13 @@ def gen_rule_file(
323300 elif option ["mode" ] == "padding" :
324301 rule_value = metrics [field ] * (1 + option ["padding" ] / 100 )
325302
303+ elif option ["mode" ] == "period_padding" :
304+ negative_slack = min (metrics [field ], 0 )
305+ rule_value = negative_slack - max (
306+ negative_slack * option ["padding" ] / 100 ,
307+ period * option ["padding" ] / 100 ,
308+ )
309+
326310 elif option ["mode" ] == "abs_padding" :
327311 rule_value = abs (metrics [field ]) * (1 + option ["padding" ] / 100 )
328312
@@ -494,6 +478,11 @@ def comma_separated_list(value):
494478 parser .print_help ()
495479 sys .exit (1 )
496480
481+ # jk: hack
482+ args .tighten = False
483+ args .failing = False
484+ args .update = True
485+
497486 gen_rule_file (
498487 args .rules ,
499488 args .new_rules ,
0 commit comments