1- proc report_wire_caps { count } {
2- set nets [lsort -command net_wire_cap_less [get_nets *]]
3- set i 0
4- foreach net $nets {
5- set wire_cap [net_wire_cap $net ]
6- puts " [ get_full_name $net ] [ sta::format_capacitance $wire_cap 3] "
7- if { $i >= $count } {
8- break
9- }
10- incr i
11- }
12- }
13-
14- proc net_wire_cap_less { net1 net2 } {
15- expr [net_wire_cap $net1 ] < [net_wire_cap $net2 ]
16- }
17-
18- proc report_var_caps { var_name count } {
19- upvar 1 $var_name var
20- global cap_var_name
21-
22- set cap_var_name $var_name
23- set nets [lsort -command net_var_cap_less [get_nets *]]
24- set i 0
25- foreach net $nets {
26- set net_name [get_full_name $net ]
27- puts " $net_name [ sta::format_capacitance $var($net_name) 3] "
28- if { $i >= $count } {
29- break
30- }
31- incr i
32- }
33- }
34-
35- proc write_rc_csv { filename } {
1+ proc write_nets_rc_csv { filename } {
362 upvar 1 grt grt_net_name_to_rc
373 upvar 1 rcx rcx_net_name_to_rc
384
@@ -97,7 +63,7 @@ proc write_rc_csv { filename } {
9763 close $stream
9864}
9965
100- proc record_wire_rc { var_name } {
66+ proc fetch_nets_rc { var_name } {
10167 upvar 1 $var_name var
10268
10369 foreach net [get_nets *] {
@@ -116,142 +82,3 @@ proc net_wire_res { net } {
11682proc net_wire_cap { net } {
11783 return [$net wire_capacitance [sta::cmd_scene] max]
11884}
119-
120- proc net_pin_cap { net } {
121- return [$net pin_capacitance [sta::cmd_scene] max]
122- }
123-
124- proc net_wire_cap_less { net1 net2 } {
125- expr [net_wire_cap $net1 ] < [net_wire_cap $net2 ]
126- }
127-
128- proc net_var_cap_less { net1 net2 } {
129- global var_cap_less_name
130- upvar 2 $var_cap_less_name cap_var
131-
132- set net_name1 [get_full_name $net1 ]
133- set net_name2 [get_full_name $net2 ]
134- lassign $cap_var($net_name1) res1 cap1
135- lassign $cap_var($net_name2) res2 cap2
136- expr $cap1 < $cap2
137- }
138-
139- proc compare_wire_rc { count var_name ref_var_name } {
140- global var_cap_less_name
141-
142- set i 0
143- # implicit arg to net_var_cap_less
144- set var_cap_less_name $ref_var_name
145- set nets [lsort -command net_var_cap_less [get_nets *]]
146- puts " net fanout [ format %4s $var_name ] [ format %5s $ref_var_name ] \
147- wire total [ format %5s $var_name ] [ format %5s $ref_var_name ] "
148- puts " cap cap delta delta res res delta"
149- set res_sum 0.0
150- set res_count 0
151- set cap_sum 0.0
152- set total_cap_sum 0.0
153- foreach net $nets {
154- lassign [compare_wire_rc1 $net $var_name $ref_var_name ] \
155- res_delta res_count cap_delta total_delta
156- set res_sum [expr $res_sum + $res_delta ]
157- set res_count [expr $res_count + $res_count ]
158- set cap_sum [expr $cap_sum + $cap_delta ]
159- set total_cap_sum [expr $total_cap_sum + $total_delta ]
160- if { $i >= $count } {
161- break
162- }
163- incr i
164- }
165- set res_avg [expr $res_sum / $count ]
166- set cap_avg [expr $cap_sum / $count ]
167- set total_cap_avg [expr $total_cap_sum / $count ]
168- puts " \
169- ----- ----- -----"
170- puts " \
171- [ format %+4.0f $cap_avg ] % [ format %+4.0f $total_cap_avg ] %\
172- [ format %+4.0f $res_avg ] %"
173- }
174-
175- proc compare_net_wire_rc { net_name var_name ref_var_name } {
176- upvar 1 $var_name cap_var
177- upvar 1 $ref_var_name ref_var
178- global var_cap_less_name
179-
180- puts " net fanout [ format %5s $var_name ] [ format %5s $ref_var_name ] \
181- wire total"
182- puts " cap cap delta delta"
183- compare_wire_rc1 [get_net $net_name ] $var_name $ref_var_name
184- }
185-
186- proc compare_wire_rc1 { net var_name ref_var_name } {
187- upvar 2 $var_name rc_var
188- upvar 2 $ref_var_name ref_var
189-
190- set net_name [get_full_name $net ]
191- set pin_cap [net_pin_cap $net ]
192- lassign $rc_var($net_name) res wire_cap
193- lassign $ref_var($net_name) res_ref wire_cap_ref
194-
195- if { $res != 0.0 } {
196- set res_delta [expr ($res - $res_ref ) / $res_ref * 100]
197- set res_count 1
198- } else {
199- set res_delta 0.0
200- set res_count 0
201- }
202-
203- if { $wire_cap_ref != 0.0 } {
204- set cap_delta [expr ($wire_cap - $wire_cap_ref ) / $wire_cap_ref * 100]
205- } else {
206- set cap_delta 0.0
207- }
208-
209- set total_cap [expr $pin_cap + $wire_cap ]
210- set total_cap_ref [expr $pin_cap + $wire_cap_ref ]
211- if { $total_cap_ref != 0.0 } {
212- set total_delta [expr ($total_cap - $total_cap_ref ) / $total_cap_ref * 100]
213- } else {
214- set total_delta 0.0
215- }
216-
217- set fanout [llength [get_pins -of $net -filter " direction == input" ]]
218-
219- puts -nonewline [concat \
220- [format " %-20s" $net_name ] " " \
221- [format " %5d" $fanout ] " " \
222- [format " %8s" [sta::format_capacitance $wire_cap 3]] " " \
223- [format " %8s" [sta::format_capacitance $wire_cap_ref 3]] " " \
224- [format " %4.0f" $cap_delta ]% " " \
225- [format " %4.0f" $total_delta ]%]
226- if { $res > 0.0 } {
227- puts [concat \
228- [format " %8s" [sta::format_resistance $res 3]] " " \
229- [format " %8s" [sta::format_resistance $res_ref 3]] " " \
230- [format " %4.0f" $res_delta ]%]
231- } else {
232- puts " "
233- }
234- return [list $res_delta $res_count $cap_delta $total_delta ]
235- }
236-
237- # adjustment is percent to adjust (ie, 10 for +10%).
238- proc write_layer_rc_cmds { adjustment } {
239- foreach layer [[ord::get_db_tech] getLayers] {
240- if { [$layer getRoutingLevel] > 0 } {
241- set res_per_sq [$layer getResistance]
242- set wire_width [ord::dbu_to_microns [$layer getWidth]]
243- # Convert ohms/square to resistance/wire_length (ohms/micron)
244- set res [expr $res_per_sq / $wire_width ]
245-
246- set cap_edge [$layer getEdgeCapacitance]
247- set cap_area [$layer getCapacitance]
248- # Convert pF/um to F/um.
249- set cap [expr \
250- ($cap_edge * 2.0 + $wire_width * $cap_area ) * 1e-12 / (1.0 + $adjustment / 100.0)]
251- puts [concat \
252- " set_layer_rc -layer [ $layer getConstName] " \
253- " -resistance [ format %.4e [sta::resistance_sta_ui $res ] ] " \
254- " -capacitance [ format %.4e [sta::capacitance_sta_ui $cap ] ]" ]
255- }
256- }
257- }
0 commit comments