From 34159b67427724295d8704382a5709aba55cfecb Mon Sep 17 00:00:00 2001 From: James Cherry Date: Wed, 6 May 2020 08:09:15 -0700 Subject: [PATCH] report_power nan's --- search/Power.cc | 9 +++++---- tcl/Power.tcl | 32 ++++++++++++++++++++++++++++---- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/search/Power.cc b/search/Power.cc index 9cf1e058..c0d202e6 100644 --- a/search/Power.cc +++ b/search/Power.cc @@ -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(), diff --git a/tcl/Power.tcl b/tcl/Power.tcl index 83c74a6b..840801ba 100644 --- a/tcl/Power.tcl +++ b/tcl/Power.tcl @@ -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. }