diff --git a/include/sta/Units.hh b/include/sta/Units.hh index b3fd6a19..4e6f5e1f 100644 --- a/include/sta/Units.hh +++ b/include/sta/Units.hh @@ -33,8 +33,10 @@ public: void operator=(const Unit &unit); float scale() const { return scale_; } void setScale(float scale); - const char *scaleAbreviation() const; + const char *scaleAbbreviation() const; const char *suffix() const { return suffix_; } + // scale abbreviation + suffix + const char *scaledSuffix() const { return scaled_suffix_; } void setSuffix(const char *suffix); int digits() const { return digits_; } void setDigits(int digits); @@ -46,8 +48,11 @@ public: int digits) const; private: + void setScaledSuffix(); + float scale_; // multiplier from user units to internal units const char *suffix_; // print suffix + const char *scaled_suffix_; int digits_; // print digits (after decimal pt) }; diff --git a/liberty/LibertyWriter.cc b/liberty/LibertyWriter.cc index 7b3216e0..cf04cb5d 100644 --- a/liberty/LibertyWriter.cc +++ b/liberty/LibertyWriter.cc @@ -123,26 +123,21 @@ LibertyWriter::writeHeader() fprintf(stream_, " delay_model : table_lookup;\n"); fprintf(stream_, " simulation : false;\n"); const Unit *cap_unit = library_->units()->capacitanceUnit(); - fprintf(stream_, " capacitive_load_unit (1,%s%s);\n", - cap_unit->scaleAbreviation(), - cap_unit->suffix()); + fprintf(stream_, " capacitive_load_unit (1,%s);\n", + cap_unit->scaledSuffix()); fprintf(stream_, " leakage_power_unit : 1pW;\n"); const Unit *current_unit = library_->units()->currentUnit(); - fprintf(stream_, " current_unit : \"1%s%s\";\n", - current_unit->scaleAbreviation(), - current_unit->suffix()); + fprintf(stream_, " current_unit : \"1%s\";\n", + current_unit->scaledSuffix()); const Unit *res_unit = library_->units()->resistanceUnit(); - fprintf(stream_, " pulling_resistance_unit : \"1%s%s\";\n", - res_unit->scaleAbreviation(), - res_unit->suffix()); + fprintf(stream_, " pulling_resistance_unit : \"1%s\";\n", + res_unit->scaledSuffix()); const Unit *time_unit = library_->units()->timeUnit(); - fprintf(stream_, " time_unit : \"1%s%s\";\n", - time_unit->scaleAbreviation(), - time_unit->suffix()); + fprintf(stream_, " time_unit : \"1%s\";\n", + time_unit->scaledSuffix()); const Unit *volt_unit = library_->units()->voltageUnit(); - fprintf(stream_, " voltage_unit : \"1%s%s\";\n", - volt_unit->scaleAbreviation(), - volt_unit->suffix()); + fprintf(stream_, " voltage_unit : \"1%s\";\n", + volt_unit->scaledSuffix()); fprintf(stream_, " library_features(report_delay_calculation);\n"); fprintf(stream_, "\n"); diff --git a/liberty/Units.cc b/liberty/Units.cc index 3f2825e3..9ff90d79 100644 --- a/liberty/Units.cc +++ b/liberty/Units.cc @@ -31,8 +31,10 @@ using std::abs; Unit::Unit(const char *suffix) : scale_(1.0), suffix_(stringCopy(suffix)), + scaled_suffix_(nullptr), digits_(3) { + setScaledSuffix(); } Unit::Unit(float scale, @@ -40,13 +42,23 @@ Unit::Unit(float scale, int digits) : scale_(scale), suffix_(stringCopy(suffix)), + scaled_suffix_(nullptr), digits_(digits) { + setScaledSuffix(); +} + +void +Unit::setScaledSuffix() +{ + stringDelete(scaled_suffix_); + scaled_suffix_ = stringPrint("%s%s", scaleAbbreviation(), suffix_); } Unit::~Unit() { stringDelete(suffix_); + stringDelete(scaled_suffix_); } void @@ -55,6 +67,7 @@ Unit::operator=(const Unit &unit) scale_ = unit.scale_; stringDelete(suffix_); suffix_ = stringCopy(unit.suffix_); + scaled_suffix_ = stringCopy(unit.scaled_suffix_); digits_ = unit.digits_; } @@ -74,10 +87,11 @@ void Unit::setScale(float scale) { scale_ = scale; + setScaledSuffix(); } const char * -Unit::scaleAbreviation() const +Unit::scaleAbbreviation() const { if (fuzzyEqual(scale_, 1E+6)) return "M"; @@ -104,6 +118,7 @@ Unit::setSuffix(const char *suffix) { stringDelete(suffix_); suffix_ = stringCopy(suffix); + setScaledSuffix(); } void diff --git a/tcl/StaTcl.i b/tcl/StaTcl.i index 08946e4b..a50f8aba 100644 --- a/tcl/StaTcl.i +++ b/tcl/StaTcl.i @@ -3987,11 +3987,11 @@ set_cmd_unit_suffix(const char *unit_name, } const char * -unit_scale_abreviation(const char *unit_name) +unit_scale_abbreviation (const char *unit_name) { Unit *unit = Sta::sta()->units()->find(unit_name); if (unit) - return unit->scaleAbreviation(); + return unit->scaleAbbreviation(); else return ""; } @@ -4006,6 +4006,16 @@ unit_suffix(const char *unit_name) return ""; } +const char * +unit_scaled_suffix(const char *unit_name) +{ + Unit *unit = Sta::sta()->units()->find(unit_name); + if (unit) + return unit->scaledSuffix(); + else + return ""; +} + //////////////////////////////////////////////////////////////// VertexIterator *