write_sdf -include_typ

Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
James Cherry 2021-11-08 16:49:43 -07:00
parent 4235b43d42
commit a23d5e5390
8 changed files with 53 additions and 42 deletions

Binary file not shown.

Binary file not shown.

View File

@ -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,

View File

@ -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);
}

View File

@ -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
}

View File

@ -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");
}

View File

@ -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,

View File

@ -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