report_power nan's

This commit is contained in:
James Cherry 2020-05-06 08:09:15 -07:00
parent 48015d8a4f
commit 34159b6742
2 changed files with 33 additions and 8 deletions

View File

@ -736,10 +736,11 @@ Power::findOutputInternalPower(const Pin *to_pin,
}
if (tr_count)
energy /= tr_count; // average non-inf energies
auto duty_sum = pg_duty_sum.find(related_pg_pin);
float weight = duty_sum == pg_duty_sum.end()
? duty
: duty / duty_sum->second;
auto duty_sum_iter = pg_duty_sum.find(related_pg_pin);
float duty_sum = duty_sum_iter == pg_duty_sum.end()
? 0.0
: duty_sum_iter->second;
float weight = duty_sum == 0.0 ? duty : duty / duty_sum;
float port_internal = weight * energy * to_activity.activity();
debugPrint9(debug_, "power", 2, "%3s -> %-3s %6s %.2f %.2f %.2f %9.2e %9.2e %s\n",
from_port->name(),

View File

@ -115,7 +115,7 @@ proc report_title_dashes { count } {
proc report_power_row { type row_result design_total field_width digits } {
lassign $row_result internal switching leakage total
if { $design_total == 0.0 } {
if { $design_total == 0.0 || [is_nan $design_total] } {
set percent 0.0
} else {
set percent [expr $total / $design_total * 100]
@ -128,12 +128,20 @@ proc report_power_row { type row_result design_total field_width digits } {
puts [format " %5.1f%%" $percent]
}
proc is_nan { str } {
return [string match "*NaN" $str]
}
proc report_power_col { pwr field_width digits } {
puts -nonewline [format " %$field_width.${digits}e" $pwr]
if { [is_nan $pwr] } {
puts -nonewline [format " %${field_width}s" $pwr]
} else {
puts -nonewline [format " %$field_width.${digits}e" $pwr]
}
}
proc report_power_col_percent { col_total total field_width } {
if { $total == 0.0 } {
if { $total == 0.0 || [is_nan $total]} {
set percent 0.0
} else {
set percent [expr $col_total / $total * 100]
@ -142,7 +150,11 @@ proc report_power_col_percent { col_total total field_width } {
}
proc report_power_line { type pwr digits } {
puts [format "%-16s %.${digits}e" $type $pwr]
if { [is_nan $pwr] } {
puts [format "%-16s %s" $type $pwr]
} else {
puts [format "%-16s %.${digits}e" $type $pwr]
}
}
proc report_power_insts { insts corner digits } {
@ -244,5 +256,17 @@ proc set_power_activity { args } {
}
}
proc power_find_nan { } {
set corner [cmd_corner]
foreach inst [network_leaf_instances] {
set power_result [instance_power $inst $corner]
lassign $power_result internal switching leakage total
if { [is_nan $internal] || [is_nan $switching] || [is_nan $leakage] } {
puts "[get_full_name $inst] $internal $switching $leakage"
break
}
}
}
# sta namespace end.
}