From 50dda7ae2f032ca0c6cc0d1f452a42d16fe04d51 Mon Sep 17 00:00:00 2001 From: Natalia Date: Mon, 24 Nov 2025 01:25:21 -0800 Subject: [PATCH 1/7] Report power as JSON --- power/Power.tcl | 109 +++++++++++++++++++++++++++++---------- tcl/Util.tcl | 11 ++++ test/power_json.ok | 85 ++++++++++++++++++++++++++++++ test/power_json.tcl | 14 +++++ test/regression_vars.tcl | 4 ++ 5 files changed, 197 insertions(+), 26 deletions(-) create mode 100644 test/power_json.ok create mode 100644 test/power_json.tcl diff --git a/power/Power.tcl b/power/Power.tcl index 420a97a99..7746e1027 100644 --- a/power/Power.tcl +++ b/power/Power.tcl @@ -35,13 +35,14 @@ define_cmd_args "report_power" \ [-highest_power_instances count]\ [-corner corner]\ [-digits digits]\ + [-format format]\ [> filename] [>> filename] } proc_redirect report_power { global sta_report_default_digits parse_key_args "report_power" args \ - keys {-instances -highest_power_instances -corner -digits} flags {} + keys {-instances -highest_power_instances -corner -digits -format} flags {} check_argc_eq0 "report_power" $args @@ -56,16 +57,23 @@ proc_redirect report_power { } set corner [parse_corner keys] + if { ![info exists keys(-format)] } { + set keys(-format) "text" + } + if { $keys(-format) != "text" && $keys(-format) != "json" } { + sta_error 311 "unknown power report -format $keys(-format)" + } + if { [info exists keys(-instances)] } { set insts [get_instances_error "-instances" $keys(-instances)] - report_power_insts $insts $corner $digits + report_power_insts $insts $corner $digits $keys(-format) } elseif { [info exists keys(-highest_power_instances)] } { set count $keys(-highest_power_instances) check_positive_integer "-highest_power_instances" $count set insts [highest_power_instances $count $corner] - report_power_insts $insts $corner $digits + report_power_insts $insts $corner $digits $keys(-format) } else { - report_power_design $corner $digits + report_power_design $corner $digits $keys(-format) } } @@ -79,7 +87,7 @@ proc liberty_libraries_exist {} { return $have_liberty } -proc report_power_design { corner digits } { +proc report_power_design { corner digits {report_format "text"} } { set power_result [design_power $corner] set totals [lrange $power_result 0 3] set sequential [lrange $power_result 4 7] @@ -90,18 +98,29 @@ proc report_power_design { corner digits } { lassign $totals design_internal design_switching design_leakage design_total 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 - 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 - 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 - - 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]" + if { $report_format == "text" } { + report_power_title5 "Group" "Internal" "Switching" "Leakage" "Total" $field_width + report_power_title5_units " " "Power" "Power" "Power" "Power" "(Watts)" $field_width + report_title_dashes5 $field_width + } elseif { $report_format == "json" } { + report_line "\{" + } + + set last_row_var "" + report_power_row "Sequential" $sequential $design_total $field_width $digits $report_format last_row_var + report_power_row "Combinational" $combinational $design_total $field_width $digits $report_format last_row_var + report_power_row "Clock" $clock $design_total $field_width $digits $report_format last_row_var + report_power_row "Macro" $macro $design_total $field_width $digits $report_format last_row_var + report_power_row "Pad" $pad $design_total $field_width $digits $report_format last_row_var + if { $report_format == "text" } { + report_title_dashes5 $field_width + } + report_power_row "Total" $power_result $design_total $field_width $digits $report_format last_row_var + if { $report_format == "text" } { + 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]" + } elseif { $report_format == "json" } { + report_line "\}" + } } proc max { x y } { @@ -146,14 +165,28 @@ proc report_title_dashes { count } { report_line $line } -proc report_power_row { type row_result design_total field_width digits } { +proc report_power_row { type row_result design_total field_width digits {report_format "text"} {last_row_var ""} } { lassign $row_result internal switching leakage total if { $design_total == 0.0 || [is_nan $design_total] } { set percent 0.0 } else { set percent [expr $total / $design_total * 100] } - 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]%" + if { "$report_format" == "json" } { + upvar_opt 1 $last_row_var last_row + if { $last_row != "" } { + report_line " ," + } + report_line " \"$type\": {" + report_line " \"internal\":[power_col $internal $field_width $digits]," + report_line " \"switching\":[power_col $switching $field_width $digits]," + report_line " \"leakage\":[power_col $leakage $field_width $digits]," + report_line " \"total\":[power_col $total $field_width $digits]" + report_line " }" + set last_row $type + } else { + 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]%" + } } proc is_nan { str } { @@ -185,7 +218,7 @@ proc report_power_line { type pwr digits } { } } -proc report_power_insts { insts corner digits } { +proc report_power_insts { insts corner digits {report_format "text"} } { set inst_pwrs {} foreach inst $insts { set power_result [instance_power $inst $corner] @@ -195,14 +228,23 @@ proc report_power_insts { insts corner digits } { 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 - report_title_dashes4 $field_width + if { $report_format == "text" } { + report_power_title4 "Internal" "Switching" "Leakage" "Total" $field_width + report_power_title4_units "Power" "Power" "Power" "Power" "(Watts)" $field_width + report_title_dashes4 $field_width + } else { + report_line {[} + } + set last_inst_var "" foreach inst_pwr $inst_pwrs { set inst [lindex $inst_pwr 0] set power [lindex $inst_pwr 1] - report_power_inst $inst $power $field_width $digits + report_power_inst $inst $power $field_width $digits $report_format last_inst_var + } + + if { $report_format == "json" } { + report_line {]} } } @@ -220,9 +262,24 @@ proc inst_pwr_cmp { inst_pwr1 inst_pwr2 } { } } -proc report_power_inst { inst power_result field_width digits } { +proc report_power_inst { inst power_result field_width digits {report_format "text"} {last_inst_var ""}} { lassign $power_result internal switching leakage total - 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]" + if { $report_format == "json" } { + upvar_opt 1 $last_inst_var last_inst + if { $last_inst != "" } { + report_line "," + } + report_line "{" + report_line " \"name\": \"[get_full_name $inst]\"," + report_line " \"internal\":[power_col $internal $field_width $digits]," + report_line " \"switching\":[power_col $switching $field_width $digits]," + report_line " \"leakage\":[power_col $leakage $field_width $digits]," + report_line " \"total\":[power_col $total $field_width $digits]" + report_line "}" + set last_inst $inst + } elseif { $report_format == "text" } { + 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]" + } } ################################################################ diff --git a/tcl/Util.tcl b/tcl/Util.tcl index 0cb2083bf..ad47cdce2 100644 --- a/tcl/Util.tcl +++ b/tcl/Util.tcl @@ -185,6 +185,17 @@ proc define_hidden_cmd_args { cmd arglist } { namespace export $cmd } +# "Optional Upvar" +# If $other_var is not empty, the upvar is executed. +# Otherwise, $my_var is set to empty. +proc upvar_opt { level other_var my_var } { + if { $other_var != "" } { + uplevel 1 "upvar $level $other_var $my_var" + } else { + uplevel 1 "set $my_var \"\"" + } +} + ################################################################ proc sta_warn { msg_id msg } { diff --git a/test/power_json.ok b/test/power_json.ok new file mode 100644 index 000000000..85968ffcb --- /dev/null +++ b/test/power_json.ok @@ -0,0 +1,85 @@ +Warning: ../examples/gcd_sky130hd.v line 527, module sky130_fd_sc_hd__tapvpwrvgnd_1 not found. Creating black box for TAP_11. +{ + "Sequential": { + "internal": 3.0660e-04, + "switching": 4.7564e-05, + "leakage": 2.9607e-10, + "total": 3.5417e-04 + } + , + "Combinational": { + "internal": 1.5871e-04, + "switching": 2.0511e-04, + "leakage": 6.8590e-10, + "total": 3.6381e-04 + } + , + "Clock": { + "internal": 4.6828e-05, + "switching": 1.2049e-04, + "leakage": 2.3004e-11, + "total": 1.6732e-04 + } + , + "Macro": { + "internal": 0.0000e+00, + "switching": 0.0000e+00, + "leakage": 0.0000e+00, + "total": 0.0000e+00 + } + , + "Pad": { + "internal": 0.0000e+00, + "switching": 0.0000e+00, + "leakage": 0.0000e+00, + "total": 0.0000e+00 + } + , + "Total": { + "internal": 5.1214e-04, + "switching": 3.7316e-04, + "leakage": 1.0050e-09, + "total": 8.8530e-04 + } +} +[ +{ + "name": "clkbuf_2_3__f_clk", + "internal": 9.3880e-06, + "switching": 2.5721e-05, + "leakage": 4.6007e-12, + "total": 3.5109e-05 +} +, +{ + "name": "clkbuf_2_0__f_clk", + "internal": 9.3814e-06, + "switching": 2.5163e-05, + "leakage": 4.6007e-12, + "total": 3.4544e-05 +} +, +{ + "name": "clkbuf_2_1__f_clk", + "internal": 9.3672e-06, + "switching": 2.3965e-05, + "leakage": 4.6007e-12, + "total": 3.3332e-05 +} +, +{ + "name": "clkbuf_2_2__f_clk", + "internal": 9.3592e-06, + "switching": 2.3293e-05, + "leakage": 4.6007e-12, + "total": 3.2652e-05 +} +, +{ + "name": "clkbuf_0_clk", + "internal": 9.3319e-06, + "switching": 2.2346e-05, + "leakage": 4.6007e-12, + "total": 3.1678e-05 +} +] diff --git a/test/power_json.tcl b/test/power_json.tcl new file mode 100644 index 000000000..65aef4506 --- /dev/null +++ b/test/power_json.tcl @@ -0,0 +1,14 @@ +# report_power gcd +set sta_report_default_digits 4 +read_liberty ../examples/sky130hd_tt.lib.gz +read_verilog ../examples/gcd_sky130hd.v +link_design gcd + +read_sdc ../examples/gcd_sky130hd.sdc +set_propagated_clock clk +read_spef ../examples/gcd_sky130hd.spef +set_power_activity -input -activity .1 +set_power_activity -input_port reset -activity 0 + +report_power -format json +report_power -format json -instances "[get_cells -filter "name=~clkbuf*"]" diff --git a/test/regression_vars.tcl b/test/regression_vars.tcl index f3eb42e97..47439b37c 100644 --- a/test/regression_vars.tcl +++ b/test/regression_vars.tcl @@ -154,7 +154,11 @@ record_sta_tests { package_require path_group_names prima3 +<<<<<<< HEAD report_checks_sorted +======= + power_json +>>>>>>> a4e3726b (JSON power reports) report_checks_src_attr report_json1 report_json2 From d5f8fc72555b645b88c603137460c3ff2305cefa Mon Sep 17 00:00:00 2001 From: nataliakokoromyti <126305457+nataliakokoromyti@users.noreply.github.com> Date: Tue, 16 Dec 2025 11:03:06 -0800 Subject: [PATCH 2/7] Update Power.tcl refactor: separate JSON and text output functions --- power/Power.tcl | 184 ++++++++++++++++++++++++++++-------------------- 1 file changed, 106 insertions(+), 78 deletions(-) diff --git a/power/Power.tcl b/power/Power.tcl index 7746e1027..977695016 100644 --- a/power/Power.tcl +++ b/power/Power.tcl @@ -57,23 +57,37 @@ proc_redirect report_power { } set corner [parse_corner keys] - if { ![info exists keys(-format)] } { - set keys(-format) "text" - } - if { $keys(-format) != "text" && $keys(-format) != "json" } { - sta_error 311 "unknown power report -format $keys(-format)" + if { [info exists keys(-format)] } { + set format $keys(-format) + if { $format != "text" && $format != "json" } { + sta_error 311 "unknown power report -format $format" + } + } else { + set format "text" } if { [info exists keys(-instances)] } { set insts [get_instances_error "-instances" $keys(-instances)] - report_power_insts $insts $corner $digits $keys(-format) + if { $format == "json" } { + report_power_insts_json $insts $corner $digits + } else { + report_power_insts $insts $corner $digits + } } elseif { [info exists keys(-highest_power_instances)] } { set count $keys(-highest_power_instances) check_positive_integer "-highest_power_instances" $count set insts [highest_power_instances $count $corner] - report_power_insts $insts $corner $digits $keys(-format) + if { $format == "json" } { + report_power_insts_json $insts $corner $digits + } else { + report_power_insts $insts $corner $digits + } } else { - report_power_design $corner $digits $keys(-format) + if { $format == "json" } { + report_power_design_json $corner $digits + } else { + report_power_design $corner $digits + } } } @@ -87,7 +101,7 @@ proc liberty_libraries_exist {} { return $have_liberty } -proc report_power_design { corner digits {report_format "text"} } { +proc report_power_design { corner digits } { set power_result [design_power $corner] set totals [lrange $power_result 0 3] set sequential [lrange $power_result 4 7] @@ -98,29 +112,47 @@ proc report_power_design { corner digits {report_format "text"} } { lassign $totals design_internal design_switching design_leakage design_total set field_width [max [expr $digits + 6] 10] - if { $report_format == "text" } { - report_power_title5 "Group" "Internal" "Switching" "Leakage" "Total" $field_width - report_power_title5_units " " "Power" "Power" "Power" "Power" "(Watts)" $field_width - report_title_dashes5 $field_width - } elseif { $report_format == "json" } { - report_line "\{" - } - - set last_row_var "" - report_power_row "Sequential" $sequential $design_total $field_width $digits $report_format last_row_var - report_power_row "Combinational" $combinational $design_total $field_width $digits $report_format last_row_var - report_power_row "Clock" $clock $design_total $field_width $digits $report_format last_row_var - report_power_row "Macro" $macro $design_total $field_width $digits $report_format last_row_var - report_power_row "Pad" $pad $design_total $field_width $digits $report_format last_row_var - if { $report_format == "text" } { - report_title_dashes5 $field_width - } - report_power_row "Total" $power_result $design_total $field_width $digits $report_format last_row_var - if { $report_format == "text" } { - 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]" - } elseif { $report_format == "json" } { - report_line "\}" - } + report_power_title5 "Group" "Internal" "Switching" "Leakage" "Total" $field_width + report_power_title5_units " " "Power" "Power" "Power" "Power" "(Watts)" $field_width + 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 + 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 + + 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]" +} + +proc report_power_design_json { corner digits } { + set power_result [design_power $corner] + 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] + + report_line "\{" + report_power_row_json "Sequential" $sequential $digits "," + report_power_row_json "Combinational" $combinational $digits "," + report_power_row_json "Clock" $clock $digits "," + report_power_row_json "Macro" $macro $digits "," + report_power_row_json "Pad" $pad $digits "," + report_power_row_json "Total" $totals $digits "" + report_line "\}" +} + +proc report_power_row_json { name row_result digits separator } { + lassign $row_result internal switching leakage total + report_line " \"$name\": \{" + report_line " \"internal\": [format %.${digits}e $internal]," + report_line " \"switching\": [format %.${digits}e $switching]," + report_line " \"leakage\": [format %.${digits}e $leakage]," + report_line " \"total\": [format %.${digits}e $total]" + report_line " \}$separator" } proc max { x y } { @@ -165,28 +197,14 @@ proc report_title_dashes { count } { report_line $line } -proc report_power_row { type row_result design_total field_width digits {report_format "text"} {last_row_var ""} } { +proc report_power_row { type row_result design_total field_width digits } { lassign $row_result internal switching leakage total if { $design_total == 0.0 || [is_nan $design_total] } { set percent 0.0 } else { set percent [expr $total / $design_total * 100] } - if { "$report_format" == "json" } { - upvar_opt 1 $last_row_var last_row - if { $last_row != "" } { - report_line " ," - } - report_line " \"$type\": {" - report_line " \"internal\":[power_col $internal $field_width $digits]," - report_line " \"switching\":[power_col $switching $field_width $digits]," - report_line " \"leakage\":[power_col $leakage $field_width $digits]," - report_line " \"total\":[power_col $total $field_width $digits]" - report_line " }" - set last_row $type - } else { - 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]%" - } + 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]%" } proc is_nan { str } { @@ -218,7 +236,7 @@ proc report_power_line { type pwr digits } { } } -proc report_power_insts { insts corner digits {report_format "text"} } { +proc report_power_insts { insts corner digits } { set inst_pwrs {} foreach inst $insts { set power_result [instance_power $inst $corner] @@ -228,24 +246,49 @@ proc report_power_insts { insts corner digits {report_format "text"} } { set field_width [max [expr $digits + 6] 10] - if { $report_format == "text" } { - report_power_title4 "Internal" "Switching" "Leakage" "Total" $field_width - report_power_title4_units "Power" "Power" "Power" "Power" "(Watts)" $field_width - report_title_dashes4 $field_width - } else { - report_line {[} - } + report_power_title4 "Internal" "Switching" "Leakage" "Total" $field_width + report_power_title4_units "Power" "Power" "Power" "Power" "(Watts)" $field_width + report_title_dashes4 $field_width - set last_inst_var "" foreach inst_pwr $inst_pwrs { set inst [lindex $inst_pwr 0] set power [lindex $inst_pwr 1] - report_power_inst $inst $power $field_width $digits $report_format last_inst_var + report_power_inst $inst $power $field_width $digits } - - if { $report_format == "json" } { - report_line {]} +} + +proc report_power_insts_json { 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] + + report_line "\[" + set first 1 + foreach inst_pwr $inst_pwrs { + set inst [lindex $inst_pwr 0] + set power [lindex $inst_pwr 1] + if { !$first } { + report_line "," + } + set first 0 + report_power_inst_json $inst $power $digits + } + report_line "\]" +} + +proc report_power_inst_json { inst power digits } { + lassign $power internal switching leakage total + set inst_name [get_full_name $inst] + report_line "\{" + report_line " \"name\": \"$inst_name\"," + report_line " \"internal\": [format %.${digits}e $internal]," + report_line " \"switching\": [format %.${digits}e $switching]," + report_line " \"leakage\": [format %.${digits}e $leakage]," + report_line " \"total\": [format %.${digits}e $total]" + report_line "\}" } proc inst_pwr_cmp { inst_pwr1 inst_pwr2 } { @@ -262,24 +305,9 @@ proc inst_pwr_cmp { inst_pwr1 inst_pwr2 } { } } -proc report_power_inst { inst power_result field_width digits {report_format "text"} {last_inst_var ""}} { +proc report_power_inst { inst power_result field_width digits } { lassign $power_result internal switching leakage total - if { $report_format == "json" } { - upvar_opt 1 $last_inst_var last_inst - if { $last_inst != "" } { - report_line "," - } - report_line "{" - report_line " \"name\": \"[get_full_name $inst]\"," - report_line " \"internal\":[power_col $internal $field_width $digits]," - report_line " \"switching\":[power_col $switching $field_width $digits]," - report_line " \"leakage\":[power_col $leakage $field_width $digits]," - report_line " \"total\":[power_col $total $field_width $digits]" - report_line "}" - set last_inst $inst - } elseif { $report_format == "text" } { - 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]" - } + 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]" } ################################################################ From bf0ab698fefaf65cb88b4a2c0baee08511840f3f Mon Sep 17 00:00:00 2001 From: nataliakokoromyti <126305457+nataliakokoromyti@users.noreply.github.com> Date: Tue, 16 Dec 2025 12:25:06 -0800 Subject: [PATCH 3/7] Remove helper upvar_opt --- tcl/Util.tcl | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/tcl/Util.tcl b/tcl/Util.tcl index ad47cdce2..0cb2083bf 100644 --- a/tcl/Util.tcl +++ b/tcl/Util.tcl @@ -185,17 +185,6 @@ proc define_hidden_cmd_args { cmd arglist } { namespace export $cmd } -# "Optional Upvar" -# If $other_var is not empty, the upvar is executed. -# Otherwise, $my_var is set to empty. -proc upvar_opt { level other_var my_var } { - if { $other_var != "" } { - uplevel 1 "upvar $level $other_var $my_var" - } else { - uplevel 1 "set $my_var \"\"" - } -} - ################################################################ proc sta_warn { msg_id msg } { From 907388d3b72cae69603bc2d3659bd0b2fd63932e Mon Sep 17 00:00:00 2001 From: nataliakokoromyti <126305457+nataliakokoromyti@users.noreply.github.com> Date: Tue, 16 Dec 2025 12:32:36 -0800 Subject: [PATCH 4/7] Update power_json.ok --- test/power_json.ok | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/test/power_json.ok b/test/power_json.ok index 85968ffcb..aa506d6ef 100644 --- a/test/power_json.ok +++ b/test/power_json.ok @@ -5,36 +5,31 @@ Warning: ../examples/gcd_sky130hd.v line 527, module sky130_fd_sc_hd__tapvpwrvgn "switching": 4.7564e-05, "leakage": 2.9607e-10, "total": 3.5417e-04 - } - , + }, "Combinational": { "internal": 1.5871e-04, "switching": 2.0511e-04, "leakage": 6.8590e-10, "total": 3.6381e-04 - } - , + }, "Clock": { "internal": 4.6828e-05, "switching": 1.2049e-04, "leakage": 2.3004e-11, "total": 1.6732e-04 - } - , + }, "Macro": { "internal": 0.0000e+00, "switching": 0.0000e+00, "leakage": 0.0000e+00, "total": 0.0000e+00 - } - , + }, "Pad": { "internal": 0.0000e+00, "switching": 0.0000e+00, "leakage": 0.0000e+00, "total": 0.0000e+00 - } - , + }, "Total": { "internal": 5.1214e-04, "switching": 3.7316e-04, From 2e8b33853ab7bdd11e7977b4eec7b2957cdca346 Mon Sep 17 00:00:00 2001 From: nataliakokoromyti <126305457+nataliakokoromyti@users.noreply.github.com> Date: Tue, 16 Dec 2025 12:38:45 -0800 Subject: [PATCH 5/7] Update Power.tcl --- power/Power.tcl | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/power/Power.tcl b/power/Power.tcl index 977695016..279cb932f 100644 --- a/power/Power.tcl +++ b/power/Power.tcl @@ -266,20 +266,22 @@ proc report_power_insts_json { insts corner digits } { set inst_pwrs [lsort -command inst_pwr_cmp $inst_pwrs] report_line "\[" - set first 1 + set count [llength $inst_pwrs] + set index 0 foreach inst_pwr $inst_pwrs { set inst [lindex $inst_pwr 0] set power [lindex $inst_pwr 1] - if { !$first } { - report_line "," + incr index + if { $index < $count } { + report_power_inst_json $inst $power $digits "," + } else { + report_power_inst_json $inst $power $digits "" } - set first 0 - report_power_inst_json $inst $power $digits } report_line "\]" } -proc report_power_inst_json { inst power digits } { +proc report_power_inst_json { inst power digits separator } { lassign $power internal switching leakage total set inst_name [get_full_name $inst] report_line "\{" @@ -288,7 +290,7 @@ proc report_power_inst_json { inst power digits } { report_line " \"switching\": [format %.${digits}e $switching]," report_line " \"leakage\": [format %.${digits}e $leakage]," report_line " \"total\": [format %.${digits}e $total]" - report_line "\}" + report_line "\}$separator" } proc inst_pwr_cmp { inst_pwr1 inst_pwr2 } { From bc41bd5e513991e49a3530dff8d685c771102f30 Mon Sep 17 00:00:00 2001 From: nataliakokoromyti <126305457+nataliakokoromyti@users.noreply.github.com> Date: Tue, 16 Dec 2025 12:41:09 -0800 Subject: [PATCH 6/7] Update power_json.ok --- test/power_json.ok | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/test/power_json.ok b/test/power_json.ok index aa506d6ef..602868fcc 100644 --- a/test/power_json.ok +++ b/test/power_json.ok @@ -44,32 +44,28 @@ Warning: ../examples/gcd_sky130hd.v line 527, module sky130_fd_sc_hd__tapvpwrvgn "switching": 2.5721e-05, "leakage": 4.6007e-12, "total": 3.5109e-05 -} -, +}, { "name": "clkbuf_2_0__f_clk", "internal": 9.3814e-06, "switching": 2.5163e-05, "leakage": 4.6007e-12, "total": 3.4544e-05 -} -, +}, { "name": "clkbuf_2_1__f_clk", "internal": 9.3672e-06, "switching": 2.3965e-05, "leakage": 4.6007e-12, "total": 3.3332e-05 -} -, +}, { "name": "clkbuf_2_2__f_clk", "internal": 9.3592e-06, "switching": 2.3293e-05, "leakage": 4.6007e-12, "total": 3.2652e-05 -} -, +}, { "name": "clkbuf_0_clk", "internal": 9.3319e-06, From b1eeb974bb19ca33eb2e3805fa744c15fa959991 Mon Sep 17 00:00:00 2001 From: nataliakokoromyti <126305457+nataliakokoromyti@users.noreply.github.com> Date: Tue, 16 Dec 2025 12:45:00 -0800 Subject: [PATCH 7/7] Update regression_vars.tcl --- test/regression_vars.tcl | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/regression_vars.tcl b/test/regression_vars.tcl index 47439b37c..6641afc3c 100644 --- a/test/regression_vars.tcl +++ b/test/regression_vars.tcl @@ -154,11 +154,8 @@ record_sta_tests { package_require path_group_names prima3 -<<<<<<< HEAD report_checks_sorted -======= power_json ->>>>>>> a4e3726b (JSON power reports) report_checks_src_attr report_json1 report_json2