diff --git a/include/sta/Units.hh b/include/sta/Units.hh index a33f9f0f..8b54be5f 100644 --- a/include/sta/Units.hh +++ b/include/sta/Units.hh @@ -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) }; diff --git a/liberty/LibertyWriter.cc b/liberty/LibertyWriter.cc index 10cce09b..2c4dd1a7 100644 --- a/liberty/LibertyWriter.cc +++ b/liberty/LibertyWriter.cc @@ -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"); diff --git a/liberty/Units.cc b/liberty/Units.cc index 6358de31..8dcbb4f0 100644 --- a/liberty/Units.cc +++ b/liberty/Units.cc @@ -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 diff --git a/tcl/CmdUtil.tcl b/tcl/CmdUtil.tcl index 17a9b75c..d6b44ef3 100644 --- a/tcl/CmdUtil.tcl +++ b/tcl/CmdUtil.tcl @@ -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]" } } diff --git a/util/Util.i b/util/Util.i index 6b89c89b..6c7ec10f 100644 --- a/util/Util.i +++ b/util/Util.i @@ -23,6 +23,7 @@ // This notice may not be removed or altered from any source distribution. %module util +%include %{ @@ -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 ""; }