report_units
This commit is contained in:
parent
b6e3ab889e
commit
07e1262186
BIN
doc/OpenSTA.odt
BIN
doc/OpenSTA.odt
Binary file not shown.
|
|
@ -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_; }
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
11
tcl/Sta.tcl
11
tcl/Sta.tcl
|
|
@ -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... }
|
||||||
|
|
|
||||||
20
tcl/StaTcl.i
20
tcl/StaTcl.i
|
|
@ -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 *
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue