report_units

This commit is contained in:
James Cherry 2020-06-23 17:11:48 -07:00
parent b6e3ab889e
commit 07e1262186
5 changed files with 78 additions and 7 deletions

Binary file not shown.

View File

@ -21,7 +21,7 @@ namespace sta {
class Unit class Unit
{ {
public: public:
Unit(); Unit(const char *suffix);
~Unit(); ~Unit();
Unit(float scale, Unit(float scale,
const char *suffix, const char *suffix,
@ -29,10 +29,12 @@ public:
void operator=(const Unit &unit); void operator=(const Unit &unit);
float scale() const { return scale_; } float scale() const { return scale_; }
void setScale(float scale); void setScale(float scale);
const char *scaleAbreviation();
const char *suffix() const { return suffix_; } const char *suffix() const { return suffix_; }
void setSuffix(const char *suffix); void setSuffix(const char *suffix);
int digits() const { return digits_; } int digits() const { return digits_; }
void setDigits(int digits); void setDigits(int digits);
// Does not include suffix.
int width() const; int width() const;
const char *asString(float value) const; const char *asString(float value) const;
const char *asString(double value) const; const char *asString(double value) const;
@ -50,7 +52,7 @@ private:
class Units class Units
{ {
public: public:
Units() {} Units();
Unit *find(const char *unit_name); Unit *find(const char *unit_name);
void operator=(const Units &units); void operator=(const Units &units);
Unit *timeUnit() { return &time_unit_; } Unit *timeUnit() { return &time_unit_; }

View File

@ -21,15 +21,17 @@
#include "StringUtil.hh" #include "StringUtil.hh"
#include "MinMax.hh" // INF #include "MinMax.hh" // INF
#include "Fuzzy.hh"
namespace sta { namespace sta {
using std::abs; using std::abs;
Unit::Unit() :
Unit::Unit(const char *suffix) :
scale_(1.0), scale_(1.0),
suffix_(stringCopy("")), suffix_(stringCopy(suffix)),
digits_(4) digits_(3)
{ {
} }
@ -62,6 +64,29 @@ Unit::setScale(float scale)
scale_ = scale; scale_ = scale;
} }
const char *
Unit::scaleAbreviation()
{
if (fuzzyEqual(scale_, 1E+6))
return "M";
else if (fuzzyEqual(scale_, 1E+3))
return "k";
if (fuzzyEqual(scale_, 1.0))
return "";
else if (fuzzyEqual(scale_, 1E-3))
return "m";
else if (fuzzyEqual(scale_, 1E-6))
return "u";
else if (fuzzyEqual(scale_, 1E-9))
return "n";
else if (fuzzyEqual(scale_, 1E-12))
return "p";
else if (fuzzyEqual(scale_, 1E-15))
return "f";
else
return "?";
}
void void
Unit::setSuffix(const char *suffix) Unit::setSuffix(const char *suffix)
{ {
@ -78,7 +103,7 @@ Unit::setDigits(int digits)
int int
Unit::width() const Unit::width() const
{ {
return digits_ + (suffix_ ? strlen(suffix_) : 0) + 2; return digits_ + 2;
} }
const char * const char *
@ -105,12 +130,25 @@ Unit::asString(float value,
// prevent "-0.00" on slowaris // prevent "-0.00" on slowaris
if (abs(scaled_value) < 1E-6) if (abs(scaled_value) < 1E-6)
scaled_value = 0.0; scaled_value = 0.0;
return stringPrintTmp("%.*f%s", digits, scaled_value, suffix_); return stringPrintTmp("%.*f", digits, scaled_value);
} }
} }
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
Units::Units() :
time_unit_("s"),
capacitance_unit_("F"),
voltage_unit_("v"),
resistance_unit_("ohm"),
pulling_resistance_unit_("ohm"),
current_unit_("A"),
power_unit_("W"),
distance_unit_("m"),
scalar_unit_("")
{
}
Unit * Unit *
Units::find(const char *unit_name) Units::find(const char *unit_name)
{ {

View File

@ -1104,6 +1104,17 @@ proc report_object_names { args } {
################################################################ ################################################################
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]"
}
}
################################################################
define_sta_cmd_args "with_output_to_variable" { var { cmds }} define_sta_cmd_args "with_output_to_variable" { var { cmds }}
# with_output_to_variable variable { command args... } # with_output_to_variable variable { command args... }

View File

@ -3949,6 +3949,26 @@ set_cmd_unit_suffix(const char *unit_name,
} }
} }
const char *
unit_scale_abreviation(const char *unit_name)
{
Unit *unit = Sta::sta()->units()->find(unit_name);
if (unit)
return unit->scaleAbreviation();
else
return "";
}
const char *
unit_suffix(const char *unit_name)
{
Unit *unit = Sta::sta()->units()->find(unit_name);
if (unit)
return unit->suffix();
else
return "";
}
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
VertexIterator * VertexIterator *