diff --git a/doc/OpenSTA.odt b/doc/OpenSTA.odt index 2953e6b6..5bbf1e11 100644 Binary files a/doc/OpenSTA.odt and b/doc/OpenSTA.odt differ diff --git a/doc/OpenSTA.pdf b/doc/OpenSTA.pdf index fd779d57..7d48565e 100644 Binary files a/doc/OpenSTA.pdf and b/doc/OpenSTA.pdf differ diff --git a/include/sta/Sta.hh b/include/sta/Sta.hh index 9f3ba651..b8031e05 100644 --- a/include/sta/Sta.hh +++ b/include/sta/Sta.hh @@ -753,7 +753,8 @@ public: float slew); void writeSdf(const char *filename, Corner *corner, - char sdf_divider, + char divider, + bool include_typ, int digits, bool gzip, bool no_timestamp, diff --git a/sdf/Sdf.i b/sdf/Sdf.i index 02782602..57afaa53 100644 --- a/sdf/Sdf.i +++ b/sdf/Sdf.i @@ -110,15 +110,16 @@ report_annotated_check_cmd(bool report_setup, void write_sdf_cmd(char *filename, Corner *corner, - char sdf_divider, - int digits, + char divider, + bool include_typ, + int digits, bool gzip, bool no_timestamp, bool no_version) { cmdLinkedNetwork(); Sta *sta = Sta::sta(); - sta->writeSdf(filename, corner, sdf_divider, digits, gzip, + sta->writeSdf(filename, corner, divider, include_typ, digits, gzip, no_timestamp, no_version); } diff --git a/sdf/Sdf.tcl b/sdf/Sdf.tcl index 1cd1c89c..3d3422b4 100644 --- a/sdf/Sdf.tcl +++ b/sdf/Sdf.tcl @@ -140,13 +140,13 @@ proc_redirect report_annotated_check { } define_cmd_args "write_sdf" \ - {[-corner corner_name] [-divider /|.] [-digits digits]\ - [-gzip] [-no_timestamp] [-no_version] filename} + {[-corner corner_name] [-divider /|.] [-include_typ]\ + [-digits digits] [-gzip] [-no_timestamp] [-no_version] filename} proc_redirect write_sdf { parse_key_args "write_sdf" args \ keys {-corner -divider -digits -significant_digits} \ - flags {-gzip -no_timestamp -no_version} + flags {-include_typ -gzip -no_timestamp -no_version} check_argc_eq1 "write_sdf" $args set corner [parse_corner keys] set filename [file nativename [lindex $args 0]] @@ -160,16 +160,14 @@ proc_redirect write_sdf { set digits 3 if [info exists keys(-digits)] { set digits $keys(-digits) + check_positive_integer "-digits" $digits } - if [info exists keys(-significant_digits)] { - set digits $keys(-significant_digits) - } - check_positive_integer "-digits" $digits + set include_typ [info exists flags(-include_typ)] set no_timestamp [info exists flags(-no_timestamp)] set no_version [info exists flags(-no_version)] set gzip [info exists flags(-gzip)] - write_sdf_cmd $filename $corner $divider $digits $gzip \ + write_sdf_cmd $filename $corner $divider $include_typ $digits $gzip \ $no_timestamp $no_version } diff --git a/sdf/SdfWriter.cc b/sdf/SdfWriter.cc index 98e28cdd..f38aa334 100644 --- a/sdf/SdfWriter.cc +++ b/sdf/SdfWriter.cc @@ -47,7 +47,8 @@ public: void write(const char *filename, Corner *corner, char sdf_divider, - int digits, + bool include_typ, + int digits, bool gzip, bool no_timestamp, bool no_version); @@ -94,10 +95,10 @@ protected: float min_period); const char *sdfEdge(const Transition *tr); void writeArcDelays(Edge *edge); - void writeSdfTuple(RiseFallMinMax &delays, - RiseFall *rf); - void writeSdfTuple(float min_delay, - float max_delay); + void writeSdfTriple(RiseFallMinMax &delays, + RiseFall *rf); + void writeSdfTriple(float min, + float max); void writeSdfDelay(double delay); char *sdfPortName(const Pin *pin); char *sdfPathName(const Pin *pin); @@ -108,6 +109,7 @@ private: DISALLOW_COPY_AND_ASSIGN(SdfWriter); char sdf_divider_; + bool include_typ_; float timescale_; char sdf_escape_; @@ -124,6 +126,7 @@ void writeSdf(const char *filename, Corner *corner, char sdf_divider, + bool include_typ, int digits, bool gzip, bool no_timestamp, @@ -131,7 +134,7 @@ writeSdf(const char *filename, StaState *sta) { SdfWriter writer(sta); - writer.write(filename, corner, sdf_divider, digits, gzip, + writer.write(filename, corner, sdf_divider, include_typ, digits, gzip, no_timestamp, no_version); } @@ -152,12 +155,14 @@ void SdfWriter::write(const char *filename, Corner *corner, char sdf_divider, + bool include_typ, int digits, bool gzip, bool no_timestamp, bool no_version) { sdf_divider_ = sdf_divider; + include_typ_ = include_typ; if (delay_format_ == nullptr) delay_format_ = new char[10]; sprintf(delay_format_, "%%.%df", digits); @@ -428,45 +433,49 @@ SdfWriter::writeArcDelays(Edge *edge) if (delays.hasValue(RiseFall::rise(), MinMax::min()) && delays.hasValue(RiseFall::fall(), MinMax::min())) { // Rise and fall. - writeSdfTuple(delays, RiseFall::rise()); + writeSdfTriple(delays, RiseFall::rise()); // Merge rise/fall values if they are the same. if (!(fuzzyEqual(delays.value(RiseFall::rise(), MinMax::min()), delays.value(RiseFall::fall(), MinMax::min())) && fuzzyEqual(delays.value(RiseFall::rise(), MinMax::max()), delays.value(RiseFall::fall(),MinMax::max())))) { gzprintf(stream_, " "); - writeSdfTuple(delays, RiseFall::fall()); + writeSdfTriple(delays, RiseFall::fall()); } } else if (delays.hasValue(RiseFall::rise(), MinMax::min())) // Rise only. - writeSdfTuple(delays, RiseFall::rise()); + writeSdfTriple(delays, RiseFall::rise()); else if (delays.hasValue(RiseFall::fall(), MinMax::min())) { // Fall only. gzprintf(stream_, "() "); - writeSdfTuple(delays, RiseFall::fall()); + writeSdfTriple(delays, RiseFall::fall()); } } void -SdfWriter::writeSdfTuple(RiseFallMinMax &delays, - RiseFall *rf) +SdfWriter::writeSdfTriple(RiseFallMinMax &delays, + RiseFall *rf) { - gzprintf(stream_, "("); - writeSdfDelay(delays.value(rf, MinMax::min())); - gzprintf(stream_, "::"); - writeSdfDelay(delays.value(rf, MinMax::max())); - gzprintf(stream_, ")"); + float min = delays.value(rf, MinMax::min()); + float max = delays.value(rf, MinMax::max()); + writeSdfTriple(min, max); } void -SdfWriter::writeSdfTuple(float min_delay, - float max_delay) +SdfWriter::writeSdfTriple(float min, + float max) { gzprintf(stream_, "("); - writeSdfDelay(min_delay); - gzprintf(stream_, "::"); - writeSdfDelay(max_delay); + writeSdfDelay(min); + if (include_typ_) { + gzprintf(stream_, ":"); + writeSdfDelay((min + max) / 2.0); + gzprintf(stream_, ":"); + } + else + gzprintf(stream_, "::"); + writeSdfDelay(max); gzprintf(stream_, ")"); } @@ -677,7 +686,7 @@ SdfWriter::writeCheck(Edge *edge, ArcDelay min_delay = graph_->arcDelay(edge, arc, arc_delay_min_index_); ArcDelay max_delay = graph_->arcDelay(edge, arc, arc_delay_max_index_); - writeSdfTuple(delayAsFloat(min_delay), delayAsFloat(max_delay)); + writeSdfTriple(delayAsFloat(min_delay), delayAsFloat(max_delay)); gzprintf(stream_, ")\n"); } @@ -691,7 +700,7 @@ SdfWriter::writeWidthCheck(const Pin *pin, gzprintf(stream_, " (WIDTH (%s %s) ", sdfEdge(hi_low->asTransition()), sdfPortName(pin)); - writeSdfTuple(min_width, max_width); + writeSdfTriple(min_width, max_width); gzprintf(stream_, ")\n"); } @@ -701,7 +710,7 @@ SdfWriter::writePeriodCheck(const Pin *pin, { gzprintf(stream_, " (PERIOD %s ", sdfPortName(pin)); - writeSdfTuple(min_period, min_period); + writeSdfTriple(min_period, min_period); gzprintf(stream_, ")\n"); } diff --git a/sdf/SdfWriter.hh b/sdf/SdfWriter.hh index 098da8b9..fde76878 100644 --- a/sdf/SdfWriter.hh +++ b/sdf/SdfWriter.hh @@ -24,7 +24,8 @@ class Corner; void writeSdf(const char *filename, Corner *corner, - char sdf_divider, + char divider, + bool include_typ, int digits, bool gzip, bool no_timestamp, diff --git a/search/Sta.cc b/search/Sta.cc index 717afd46..61ffb7c4 100644 --- a/search/Sta.cc +++ b/search/Sta.cc @@ -3524,15 +3524,16 @@ Sta::setAnnotatedSlew(Vertex *vertex, void Sta::writeSdf(const char *filename, Corner *corner, - char sdf_divider, - int digits, + char divider, + bool include_typ, + int digits, bool gzip, bool no_timestamp, bool no_version) { findDelays(); - sta::writeSdf(filename, corner, sdf_divider, digits, gzip, no_timestamp, - no_version, this); + sta::writeSdf(filename, corner, divider, include_typ, digits, gzip, + no_timestamp, no_version, this); } void