From 4c2a1aa1017867c4f0ee57f5a7db35ecafcfaae1 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Thu, 14 Mar 2024 18:11:16 -0700 Subject: [PATCH] set_units allow scale multiplier Signed-off-by: James Cherry --- tcl/CmdUtil.tcl | 28 +++++++++++-------------- tcl/Sdc.tcl | 55 ++++++++++++++++++++----------------------------- 2 files changed, 34 insertions(+), 49 deletions(-) diff --git a/tcl/CmdUtil.tcl b/tcl/CmdUtil.tcl index 324b2ead..c5a84dcb 100644 --- a/tcl/CmdUtil.tcl +++ b/tcl/CmdUtil.tcl @@ -140,26 +140,22 @@ proc set_cmd_units { args } { set_unit_values "distance" -distance "m" keys } -proc set_unit_values { unit key unit_name key_var } { +proc set_unit_values { unit key suffix key_var } { upvar 1 $key_var keys if { [info exists keys($key)] } { set value $keys($key) - if { [string equal -nocase $value $unit_name] } { - set_cmd_unit_scale $unit 1.0 + if { [regexp "(10*)?(\[Mkmunpf\])?" $value match mult prefix] } { + set arg_suffix [string range $value [string length $match] end] + if { ![string match -nocase $arg_suffix $suffix] } { + sta_error 501 "unknown unit $unit suffix $arg_suffix." + } + if { $mult == "" } { + set mult 1 + } + set scale [unit_prefix_scale $unit $prefix ] + set_cmd_unit_scale $unit $scale } else { - set prefix [string index $value 0] - set suffix [string range $value 1 end] - # unit includes "1" prefix - if { [string is digit $prefix] } { - set prefix [string index $value 1] - set suffix [string range $value 2 end] - } - if { [string equal -nocase $suffix $unit_name] } { - set scale [unit_prefix_scale $unit $prefix] - set_cmd_unit_scale $unit $scale - } else { - sta_error 163 "unknown $unit unit '$suffix'." - } + sta_error 163 "unknown unit $unit format." } if [info exists keys(-digits)] { set_cmd_unit_digits $unit $keys(-digits) diff --git a/tcl/Sdc.tcl b/tcl/Sdc.tcl index 4ce727b6..8e3059bb 100644 --- a/tcl/Sdc.tcl +++ b/tcl/Sdc.tcl @@ -235,51 +235,40 @@ proc set_units { args } { check_unit "current" -current "A" keys check_unit "power" -power "W" keys check_unit "distance" -distance "m" keys - check_unit "power" -power "w" keys } -proc check_unit { unit key unit_name key_var } { +proc check_unit { unit key suffix key_var } { upvar 1 $key_var keys if { [info exists keys($key)] } { set value $keys($key) - if { [string equal -nocase $value $unit_name] } { - check_unit_scale $unit 1.0 + if { [regexp "(10*)?(\[Mkmunpf\])?" $value match mult prefix] } { + set arg_suffix [string range $value [string length $match] end] + if { ![string match -nocase $arg_suffix $suffix] } { + sta_error 501 "unknown unit $unit suffix $arg_suffix." + } + if { $mult == "" } { + set mult 1 + } + set scale [unit_prefix_scale $unit $prefix ] + check_unit_scale $unit [expr $scale * $mult] } else { - set prefix [string index $value 0] - set suffix [string range $value 1 end] - # unit includes "1" prefix - if { [string is digit $prefix] } { - set prefix [string index $value 1] - set suffix [string range $value 2 end] - } - if { [string equal -nocase $suffix $unit_name] } { - set scale [unit_prefix_scale $unit $prefix] - check_unit_scale $unit $scale - } else { - sta_error 343 "unknown unit $unit '$suffix'." - } + sta_error 343 "unknown unit $unit format." } } } proc unit_prefix_scale { unit prefix } { - if { [string equal $prefix "M"] } { - return 1E+6 - } elseif { [string equal $prefix "k"] } { - return 1E+3 - } elseif { [string equal $prefix "m"] } { - return 1E-3 - } elseif { [string equal $prefix "u"] } { - return 1E-6 - } elseif { [string equal $prefix "n"] } { - return 1E-9 - } elseif { [string equal $prefix "p"] } { - return 1E-12 - } elseif { [string equal $prefix "f"] } { - return 1E-15 - } else { - sta_error 344 "unknown $unit prefix '$prefix'." + switch -exact -- $prefix { + "M" { return 1E+6 } + "k" { return 1E+3 } + "" { return 1E+0 } + "m" { return 1E-3 } + "u" { return 1E-6 } + "n" { return 1E-9 } + "p" { return 1E-12 } + "f" { return 1E-15 } } + sta_error 344 "unknown $unit prefix '$prefix'." } proc check_unit_scale { unit scale } {