more unit issues

Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
James Cherry 2025-12-05 14:47:16 -07:00
parent 75c2b1e80d
commit 6ef25d488a
5 changed files with 67 additions and 21 deletions

View File

@ -42,10 +42,15 @@ public:
void operator=(const Unit &unit);
float scale() const { return scale_; }
void setScale(float scale);
// Mkmunpf abbreviation for scale.
std::string scaleAbbreviation() const;
const char *suffix() const { return suffix_.c_str(); }
// 1Mkmunpf or scale
std::string scaleString() const;
std::string suffix() const { return suffix_; }
// scaleString + suffix
std::string scaleSuffix() const;
// scale abbreviation + suffix
const char *scaledSuffix() const { return scaled_suffix_.c_str(); }
std::string scaleAbbrevSuffix() const { return scale_abbrev_suffix_; }
void setSuffix(const char *suffix);
int digits() const { return digits_; }
void setDigits(int digits);
@ -57,11 +62,11 @@ public:
int digits) const;
private:
void setScaledSuffix();
void setScaleAbbrevSuffix();
float scale_; // multiplier from user units to internal units
std::string suffix_; // print suffix
std::string scaled_suffix_;
std::string scale_abbrev_suffix_;
int digits_; // print digits (after decimal pt)
};

View File

@ -137,20 +137,20 @@ LibertyWriter::writeHeader()
fprintf(stream_, " simulation : false;\n");
const Unit *cap_unit = library_->units()->capacitanceUnit();
fprintf(stream_, " capacitive_load_unit (1,%s);\n",
cap_unit->scaledSuffix());
cap_unit->scaleAbbrevSuffix().c_str());
fprintf(stream_, " leakage_power_unit : 1pW;\n");
const Unit *current_unit = library_->units()->currentUnit();
fprintf(stream_, " current_unit : \"1%s\";\n",
current_unit->scaledSuffix());
current_unit->scaleAbbrevSuffix().c_str());
const Unit *res_unit = library_->units()->resistanceUnit();
fprintf(stream_, " pulling_resistance_unit : \"1%s\";\n",
res_unit->scaledSuffix());
res_unit->scaleAbbrevSuffix().c_str());
const Unit *time_unit = library_->units()->timeUnit();
fprintf(stream_, " time_unit : \"1%s\";\n",
time_unit->scaledSuffix());
time_unit->scaleAbbrevSuffix().c_str());
const Unit *volt_unit = library_->units()->voltageUnit();
fprintf(stream_, " voltage_unit : \"1%s\";\n",
volt_unit->scaledSuffix());
volt_unit->scaleAbbrevSuffix().c_str());
fprintf(stream_, " library_features(report_delay_calculation);\n");
fprintf(stream_, "\n");

View File

@ -40,7 +40,7 @@ Unit::Unit(const char *suffix) :
suffix_(suffix),
digits_(3)
{
setScaledSuffix();
setScaleAbbrevSuffix();
}
Unit::Unit(float scale,
@ -50,13 +50,13 @@ Unit::Unit(float scale,
suffix_(suffix),
digits_(digits)
{
setScaledSuffix();
setScaleAbbrevSuffix();
}
void
Unit::setScaledSuffix()
Unit::setScaleAbbrevSuffix()
{
scaled_suffix_ = scaleAbbreviation() + suffix_;
scale_abbrev_suffix_ = scaleAbbreviation() + suffix_;
}
void
@ -64,7 +64,7 @@ Unit::operator=(const Unit &unit)
{
scale_ = unit.scale_;
suffix_ = unit.suffix_;
scaled_suffix_ = unit.scaled_suffix_;
scale_abbrev_suffix_ = unit.scale_abbrev_suffix_;
digits_ = unit.digits_;
}
@ -84,11 +84,34 @@ void
Unit::setScale(float scale)
{
scale_ = scale;
setScaledSuffix();
setScaleAbbrevSuffix();
}
std::string
Unit::scaleAbbreviation() const
{
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 "?";
}
std::string
Unit::scaleString() const
{
if (fuzzyEqual(scale_, 1E+6))
return "1M";
@ -110,11 +133,17 @@ Unit::scaleAbbreviation() const
return stdstrPrint("%.1e", scale_);
}
std::string
Unit::scaleSuffix() const
{
return scaleString() + suffix_;
}
void
Unit::setSuffix(const char *suffix)
{
suffix_ = suffix;
setScaledSuffix();
setScaleAbbrevSuffix();
}
void

View File

@ -122,7 +122,7 @@ define_cmd_args "report_units" {}
proc report_units { args } {
check_argc_eq0 "report_units" $args
foreach unit {"time" "capacitance" "resistance" "voltage" "current" "power" "distance"} {
report_line " $unit [unit_scaled_suffix $unit]"
report_line " $unit [unit_scale_suffix $unit]"
}
}

View File

@ -23,6 +23,7 @@
// This notice may not be removed or altered from any source distribution.
%module util
%include <std_string.i>
%{
@ -425,7 +426,7 @@ unit_scale_abbreviation (const char *unit_name)
return "";
}
const char *
std::string
unit_suffix(const char *unit_name)
{
Unit *unit = Sta::sta()->units()->find(unit_name);
@ -435,12 +436,23 @@ unit_suffix(const char *unit_name)
return "";
}
const char *
unit_scaled_suffix(const char *unit_name)
std::string
unit_scale_suffix(const char *unit_name)
{
Unit *unit = Sta::sta()->units()->find(unit_name);
if (unit) {
return unit->scaleSuffix();
}
else
return "";
}
std::string
unit_scale_abbrev_suffix(const char *unit_name)
{
Unit *unit = Sta::sta()->units()->find(unit_name);
if (unit)
return unit->scaledSuffix();
return unit->scaleAbbrevSuffix();
else
return "";
}