OpenSTA/power/Power.tcl

375 lines
12 KiB
Tcl
Raw Normal View History

2018-11-26 18:15:52 +01:00
# OpenSTA, Static Timing Analyzer
# Copyright (c) 2024, Parallax Software, Inc.
2018-11-26 18:15:52 +01:00
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2018-11-26 18:15:52 +01:00
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
2018-11-26 18:15:52 +01:00
################################################################
#
# Power commands.
#
################################################################
namespace eval sta {
define_cmd_args "report_power" \
{ [-instances instances]\
[-corner corner]\
2018-11-26 18:15:52 +01:00
[-digits digits]\
[> filename] [>> filename] }
proc_redirect report_power {
global sta_report_default_digits
parse_key_args "report_power" args \
keys {-instances -corner -digits} flags {}
2018-11-26 18:15:52 +01:00
check_argc_eq0 "report_power" $args
if { ![liberty_libraries_exist] } {
sta_error 304 "No liberty libraries have been read."
}
2019-04-29 17:39:05 +02:00
if { [info exists keys(-digits)] } {
2018-11-26 18:15:52 +01:00
set digits $keys(-digits)
check_positive_integer "-digits" $digits
} else {
set digits $sta_report_default_digits
}
set corner [parse_corner keys]
if { [info exists keys(-instances)] } {
2019-02-17 00:31:39 +01:00
set insts [get_instances_error "-instances" $keys(-instances)]
2019-02-18 19:56:38 +01:00
report_power_insts $insts $corner $digits
2018-11-26 18:15:52 +01:00
} else {
report_power_design $corner $digits
}
}
proc liberty_libraries_exist {} {
set lib_iter [liberty_library_iterator]
set have_liberty 0
if { [$lib_iter has_next] } {
set have_liberty 1
}
$lib_iter finish
return $have_liberty
}
2018-11-26 18:15:52 +01:00
proc report_power_design { corner digits } {
set power_result [design_power $corner]
2018-12-11 21:34:03 +01:00
set totals [lrange $power_result 0 3]
set sequential [lrange $power_result 4 7]
set combinational [lrange $power_result 8 11]
set clock [lrange $power_result 12 15]
set macro [lrange $power_result 16 19]
set pad [lrange $power_result 20 end]
2018-12-14 08:53:17 +01:00
lassign $totals design_internal design_switching design_leakage design_total
2019-02-18 19:56:38 +01:00
2019-03-29 22:18:08 +01:00
set field_width [max [expr $digits + 6] 10]
report_power_title5 "Group" "Internal" "Switching" "Leakage" "Total" $field_width
report_power_title5_units " " "Power" "Power" "Power" "Power" "(Watts)" $field_width
2019-03-29 22:18:08 +01:00
report_title_dashes5 $field_width
report_power_row "Sequential" $sequential $design_total $field_width $digits
report_power_row "Combinational" $combinational $design_total $field_width $digits
report_power_row "Clock" $clock $design_total $field_width $digits
2019-03-29 22:18:08 +01:00
report_power_row "Macro" $macro $design_total $field_width $digits
report_power_row "Pad" $pad $design_total $field_width $digits
report_title_dashes5 $field_width
report_power_row "Total" $power_result $design_total $field_width $digits
2020-12-26 01:55:46 +01:00
report_line "[format %-20s {}][power_col_percent $design_internal $design_total $field_width][power_col_percent $design_switching $design_total $field_width][power_col_percent $design_leakage $design_total $field_width]"
2018-11-26 18:15:52 +01:00
}
2019-03-29 22:18:08 +01:00
proc max { x y } {
if { $x >= $y } {
return $x
} else {
return $y
}
}
proc report_power_title5 { title1 title2 title3 title4 title5 field_width } {
2020-12-26 01:55:46 +01:00
report_line "[format %-20s $title1] [format %${field_width}s $title2] [format %${field_width}s $title3] [format %${field_width}s $title4] [format %${field_width}s $title5]"
2019-03-29 22:18:08 +01:00
}
proc report_power_title5_units { title1 title2 title3 title4 title5 units field_width } {
report_line "[format %-20s $title1] [format %${field_width}s $title2] [format %${field_width}s $title3] [format %${field_width}s $title4] [format %${field_width}s $title5] $units"
}
2019-03-29 22:18:08 +01:00
proc report_power_title4 { title1 title2 title3 title4 field_width } {
2020-12-26 01:55:46 +01:00
report_line " [format %${field_width}s $title1] [format %${field_width}s $title2] [format %${field_width}s $title3] [format %${field_width}s $title4]"
2019-03-29 22:18:08 +01:00
}
proc report_power_title4_units { title1 title2 title3 title4 units field_width } {
report_line " [format %${field_width}s $title1] [format %${field_width}s $title2] [format %${field_width}s $title3] [format %${field_width}s $title4] $units"
}
2019-03-29 22:18:08 +01:00
proc report_title_dashes5 { field_width } {
set count [expr 20 + ($field_width + 1) * 4]
report_title_dashes $count
}
proc report_title_dashes4 { field_width } {
set count [expr ($field_width + 1) * 4]
report_title_dashes $count
}
proc report_title_dashes { count } {
2020-12-26 01:55:46 +01:00
set line ""
2019-03-29 22:18:08 +01:00
for {set i 0} {$i < $count} {incr i} {
2020-12-26 01:55:46 +01:00
set line "-$line"
2019-03-29 22:18:08 +01:00
}
2020-12-26 01:55:46 +01:00
report_line $line
2019-03-29 22:18:08 +01:00
}
proc report_power_row { type row_result design_total field_width digits } {
2018-12-11 21:34:03 +01:00
lassign $row_result internal switching leakage total
2020-05-06 17:09:15 +02:00
if { $design_total == 0.0 || [is_nan $design_total] } {
2018-12-11 19:47:04 +01:00
set percent 0.0
} else {
set percent [expr $total / $design_total * 100]
}
2020-12-28 18:04:57 +01:00
report_line "[format %-20s $type][power_col $internal $field_width $digits][power_col $switching $field_width $digits][power_col $leakage $field_width $digits][power_col $total $field_width $digits] [format %5.1f $percent]%"
2018-11-26 18:15:52 +01:00
}
2020-05-06 17:09:15 +02:00
proc is_nan { str } {
return [string match "*NaN" $str]
}
2020-12-26 01:55:46 +01:00
proc power_col { pwr field_width digits } {
2020-05-06 17:09:15 +02:00
if { [is_nan $pwr] } {
2020-12-26 01:55:46 +01:00
format " %${field_width}s" $pwr
2020-05-06 17:09:15 +02:00
} else {
2020-12-26 01:55:46 +01:00
format " %$field_width.${digits}e" $pwr
2020-05-06 17:09:15 +02:00
}
2018-11-26 18:15:52 +01:00
}
2020-12-26 01:55:46 +01:00
proc power_col_percent { col_total total field_width } {
2020-05-06 17:09:15 +02:00
if { $total == 0.0 || [is_nan $total]} {
2018-12-11 19:47:04 +01:00
set percent 0.0
} else {
2018-12-11 21:34:03 +01:00
set percent [expr $col_total / $total * 100]
2018-12-11 19:47:04 +01:00
}
2020-12-26 01:55:46 +01:00
format "%$field_width.1f%%" $percent
2018-11-26 18:15:52 +01:00
}
2019-02-18 19:56:38 +01:00
proc report_power_line { type pwr digits } {
2020-05-06 17:09:15 +02:00
if { [is_nan $pwr] } {
2020-12-26 01:55:46 +01:00
report_line [format "%-16s %s" $type $pwr]
2020-05-06 17:09:15 +02:00
} else {
2020-12-26 01:55:46 +01:00
report_line [format "%-16s %.${digits}e" $type $pwr]
2020-05-06 17:09:15 +02:00
}
2019-02-18 19:56:38 +01:00
}
proc report_power_insts { insts corner digits } {
set inst_pwrs {}
foreach inst $insts {
set power_result [instance_power $inst $corner]
lappend inst_pwrs [list $inst $power_result]
}
set inst_pwrs [lsort -command inst_pwr_cmp $inst_pwrs]
2019-02-19 01:24:41 +01:00
2019-03-29 22:18:08 +01:00
set field_width [max [expr $digits + 6] 10]
report_power_title4 "Internal" "Switching" "Leakage" "Total" $field_width
report_power_title4_units "Power" "Power" "Power" "Power" "(Watts)" $field_width
2019-03-29 22:18:08 +01:00
report_title_dashes4 $field_width
2019-02-19 01:24:41 +01:00
2019-02-18 19:56:38 +01:00
foreach inst_pwr $inst_pwrs {
set inst [lindex $inst_pwr 0]
set power [lindex $inst_pwr 1]
2019-03-29 22:18:08 +01:00
report_power_inst $inst $power $field_width $digits
2019-02-18 19:56:38 +01:00
}
}
proc inst_pwr_cmp { inst_pwr1 inst_pwr2 } {
set pwr1 [lindex $inst_pwr1 1]
set pwr2 [lindex $inst_pwr2 1]
lassign $pwr1 internal1 switching1 leakage1 total1
lassign $pwr2 internal2 switching2 leakage2 total2
if { $total1 < $total2 } {
return 1
} elseif { $total1 == $total2 } {
return 0
} else {
return -1
}
}
2019-03-29 22:18:08 +01:00
proc report_power_inst { inst power_result field_width digits } {
2019-02-19 01:24:41 +01:00
lassign $power_result internal switching leakage total
2020-12-26 01:55:46 +01:00
report_line "[power_col $internal $field_width $digits][power_col $switching $field_width $digits][power_col $leakage $field_width $digits][power_col $total $field_width $digits] [get_full_name $inst]"
2018-11-26 18:15:52 +01:00
}
2019-02-18 19:56:38 +01:00
################################################################
2018-11-26 18:15:52 +01:00
2019-04-29 17:39:05 +02:00
define_cmd_args "set_power_activity" { [-global]\
[-input]\
[-input_ports ports]\
[-pins pins]\
[-activity activity | -density density]\
[-duty duty]\
[-clock clock]}
2019-04-29 17:39:05 +02:00
proc set_power_activity { args } {
parse_key_args "set_power_activity" args \
keys {-input_ports -pins -activity -density -duty -clock} \
flags {-global -input}
2019-04-29 17:39:05 +02:00
check_argc_eq0 "set_power_activity" $args
if { [info exists keys(-activity)] && [info exists keys(-density)] \
|| ![info exists keys(-activity)] && ![info exists keys(-density)] } {
sta_error 306 "Specify -activity or -density."
}
set density 0.0
2019-04-29 17:39:05 +02:00
if { [info exists keys(-activity)] } {
set activity $keys(-activity)
check_positive_float "activity" $activity
if { [info exists keys(-clock)] } {
set clk [get_clock_warn "-clock" $keys(-clock)]
} else {
set clks [get_clocks]
if { $clks == {} } {
sta_error 307 "-activity requires a clock to be defined"
}
}
set density [expr $activity / [clock_min_period]]
}
if { [info exists keys(-density)] } {
set density $keys(-density)
check_positive_float "density" $density
set density [expr $density / [time_ui_sta 1.0]]
if { [info exists keys(-clock)] } {
sta_warn 302 "-clock ignored for -density"
2019-04-29 17:39:05 +02:00
}
}
set duty 0.5
if { [info exists keys(-duty)] } {
set duty $keys(-duty)
check_float "duty" $duty
if { $duty < 0.0 || $duty > 1.0 } {i
sta_error 302 "duty should be 0.0 to 1.0"
2019-04-29 17:39:05 +02:00
}
}
2018-11-26 18:15:52 +01:00
2019-04-29 17:39:05 +02:00
if { [info exists flags(-global)] } {
set_power_global_activity $density $duty
2019-04-29 17:39:05 +02:00
}
if { [info exists flags(-input)] } {
set_power_input_activity $density $duty
2019-04-29 17:39:05 +02:00
}
if { [info exists keys(-input_ports)] } {
set ports [get_ports_error "input_ports" $keys(-input_ports)]
foreach port $ports {
if { [get_property $port "direction"] == "input" } {
if { [is_clock_src [sta::get_port_pin $port]] } {
sta_warn 303 "activity cannot be set on clock ports."
} else {
set_power_input_port_activity $port $density $duty
}
2019-04-29 17:39:05 +02:00
}
}
}
if { [info exists keys(-pins)] } {
2020-08-05 16:23:38 +02:00
set pins [get_pins $keys(-pins)]
2019-04-29 17:39:05 +02:00
foreach pin $pins {
set_power_pin_activity $pin $density $duty
2018-11-26 18:15:52 +01:00
}
}
}
################################################################
# Deprecated 9/2024
define_cmd_args "read_power_activities" { [-scope scope] -vcd filename }
proc read_power_activities { args } {
parse_key_args "read_power_activities" args \
keys {-scope} flags {-vcd}
check_argc_eq1 "set_power_activity" $args
set filename [file nativename [lindex $args 0]]
set scope ""
if { [info exists keys(-scope)] } {
set scope $keys(-scope)
}
liberty test_cell parse internals commit 6a290928a1e554df63682ec416ead0d463c89b4a Author: James Cherry <cherry@parallaxsw.com> Date: Thu Oct 24 11:33:24 2024 -0700 liberty test signal_types Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 662b68e3def20b467c5dc1a2d9ca14b399ad27c1 Author: James Cherry <cherry@parallaxsw.com> Date: Thu Oct 24 11:28:25 2024 -0700 liberty test_cell Signed-off-by: James Cherry <cherry@parallaxsw.com> commit d91e9a824b46149fb1f803c76714971043fe21b6 Author: James Cherry <cherry@parallaxsw.com> Date: Thu Oct 24 10:35:17 2024 -0700 readme Signed-off-by: James Cherry <cherry@parallaxsw.com> commit cbe980545669379ac25c5721c488168de98e9120 Author: James Cherry <cherry@parallaxsw.com> Date: Thu Oct 24 09:38:29 2024 -0700 message ids Signed-off-by: James Cherry <cherry@parallaxsw.com> commit f0234ddefae5ad82bad75839afc18baf458ebdab Author: James Cherry <cherry@parallaxsw.com> Date: Wed Oct 23 12:52:39 2024 -0700 rm test_cell disable edge support Signed-off-by: James Cherry <cherry@parallaxsw.com> commit db798869bc85a6c7be5f938f4c4eb27402c177ad Author: James Cherry <cherry@parallaxsw.com> Date: Wed Oct 23 08:20:24 2024 -0700 liberty test_cell Signed-off-by: James Cherry <cherry@parallaxsw.com> commit d8fe710d551737f899a770abd2ca0b5e3a261d32 Author: James Cherry <cherry@parallaxsw.com> Date: Tue Oct 22 17:37:04 2024 -0700 liberty test_cell Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 9ad676ec78df99223ecd82e27c941341b28eb4e4 Author: James Cherry <cherry@parallaxsw.com> Date: Mon Oct 21 19:50:44 2024 -0700 liberty testcell Signed-off-by: James Cherry <cherry@parallaxsw.com> Signed-off-by: James Cherry <cherry@parallaxsw.com>
2024-10-24 20:37:07 +02:00
sta_warn 305 "read_power_activities is deprecated. Use read_vcd."
2024-09-24 03:04:26 +02:00
read_vcd_file $filename $scope
}
################################################################
define_cmd_args "read_vcd" { [-scope scope] filename }
proc read_vcd { args } {
parse_key_args "read_vcd" args \
keys {-scope} flags {}
check_argc_eq1 "read_vcd" $args
set filename [file nativename [lindex $args 0]]
set scope ""
if { [info exists keys(-scope)] } {
set scope $keys(-scope)
}
read_vcd_file $filename $scope
}
################################################################
define_cmd_args "read_saif" { [-scope scope] filename }
proc read_saif { args } {
parse_key_args "read_saif" args keys {-scope} flags {}
check_argc_eq1 "read_saif" $args
set filename [file nativename [lindex $args 0]]
set scope ""
if { [info exists keys(-scope)] } {
set scope $keys(-scope)
}
read_saif_file $filename $scope
}
################################################################
read_vcd, report_activity_annotation resolves #162 resolves $158 commit 02be8357f8ba158292faab0e8d8b8d220e69c842 Author: James Cherry <cherry@parallaxsw.com> Date: Wed Jan 15 15:59:20 2025 -0700 sort regressions Signed-off-by: James Cherry <cherry@parallaxsw.com> commit b0e1d863d34853b70d342c6bb0baa400a08db207 Author: James Cherry <cherry@parallaxsw.com> Date: Wed Jan 15 15:44:07 2025 -0700 PowerResult::incf* Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 23ed0ed05d8bbf83cc5b6fa7598f1253cbe2b222 Author: James Cherry <cherry@parallaxsw.com> Date: Sun Jan 12 17:49:24 2025 -0700 gzip vcd/saif Signed-off-by: James Cherry <cherry@parallaxsw.com> commit a5a1a7b80e00b2deb51505b2e60312e3c29284fe Author: James Cherry <cherry@parallaxsw.com> Date: Sun Jan 12 17:12:09 2025 -0700 report_activity_annotation sort pins Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 6c149cc6d66addda4eee5f56dbe4731876f1efa9 Author: James Cherry <cherry@parallaxsw.com> Date: Sun Jan 12 16:47:02 2025 -0700 vcd/saif do not annotate internal pins Signed-off-by: James Cherry <cherry@parallaxsw.com> commit fe8c7c7fc7b2878cb16c7d2a57e1161555f9a36f Author: James Cherry <cherry@parallaxsw.com> Date: Sat Jan 11 17:09:22 2025 -0700 report_activity_annotation Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 8a8f87ba05c6c6f31017288d573c23e92cac4f9e Author: James Cherry <cherry@parallaxsw.com> Date: Fri Jan 10 11:57:22 2025 -0700 ReadVcdActivies factor VcdCountReader Signed-off-by: James Cherry <cherry@parallaxsw.com> commit aa70ae987c4a749e53ae2f93c8ff04a3c28b0b08 Author: James Cherry <cherry@parallaxsw.com> Date: Fri Jan 10 09:06:09 2025 -0700 vcd high time Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 242493e992949ee72493f4f15a0fe92630ad2f03 Author: James Cherry <cherry@parallaxsw.com> Date: Thu Jan 9 17:14:02 2025 -0700 comment Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 8621a83d7abf5efcf54c24a1a16bba0c8eb5e441 Author: James Cherry <cherry@parallaxsw.com> Date: Thu Jan 9 17:11:22 2025 -0700 ReadVcdActivities rm sta_ Signed-off-by: James Cherry <cherry@parallaxsw.com> commit fc0327c39c5aef6d09580795f6a13abf9b9f8266 Author: James Cherry <cherry@parallaxsw.com> Date: Thu Jan 9 09:36:30 2025 -0700 var name Signed-off-by: James Cherry <cherry@parallaxsw.com> commit a5b6e2ac66cef9355a9a87edcc185b483f5781ce Author: James Cherry <cherry@parallaxsw.com> Date: Thu Jan 9 08:23:50 2025 -0700 vcd passes Signed-off-by: James Cherry <cherry@parallaxsw.com> commit c0f6d268542b3dd431882cfa4e3d131d6d2fb933 Author: James Cherry <cherry@parallaxsw.com> Date: Wed Jan 8 20:19:27 2025 -0700 vcd Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 8181e206ee39e4c3fdd69ef1d3463092763c3d2b Author: James Cherry <cherry@parallaxsw.com> Date: Wed Jan 8 19:41:59 2025 -0700 vcd debug Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 652736654b853d1f7fb64545c6a48500e1e3b83f Author: James Cherry <cherry@parallaxsw.com> Date: Wed Jan 8 19:17:06 2025 -0700 vcd bus support Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 03c877512d92b0148fd62cbc636da58ef6fb25ff Author: James Cherry <cherry@parallaxsw.com> Date: Wed Jan 8 19:11:21 2025 -0700 vcd Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 53bbd97a28d619ca87a546f34a3643c227b9df78 Author: James Cherry <cherry@parallaxsw.com> Date: Wed Jan 8 16:02:47 2025 -0700 rm Vcd structs, ReadVcdActivities -> VcdReader Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 745efff41221c3b06ba19931e4f8a58e5b0758ae Author: James Cherry <cherry@parallaxsw.com> Date: Wed Jan 8 15:46:49 2025 -0700 vcd skip hpins Signed-off-by: James Cherry <cherry@parallaxsw.com> commit a9a6177e8b671f0619809611984ed16f2d1a5b7a Author: James Cherry <cherry@parallaxsw.com> Date: Wed Jan 8 15:39:41 2025 -0700 ReadVcdActivies rm vcd_ Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 8b51b13b02c257d10385312d246e0da1f11b72f2 Author: James Cherry <cherry@parallaxsw.com> Date: Wed Jan 8 15:28:31 2025 -0700 power_vcd1 passes Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 744669797d1a4189c417d9d2f359cbd1f5bc7113 Author: James Cherry <cherry@parallaxsw.com> Date: Wed Jan 8 10:16:35 2025 -0700 vcd Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 0f0aeac1cd8349302b758ce4b79fd753063565f2 Author: James Cherry <cherry@parallaxsw.com> Date: Mon Jan 6 16:20:13 2025 -0800 vcd reader Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 01d296ce9b3ad8ac7e6dddf28a41a718b4138869 Author: James Cherry <cherry@parallaxsw.com> Date: Sun Jan 5 16:08:41 2025 -0800 vcd rm max_var_width Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 9ffdb19074e5c38464b88ead0ec751ae7d3c506c Author: James Cherry <cherry@parallaxsw.com> Date: Sun Jan 5 16:03:06 2025 -0800 vcd rm max_var_name_length_ Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 5c577143d4a166bd133a9d97d1761b52b8e122dd Author: James Cherry <cherry@parallaxsw.com> Date: Sun Jan 5 15:58:29 2025 -0800 ReadVcdActivities isa VcdReader Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 6914405d0799b967a92634fe1aa251aaea4cdfbc Author: James Cherry <cherry@parallaxsw.com> Date: Sat Jan 4 17:24:57 2025 -0800 vcd parse rm StaState dependence Signed-off-by: James Cherry <cherry@parallaxsw.com> commit a0bd7aa5eee2e87c883776bf4840d117335e4a8b Author: James Cherry <cherry@parallaxsw.com> Date: Sat Jan 4 16:41:55 2025 -0800 vcd headers Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 4842d19d7a5c47d6ee46f297cb9404ab77fe2662 Author: James Cherry <cherry@parallaxsw.com> Date: Sat Jan 4 15:59:46 2025 -0800 refactor vcd parser Signed-off-by: James Cherry <cherry@parallaxsw.com> Signed-off-by: James Cherry <cherry@parallaxsw.com>
2025-01-16 00:20:21 +01:00
define_cmd_args "report_activity_annotation" { [-report_unannotated] \
[-report_annotated] }
proc_redirect report_activity_annotation {
parse_key_args "report_activity_annotation" args \
keys {} flags {-report_unannotated -report_annotated}
check_argc_eq0 "report_activity_annotation" $args
set report_unannotated [info exists flags(-report_unannotated)]
set report_annotated [info exists flags(-report_annotated)];
report_activity_annotation_cmd $report_unannotated $report_annotated
}
################################################################
2020-05-06 17:09:15 +02:00
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] } {
2020-12-26 01:55:46 +01:00
report_line "[get_full_name $inst] $internal $switching $leakage"
2020-05-06 17:09:15 +02:00
break
}
}
}
2018-11-26 18:15:52 +01:00
# sta namespace end.
}