From 7d6c70c6f8e659d4f6cccdd85f6edc5c7d337ac8 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Fri, 25 Dec 2020 16:55:46 -0800 Subject: [PATCH] puts -> report_line --- dcalc/DelayCalc.tcl | 19 ++++--- include/sta/Report.hh | 4 +- tcl/Cmds.tcl | 18 +++---- tcl/Graph.tcl | 46 ++++++++-------- tcl/Network.tcl | 122 +++++++++++++++++++++--------------------- tcl/Power.tcl | 48 ++++++----------- tcl/Sdc.tcl | 10 ++-- tcl/Search.tcl | 60 ++++++++++----------- tcl/Splash.tcl | 6 +-- tcl/Sta.tcl | 62 ++++++--------------- tcl/StaTcl.i | 17 +++--- tcl/Util.tcl | 12 ++--- util/Report.cc | 7 +++ 13 files changed, 200 insertions(+), 231 deletions(-) diff --git a/dcalc/DelayCalc.tcl b/dcalc/DelayCalc.tcl index 80e9c6b3..c2563711 100644 --- a/dcalc/DelayCalc.tcl +++ b/dcalc/DelayCalc.tcl @@ -82,10 +82,10 @@ proc report_edge_dcalc { edge corner min_max digits } { # Filter timing checks based on min_max. if {!(($min_max == "max" && $role == "hold") \ || ($min_max=="min" && $role=="setup"))} { - puts "Library: [get_name $library]" - puts "Cell: [get_name $cell]" - puts "Arc sense: [$edge sense]" - puts "Arc type: $role" + report_line "Library: [get_name $library]" + report_line "Cell: [get_name $cell]" + report_line "Arc sense: [$edge sense]" + report_line "Arc type: $role" set arc_iter [$edge timing_arc_iterator] while {[$arc_iter has_next]} { @@ -94,15 +94,14 @@ proc report_edge_dcalc { edge corner min_max digits } { set from_rf [$arc from_trans] set to [get_name [$to_pin port]] set to_rf [$arc to_trans] - puts "$from $from_rf -> $to $to_rf" - puts -nonewline [report_delay_calc_cmd $edge $arc $corner $min_max $digits] + report_line "$from $from_rf -> $to $to_rf" + report_line [report_delay_calc_cmd $edge $arc $corner $min_max $digits] if { [$edge delay_annotated $arc $corner $min_max] } { set delay [$edge arc_delay $arc $corner $min_max] - puts "Annotated value = [format_time $delay $digits]" + report_line "Annotated value = [format_time $delay $digits]" } - puts "" - puts "............................................." - puts "" + report_line "............................................." + report_line "" } $arc_iter finish } diff --git a/include/sta/Report.hh b/include/sta/Report.hh index 7cbad366..dcdb96ad 100644 --- a/include/sta/Report.hh +++ b/include/sta/Report.hh @@ -38,7 +38,7 @@ public: Report(); virtual ~Report(); - // Primitives to print output. + // Primitive to print output. // Return the number of characters written. virtual size_t printString(const char *buffer, size_t length); @@ -47,6 +47,8 @@ public: va_list args); void print(const string *str); void print(const string &str); + // Print line with return. + virtual void printLine(const char *line); //////////////////////////////////////////////////////////////// diff --git a/tcl/Cmds.tcl b/tcl/Cmds.tcl index ca9819c7..d198178a 100644 --- a/tcl/Cmds.tcl +++ b/tcl/Cmds.tcl @@ -27,21 +27,21 @@ proc report_clock1 { clk } { if { [$clk waveform_valid] } { set digits $sta_report_default_digits - puts -nonewline [format "%-20s" [get_name $clk]] - puts -nonewline [format "%10s" [format_time [$clk period] $digits]] - puts -nonewline " " set waveform [$clk waveform] if { $waveform == {} } { - puts -nonewline " " + set wave " " } else { + set wave "" foreach edge $waveform { - puts -nonewline [format "%10s" [format_time $edge $digits]] + set wave "$wave[format "%10s" [format_time $edge $digits]]" } } if {[$clk is_generated]} { - puts -nonewline " (generated)" + set generated " (generated)" + } else { + set generated "" } - puts "" + report_line "[format %-20s [get_name $clk]][format %10s [format_time [$clk period] $digits]] $wave$generated" } } @@ -75,10 +75,10 @@ proc check_setup_cmd { cmd cmd_args } { $generated_clocks] foreach error $errors { # First line is the error msg. - puts [lindex $error 0] + report_line [lindex $error 0] if { $verbose } { foreach obj [lrange $error 1 end] { - puts " $obj" + report_line " $obj" } } } diff --git a/tcl/Graph.tcl b/tcl/Graph.tcl index e391394b..1af8436f 100644 --- a/tcl/Graph.tcl +++ b/tcl/Graph.tcl @@ -95,27 +95,25 @@ proc report_edges_ { vertex iter_proc wire_from_name_proc wire_to_name_proc } { proc report_edge_ { edge vertex_from_name_proc vertex_to_name_proc } { global sta_report_default_digits - puts -nonewline "[$vertex_from_name_proc [$edge from]] -> [$vertex_to_name_proc [$edge to]] [$edge role]" set latch_enable [$edge latch_d_to_q_en] if { $latch_enable != "" } { - puts " enable $latch_enable" - } else { - puts "" + set latch_enable " enable $latch_enable" } + report_line "[$vertex_from_name_proc [$edge from]] -> [$vertex_to_name_proc [$edge to]] [$edge role]$latch_enable" set disables [edge_disable_reason $edge] if { $disables != "" } { - puts " Disabled by $disables" + report_line " Disabled by $disables" } set cond [$edge cond] if { $cond != "" } { - puts " Condition: $cond" + report_line " Condition: $cond" } set mode_name [$edge mode_name] if { $mode_name != "" } { - puts " Mode: $mode_name [$edge mode_value]" + report_line " Mode: $mode_name [$edge mode_value]" } set iter [$edge timing_arc_iterator] @@ -127,7 +125,7 @@ proc report_edge_ { edge vertex_from_name_proc vertex_to_name_proc } { if { [timing_arc_disabled $edge $arc] } { set disable_reason " disabled" } - puts " [$arc from_trans] -> [$arc to_trans] $delays_fmt$disable_reason" + report_line " [$arc from_trans] -> [$arc to_trans] $delays_fmt$disable_reason" } $iter finish } @@ -217,16 +215,20 @@ proc report_constant { obj } { proc report_pin_constant { pin } { set sim_value [pin_sim_logic_value $pin] - puts -nonewline "[pin_property $pin lib_pin_name] $sim_value" + set case_value [pin_case_logic_value $pin] if { $case_value != "X" } { - puts -nonewline " case=$case_value" + set case " case=$case_value" + } else { + set case "" } set logic_value [pin_logic_value $pin] if { $logic_value != "X" } { - puts -nonewline " logic=$logic_value" + set logic " logic=$logic_value" + } else { + set logic "" } - puts "" + report_line "[pin_property $pin lib_pin_name] $sim_value$case$logic" } ################################################################ @@ -236,21 +238,21 @@ proc report_disabled_edges {} { if { [$edge role] == "wire" } { set from_pin_name [get_full_name [[$edge from] pin]] set to_pin_name [get_full_name [[$edge to] pin]] - puts -nonewline "$from_pin_name $to_pin_name" + report_line "$from_pin_name $to_pin_name [edge_disable_reason_verbose $edge]" } else { set from_pin [[$edge from] pin] set to_pin [[$edge to] pin] set inst_name [get_full_name [$from_pin instance]] set from_port_name [get_name [$from_pin port]] set to_port_name [get_name [$to_pin port]] - puts -nonewline "$inst_name $from_port_name $to_port_name" set cond [$edge cond] if { $cond != "" } { - puts -nonewline " when: $cond" + set when " when: $cond" + } else { + set when "" } + report_line "$inst_name $from_port_name $to_port_name$when [edge_disable_reason_verbose $edge]" } - set reason [edge_disable_reason_verbose $edge] - puts " $reason" } } @@ -297,7 +299,7 @@ proc report_slews { pin } { set pin1 [get_port_pin_error "pin" $pin] foreach vertex [$pin1 vertices] { - puts "[vertex_path_name $vertex] [rise_short_name] [format_times [$vertex slews rise] $sta_report_default_digits] [fall_short_name] [format_times [$vertex slews fall] $sta_report_default_digits]" + report_line "[vertex_path_name $vertex] [rise_short_name] [format_times [$vertex slews rise] $sta_report_default_digits] [fall_short_name] [format_times [$vertex slews fall] $sta_report_default_digits]" } } @@ -330,7 +332,7 @@ proc vertex_name_ { vertex pin pin_name } { proc hier_pins_crossed_by_edge { edge } { set from_pins [hier_pins_above [[$edge from] pin]] set to_pins [hier_pins_above [[$edge to] pin]] - foreach p $to_pins { puts [$p path_name] } + foreach p $to_pins { report_line [$p path_name] } while { [llength $from_pins] > 0 \ && [llength $to_pins] > 0 \ && [lindex $from_pins 0] == [lindex $to_pins 0] } { @@ -369,7 +371,7 @@ proc report_level { pin } { set pin1 [get_port_pin_error "pin" $pin] foreach vertex [$pin1 vertices] { if { $vertex != "NULL" } { - puts "[vertex_path_name $vertex] level = [$vertex level]" + report_line "[vertex_path_name $vertex] level = [$vertex level]" } } } @@ -392,9 +394,9 @@ proc report_level_distribution {} { } $iter finish - puts "level pin count" + report_line "level pin count" for { set level 0 } { $level < $max_level } { incr level } { - puts " $level $count($level)" + report_line " $level $count($level)" } } diff --git a/tcl/Network.tcl b/tcl/Network.tcl index 4cd7d1c1..c7c56ff0 100644 --- a/tcl/Network.tcl +++ b/tcl/Network.tcl @@ -62,11 +62,11 @@ proc report_instance1 { instance connections verbose } { } else { set inst_name [get_full_name $instance] } - puts "Instance $inst_name" + report_line "Instance $inst_name" set cell [instance_property $instance "cell"] - puts " Cell: [get_name $cell]" - puts " Library: [get_name [$cell library]]" - puts " Path cells: [instance_cell_path $instance]" + report_line " Cell: [get_name $cell]" + report_line " Library: [get_name [$cell library]]" + report_line " Path cells: [instance_cell_path $instance]" if { $connections } { report_instance_pins $instance $verbose } @@ -87,7 +87,7 @@ proc report_instance_pins { instance verbose } { proc report_instance_pins1 {instance verbose header header_optional dirs} { set header_shown 0 if { !$header_optional } { - puts $header + report_line $header set header_shown 1 } set iter [$instance pin_iterator] @@ -96,7 +96,7 @@ proc report_instance_pins1 {instance verbose header header_optional dirs} { set dir [pin_direction $pin] if { [lsearch $dirs $dir] != -1 } { if { !$header_shown } { - puts $header + report_line $header set header_shown 1 } report_instance_pin $pin $verbose @@ -106,22 +106,22 @@ proc report_instance_pins1 {instance verbose header header_optional dirs} { } proc report_instance_pin { pin verbose } { - puts -nonewline " [$pin port_name] [pin_direction $pin]" set net [$pin net] if { $net == "NULL" } { - puts " (unconnected)" + set net_name "(unconnected)" } else { - puts " [get_full_name [$net highest_connected_net]]" - if { $verbose } { - set pins [net_connected_pins_sorted $net] - foreach pin $pins { - if [$pin is_load] { - if [$pin is_top_level_port] { - puts " [get_full_name $pin] [pin_direction $pin] port" - } else { - puts " [get_full_name $pin] [pin_direction $pin]" - } - } + set net_name [get_full_name [$net highest_connected_net]] + } + report_line " [$pin port_name] [pin_direction $pin] $net_name" + if { $verbose && $net != "NULL" } { + set pins [net_connected_pins_sorted $net] + foreach pin $pins { + if [$pin is_load] { + if [$pin is_top_level_port] { + report_line " [get_full_name $pin] [pin_direction $pin] port" + } else { + report_line " [get_full_name $pin] [pin_direction $pin]" + } } } } @@ -142,9 +142,9 @@ proc instance_cell_path { instance } { proc report_instance_children_ { instance } { set children [instance_sorted_children $instance] if { $children != {} } { - puts " Children:" + report_line " Children:" foreach child $children { - puts " [get_name $child] ([instance_property $child ref_name])" + report_line " [get_name $child] ([instance_property $child ref_name])" } } } @@ -176,48 +176,48 @@ proc report_lib_cell_ { cell } { global sta_report_default_digits set lib [$cell liberty_library] - puts "Cell [get_name $cell]" - puts "Library [get_name $lib]" + report_line "Cell [get_name $cell]" + report_line "Library [get_name $lib]" set filename [liberty_cell_property $cell "filename"] if { $filename != "" } { - puts "File $filename" + report_line "File $filename" } set iter [$cell liberty_port_iterator] while {[$iter has_next]} { set port [$iter next] if { [$port is_bus] } { - puts -nonewline " [$port bus_name] [liberty_port_direction $port]" + set port_name [$port bus_name] } else { - puts -nonewline " [get_name $port] [liberty_port_direction $port]" + set port_name [get_name $port] } set enable [$port tristate_enable] if { $enable != "" } { - puts -nonewline " enable=$enable" + set enable " enable=$enable" } set func [$port function] if { $func != "" } { - puts -nonewline " function=$func" + set func " function=$func" } - puts [port_capacitance_str $port $sta_report_default_digits] + report_line " $port_name [liberty_port_direction $port]$enable$func[port_capacitance_str $port $sta_report_default_digits]" } $iter finish } proc report_cell_ { cell } { set lib [$cell library] - puts "Cell [get_name $cell]" - puts "Library [get_name $lib]" + report_line "Cell [get_name $cell]" + report_line "Library [get_name $lib]" set filename [liberty_cell_property $cell "filename"] if { $filename != "" } { - puts "File $filename" + report_line "File $filename" } set iter [$cell port_iterator] while {[$iter has_next]} { set port [$iter next] if { [$port is_bus] } { - puts " [$port bus_name] [port_direction $port]" + report_line " [$port bus_name] [port_direction $port]" } else { - puts " [get_name $port] [port_direction $port]" + report_line " [get_name $port] [port_direction $port]" } } $iter finish @@ -285,20 +285,20 @@ proc report_net_ { net } { } proc report_net1 { net connections verbose hier_pins corner digits } { - puts "Net [get_full_name $net]" + report_line "Net [get_full_name $net]" if {$connections} { set pins [net_connected_pins_sorted $net] if {$verbose} { report_net_caps $net $pins $corner $digits } - puts "Driver pins" + report_line "Driver pins" report_net_pins $pins "is_driver" $verbose $corner $digits - puts "" - puts "Load pins" + report_line "" + report_line "Load pins" report_net_pins $pins "is_load" $verbose $corner $digits if {$hier_pins} { - puts "" - puts "Hierarchical pins" + report_line "" + report_line "Hierarchical pins" report_net_pins $pins "is_hierarchical" $verbose $corner $digits } report_net_other_pins $pins $verbose $corner $digits @@ -336,10 +336,10 @@ proc report_net_caps { net pins corner digits } { incr load_count } } - puts " Number of drivers: $driver_count" - puts " Number of loads: $load_count" - puts " Number of pins: $pin_count" - puts "" + report_line " Number of drivers: $driver_count" + report_line " Number of loads: $load_count" + report_line " Number of pins: $pin_count" + report_line "" } proc report_net_cap { net caption cap_msg corner digits } { @@ -347,7 +347,7 @@ proc report_net_cap { net caption cap_msg corner digits } { set cap_r_max [$net $cap_msg "rise" $corner "max"] set cap_f_min [$net $cap_msg "fall" $corner "min"] set cap_f_max [$net $cap_msg "fall" $corner "max"] - puts " $caption capacitance: [capacitances_str $cap_r_min $cap_r_max $cap_f_min $cap_f_max $digits]" + report_line " $caption capacitance: [capacitances_str $cap_r_min $cap_r_max $cap_f_min $cap_f_max $digits]" } proc report_net_pins { pins pin_pred verbose corner digits } { @@ -363,8 +363,8 @@ proc report_net_other_pins { pins verbose corner digits } { foreach pin $pins { if { !([$pin is_driver] || [$pin is_load] || [$pin is_hierarchical]) } { if { !$header } { - puts "" - puts "Other pins" + report_line "" + report_line "Other pins" set header 1 } report_net_pin $pin $verbose $corner $digits @@ -375,16 +375,17 @@ proc report_net_other_pins { pins verbose corner digits } { proc report_net_pin { pin verbose corner digits } { if [$pin is_leaf] { set cell_name [get_name [[$pin instance] cell]] - puts -nonewline " [get_full_name $pin] [pin_direction $pin] ($cell_name)" + set cap "" if { $verbose } { set liberty_port [$pin liberty_port] if { $liberty_port != "NULL" } { - puts -nonewline [port_capacitance_str $liberty_port $digits] + set cap [port_capacitance_str $liberty_port $digits] } } - puts "[pin_location_str $pin]" + report_line " [get_full_name $pin] [pin_direction $pin] ($cell_name)$cap[pin_location_str $pin]" } elseif [$pin is_top_level_port] { - puts -nonewline " [get_full_name $pin] [pin_direction $pin] port" + set wire_cap "" + set pin_cap "" if { $verbose } { set port [$pin port] set cap_r_min [port_ext_wire_cap $port "rise" "min"] @@ -392,7 +393,7 @@ proc report_net_pin { pin verbose corner digits } { set cap_f_min [port_ext_wire_cap $port "fall" "min"] set cap_f_max [port_ext_wire_cap $port "fall" "max"] if { $cap_r_min > 0 || $cap_r_max > 0 || $cap_f_min > 0 || $cap_r_max > 0 } { - puts -nonewline " wire [capacitances_str $cap_r_min $cap_r_max $cap_f_min $cap_f_max $digits]" + set wire_cap " wire [capacitances_str $cap_r_min $cap_r_max $cap_f_min $cap_f_max $digits]" } set port [$pin port] @@ -401,12 +402,12 @@ proc report_net_pin { pin verbose corner digits } { set cap_f_min [port_ext_pin_cap $port "fall" "min"] set cap_f_max [port_ext_pin_cap $port "fall" "max"] if { $cap_r_min > 0 || $cap_r_max > 0 || $cap_f_min > 0 || $cap_r_max > 0} { - puts -nonewline " pin [capacitances_str $cap_r_min $cap_r_max $cap_f_min $cap_f_max $digits]" + set pin_cap " pin [capacitances_str $cap_r_min $cap_r_max $cap_f_min $cap_f_max $digits]" } } - puts "[pin_location_str $pin]" + report_line " [get_full_name $pin] [pin_direction $pin] port$wire_cap$pin_cap[pin_location_str $pin]" } elseif [$pin is_hierarchical] { - puts " [get_full_name $pin] [pin_direction $pin]" + report_line " [get_full_name $pin] [pin_direction $pin]" } } @@ -426,11 +427,11 @@ proc pin_location_str { pin } { proc report_pin_ { pin } { global sta_report_default_digits - puts -nonewline "Pin [get_full_name $pin] [pin_direction_desc $pin]" - set liberty_port [$pin liberty_port] if { $liberty_port != "NULL" } { - puts -nonewline [port_capacitance_str $liberty_port $sta_report_default_digits] + set cap [port_capacitance_str $liberty_port $sta_report_default_digits] + } else { + set cap "" } if { [$pin is_top_level_port] } { @@ -444,10 +445,11 @@ proc report_pin_ { pin } { set net [$pin net] } if { $net == "NULL" } { - puts " (unconnected)" + set net_name "(unconnected)" } else { - puts " [get_full_name [$net highest_connected_net]]" + set net_name [get_full_name [$net highest_connected_net]] } + report_line "Pin [get_full_name $pin] [pin_direction_desc $pin]$cap $net_name" } proc pin_direction_desc { pin } { diff --git a/tcl/Power.tcl b/tcl/Power.tcl index 014f6879..1d9106d5 100644 --- a/tcl/Power.tcl +++ b/tcl/Power.tcl @@ -69,11 +69,7 @@ proc report_power_design { corner digits } { report_title_dashes5 $field_width report_power_row "Total" $power_result $design_total $field_width $digits - puts -nonewline [format "%-20s" ""] - report_power_col_percent $design_internal $design_total $field_width - report_power_col_percent $design_switching $design_total $field_width - report_power_col_percent $design_leakage $design_total $field_width - puts "" + 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 max { x y } { @@ -85,15 +81,11 @@ proc max { x y } { } proc report_power_title5 { title1 title2 title3 title4 title5 field_width } { - puts -nonewline [format "%-20s" $title1] - report_power_title4 $title2 $title3 $title4 $title5 $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]" } proc report_power_title4 { title1 title2 title3 title4 field_width } { - puts -nonewline [format " %${field_width}s" $title1] - puts -nonewline [format " %${field_width}s" $title2] - puts -nonewline [format " %${field_width}s" $title3] - puts [format " %${field_width}s" $title4] + report_line " [format %${field_width}s $title1] [format %${field_width}s $title2] [format %${field_width}s $title3] [format %${field_width}s $title4]" } proc report_title_dashes5 { field_width } { @@ -107,10 +99,11 @@ proc report_title_dashes4 { field_width } { } proc report_title_dashes { count } { + set line "" for {set i 0} {$i < $count} {incr i} { - puts -nonewline "-" + set line "-$line" } - puts "" + report_line $line } proc report_power_row { type row_result design_total field_width digits } { @@ -120,40 +113,35 @@ proc report_power_row { type row_result design_total field_width digits } { } else { set percent [expr $total / $design_total * 100] } - puts -nonewline [format "%-20s" $type] - report_power_col $internal $field_width $digits - report_power_col $switching $field_width $digits - report_power_col $leakage $field_width $digits - report_power_col $total $field_width $digits - puts [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 } { return [string match "*NaN" $str] } -proc report_power_col { pwr field_width digits } { +proc power_col { pwr field_width digits } { if { [is_nan $pwr] } { - puts -nonewline [format " %${field_width}s" $pwr] + format " %${field_width}s" $pwr } else { - puts -nonewline [format " %$field_width.${digits}e" $pwr] + format " %$field_width.${digits}e" $pwr } } -proc report_power_col_percent { col_total total field_width } { +proc power_col_percent { col_total total field_width } { if { $total == 0.0 || [is_nan $total]} { set percent 0.0 } else { set percent [expr $col_total / $total * 100] } - puts -nonewline [format "%$field_width.1f%%" $percent] + format "%$field_width.1f%%" $percent } proc report_power_line { type pwr digits } { if { [is_nan $pwr] } { - puts [format "%-16s %s" $type $pwr] + report_line [format "%-16s %s" $type $pwr] } else { - puts [format "%-16s %.${digits}e" $type $pwr] + report_line [format "%-16s %.${digits}e" $type $pwr] } } @@ -194,11 +182,7 @@ proc inst_pwr_cmp { inst_pwr1 inst_pwr2 } { proc report_power_inst { inst power_result field_width digits } { lassign $power_result internal switching leakage total - report_power_col $internal $field_width $digits - report_power_col $switching $field_width $digits - report_power_col $leakage $field_width $digits - report_power_col $total $field_width $digits - puts " [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]" } ################################################################ @@ -262,7 +246,7 @@ proc power_find_nan { } { 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" + report_line "[get_full_name $inst] $internal $switching $leakage" break } } diff --git a/tcl/Sdc.tcl b/tcl/Sdc.tcl index ce3caadc..3cb3c553 100644 --- a/tcl/Sdc.tcl +++ b/tcl/Sdc.tcl @@ -76,7 +76,7 @@ proc source_ { filename echo verbose } { gets $stream line if { $line != "" } { if {$echo} { - puts $line + report_line $line } } append cmd $line "\n" @@ -89,7 +89,7 @@ proc source_ { filename echo verbose } { # Flush results printed outside tcl to stdout/stderr. fflush switch $error_code { - 0 { if { $verbose && $result != "" } { puts $result } } + 0 { if { $verbose && $result != "" } { report_line $result } } 1 { set error $result } 2 { set error {invoked "return" outside of a proc.} } 3 { set error {invoked "break" outside of a loop.} } @@ -99,9 +99,9 @@ proc source_ { filename echo verbose } { if { $sta_continue_on_error } { # Only prepend error message with file/line once. if { [string first "Error" $error] == 0 } { - puts $error + report_line $error } else { - puts "Error: [file tail $sdc_file], $sdc_line $error" + report_line "Error: [file tail $sdc_file], $sdc_line $error" } set error {} } else { @@ -176,7 +176,7 @@ proc current_instance { {inst ""} } { set current_instance [get_instance_error "instance" $inst] } set cell [get_name [$current_instance cell]] - puts "Current instance is $cell." + report_line "Current instance is $cell." # Current instance state variable must be part of the sta state so # the tcl interpreter can be shared by multiple sdc files. set_current_instance $current_instance diff --git a/tcl/Search.tcl b/tcl/Search.tcl index e01b7c9f..ea205b7e 100644 --- a/tcl/Search.tcl +++ b/tcl/Search.tcl @@ -59,7 +59,7 @@ proc report_delays_wrt_clk { vertex what clk clk_rf } { } else { set clk_str "" } - puts "$clk_str r $rise_fmt f $fall_fmt" + report_line "$clk_str r $rise_fmt f $fall_fmt" } } @@ -94,7 +94,7 @@ proc report_wrt_clk { vertex what clk clk_rf } { } else { set clk_str "" } - puts "$clk_str r $rise_fmt f $fall_fmt" + report_line "$clk_str r $rise_fmt f $fall_fmt" } } @@ -173,12 +173,12 @@ proc_redirect report_path { while {[$path_iter has_next]} { set path [$path_iter next] if { $first } { - puts "Tag group: [$vertex tag_group_index]" + report_line "Tag group: [$vertex tag_group_index]" } else { - puts "" + report_line "" } if { $report_tags } { - puts "Tag: [$path tag]" + report_line "Tag: [$path tag]" } report_path_cmd $path delete_path_ref $path @@ -189,7 +189,7 @@ proc_redirect report_path { set worst_path [vertex_worst_arrival_path_rf $vertex $tr $min_max] if { $worst_path != "NULL" } { if { $report_tags } { - puts "Tag: [$worst_path tag]" + report_line "Tag: [$worst_path tag]" } report_path_cmd $worst_path delete_path_ref $worst_path @@ -386,33 +386,33 @@ proc report_slew_limits { corner min_max all_violators verbose nosplit } { if { $all_violators } { set violators [pin_slew_limit_violations $corner $min_max] if { $violators != {} } { - puts "${min_max} slew" - puts "" + report_line "${min_max} slew" + report_line "" if { $verbose } { foreach pin $violators { report_slew_limit_verbose $pin $corner $min_max - puts "" + report_line "" } } else { report_slew_limit_short_header foreach pin $violators { report_slew_limit_short $pin $corner $min_max } - puts "" + report_line "" } } } else { set pin [pin_min_slew_limit_slack $corner $min_max] if { $pin != "NULL" } { - puts "${min_max} slew" - puts "" + report_line "${min_max} slew" + report_line "" if { $verbose } { report_slew_limit_verbose $pin $corner $min_max - puts "" + report_line "" } else { report_slew_limit_short_header report_slew_limit_short $pin $corner $min_max - puts "" + report_line "" } } } @@ -422,33 +422,33 @@ proc report_fanout_limits { min_max all_violators verbose nosplit } { if { $all_violators } { set violators [pin_fanout_limit_violations $min_max] if { $violators != {} } { - puts "${min_max} fanout" - puts "" + report_line "${min_max} fanout" + report_line "" if { $verbose } { foreach pin $violators { report_fanout_limit_verbose $pin $min_max - puts "" + report_line "" } } else { report_fanout_limit_short_header foreach pin $violators { report_fanout_limit_short $pin $min_max } - puts "" + report_line "" } } } else { set pin [pin_min_fanout_limit_slack $min_max] if { $pin != "NULL" } { - puts "${min_max} fanout" - puts "" + report_line "${min_max} fanout" + report_line "" if { $verbose } { report_fanout_limit_verbose $pin $min_max - puts "" + report_line "" } else { report_fanout_limit_short_header report_fanout_limit_short $pin $min_max - puts "" + report_line "" } } } @@ -458,33 +458,33 @@ proc report_capacitance_limits { corner min_max all_violators verbose nosplit } if { $all_violators } { set violators [pin_capacitance_limit_violations $corner $min_max] if { $violators != {} } { - puts "${min_max} capacitance" - puts "" + report_line "${min_max} capacitance" + report_line "" if { $verbose } { foreach pin $violators { report_capacitance_limit_verbose $pin $corner $min_max - puts "" + report_line "" } } else { report_capacitance_limit_short_header foreach pin $violators { report_capacitance_limit_short $pin $corner $min_max } - puts "" + report_line "" } } } else { set pin [pin_min_capacitance_limit_slack $corner $min_max] if { $pin != "NULL" } { - puts "${min_max} capacitance" - puts "" + report_line "${min_max} capacitance" + report_line "" if { $verbose } { report_capacitance_limit_verbose $pin $corner $min_max - puts "" + report_line "" } else { report_capacitance_limit_short_header report_capacitance_limit_short $pin $corner $min_max - puts "" + report_line "" } } } diff --git a/tcl/Splash.tcl b/tcl/Splash.tcl index 59b66a45..8df46712 100644 --- a/tcl/Splash.tcl +++ b/tcl/Splash.tcl @@ -25,7 +25,7 @@ namespace eval sta { define_cmd_args show_splash {} proc show_splash {} { - puts "OpenSTA [sta::version] [string range [sta::git_sha1] 0 9] Copyright (c) 2019, Parallax Software, Inc. + report_line "OpenSTA [sta::version] [string range [sta::git_sha1] 0 9] Copyright (c) 2019, Parallax Software, Inc. License GPLv3: GNU GPL version 3 This is free software, and you are free to change and redistribute it @@ -36,7 +36,7 @@ This program comes with ABSOLUTELY NO WARRANTY; for details type `show_warranty' define_cmd_args show_warranty {} proc show_warranty {} { - puts {15. Disclaimer of Warranty. + report_line {15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. @@ -49,7 +49,7 @@ If the disclaimer of warranty and limitation of liability provided above cannot define_cmd_args show_copying {} proc show_copying {} { - puts { GNU GENERAL PUBLIC LICENSE + report_line { GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. diff --git a/tcl/Sta.tcl b/tcl/Sta.tcl index cb6de663..38e9f49e 100644 --- a/tcl/Sta.tcl +++ b/tcl/Sta.tcl @@ -303,7 +303,7 @@ proc_redirect report_checks { parse_report_path_options "report_checks" args "full" 0 set path_ends [find_timing_paths_cmd "report_checks" args] if { $path_ends == {} } { - puts "No paths found." + report_line "No paths found." } else { report_path_ends $path_ends } @@ -535,7 +535,7 @@ proc_redirect report_tns { set digits $sta_report_default_digits } - puts "tns [format_time [total_negative_slack_cmd "max"] $digits]" + report_line "tns [format_time [total_negative_slack_cmd "max"] $digits]" } ################################################################ @@ -557,7 +557,7 @@ proc_redirect report_wns { if { $slack > 0.0 } { set slack 0.0 } - puts "wns [format_time $slack $digits]" + report_line "wns [format_time $slack $digits]" } ################################################################ @@ -575,7 +575,7 @@ proc_redirect report_worst_slack { set digits $sta_report_default_digits } - puts "worst slack [format_time [worst_slack_cmd "max"] $digits]" + report_line "worst slack [format_time [worst_slack_cmd "max"] $digits]" } ################################################################ @@ -1036,8 +1036,8 @@ define_sta_cmd_args "report_clock_properties" {[clocks]} proc_redirect report_clock_properties { check_argc_eq0or1 "report_clock_properties" $args update_generated_clks - puts "Clock Period Waveform" - puts "----------------------------------------------------" + report_line "Clock Period Waveform" + report_line "----------------------------------------------------" if { [llength $args] == 0 } { set clk_iter [clock_iterator] while {[$clk_iter has_next]} { @@ -1054,51 +1054,19 @@ proc_redirect report_clock_properties { ################################################################ -define_sta_cmd_args "report_object_full_names" {[-verbose] objects} +define_sta_cmd_args "report_object_full_names" {objects} -proc report_object_full_names { args } { - parse_key_args "report_object_full_names" args keys {} flags {-verbose} - - set objects [lindex $args 0] - if { [info exists flags(-verbose)] } { - puts -nonewline "{" - set first 1 - foreach obj [sort_by_full_name $objects] { - if { !$first } { - puts -nonewline ", " - } - puts -nonewline \"[get_object_type $obj]:[get_full_name $obj]\" - set first 0 - } - puts "}" - } else { - foreach obj [sort_by_full_name $objects] { - puts [get_full_name $obj] - } +proc report_object_full_names { objects } { + foreach obj [sort_by_full_name $objects] { + report_line [get_full_name $obj] } } -define_sta_cmd_args "report_object_names" {[-verbose] objects} +define_sta_cmd_args "report_object_names" {objects} -proc report_object_names { args } { - parse_key_args "report_object_names" args keys {} flags {-verbose} - - set objects [lindex $args 0] - if { [info exists flags(-verbose)] } { - puts -nonewline "{" - set first 1 - foreach obj [sort_by_name $objects] { - if { !$first } { - puts -nonewline ", " - } - puts -nonewline \"[get_object_type $obj]:[get_name $obj]\" - set first 0 - } - puts "}" - } else { - foreach obj [sort_by_name $objects] { - puts [get_name $obj] - } +proc report_object_names { objects } { + foreach obj [sort_by_name $objects] { + report_line [get_name $obj] } } @@ -1109,7 +1077,7 @@ define_sta_cmd_args "report_units" {} proc report_units { args } { check_argc_eq0 "report_units" $args foreach unit {"time" "capacitance" "resistance" "voltage" "current" "power" "distance"} { - puts " $unit 1[unit_scale_abreviation $unit][unit_suffix $unit]" + report_line " $unit 1[unit_scale_abreviation $unit][unit_suffix $unit]" } } diff --git a/tcl/StaTcl.i b/tcl/StaTcl.i index 17b0b8dd..64499111 100644 --- a/tcl/StaTcl.i +++ b/tcl/StaTcl.i @@ -1947,7 +1947,8 @@ void report_error(int id, const char *msg) { - Sta::sta()->report()->error(id, "%s", msg); + Report *report = Sta::sta()->report(); + report->error(id, "%s", msg); } void @@ -1956,14 +1957,16 @@ report_file_error(int id, int line, const char *msg) { - Sta::sta()->report()->error(id, filename, line, "%s", msg); + Report *report = Sta::sta()->report(); + report->error(id, filename, line, "%s", msg); } void report_warn(int id, const char *msg) { - Sta::sta()->report()->warn(id, "%s", msg); + Report *report = Sta::sta()->report(); + report->warn(id, "%s", msg); } void @@ -1972,13 +1975,15 @@ report_file_warn(int id, int line, const char *msg) { - Sta::sta()->report()->fileWarn(id, filename, line, "%s", msg); + Report *report = Sta::sta()->report(); + report->fileWarn(id, filename, line, "%s", msg); } void -report(const char *msg) +report_line(const char *msg) { - Sta::sta()->report()->print(msg); + Report *report = Sta::sta()->report(); + report->printLine(msg); } void diff --git a/tcl/Util.tcl b/tcl/Util.tcl index 92a960eb..ecc80119 100644 --- a/tcl/Util.tcl +++ b/tcl/Util.tcl @@ -225,25 +225,25 @@ proc show_cmd_args { cmd } { set max_col 80 set indent 2 set indent_str " " - puts -nonewline $cmd + set line $cmd set col [string length $cmd] set arglist $cmd_args($cmd) # Break the arglist up into max_col length lines. while {1} { - if {[regexp {(^ *)([a-zA-Z0-9>_\|\-]+|\[.*\])(.*)} \ + if {[regexp {(^ *)([a-zA-Z0-9_\\\|\-]+|\[.*\])(.*)} \ $arglist ignore space arg rest]} { set arg_length [string length $arg] if { $col + $arg_length < $max_col } { - puts -nonewline " $arg" + set line "$line $arg" set col [expr $col + $arg_length + 1] } else { - puts "" - puts -nonewline "$indent_str $arg" + report_line $line + set line "$line$indent_str $arg" set col [expr $indent + $arg_length + 1] } set arglist $rest } else { - puts "" + report_line $line break } } diff --git a/util/Report.cc b/util/Report.cc index e949d5fd..76ab4b4c 100644 --- a/util/Report.cc +++ b/util/Report.cc @@ -142,6 +142,13 @@ Report::print(const char *fmt, ...) va_end(args); } +void +Report::printLine(const char *line) +{ + printString(line, strlen(line)); + printString("\n", 1); +} + //////////////////////////////////////////////////////////////// void