Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
177 changes: 2 additions & 175 deletions flow/util/write_net_rc.tcl
Original file line number Diff line number Diff line change
@@ -1,38 +1,4 @@
proc report_wire_caps { count } {
set nets [lsort -command net_wire_cap_less [get_nets *]]
set i 0
foreach net $nets {
set wire_cap [net_wire_cap $net]
puts "[get_full_name $net] [sta::format_capacitance $wire_cap 3]"
if { $i >= $count } {
break
}
incr i
}
}

proc net_wire_cap_less { net1 net2 } {
expr [net_wire_cap $net1] < [net_wire_cap $net2]
}

proc report_var_caps { var_name count } {
upvar 1 $var_name var
global cap_var_name

set cap_var_name $var_name
set nets [lsort -command net_var_cap_less [get_nets *]]
set i 0
foreach net $nets {
set net_name [get_full_name $net]
puts "$net_name [sta::format_capacitance $var($net_name) 3]"
if { $i >= $count } {
break
}
incr i
}
}

proc write_rc_csv { filename } {
proc write_nets_rc_csv { filename } {
upvar 1 grt grt_net_name_to_rc
upvar 1 rcx rcx_net_name_to_rc

Expand Down Expand Up @@ -97,7 +63,7 @@ proc write_rc_csv { filename } {
close $stream
}

proc record_wire_rc { var_name } {
proc fetch_nets_rc { var_name } {
Comment thread
AcKoucher marked this conversation as resolved.
upvar 1 $var_name var

foreach net [get_nets *] {
Expand All @@ -116,142 +82,3 @@ proc net_wire_res { net } {
proc net_wire_cap { net } {
return [$net wire_capacitance [sta::cmd_scene] max]
}

proc net_pin_cap { net } {
return [$net pin_capacitance [sta::cmd_scene] max]
}

proc net_wire_cap_less { net1 net2 } {
expr [net_wire_cap $net1] < [net_wire_cap $net2]
}

proc net_var_cap_less { net1 net2 } {
global var_cap_less_name
upvar 2 $var_cap_less_name cap_var

set net_name1 [get_full_name $net1]
set net_name2 [get_full_name $net2]
lassign $cap_var($net_name1) res1 cap1
lassign $cap_var($net_name2) res2 cap2
expr $cap1 < $cap2
}

proc compare_wire_rc { count var_name ref_var_name } {
global var_cap_less_name

set i 0
# implicit arg to net_var_cap_less
set var_cap_less_name $ref_var_name
set nets [lsort -command net_var_cap_less [get_nets *]]
puts "net fanout [format %4s $var_name] [format %5s $ref_var_name] \
wire total [format %5s $var_name] [format %5s $ref_var_name]"
puts " cap cap delta delta res res delta"
set res_sum 0.0
set res_count 0
set cap_sum 0.0
set total_cap_sum 0.0
foreach net $nets {
lassign [compare_wire_rc1 $net $var_name $ref_var_name] \
res_delta res_count cap_delta total_delta
set res_sum [expr $res_sum + $res_delta]
set res_count [expr $res_count + $res_count]
set cap_sum [expr $cap_sum + $cap_delta]
set total_cap_sum [expr $total_cap_sum + $total_delta]
if { $i >= $count } {
break
}
incr i
}
set res_avg [expr $res_sum / $count]
set cap_avg [expr $cap_sum / $count]
set total_cap_avg [expr $total_cap_sum / $count]
puts " \
----- ----- -----"
puts " \
[format %+4.0f $cap_avg]% [format %+4.0f $total_cap_avg]%\
[format %+4.0f $res_avg]%"
}

proc compare_net_wire_rc { net_name var_name ref_var_name } {
upvar 1 $var_name cap_var
upvar 1 $ref_var_name ref_var
global var_cap_less_name

puts "net fanout [format %5s $var_name] [format %5s $ref_var_name] \
wire total"
puts " cap cap delta delta"
compare_wire_rc1 [get_net $net_name] $var_name $ref_var_name
}

proc compare_wire_rc1 { net var_name ref_var_name } {
upvar 2 $var_name rc_var
upvar 2 $ref_var_name ref_var

set net_name [get_full_name $net]
set pin_cap [net_pin_cap $net]
lassign $rc_var($net_name) res wire_cap
lassign $ref_var($net_name) res_ref wire_cap_ref

if { $res != 0.0 } {
set res_delta [expr ($res - $res_ref) / $res_ref * 100]
set res_count 1
} else {
set res_delta 0.0
set res_count 0
}

if { $wire_cap_ref != 0.0 } {
set cap_delta [expr ($wire_cap - $wire_cap_ref) / $wire_cap_ref * 100]
} else {
set cap_delta 0.0
}

set total_cap [expr $pin_cap + $wire_cap]
set total_cap_ref [expr $pin_cap + $wire_cap_ref]
if { $total_cap_ref != 0.0 } {
set total_delta [expr ($total_cap - $total_cap_ref) / $total_cap_ref * 100]
} else {
set total_delta 0.0
}

set fanout [llength [get_pins -of $net -filter "direction == input"]]

puts -nonewline [concat \
[format "%-20s" $net_name] " " \
[format "%5d" $fanout] " " \
[format "%8s" [sta::format_capacitance $wire_cap 3]] " " \
[format "%8s" [sta::format_capacitance $wire_cap_ref 3]] " " \
[format "%4.0f" $cap_delta]% " " \
[format "%4.0f" $total_delta]%]
if { $res > 0.0 } {
puts [concat \
[format "%8s" [sta::format_resistance $res 3]] " " \
[format "%8s" [sta::format_resistance $res_ref 3]] " " \
[format "%4.0f" $res_delta]%]
} else {
puts ""
}
return [list $res_delta $res_count $cap_delta $total_delta]
}

# adjustment is percent to adjust (ie, 10 for +10%).
proc write_layer_rc_cmds { adjustment } {
foreach layer [[ord::get_db_tech] getLayers] {
if { [$layer getRoutingLevel] > 0 } {
set res_per_sq [$layer getResistance]
set wire_width [ord::dbu_to_microns [$layer getWidth]]
# Convert ohms/square to resistance/wire_length (ohms/micron)
set res [expr $res_per_sq / $wire_width]

set cap_edge [$layer getEdgeCapacitance]
set cap_area [$layer getCapacitance]
# Convert pF/um to F/um.
set cap [expr \
($cap_edge * 2.0 + $wire_width * $cap_area) * 1e-12 / (1.0 + $adjustment / 100.0)]
puts [concat \
"set_layer_rc -layer [$layer getConstName] " \
"-resistance [format %.4e [sta::resistance_sta_ui $res]] " \
"-capacitance [format %.4e [sta::capacitance_sta_ui $cap]]"]
}
}
}
6 changes: 3 additions & 3 deletions flow/util/write_net_rc_script.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ load_design 6_final.odb 6_final.sdc
source $::env(UTILS_DIR)/write_net_rc.tcl

estimate_parasitics -global_routing
record_wire_rc grt
fetch_nets_rc grt

read_spef $::env(RESULTS_DIR)/6_final.spef
record_wire_rc rcx
fetch_nets_rc rcx

# write grt/rcx rc file for correlateRC.py
write_rc_csv $::env(RESULTS_DIR)/6_net_rc.csv
write_nets_rc_csv $::env(RESULTS_DIR)/6_net_rc.csv