Merge branch 'master' into read_vcd

This commit is contained in:
James Cherry 2022-10-10 15:16:56 -07:00
commit d33a091793
38 changed files with 892 additions and 398 deletions

View File

@ -116,6 +116,7 @@ set(STA_SOURCE
parasitics/NullParasitics.cc
parasitics/Parasitics.cc
parasitics/ReduceParasitics.cc
parasitics/ReportParasiticAnnotation.cc
parasitics/SpefNamespace.cc
parasitics/SpefReader.cc
parasitics/SpefReaderPvt.hh

View File

@ -163,6 +163,9 @@ LumpedCapDelayCalc::gateDelay(const LibertyCell *drvr_cell,
ArcDelay gate_delay1;
Slew drvr_slew1;
float in_slew1 = delayAsFloat(in_slew);
// NaNs cause seg faults during table lookup.
if (isnan(load_cap) || isnan(related_out_cap) || isnan(in_slew))
report_->error(705, "gate delay input variable is NaN");
model->gateDelay(drvr_cell, pvt, in_slew1, load_cap, related_out_cap,
pocv_enabled_, gate_delay1, drvr_slew1);
gate_delay = gate_delay1;

View File

@ -3,6 +3,10 @@ OpenSTA Timing Analyzer Release Notes
This file summarizes user visible changes for each release.
The report_parasitics_annotation command reports SPEF annotation completeness.
report_parasitics_annotation [-report_unannotated]
Release 2.3.2 2022/07/03
-------------------------

Binary file not shown.

Binary file not shown.

View File

@ -46,8 +46,10 @@ class TimingArcAttrs;
class InternalPowerAttrs;
class LibertyPgPort;
class StaState;
class Corner;
class Corners;
class DcalcAnalysisPt;
typedef Set<Library*> LibrarySet;
typedef Map<const char*, TableTemplate*, CharPtrLess> TableTemplateMap;
typedef Vector<TableTemplate*> TableTemplateSeq;
typedef Map<const char*, BusDcl *, CharPtrLess> BusDclMap;
@ -294,6 +296,10 @@ public:
bool link,
int ap_index,
Report *report);
static void
checkCorners(LibertyCell *cell,
Corners *corners,
Report *report);
protected:
float degradeWireSlew(const LibertyCell *cell,
@ -443,6 +449,9 @@ public:
RiseFall *&enable_rf) const;
RiseFall *latchCheckEnableEdge(TimingArcSet *check_set);
bool isDisabledConstraint() const { return is_disabled_constraint_; }
LibertyCell *cornerCell(const Corner *corner,
const MinMax *min_max);
LibertyCell *cornerCell(const DcalcAnalysisPt *dcalc_ap);
LibertyCell *cornerCell(int ap_index);
// AOCV
@ -489,6 +498,9 @@ public:
void bufferPorts(// Return values.
LibertyPort *&input,
LibertyPort *&output) const;
// Check all liberty cells to make sure they exist
// for all the defined corners.
static void checkLibertyCorners();
protected:
void addPort(ConcretePort *port);
@ -515,6 +527,8 @@ protected:
const LibertyPort *output) const;
bool hasInverterFunc(const LibertyPort *input,
const LibertyPort *output) const;
bool checkCornerCell(const Corner *corner,
const MinMax *min_max) const;
LibertyLibrary *liberty_library_;
float area_;
@ -712,6 +726,12 @@ public:
RiseFall *sense);
bool isDisabledConstraint() const { return is_disabled_constraint_; }
void setIsDisabledConstraint(bool is_disabled);
LibertyPort *cornerPort(const Corner *corner,
const MinMax *min_max);
const LibertyPort *cornerPort(const Corner *corner,
const MinMax *min_max) const;
LibertyPort *cornerPort(const DcalcAnalysisPt *dcalc_ap);
const LibertyPort *cornerPort(const DcalcAnalysisPt *dcalc_ap) const;
LibertyPort *cornerPort(int ap_index);
const LibertyPort *cornerPort(int ap_index) const;
void setCornerPort(LibertyPort *corner_port,

View File

@ -127,6 +127,11 @@ public:
// This corresponds to a link_path of '*'.
LibertyLibrary *defaultLibertyLibrary() const;
void setDefaultLibertyLibrary(LibertyLibrary *library);
// Check liberty cells used by the network to make sure they exist
// for all the defined corners.
void checkNetworkLibertyCorners();
// Check liberty cells to make sure they exist for all the defined corners.
void checkLibertyCorners();
////////////////////////////////////////////////////////////////
// Cell functions.
@ -514,7 +519,6 @@ public:
virtual void mergeInto(Net *net,
Net *into_net) = 0;
virtual Net *mergedInto(Net *net) = 0;
};
// Network API to support the Parallax readers.

View File

@ -39,10 +39,11 @@ typedef Iterator<ParasiticNode*> ParasiticNodeIterator;
// Parasitic annotation for a pin or net may exist for one analysis point
// and not another.
// If there is only one parasitic for both rise and fall transitions
// the sta parasitic readers will save it under the rise transition.
// the parasitic readers will save it under the rise transition.
class Parasitics : public StaState
{
public:
Parasitics(StaState *sta);
virtual ~Parasitics() {}
virtual bool haveParasitics() = 0;
// Clear all state.
@ -137,7 +138,7 @@ public:
virtual void poleResidue(const Parasitic *parasitic,
int pole_index,
ComplexFloat &pole,
ComplexFloat &residue) const=0;
ComplexFloat &residue) const = 0;
////////////////////////////////////////////////////////////////
// Parasitic Network (detailed parasitics).
@ -300,7 +301,6 @@ protected:
float fanout,
const ParasiticAnalysisPt *ap);
Parasitics(StaState *sta);
Net *findParasiticNet(const Pin *pin) const;
};

View File

@ -1113,13 +1113,14 @@ public:
Instance *instance,
const Corner *corner,
const MinMaxAll *min_max,
bool increment,
bool pin_cap_included,
bool keep_coupling_caps,
float coupling_cap_factor,
ReducedParasiticType reduce_to,
bool delete_after_reduce,
bool quiet);
void reportParasiticAnnotation(bool report_unannotated,
const Corner *corner);
// Parasitics.
void findPiElmore(Pin *drvr_pin,
const RiseFall *rf,
@ -1398,6 +1399,8 @@ protected:
CornerSeq makeCornerSeq(Corner *corner) const;
void makeParasiticAnalysisPts();
void clkSkewPreamble();
void setCmdNamespace1(CmdNamespace namespc);
void setThreadCount1(int thread_count);
CmdNamespace cmd_namespace_;
Instance *current_instance_;

View File

@ -195,7 +195,6 @@ public:
static int wireArcCount() { return 2; }
protected:
void init(LibertyCell *cell);
TimingArcSet(TimingRole *role,
TimingArcAttrsPtr attrs);

View File

@ -36,11 +36,11 @@
#include "EquivCells.hh"
#include "Network.hh"
#include "PortDirection.hh"
#include "Corner.hh"
#include "DcalcAnalysisPt.hh"
namespace sta {
typedef Set<TimingModel*> TimingModelSet;
typedef Set<FuncExpr*> FuncExprSet;
typedef Set<LatchEnable*> LatchEnableSet;
void
@ -782,6 +782,23 @@ LibertyLibrary::makeCornerMap(LibertyCell *cell1,
}
}
void
LibertyLibrary::checkCorners(LibertyCell *cell,
Corners *corners,
Report *report)
{
for (const Corner *corner : *corners) {
for (auto min_max : MinMax::range()) {
if (!cell->checkCornerCell(corner, min_max))
report->error(705, "Liberty cell %s/%s for corner %s/%s not found",
cell->libertyLibrary()->name(),
cell->name(),
corner->name(),
min_max->asString());
}
}
}
////////////////////////////////////////////////////////////////
float
@ -1497,15 +1514,40 @@ LibertyCell::setIsDisabledConstraint(bool is_disabled)
is_disabled_constraint_ = is_disabled;
}
LibertyCell *
LibertyCell::cornerCell(const Corner *corner,
const MinMax *min_max)
{
return cornerCell(corner->libertyIndex(min_max));
}
LibertyCell *
LibertyCell::cornerCell(const DcalcAnalysisPt *dcalc_ap)
{
return cornerCell(dcalc_ap->libertyIndex());
}
LibertyCell *
LibertyCell::cornerCell(int ap_index)
{
if (ap_index < static_cast<int>(corner_cells_.size()))
if (corner_cells_.empty())
return this;
else if (ap_index < static_cast<int>(corner_cells_.size()))
return corner_cells_[ap_index];
else
return nullptr;
}
bool
LibertyCell::checkCornerCell(const Corner *corner,
const MinMax *min_max) const
{
int lib_index = corner->libertyIndex(min_max);
return corner_cells_.empty()
|| (lib_index <= static_cast<int>(corner_cells_.size())
&& corner_cells_[lib_index]);
}
void
LibertyCell::setCornerCell(LibertyCell *corner_cell,
int ap_index)
@ -2323,26 +2365,52 @@ LibertyPort::setIsDisabledConstraint(bool is_disabled)
is_disabled_constraint_ = is_disabled;
}
LibertyPort *
LibertyPort::cornerPort(const Corner *corner,
const MinMax *min_max)
{
return cornerPort(corner->libertyIndex(min_max));
}
const LibertyPort *
LibertyPort::cornerPort(const Corner *corner,
const MinMax *min_max) const
{
return cornerPort(corner->libertyIndex(min_max));
}
LibertyPort *
LibertyPort::cornerPort(const DcalcAnalysisPt *dcalc_ap)
{
return cornerPort(dcalc_ap->libertyIndex());
}
const LibertyPort *
LibertyPort::cornerPort(const DcalcAnalysisPt *dcalc_ap) const
{
return cornerPort(dcalc_ap->libertyIndex());
}
LibertyPort *
LibertyPort::cornerPort(int ap_index)
{
if (ap_index < static_cast<int>(corner_ports_.size())) {
LibertyPort *corner_port = corner_ports_[ap_index];
if (corner_port)
return corner_port;
}
return this;
if (corner_ports_.empty())
return this;
else if (ap_index < static_cast<int>(corner_ports_.size()))
return corner_ports_[ap_index];
else
return nullptr;
}
const LibertyPort *
LibertyPort::cornerPort(int ap_index) const
{
if (ap_index < static_cast<int>(corner_ports_.size())) {
LibertyPort *corner_port = corner_ports_[ap_index];
if (corner_port)
return corner_port;
}
return this;
if (corner_ports_.empty())
return this;
else if (ap_index < static_cast<int>(corner_ports_.size()))
return corner_ports_[ap_index];
else
return nullptr;
}
void

View File

@ -406,16 +406,11 @@ LibertyBuilder::makeFromTransitionArcs(LibertyCell *cell,
{
TimingArcSet *arc_set = makeTimingArcSet(cell, from_port, to_port,
related_out, role, attrs);
TimingModel *model;
RiseFall *to_rf;
to_rf = RiseFall::rise();
model = attrs->model(to_rf);
if (model)
makeTimingArc(arc_set, from_rf, to_rf, model);
to_rf = RiseFall::fall();
model = attrs->model(to_rf);
if (model)
makeTimingArc(arc_set, from_rf, to_rf, model);
for (auto to_rf : RiseFall::range()) {
TimingModel *model = attrs->model(to_rf);
if (model)
makeTimingArc(arc_set, from_rf, to_rf, model);
}
return arc_set;
}

View File

@ -2266,6 +2266,8 @@ LibertyReader::makeTimingArcs(const char *from_port_name,
// one -> one
if (from_port_iter.hasNext()) {
LibertyPort *from_port = from_port_iter.next();
if (from_port->direction()->isOutput())
libWarn(164, timing->line(), "timing group from output port.");
builder_->makeTimingArcs(cell_, from_port, to_port,
related_out_port, timing->attrs());
}
@ -2274,6 +2276,8 @@ LibertyReader::makeTimingArcs(const char *from_port_name,
// bus -> one
while (from_port_iter.hasNext()) {
LibertyPort *from_port = from_port_iter.next();
if (from_port->direction()->isOutput())
libWarn(165, timing->line(), "timing group from output port.");
builder_->makeTimingArcs(cell_, from_port, to_port,
related_out_port, timing->attrs());
}
@ -2282,6 +2286,8 @@ LibertyReader::makeTimingArcs(const char *from_port_name,
// one -> bus
if (from_port_iter.hasNext()) {
LibertyPort *from_port = from_port_iter.next();
if (from_port->direction()->isOutput())
libWarn(166, timing->line(), "timing group from output port.");
LibertyPortMemberIterator bit_iter(to_port);
while (bit_iter.hasNext()) {
LibertyPort *to_port_bit = bit_iter.next();
@ -2298,6 +2304,8 @@ LibertyReader::makeTimingArcs(const char *from_port_name,
while (from_port_iter.hasNext() && to_iter.hasNext()) {
LibertyPort *from_port_bit = from_port_iter.next();
LibertyPort *to_port_bit = to_iter.next();
if (from_port_bit->direction()->isOutput())
libWarn(167, timing->line(), "timing group from output port.");
builder_->makeTimingArcs(cell_, from_port_bit, to_port_bit,
related_out_port, timing->attrs());
}
@ -2311,6 +2319,8 @@ LibertyReader::makeTimingArcs(const char *from_port_name,
else {
while (from_port_iter.hasNext()) {
LibertyPort *from_port_bit = from_port_iter.next();
if (from_port_bit->direction()->isOutput())
libWarn(168, timing->line(), "timing group from output port.");
LibertyPortMemberIterator to_iter(to_port);
while (to_iter.hasNext()) {
LibertyPort *to_port_bit = to_iter.next();

View File

@ -190,10 +190,12 @@ TimingArcSet::TimingArcSet(LibertyCell *cell,
role_(role),
attrs_(attrs),
is_cond_default_(false),
index_(0),
is_disabled_constraint_(false)
index_(cell->addTimingArcSet(this)),
is_disabled_constraint_(false),
from_arc1_{nullptr, nullptr},
from_arc2_{nullptr, nullptr},
to_arc_{nullptr, nullptr}
{
init(cell);
}
TimingArcSet::TimingArcSet(TimingRole *role,
@ -205,22 +207,11 @@ TimingArcSet::TimingArcSet(TimingRole *role,
attrs_(attrs),
is_cond_default_(false),
index_(0),
is_disabled_constraint_(false)
is_disabled_constraint_(false),
from_arc1_{nullptr, nullptr},
from_arc2_{nullptr, nullptr},
to_arc_{nullptr, nullptr}
{
init(nullptr);
}
void
TimingArcSet::init(LibertyCell *cell)
{
if (cell)
index_ = cell->addTimingArcSet(this);
for (auto tr_index : RiseFall::rangeIndex()) {
from_arc1_[tr_index] = nullptr;
from_arc2_[tr_index] = nullptr;
to_arc_[tr_index] = nullptr;
}
}
TimingArcSet::~TimingArcSet()

View File

@ -1,28 +1,29 @@
0001 DmpCeff.cc:1595 cell %s delay model not supported on SPF parasitics by DMP delay calculator
0002 Liberty.cc:739 cell %s/%s port %s not found in cell %s/%s.
0003 Liberty.cc:762 cell %s/%s %s -> %s timing group %s not found in cell %s/%s.
0004 Liberty.cc:1657 cell %s/%s %s -> %s latch enable %s_edge timing arc is inconsistent with %s -> %s setup_%s check.
0005 Liberty.cc:1672 cell %s/%s %s -> %s latch enable %s_edge is inconsistent with latch group enable function positive sense.
0006 Liberty.cc:1680 cell %s/%s %s -> %s latch enable %s_edge is inconsistent with latch group enable function negative sense.
Warning: 705 duplicated
0001 DmpCeff.cc:1597 cell %s delay model not supported on SPF parasitics by DMP delay calculator
0002 Liberty.cc:748 cell %s/%s port %s not found in cell %s/%s.
0003 Liberty.cc:774 cell %s/%s %s -> %s timing group %s not found in cell %s/%s.
0004 Liberty.cc:1680 cell %s/%s %s -> %s latch enable %s_edge is inconsistent with %s -> %s setup_%s check.
0005 Liberty.cc:1694 cell %s/%s %s -> %s latch enable %s_edge is inconsistent with latch group enable function positive sense.
0006 Liberty.cc:1702 cell %s/%s %s -> %s latch enable %s_edge is inconsistent with latch group enable function negative sense.
0007 LibertyExpr.cc:78 %s references unknown port %s.
0008 ConcreteNetwork.cc:1855 cell type %s can not be linked.
0008 ConcreteNetwork.cc:1857 cell type %s can not be linked.
0009 CycleAccting.cc:87 No common period was found between clocks %s and %s.
0010 Genclks.cc:287 no master clock found for generated clock %s.
0011 Genclks.cc:329 generated clock %s is in the fanout of multiple clocks.
0013 Genclks.cc:991 generated clock %s source pin %s missing paths from master clock %s.
0013 Genclks.cc:987 generated clock %s source pin %s missing paths from master clock %s.
0015 Sim.cc:871 propagated logic value %c differs from constraint value of %c on pin %s.
0016 LibertyReader.cc:996 default_max_fanout is 0.0.
0017 Sta.cc:2083 '%s' is not a valid endpoint.
0018 Sta.cc:2007 '%s' is not a valid startoint.
0017 Sta.cc:2094 '%s' is not a valid endpoint.
0018 Sta.cc:2018 '%s' is not a valid start point.
0021 SpefParse.yy:805 %d is not positive.
0022 SpefParse.yy:814 %.4f is not positive.
0023 SpefParse.yy:820 %.4f is not positive.
0024 WritePathSpice.cc:425 pg_pin %s/%s voltage %s not found,
0025 WritePathSpice.cc:432 Liberty pg_port %s/%s missing voltage_name attribute,
0026 WritePathSpice.cc:962 %s pg_port %s not found,
0027 WritePathSpice.cc:1017 no register/latch found for path from %s to %s,
0028 WritePathSpice.cc:1384 The following subkcts are missing from %s
0029 WritePathSpice.cc:1442 subckt %s port %s has no corresponding liberty port, pg_port and is not power or ground.
0026 WritePathSpice.cc:960 %s pg_port %s not found,
0027 WritePathSpice.cc:1015 no register/latch found for path from %s to %s,
0028 WritePathSpice.cc:1382 The following subkcts are missing from %s
0029 WritePathSpice.cc:1440 subckt %s port %s has no corresponding liberty port, pg_port and is not power or ground.
0030 LibertyReader.cc:575 library missing name.
0031 LibertyReader.cc:607 default_wire_load %s not found.
0032 LibertyReader.cc:618 default_wire_selection %s not found.
@ -57,123 +58,128 @@
0059 LibertyReader.cc:1114 default_wire_load_mode %s not found.
0060 LibertyReader.cc:630 default_operating_condition %s not found.
0061 LibertyReader.cc:1285 table template missing name.
0062 LibertyReader.cc:1330 missing variable_%d attribute.
0063 LibertyReader.cc:1372 axis type %s not supported.
0064 LibertyReader.cc:1432 bus type %s missing bit_from.
0065 LibertyReader.cc:1434 bus type %s missing bit_to.
0066 LibertyReader.cc:1438 type missing name.
0067 LibertyReader.cc:1465 scaling_factors do not have a name.
0068 LibertyReader.cc:1633 operating_conditions missing name.
0069 LibertyReader.cc:1703 wire_load missing name.
0070 LibertyReader.cc:1746 fanout_length is missing length and fanout.
0071 LibertyReader.cc:1761 wire_load_selection missing name.
0072 LibertyReader.cc:1792 wireload %s not found.
0074 LibertyReader.cc:1799 wire_load_from_area min not a float.
0075 LibertyReader.cc:1802 wire_load_from_area max not a float.
0076 LibertyReader.cc:1805 wire_load_from_area missing parameters.
0077 LibertyReader.cc:1808 wire_load_from_area missing parameters.
0078 LibertyReader.cc:1825 cell missing name.
0079 LibertyReader.cc:1848 cell %s ocv_derate_group %s not found.
0080 LibertyReader.cc:1884 port %s function size does not match port size.
0081 LibertyReader.cc:1953 %s %s bus width mismatch.
0082 LibertyReader.cc:1964 %s %s bus width mismatch.
0083 LibertyReader.cc:1974 clear
0084 LibertyReader.cc:1984 preset
0085 LibertyReader.cc:2020 latch enable function is non-unate for port %s.
0086 LibertyReader.cc:2025 latch enable function is unknown for port %s.
0087 LibertyReader.cc:2101 operating conditions %s not found.
0088 LibertyReader.cc:2104 scaled_cell missing operating condition.
0089 LibertyReader.cc:2107 scaled_cell cell %s has not been defined.
0090 LibertyReader.cc:2110 scaled_cell missing name.
0091 LibertyReader.cc:2136 scaled_cell %s, %s port functions do not match cell port functions.
0092 LibertyReader.cc:2141 scaled_cell ports do not match cell ports.
0093 LibertyReader.cc:2143 scaled_cell %s, %s timing does not match cell timing.
0094 LibertyReader.cc:2162 combinational timing to an input port.
0095 LibertyReader.cc:2249 missing %s_transition.
0096 LibertyReader.cc:2251 missing cell_%s.
0099 LibertyReader.cc:2517 scaling_factors %s not found.
0100 LibertyReader.cc:2560 pin name is not a string.
0101 LibertyReader.cc:2579 pin name is not a string.
0102 LibertyReader.cc:2601 pin name is not a string.
0103 LibertyReader.cc:2679 bus %s bus_type not found.
0104 LibertyReader.cc:2736 bus_type %s not found.
0105 LibertyReader.cc:2739 bus_type is not a string.
0106 LibertyReader.cc:2757 bundle %s member not found.
0107 LibertyReader.cc:2784 member is not a string.
0108 LibertyReader.cc:2791 members attribute is missing values.
0109 LibertyReader.cc:2834 unknown port direction.
0110 LibertyReader.cc:3204 pulse_latch unknown pulse type.
0111 LibertyReader.cc:3581 unknown timing_type %s.
0112 LibertyReader.cc:3601 unknown timing_sense %s.
0113 LibertyReader.cc:3641 mode value is not a string.
0114 LibertyReader.cc:3644 missing mode value.
0115 LibertyReader.cc:3647 mode name is not a string.
0116 LibertyReader.cc:3650 mode missing values.
0117 LibertyReader.cc:3653 mode missing mode name and value.
0118 LibertyReader.cc:3729 unsupported model axis.
0119 LibertyReader.cc:3758 unsupported model axis.
0120 LibertyReader.cc:3789 unsupported model axis.
0121 LibertyReader.cc:3826 unsupported model axis.
0122 LibertyReader.cc:3878 table template %s not found.
0123 LibertyReader.cc:3965 %s is missing values.
0124 LibertyReader.cc:3990 %s is not a list of floats.
0125 LibertyReader.cc:3992 table row has %u columns but axis has %d.
0126 LibertyReader.cc:4002 table has %u rows but axis has %d.
0127 LibertyReader.cc:4056 lut output is not a string.
0128 LibertyReader.cc:4094 mode definition missing name.
0129 LibertyReader.cc:4111 mode value missing name.
0130 LibertyReader.cc:4125 when attribute inside table model.
0131 LibertyReader.cc:4174 %s attribute is not a string.
0132 LibertyReader.cc:4177 %s is not a simple attribute.
0133 LibertyReader.cc:4200 %s is not a simple attribute.
0134 LibertyReader.cc:4213 %s is not a simple attribute.
0135 LibertyReader.cc:4237 %s value %s is not a float.
0136 LibertyReader.cc:4266 %s missing values.
0137 LibertyReader.cc:4270 %s missing values.
0138 LibertyReader.cc:4273 %s is not a complex attribute.
0139 LibertyReader.cc:4299 %s is not a float.
0140 LibertyReader.cc:4318 %s is missing values.
0141 LibertyReader.cc:4321 %s has more than one string.
0142 LibertyReader.cc:4330 %s is missing values.
0143 LibertyReader.cc:4355 %s attribute is not boolean.
0144 LibertyReader.cc:4358 %s attribute is not boolean.
0145 LibertyReader.cc:4361 %s is not a simple attribute.
0146 LibertyReader.cc:4377 attribute %s value %s not recognized.
0147 LibertyReader.cc:4407 unknown early/late value.
0148 LibertyReader.cc:4633 OCV derate group named %s not found.
0149 LibertyReader.cc:4649 ocv_derate missing name.
0150 LibertyReader.cc:4702 unknown rise/fall.
0151 LibertyReader.cc:4722 unknown derate type.
0152 LibertyReader.cc:4754 unsupported model axis.
0153 LibertyReader.cc:4788 unsupported model axis.
0154 LibertyReader.cc:4822 unsupported model axis.
0155 LibertyReader.cc:4895 unknown pg_type.
0156 LibertyReader.cc:5272 port %s subscript out of range.
0157 LibertyReader.cc:5276 port range %s of non-bus port %s.
0158 LibertyReader.cc:5290 port %s not found.
0159 LibertyReader.cc:5360 port %s not found.
0062 LibertyReader.cc:1327 missing variable_%d attribute.
0063 LibertyReader.cc:1370 axis type %s not supported.
0064 LibertyReader.cc:1430 bus type %s missing bit_from.
0065 LibertyReader.cc:1432 bus type %s missing bit_to.
0066 LibertyReader.cc:1436 type missing name.
0067 LibertyReader.cc:1463 scaling_factors do not have a name.
0068 LibertyReader.cc:1631 operating_conditions missing name.
0069 LibertyReader.cc:1701 wire_load missing name.
0070 LibertyReader.cc:1744 fanout_length is missing length and fanout.
0071 LibertyReader.cc:1759 wire_load_selection missing name.
0072 LibertyReader.cc:1790 wireload %s not found.
0074 LibertyReader.cc:1797 wire_load_from_area min not a float.
0075 LibertyReader.cc:1800 wire_load_from_area max not a float.
0076 LibertyReader.cc:1803 wire_load_from_area missing parameters.
0077 LibertyReader.cc:1806 wire_load_from_area missing parameters.
0078 LibertyReader.cc:1823 cell missing name.
0079 LibertyReader.cc:1846 cell %s ocv_derate_group %s not found.
0080 LibertyReader.cc:1882 port %s function size does not match port size.
0081 LibertyReader.cc:1950 %s %s bus width mismatch.
0082 LibertyReader.cc:1961 %s %s bus width mismatch.
0083 LibertyReader.cc:1971 clear
0084 LibertyReader.cc:1981 preset
0085 LibertyReader.cc:2017 latch enable function is non-unate for port %s.
0086 LibertyReader.cc:2022 latch enable function is unknown for port %s.
0087 LibertyReader.cc:2098 operating conditions %s not found.
0088 LibertyReader.cc:2101 scaled_cell missing operating condition.
0089 LibertyReader.cc:2104 scaled_cell cell %s has not been defined.
0090 LibertyReader.cc:2107 scaled_cell missing name.
0091 LibertyReader.cc:2133 scaled_cell %s, %s port functions do not match cell port functions.
0092 LibertyReader.cc:2138 scaled_cell ports do not match cell ports.
0093 LibertyReader.cc:2140 scaled_cell %s, %s timing does not match cell timing.
0094 LibertyReader.cc:2159 combinational timing to an input port.
0095 LibertyReader.cc:2247 missing %s_transition.
0096 LibertyReader.cc:2249 missing cell_%s.
0099 LibertyReader.cc:2525 scaling_factors %s not found.
0100 LibertyReader.cc:2568 pin name is not a string.
0101 LibertyReader.cc:2587 pin name is not a string.
0102 LibertyReader.cc:2609 pin name is not a string.
0103 LibertyReader.cc:2687 bus %s bus_type not found.
0104 LibertyReader.cc:2743 bus_type %s not found.
0105 LibertyReader.cc:2746 bus_type is not a string.
0106 LibertyReader.cc:2764 bundle %s member not found.
0107 LibertyReader.cc:2791 member is not a string.
0108 LibertyReader.cc:2798 members attribute is missing values.
0109 LibertyReader.cc:2841 unknown port direction.
0110 LibertyReader.cc:3211 pulse_latch unknown pulse type.
0111 LibertyReader.cc:3588 unknown timing_type %s.
0112 LibertyReader.cc:3608 unknown timing_sense %s.
0113 LibertyReader.cc:3648 mode value is not a string.
0114 LibertyReader.cc:3651 missing mode value.
0115 LibertyReader.cc:3654 mode name is not a string.
0116 LibertyReader.cc:3657 mode missing values.
0117 LibertyReader.cc:3660 mode missing mode name and value.
0118 LibertyReader.cc:3736 unsupported model axis.
0119 LibertyReader.cc:3765 unsupported model axis.
0120 LibertyReader.cc:3796 unsupported model axis.
0121 LibertyReader.cc:3833 unsupported model axis.
0122 LibertyReader.cc:3885 table template %s not found.
0123 LibertyReader.cc:3960 %s is missing values.
0124 LibertyReader.cc:3985 %s is not a list of floats.
0125 LibertyReader.cc:3987 table row has %u columns but axis has %d.
0126 LibertyReader.cc:3997 table has %u rows but axis has %d.
0127 LibertyReader.cc:4050 lut output is not a string.
0128 LibertyReader.cc:4088 mode definition missing name.
0129 LibertyReader.cc:4105 mode value missing name.
0130 LibertyReader.cc:4119 when attribute inside table model.
0131 LibertyReader.cc:4168 %s attribute is not a string.
0132 LibertyReader.cc:4171 %s is not a simple attribute.
0133 LibertyReader.cc:4194 %s is not a simple attribute.
0134 LibertyReader.cc:4207 %s is not a simple attribute.
0135 LibertyReader.cc:4231 %s value %s is not a float.
0136 LibertyReader.cc:4260 %s missing values.
0137 LibertyReader.cc:4264 %s missing values.
0138 LibertyReader.cc:4267 %s is not a complex attribute.
0139 LibertyReader.cc:4293 %s is not a float.
0140 LibertyReader.cc:4312 %s is missing values.
0141 LibertyReader.cc:4315 %s has more than one string.
0142 LibertyReader.cc:4324 %s is missing values.
0143 LibertyReader.cc:4349 %s attribute is not boolean.
0144 LibertyReader.cc:4352 %s attribute is not boolean.
0145 LibertyReader.cc:4355 %s is not a simple attribute.
0146 LibertyReader.cc:4371 attribute %s value %s not recognized.
0147 LibertyReader.cc:4401 unknown early/late value.
0148 LibertyReader.cc:4627 OCV derate group named %s not found.
0149 LibertyReader.cc:4643 ocv_derate missing name.
0150 LibertyReader.cc:4696 unknown rise/fall.
0151 LibertyReader.cc:4716 unknown derate type.
0152 LibertyReader.cc:4748 unsupported model axis.
0153 LibertyReader.cc:4782 unsupported model axis.
0154 LibertyReader.cc:4816 unsupported model axis.
0155 LibertyReader.cc:4889 unknown pg_type.
0156 LibertyReader.cc:5263 port %s subscript out of range.
0157 LibertyReader.cc:5267 port range %s of non-bus port %s.
0158 LibertyReader.cc:5281 port %s not found.
0159 LibertyReader.cc:5351 port %s not found.
0160 LibertyReader.cc:981 default_max_transition is 0.0.
0161 LibertyReader.cc:3092 max_transition is 0.0.
0162 LibertyReader.cc:4197 %s attribute is not an integer.
0161 LibertyReader.cc:3099 max_transition is 0.0.
0162 LibertyReader.cc:4191 %s attribute is not an integer.
0163 LibertyReader.cc:1086 default_fanout_load is 0.0.
0179 SpefReader.cc:728 %s.
0164 LibertyReader.cc:2270 timing group from output port.
0165 LibertyReader.cc:2280 timing group from output port.
0166 LibertyReader.cc:2290 timing group from output port.
0167 LibertyReader.cc:2308 timing group from output port.
0168 LibertyReader.cc:2323 timing group from output port.
0179 SpefReader.cc:725 %s.
0190 VerilogReader.cc:1728 %s is not a verilog module.
0191 VerilogReader.cc:1733 %s is not a verilog module.
0201 StaTcl.i:129 no network has been linked.
0202 StaTcl.i:143 network does not support edits.
0204 StaTcl.i:4182 POCV support requires compilation with SSTA=1.
0206 LibertyExpr.cc:171 %s %s.
0207 GraphDelayCalc1.cc:742 port not found in cell
0208 Graph.cc:795 arc_delay_annotated array bounds exceeded
0209 Graph.cc:810 arc_delay_annotated array bounds exceeded
0210 Graph.cc:822 arc_delay_annotated array bounds exceeded
0207 GraphDelayCalc1.cc:738 port not found in cell
0208 Graph.cc:793 arc_delay_annotated array bounds exceeded
0209 Graph.cc:808 arc_delay_annotated array bounds exceeded
0210 Graph.cc:820 arc_delay_annotated array bounds exceeded
0211 SdcNetwork.cc:1026 inst path string lenth estimate busted
0212 SdcNetwork.cc:1098 inst path string lenth estimate exceeded
0213 Sdc.cc:4114 group path name and is_default are mutually exclusive.
0213 Sdc.cc:4101 group path name and is_default are mutually exclusive.
0214 WriteSdc.cc:1317 unknown exception type
0215 WriteSdc.cc:1888 illegal set_logic value
0216 WriteSdc.cc:1932 invalid set_case_analysis value
0228 Graph.cc:835 arc_delay_annotated array bounds exceeded
0228 Graph.cc:833 arc_delay_annotated array bounds exceeded
0251 PathEnumed.cc:126 enumerated path required time
0252 PathEnumed.cc:135 enumerated path required time
0253 PathGroup.cc:402 unknown path end type
@ -183,16 +189,16 @@
0257 ReportPath.cc:349 unsupported path type
0258 ReportPath.cc:2228 generated clock pll source path too short.
0259 ReportPath.cc:2392 unsupported path type
0260 Search.cc:2668 max tag group index exceeded
0261 Search.cc:2900 max tag index exceeded
0262 Search.cc:3595 unexpected filter path
0263 Search.cc:3763 tns incr existing vertex
0264 Sta.cc:4132 corresponding timing arc set not found in equiv cells
0260 Search.cc:2637 max tag group index exceeded
0261 Search.cc:2869 max tag index exceeded
0262 Search.cc:3561 unexpected filter path
0263 Search.cc:3729 tns incr existing vertex
0264 Sta.cc:4150 corresponding timing arc set not found in equiv cells
0265 TagGroup.cc:297 tag group missing tag
0266 Sta.cc:2080 '%s' is not a valid endpoint.
0267 Sta.cc:2004 '%s' is not a valid startpoint.
0266 Sta.cc:2091 '%s' is not a valid endpoint.
0267 Sta.cc:2015 '%s' is not a valid start point.
0272 StaTcl.i:4168 unknown common clk pessimism mode.
0273 StaTcl.i:5176 unknown clock sense
0273 StaTcl.i:5187 unknown clock sense
0300 Util.tcl:218 no commands match '$pattern'.
0301 Power.tcl:215 activity should be 0.0 to 1.0 or 2.0
0302 Power.tcl:223 duty should be 0.0 to 1.0
@ -203,7 +209,7 @@
0314 Cmds.tcl:850 $arg_name must be a single net.
0315 Cmds.tcl:856 $arg_name '$object_type' is not a net.
0316 Cmds.tcl:861 $arg_name '$arg' not found.
0318 Search.tcl:1045 unknown path group '$name'.
0318 Search.tcl:1073 unknown path group '$name'.
0319 Sdc.tcl:279 $unit scale [format %.0e $scale] does not match library scale [format %.0e $unit_scale].
0320 Sdc.tcl:480 current_design for other than top cell not supported.
0321 Sdc.tcl:517 patterns argument not supported with -of_objects.
@ -232,32 +238,32 @@
0345 Sdc.tcl:1575 -pulse argument not supported.
0346 Sdc.tcl:1584 -positive, -negative, -stop_propagation and -pulse are mutually exclusive.
0347 Sdc.tcl:1597 hierarchical pin '[get_full_name $pin]' not supported.
0348 Sdc.tcl:1799 -from/-to keywords ignored for lib_pin, port and pin arguments.
0348 Sdc.tcl:1805 -from/-to keywords ignored for lib_pin, port and pin arguments.
0349 Sdc.tcl:1467 unknown keyword argument $arg.
0350 Sdc.tcl:1947 -from, -through or -to required.
0351 Sdc.tcl:2026 -source_latency_included ignored with -reference_pin.
0352 Sdc.tcl:2029 -network_latency_included ignored with -reference_pin.
0353 Sdc.tcl:2048 $cmd not allowed on [pin_direction $pin] port '[get_full_name $pin]'.
0354 Sdc.tcl:2050 $cmd relative to a clock defined on the same port/pin not allowed.
0355 Sdc.tcl:2093 '$args' ignored.
0356 Sdc.tcl:2223 '$args' ignored.
0357 Sdc.tcl:2270 virtual clock [get_name $clk] can not be propagated.
0358 Sdc.tcl:2419 -multiply_by ignored.
0359 Sdc.tcl:2422 -dont_scale ignored.
0360 Sdc.tcl:2425 -no_design_rule ignored.
0361 Sdc.tcl:2466 -clock not supported.
0362 Sdc.tcl:2469 -clock_fall not supported.
0363 Sdc.tcl:2515 -pin_load not allowed for net objects.
0364 Sdc.tcl:2518 -wire_load not allowed for net objects.
0365 Sdc.tcl:2521 -rise/-fall not allowed for net objects.
0366 Sdc.tcl:2654 -data_path, -clock_path, -rise, -fall ignored for ports and designs.
0367 Sdc.tcl:2724 derating factor greater than 2.0.
0368 Sdc.tcl:2761 -cell_delay and -cell_check flags ignored for net objects.
0369 Sdc.tcl:2820 no valid objects specified for $key.
0370 Sdc.tcl:2853 no valid objects specified for $key
0371 Sdc.tcl:3014 set_wire_load_min_block_size not supported.
0350 Sdc.tcl:1953 -from, -through or -to required.
0351 Sdc.tcl:2032 -source_latency_included ignored with -reference_pin.
0352 Sdc.tcl:2035 -network_latency_included ignored with -reference_pin.
0353 Sdc.tcl:2054 $cmd not allowed on [pin_direction $pin] port '[get_full_name $pin]'.
0354 Sdc.tcl:2056 $cmd relative to a clock defined on the same port/pin not allowed.
0355 Sdc.tcl:2099 '$args' ignored.
0356 Sdc.tcl:2229 '$args' ignored.
0357 Sdc.tcl:2276 virtual clock [get_name $clk] can not be propagated.
0358 Sdc.tcl:2425 -multiply_by ignored.
0359 Sdc.tcl:2428 -dont_scale ignored.
0360 Sdc.tcl:2431 -no_design_rule ignored.
0361 Sdc.tcl:2472 -clock not supported.
0362 Sdc.tcl:2475 -clock_fall not supported.
0363 Sdc.tcl:2521 -pin_load not allowed for net objects.
0364 Sdc.tcl:2524 -wire_load not allowed for net objects.
0365 Sdc.tcl:2527 -rise/-fall not allowed for net objects.
0366 Sdc.tcl:2660 -data_path, -clock_path, -rise, -fall ignored for ports and designs.
0367 Sdc.tcl:2730 derating factor greater than 2.0.
0368 Sdc.tcl:2767 -cell_delay and -cell_check flags ignored for net objects.
0369 Sdc.tcl:2826 no valid objects specified for $key.
0370 Sdc.tcl:2859 no valid objects specified for $key
0371 Sdc.tcl:3020 set_wire_load_min_block_size not supported.
0372 NetworkEdit.tcl:80 connect_pins is deprecated. Use connect_pin.
0373 Sdc.tcl:3164 define_corners must be called before read_liberty.
0373 Sdc.tcl:3170 define_corners must be called before read_liberty.
0400 Util.tcl:44 $cmd $key missing value.
0401 Util.tcl:61 $cmd $key missing value.
0402 Util.tcl:71 $cmd $arg is not a known keyword or flag.
@ -286,18 +292,18 @@
0425 Search.tcl:207 positional arguments not supported.
0426 Search.tcl:526 analysis type single is not consistent with doing both setup/max and hold/min checks.
0427 Search.tcl:531 positional arguments not supported.
0428 Sta.tcl:867 set_assigned_transition transition is not a float.
0428 Sta.tcl:861 set_assigned_transition transition is not a float.
0430 Sdf.tcl:46 -cond_use min_max cannot be used with analysis type single.
0432 Sdf.tcl:157 SDF -divider must be / or .
0433 Parasitics.tcl:47 path instance '$path' not found.
0434 Parasitics.tcl:65 -reduce_to must be pi_elmore or pi_pole_residue2.
0433 Parasitics.tcl:45 path instance '$path' not found.
0434 Parasitics.tcl:62 -reduce_to must be pi_elmore or pi_pole_residue2.
0435 DelayCalc.tcl:119 delay calculator $alg not found.
0436 Variables.tcl:45 sta_report_default_digits must be a positive integer.
0437 Variables.tcl:70 sta_crpr_mode must be pin or transition.
0438 Variables.tcl:187 $var_name value must be 0 or 1.
0439 Sta.tcl:941 unsupported object type $list_type.
0440 Sta.tcl:1239 -from/-to arguments not supported with -of_objects.
0441 Sta.tcl:1377 unsupported -filter expression.
0439 Sta.tcl:935 unsupported object type $list_type.
0440 Sta.tcl:1233 -from/-to arguments not supported with -of_objects.
0441 Sta.tcl:1361 unsupported -filter expression.
0442 Sta.tcl:657 $cmd missing -from argument.
0443 Sta.tcl:662 $cmd missing -to argument.
0444 Sta.tcl:667 $cmd delay is not a float.
@ -305,11 +311,11 @@
0446 Sta.tcl:678 $cmd pin [get_full_name $pin] is not attached to instance [get_full_name $inst].
0447 Sta.tcl:683 $cmd pin [get_full_name $pin] is not attached to instance [get_full_name $inst]
0448 Sta.tcl:688 $cmd -cell or -net required.
0449 Sta.tcl:757 $cmd missing -from argument.
0450 Sta.tcl:766 $cmd -clock must be rise or fall.
0451 Sta.tcl:773 $cmd missing -to argument.
0452 Sta.tcl:788 $cmd missing -setup|-hold|-recovery|-removal check type..
0453 Sta.tcl:796 $cmd check_value is not a float.
0449 Sta.tcl:754 $cmd missing -from argument.
0450 Sta.tcl:763 $cmd -clock must be rise or fall.
0451 Sta.tcl:770 $cmd missing -to argument.
0452 Sta.tcl:785 $cmd missing -setup|-hold|-recovery|-removal check type..
0453 Sta.tcl:793 $cmd check_value is not a float.
0454 Sta.tcl:100 the -all and -name options are mutually exclusive.
0455 Sta.tcl:103 either -all or -name options must be specified.
0456 Sta.tcl:111 one of -logically_exclusive, -physically_exclusive or -asynchronous is required.
@ -347,23 +353,23 @@
0488 Cmds.tcl:727 $arg_name type '$object_type' is not a pin or port.
0489 Cmds.tcl:734 pin '$arg' not found.
0490 Cmds.tcl:754 $arg_name type '$object_type' is not a port.
0491 Sta.tcl:1091 $cmd object is null.
0492 Sta.tcl:1096 $cmd $type_key must be specified with object name argument.
0493 Sta.tcl:1139 get_property $object is not an object.
0494 Sta.tcl:1162 $object_type not supported.
0495 Sta.tcl:1165 $object_type '$object_name' not found.
0496 Sta.tcl:1492 Directory $spice_dir not found.
0497 Sta.tcl:1495 $spice_dir is not a directory.
0498 Sta.tcl:1498 Cannot write in $spice_dir.
0499 Sta.tcl:1501 No -spice_directory specified.
0500 Sta.tcl:1507 -lib_subckt_file $lib_subckt_file is not readable.
0501 Sta.tcl:1510 No -lib_subckt_file specified.
0502 Sta.tcl:1516 -model_file $model_file is not readable.
0503 Sta.tcl:1519 No -model_file specified.
0504 Sta.tcl:1525 No -power specified.
0505 Sta.tcl:1531 No -ground specified.
0506 Sta.tcl:1535 No -path_args specified.
0507 Sta.tcl:1540 No paths found for -path_args $path_args.
0491 Sta.tcl:1085 $cmd object is null.
0492 Sta.tcl:1090 $cmd $type_key must be specified with object name argument.
0493 Sta.tcl:1133 get_property $object is not an object.
0494 Sta.tcl:1156 $object_type not supported.
0495 Sta.tcl:1159 $object_type '$object_name' not found.
0496 Sta.tcl:1476 Directory $spice_dir not found.
0497 Sta.tcl:1479 $spice_dir is not a directory.
0498 Sta.tcl:1482 Cannot write in $spice_dir.
0499 Sta.tcl:1485 No -spice_directory specified.
0500 Sta.tcl:1491 -lib_subckt_file $lib_subckt_file is not readable.
0501 Sta.tcl:1494 No -lib_subckt_file specified.
0502 Sta.tcl:1500 -model_file $model_file is not readable.
0503 Sta.tcl:1503 No -model_file specified.
0504 Sta.tcl:1509 No -power specified.
0505 Sta.tcl:1515 No -ground specified.
0506 Sta.tcl:1519 No -path_args specified.
0507 Sta.tcl:1524 No paths found for -path_args $path_args.
0508 Search.tcl:794 -min and -max cannot both be specified.
0509 Search.tcl:814 pin '$pin_arg' is hierarchical.
0510 Search.tcl:880 -format $format not recognized.
@ -417,31 +423,31 @@
0558 Sdc.tcl:1552 set_sense -type clock|data
0559 Sdc.tcl:1621 transition time can not be specified for virtual clocks.
0560 Sdc.tcl:1642 missing uncertainty value.
0561 Sdc.tcl:1684 -from/-to must be used together.
0562 Sdc.tcl:1704 -rise, -fall options not allowed for single clock uncertainty.
0563 Sdc.tcl:1745 missing -from, -rise_from or -fall_from argument.
0564 Sdc.tcl:1757 missing -to, -rise_to or -fall_to argument.
0565 Sdc.tcl:1829 -from/-to hierarchical instance not supported.
0566 Sdc.tcl:1861 pin '[get_full_name $inst]${hierarchy_separator}${port_name}' not found.
0567 Sdc.tcl:1902 pin '[get_name $cell]${hierarchy_separator}${port_name}' not found.
0568 Sdc.tcl:2087 missing delay argument.
0569 Sdc.tcl:2218 missing path multiplier argument.
0570 Sdc.tcl:2230 cannot use -start with -end.
0571 Sdc.tcl:2298 value must be 0, zero, 1, one, rise, rising, fall, or falling.
0572 Sdc.tcl:2356 cell '$lib_name:$cell_name' not found.
0573 Sdc.tcl:2362 '$cell_name' not found.
0574 Sdc.tcl:2366 missing -lib_cell argument.
0575 Sdc.tcl:2374 port '$to_port_name' not found.
0576 Sdc.tcl:2386 -pin argument required for cells with multiple outputs.
0577 Sdc.tcl:2401 port '$from_port_name' not found.
0578 Sdc.tcl:2608 port '[get_name $port]' is not an input.
0579 Sdc.tcl:2970 operating condition '$op_cond_name' not found.
0580 Sdc.tcl:2988 operating condition '$op_cond_name' not found.
0581 Sdc.tcl:3002 -analysis_type must be single, bc_wc or on_chip_variation.
0582 Sdc.tcl:3027 mode must be top, enclosed or segmented.
0583 Sdc.tcl:3042 no wire load model specified.
0584 Sdc.tcl:3103 wire load selection group '$selection_name' not found.
0585 Sdc.tcl:3234 no default operating conditions found.
0561 Sdc.tcl:1690 -from/-to must be used together.
0562 Sdc.tcl:1710 -rise, -fall options not allowed for single clock uncertainty.
0563 Sdc.tcl:1751 missing -from, -rise_from or -fall_from argument.
0564 Sdc.tcl:1763 missing -to, -rise_to or -fall_to argument.
0565 Sdc.tcl:1835 -from/-to hierarchical instance not supported.
0566 Sdc.tcl:1867 pin '[get_full_name $inst]${hierarchy_separator}${port_name}' not found.
0567 Sdc.tcl:1908 pin '[get_name $cell]${hierarchy_separator}${port_name}' not found.
0568 Sdc.tcl:2093 missing delay argument.
0569 Sdc.tcl:2224 missing path multiplier argument.
0570 Sdc.tcl:2236 cannot use -start with -end.
0571 Sdc.tcl:2304 value must be 0, zero, 1, one, rise, rising, fall, or falling.
0572 Sdc.tcl:2362 cell '$lib_name:$cell_name' not found.
0573 Sdc.tcl:2368 '$cell_name' not found.
0574 Sdc.tcl:2372 missing -lib_cell argument.
0575 Sdc.tcl:2380 port '$to_port_name' not found.
0576 Sdc.tcl:2392 -pin argument required for cells with multiple outputs.
0577 Sdc.tcl:2407 port '$from_port_name' not found.
0578 Sdc.tcl:2614 port '[get_name $port]' is not an input.
0579 Sdc.tcl:2976 operating condition '$op_cond_name' not found.
0580 Sdc.tcl:2994 operating condition '$op_cond_name' not found.
0581 Sdc.tcl:3008 -analysis_type must be single, bc_wc or on_chip_variation.
0582 Sdc.tcl:3033 mode must be top, enclosed or segmented.
0583 Sdc.tcl:3048 no wire load model specified.
0584 Sdc.tcl:3109 wire load selection group '$selection_name' not found.
0585 Sdc.tcl:3240 no default operating conditions found.
0586 NetworkEdit.tcl:50 unsupported object type $object_type.
0587 NetworkEdit.tcl:119 unsupported object type $object_type.
0588 NetworkEdit.tcl:135 unsupported object type $object_type.
@ -454,13 +460,13 @@
0595 DelayNormal2.cc:378 unknown early/late value.
0596 Sim.cc:205 unknown function operator
0597 EstimateParasitics.cc:188 load pin not leaf or top level
0600 Sdc.tcl:1943 '$args' ignored.
0601 Sdc.tcl:2442 set_fanout_load not supported.
0602 Sdc.tcl:2902 no valid objects specified for $key.
0600 Sdc.tcl:1949 '$args' ignored.
0601 Sdc.tcl:2448 set_fanout_load not supported.
0602 Sdc.tcl:2908 no valid objects specified for $key.
0603 NetworkEdit.tcl:172 disconnect_pins is deprecated. Use disconnect_pin.
0604 Sdc.tcl:272 unknown $unit prefix '$prefix'.
0605 Sdc.tcl:3064 wire load model '$model_name' not found.
0606 Sta.tcl:1136 get_property unsupported object type $object_type.
0605 Sdc.tcl:3070 wire load model '$model_name' not found.
0606 Sta.tcl:1130 get_property unsupported object type $object_type.
0607 StaTcl.i:4418 unknown report path field %s
0608 StaTcl.i:4430 unknown report path field %s
0609 Search.tcl:427 -all_violators is deprecated. Use -violators
@ -469,13 +475,16 @@
0612 Sdf.tcl:41 -cond_use must be min, max or min_max.
0616 Search.tcl:1024 specify one of -setup and -hold.
0617 Sdf.tcl:50 -analysis_type is deprecated. Use set_operating_conditions -analysis_type.
0618 DmpCeff.cc:1579 parasitic Pi model has NaNs.
0619 PathEnum.cc:477 path diversion missing edge.
0618 DmpCeff.cc:1581 parasitic Pi model has NaNs.
0619 PathEnum.cc:474 path diversion missing edge.
0620 PathVertex.cc:236 missing arrivals.
0621 PathVertex.cc:250 missing arrivals.
0622 PathVertex.cc:279 missing requireds.
0623 PathVertexRep.cc:153 missing arrivals.
0624 PathVertexRep.cc:150 missing arrivals
0701 LibertyWriter.cc:360 %s/%s/%s timing model not supported.
0702 LibertyWriter.cc:379 3 axis table models not supported.
0703 LibertyWriter.cc:504 %s/%s/%s timing arc type %s not supported.
0701 LibertyWriter.cc:416 %s/%s/%s timing model not supported.
0702 LibertyWriter.cc:436 3 axis table models not supported.
0703 LibertyWriter.cc:576 %s/%s/%s timing arc type %s not supported.
0704 LibertyWriter.cc:289 %s/%s bundled ports not supported.
0705 LumpedCapDelayCalc.cc:168 gate delay input variable is NaN
0705 Liberty.cc:793 Liberty cell %s/%s for corner %s/%s not found

View File

@ -1849,6 +1849,8 @@ ConcreteNetwork::linkNetwork(const char *top_cell_name,
clearConstantNets();
deleteTopInstance();
top_instance_ = link_func_(top_cell_name, make_black_boxes, report, this);
if (top_instance_)
checkNetworkLibertyCorners();
return top_instance_ != nullptr;
}
else {

View File

@ -21,6 +21,7 @@
#include "PatternMatch.hh"
#include "Liberty.hh"
#include "PortDirection.hh"
#include "Corner.hh"
namespace sta {
@ -94,6 +95,47 @@ Network::setDefaultLibertyLibrary(LibertyLibrary *library)
default_liberty_ = library;
}
void
Network::checkLibertyCorners()
{
if (corners_->count() > 1) {
LibertyLibraryIterator *lib_iter = libertyLibraryIterator();
LibertyCellSet cells;
while (lib_iter->hasNext()) {
LibertyLibrary *lib = lib_iter->next();
LibertyCellIterator cell_iter(lib);
while (cell_iter.hasNext()) {
LibertyCell *cell = cell_iter.next();
LibertyCell *link_cell = findLibertyCell(cell->name());
cells.insert(link_cell);
}
}
delete lib_iter;
for (LibertyCell *cell : cells)
LibertyLibrary::checkCorners(cell, corners_, report_);
}
}
void
Network::checkNetworkLibertyCorners()
{
if (corners_->count() > 1) {
LibertyCellSet network_cells;
LeafInstanceIterator *leaf_iter = network_->leafInstanceIterator();
while (leaf_iter->hasNext()) {
const Instance *inst = leaf_iter->next();
LibertyCell *cell = libertyCell(inst);
if (cell)
network_cells.insert(cell);
}
delete leaf_iter;
for (LibertyCell *cell : network_cells)
LibertyLibrary::checkCorners(cell, corners_, report_);
}
}
// Only used by Sta::setMinLibrary so linear search is acceptable.
LibertyLibrary *
Network::findLibertyFilename(const char *filename)

View File

@ -38,7 +38,6 @@ read_spef_cmd(const char *filename,
Instance *instance,
const Corner *corner,
const MinMaxAll *min_max,
bool increment,
bool pin_cap_included,
bool keep_coupling_caps,
float coupling_cap_factor,
@ -48,9 +47,17 @@ read_spef_cmd(const char *filename,
{
cmdLinkedNetwork();
return Sta::sta()->readSpef(filename, instance, corner, min_max,
increment, pin_cap_included,
keep_coupling_caps, coupling_cap_factor,
reduce_to, delete_after_reduce, quiet);
pin_cap_included, keep_coupling_caps,
coupling_cap_factor, reduce_to,
delete_after_reduce, quiet);
}
void
report_parasitic_annotation_cmd(bool report_unannotated,
const Corner *corner)
{
cmdLinkedNetwork();
Sta::sta()->reportParasiticAnnotation(report_unannotated, corner);
}
TmpFloatSeq *

View File

@ -21,7 +21,6 @@ define_cmd_args "read_spef" \
[-min]\
[-max]\
[-path path]\
[-increment]\
[-pin_cap_included]\
[-keep_capacitive_coupling]\
[-coupling_reduction_factor factor]\
@ -34,8 +33,7 @@ define_cmd_args "read_spef" \
proc_redirect read_spef {
parse_key_args "read_spef" args \
keys {-path -coupling_reduction_factor -reduce_to -corner} \
flags {-min -max -increment -pin_cap_included \
-keep_capacitive_coupling \
flags {-min -max -increment -pin_cap_included -keep_capacitive_coupling \
-delete_after_reduce -quiet -save}
check_argc_eq1 "report_spef" $args
@ -49,7 +47,6 @@ proc_redirect read_spef {
}
set corner [parse_corner_or_all keys]
set min_max [parse_min_max_all_flags flags]
set increment [info exists flags(-increment)]
set coupling_reduction_factor 1.0
if [info exists keys(-coupling_reduction_factor)] {
set coupling_reduction_factor $keys(-coupling_reduction_factor)
@ -69,11 +66,25 @@ proc_redirect read_spef {
set quiet [info exists flags(-quiet)]
set save [info exists flags(-save)]
set filename [file nativename [lindex $args 0]]
return [read_spef_cmd $filename $instance $corner $min_max $increment \
if { [info exists flags(-increment)] } {
sta_warn 706 "read_spef -increment is deprecated."
}
return [read_spef_cmd $filename $instance $corner $min_max \
$pin_cap_included $keep_coupling_caps $coupling_reduction_factor \
$reduce_to $delete_after_reduce $quiet]
}
define_cmd_args "report_parasitic_annotation" {}
proc_redirect report_parasitic_annotation {
parse_key_args "report_parasitic_annotation" args \
keys {} flags {-report_unannotated}
check_argc_eq0 "report_parasitic_annotation" $args
set report_unannotated [info exists flags(-report_unannotated)]
report_parasitic_annotation_cmd $report_unannotated [sta::cmd_corner]
}
# set_pi_model [-min] [-max] drvr_pin c2 rpi c1
proc set_pi_model { args } {
parse_key_args "set_pi_model" args keys {} flags {-max -min}

View File

@ -0,0 +1,151 @@
// OpenSTA, Static Timing Analyzer
// Copyright (c) 2022, Parallax Software, Inc.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
#include "ReportParasiticAnnotation.hh"
#include "Report.hh"
#include "Network.hh"
#include "Graph.hh"
#include "Corner.hh"
#include "Parasitics.hh"
#include "DcalcAnalysisPt.hh"
#include "ArcDelayCalc.hh"
namespace sta {
class ReportParasiticAnnotation : public StaState
{
public:
ReportParasiticAnnotation(bool report_unannotated,
const Corner *corner,
StaState *sta);
void report();
private:
void reportAnnotationCounts();
void findCounts();
void findCounts(Instance *inst);
void findCounts(Net *net);
bool report_unannotated_;
const Corner *corner_;
const MinMax *min_max_;
const DcalcAnalysisPt *dcalc_ap_;
const ParasiticAnalysisPt *parasitics_ap_;
NetSet unannotated_nets_;
VertexSet partially_annotated_drvrs_;
};
void
reportParasiticAnnotation(bool report_unannotated,
const Corner *corner,
StaState *sta)
{
ReportParasiticAnnotation report_annotation(report_unannotated, corner, sta);
report_annotation.report();
}
ReportParasiticAnnotation::ReportParasiticAnnotation(bool report_unannotated,
const Corner *corner,
StaState *sta) :
StaState(sta),
report_unannotated_(report_unannotated),
corner_(corner),
min_max_(MinMax::max()),
dcalc_ap_(corner_->findDcalcAnalysisPt(min_max_)),
parasitics_ap_(corner_->findParasiticAnalysisPt(min_max_)),
partially_annotated_drvrs_(graph_)
{
}
void
ReportParasiticAnnotation::report()
{
findCounts();
reportAnnotationCounts();
}
void
ReportParasiticAnnotation::reportAnnotationCounts()
{
report_->reportLine("Found %lu unannotated nets.", unannotated_nets_.size());
if (report_unannotated_) {
for (const Net *net : unannotated_nets_)
report_->reportLine(" %s", network_->pathName(net));
}
report_->reportLine("Found %lu partially unannotated nets.",
partially_annotated_drvrs_.size());
if (report_unannotated_) {
const RiseFall *rf = RiseFall::rise();
for (Vertex *vertex : partially_annotated_drvrs_) {
Pin *drvr_pin = vertex->pin();
Net *net = network_->isTopLevelPort(drvr_pin)
? network_->net(network_->term(drvr_pin))
: network_->net(drvr_pin);
report_->reportLine(" %s", network_->pathName(net));
Parasitic *parasitic = arc_delay_calc_->findParasitic(drvr_pin, rf, dcalc_ap_);
VertexOutEdgeIterator edge_iter(vertex, graph_);
while (edge_iter.hasNext()) {
Edge *edge = edge_iter.next();
Vertex *load_vertex = edge->to(graph_);
Pin *load_pin = load_vertex->pin();
bool elmore_exists = false;
float elmore = 0.0;
parasitics_->findElmore(parasitic, load_pin, elmore, elmore_exists);
if (!elmore_exists)
report_->reportLine(" %s", network_->pathName(load_pin));
}
}
}
}
void
ReportParasiticAnnotation::findCounts()
{
const RiseFall *rf = RiseFall::rise();
VertexIterator vertex_iter(graph_);
while (vertex_iter.hasNext()) {
Vertex *vertex = vertex_iter.next();
if (vertex->isDriver(network_)) {
Pin *drvr_pin = vertex->pin();
Parasitic *parasitic = arc_delay_calc_->findParasitic(drvr_pin, rf, dcalc_ap_);
if (parasitic) {
VertexOutEdgeIterator edge_iter(vertex, graph_);
while (edge_iter.hasNext()) {
Edge *edge = edge_iter.next();
Vertex *load_vertex = edge->to(graph_);
Pin *load_pin = load_vertex->pin();
bool elmore_exists = false;
float elmore = 0.0;
parasitics_->findElmore(parasitic, load_pin, elmore, elmore_exists);
if (!elmore_exists)
partially_annotated_drvrs_.insert(vertex);
}
}
else {
Net *net = network_->isTopLevelPort(drvr_pin)
? network_->net(network_->term(drvr_pin))
: network_->net(drvr_pin);
if (net)
unannotated_nets_.insert(net);
}
}
}
}
} // namespace

View File

@ -0,0 +1,29 @@
// OpenSTA, Static Timing Analyzer
// Copyright (c) 2022, Parallax Software, Inc.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
#pragma once
namespace sta {
class StaState;
class Corner;
void
reportParasiticAnnotation(bool report_unannotated,
const Corner *corner,
StaState *sta);
} // namespace

View File

@ -45,7 +45,6 @@ bool
readSpefFile(const char *filename,
Instance *instance,
ParasiticAnalysisPt *ap,
bool increment,
bool pin_cap_included,
bool keep_coupling_caps,
float coupling_cap_factor,
@ -63,7 +62,7 @@ readSpefFile(const char *filename,
// Use zlib to uncompress gzip'd files automagically.
gzFile stream = gzopen(filename, "rb");
if (stream) {
SpefReader reader(filename, stream, instance, ap, increment,
SpefReader reader(filename, stream, instance, ap,
pin_cap_included, keep_coupling_caps, coupling_cap_factor,
reduce_to, delete_after_reduce, op_cond, corner,
cnst_min_max, quiet, report, network, parasitics);
@ -83,7 +82,6 @@ SpefReader::SpefReader(const char *filename,
gzFile stream,
Instance *instance,
ParasiticAnalysisPt *ap,
bool increment,
bool pin_cap_included,
bool keep_coupling_caps,
float coupling_cap_factor,
@ -99,7 +97,6 @@ SpefReader::SpefReader(const char *filename,
filename_(filename),
instance_(instance),
ap_(ap),
increment_(increment),
pin_cap_included_(pin_cap_included),
keep_coupling_caps_(keep_coupling_caps),
reduce_to_(reduce_to),
@ -391,7 +388,7 @@ void
SpefReader::rspfBegin(Net *net,
SpefTriple *total_cap)
{
if (net && !increment_)
if (net)
parasitics_->deleteParasitics(net, ap_);
// Net total capacitance is ignored.
delete total_cap;
@ -407,19 +404,15 @@ SpefReader::rspfDrvrBegin(Pin *drvr_pin,
SpefRspfPi *pi)
{
if (drvr_pin) {
// Incremental parasitics do not overwrite existing parasitics.
if (!(increment_ &&
parasitics_->findPiElmore(drvr_pin, RiseFall::rise(), ap_))) {
float c2 = pi->c2()->value(triple_index_) * cap_scale_;
float rpi = pi->r1()->value(triple_index_) * res_scale_;
float c1 = pi->c1()->value(triple_index_) * cap_scale_;
// Delete pi model and elmore delays.
parasitics_->deleteParasitics(drvr_pin, ap_);
// Only one parasitic, save it under rise transition.
parasitic_ = parasitics_->makePiElmore(drvr_pin,
RiseFall::rise(),
ap_, c2, rpi, c1);
}
float c2 = pi->c2()->value(triple_index_) * cap_scale_;
float rpi = pi->r1()->value(triple_index_) * res_scale_;
float c1 = pi->c1()->value(triple_index_) * cap_scale_;
// Delete pi model and elmore delays.
parasitics_->deleteParasitics(drvr_pin, ap_);
// Only one parasitic, save it under rise transition.
parasitic_ = parasitics_->makePiElmore(drvr_pin,
RiseFall::rise(),
ap_, c2, rpi, c1);
}
delete pi;
}
@ -447,14 +440,23 @@ SpefReader::dspfBegin(Net *net,
SpefTriple *total_cap)
{
if (net) {
// Incremental parasitics do not overwrite existing parasitics.
if (increment_
&& parasitics_->findParasiticNetwork(net, ap_))
parasitic_ = nullptr;
else {
if (network_->isTopInstance(instance_)) {
parasitics_->deleteReducedParasitics(net, ap_);
parasitic_ = parasitics_->makeParasiticNetwork(net, pin_cap_included_,
ap_);
parasitic_ = parasitics_->makeParasiticNetwork(net, pin_cap_included_, ap_);
}
else {
Net *parasitic_owner = net;
NetTermIterator *term_iter = network_->termIterator(net);
if (term_iter->hasNext()) {
Term *term = term_iter->next();
Pin *hpin = network_->pin(term);
parasitic_owner = network_->net(hpin);
}
delete term_iter;
parasitic_ = parasitics_->findParasiticNetwork(parasitic_owner, ap_);
if (parasitic_ == nullptr)
parasitic_ = parasitics_->makeParasiticNetwork(parasitic_owner,
pin_cap_included_, ap_);
}
net_ = net;
}
@ -469,7 +471,6 @@ void
SpefReader::dspfFinish()
{
if (parasitic_) {
// Checking "should" be done by report_annotated_parasitics.
if (!quiet_)
parasitics_->check(parasitic_);
if (reduce_to_ != ReducedParasiticType::none) {

View File

@ -39,7 +39,6 @@ bool
readSpefFile(const char *filename,
Instance *instance,
ParasiticAnalysisPt *ap,
bool increment,
bool pin_cap_included,
bool keep_coupling_caps,
float coupling_cap_factor,

View File

@ -49,7 +49,6 @@ public:
gzFile stream,
Instance *instance,
ParasiticAnalysisPt *ap,
bool increment,
bool pin_cap_included,
bool keep_coupling_caps,
float coupling_cap_factor,
@ -143,7 +142,6 @@ private:
const char *filename_;
Instance *instance_;
const ParasiticAnalysisPt *ap_;
bool increment_;
bool pin_cap_included_;
bool keep_coupling_caps_;
ReducedParasiticType reduce_to_;

View File

@ -3296,7 +3296,7 @@ Sdc::portCapacitance(Instance *inst,
Pvt *inst_pvt = nullptr;
if (inst)
inst_pvt = pvt(inst, min_max);
LibertyPort *corner_port = port->cornerPort(corner->libertyIndex(min_max));
LibertyPort *corner_port = port->cornerPort(corner, min_max);
return corner_port->capacitance(rf, min_max, op_cond, inst_pvt);
}

View File

@ -248,14 +248,16 @@ SdfReader::findWireEdge(Pin *from_pin,
{
Vertex *to_vertex, *to_vertex_bidirect_drvr;
graph_->pinVertices(to_pin, to_vertex, to_vertex_bidirect_drvr);
// Fanin < fanout, so search for driver from load.
VertexInEdgeIterator edge_iter(to_vertex, graph_);
while (edge_iter.hasNext()) {
Edge *edge = edge_iter.next();
const TimingRole *edge_role = edge->role();
if (edge->from(graph_)->pin() == from_pin
&& edge_role->sdfRole()->isWire())
return edge;
if (to_vertex) {
// Fanin < fanout, so search for driver from load.
VertexInEdgeIterator edge_iter(to_vertex, graph_);
while (edge_iter.hasNext()) {
Edge *edge = edge_iter.next();
const TimingRole *edge_role = edge->role();
if (edge->from(graph_)->pin() == from_pin
&& edge_role->sdfRole()->isWire())
return edge;
}
}
return nullptr;
}

View File

@ -174,7 +174,7 @@ CheckCapacitanceLimits::findLimit(const Pin *pin,
LibertyPort *to_port;
drive->driveCell(rf, min_max, cell, from_port, from_slews, to_port);
if (to_port) {
LibertyPort *corner_port = to_port->cornerPort(corner->libertyIndex(min_max));
LibertyPort *corner_port = to_port->cornerPort(corner, min_max);
corner_port->capacitanceLimit(min_max, limit1, exists1);
if (!exists1
&& corner_port->direction()->isAnyOutput()
@ -202,7 +202,7 @@ CheckCapacitanceLimits::findLimit(const Pin *pin,
}
LibertyPort *port = network->libertyPort(pin);
if (port) {
LibertyPort *corner_port = port->cornerPort(corner->libertyIndex(min_max));
LibertyPort *corner_port = port->cornerPort(corner, min_max);
corner_port->capacitanceLimit(min_max, limit1, exists1);
if (!exists1
&& port->direction()->isAnyOutput())

View File

@ -224,7 +224,7 @@ CheckSlewLimits::findLimit(const Pin *pin,
LibertyPort *to_port;
drive->driveCell(rf, min_max, cell, from_port, from_slews, to_port);
if (to_port) {
LibertyPort *corner_port = to_port->cornerPort(corner->libertyIndex(min_max));
LibertyPort *corner_port = to_port->cornerPort(corner, min_max);
corner_port->slewLimit(min_max, limit1, exists1);
if (!exists1
&& corner_port->direction()->isAnyOutput()
@ -268,7 +268,7 @@ CheckSlewLimits::findLimit(const LibertyPort *port,
}
if (port) {
const LibertyPort *corner_port = port->cornerPort(corner->libertyIndex(min_max));
const LibertyPort *corner_port = port->cornerPort(corner, min_max);
corner_port->slewLimit(min_max, limit1, exists1);
if (!exists1
// default_max_transition only applies to outputs.

View File

@ -172,16 +172,21 @@ ClkSkews::findWorstClkSkew(const Corner *corner,
ClockSet clks;
for (Clock *clk : *sdc_->clocks())
clks.insert(clk);
float worst_skew = INF;
ClkSkewMap skews;
findClkSkew(&clks, corner, setup_hold, skews);
for (auto clk_skew_itr : skews) {
ClkSkew *clk_skew = clk_skew_itr.second;
float skew = clk_skew->skew();
if (skew < worst_skew)
worst_skew = skew;
if (!skews.empty()) {
float worst_skew = INF;
for (auto clk_skew_itr : skews) {
ClkSkew *clk_skew = clk_skew_itr.second;
float skew = clk_skew->skew();
if (skew < worst_skew)
worst_skew = skew;
}
return worst_skew;
}
return worst_skew;
else
// Degenerate design without launch/capture registers.
return 0.0;
}
void

View File

@ -208,30 +208,32 @@ void
MakeEndTimingArcs::visit(PathEnd *path_end)
{
ClockEdge *tgt_clk_edge = path_end->targetClkEdge(sta_);
Debug *debug = sta_->debug();
const MinMax *min_max = path_end->minMax(sta_);
debugPrint(debug, "make_timing_model", 2, "%s %s -> clock %s %s %s",
sta_->network()->pathName(input_pin_),
input_rf_->shortName(),
tgt_clk_edge->name(),
path_end->typeName(),
min_max->asString());
if (debug->check("make_timing_model", 3))
sta_->reportPathEnd(path_end);
Arrival data_delay = path_end->path()->arrival(sta_);
Delay clk_latency = path_end->targetClkDelay(sta_);
ArcDelay check_margin = path_end->margin(sta_);
Delay margin = min_max == MinMax::max()
? data_delay - clk_latency + check_margin
: clk_latency - data_delay + check_margin;
float delay1 = delayAsFloat(margin, MinMax::max(), sta_);
RiseFallMinMax &margins = margins_[tgt_clk_edge];
float max_margin;
bool max_exists;
margins.value(input_rf_, min_max, max_margin, max_exists);
// Always max margin, even for min/hold checks.
margins.setValue(input_rf_, min_max,
max_exists ? max(max_margin, delay1) : delay1);
if (tgt_clk_edge) {
Debug *debug = sta_->debug();
const MinMax *min_max = path_end->minMax(sta_);
debugPrint(debug, "make_timing_model", 2, "%s %s -> clock %s %s %s",
sta_->network()->pathName(input_pin_),
input_rf_->shortName(),
tgt_clk_edge->name(),
path_end->typeName(),
min_max->asString());
if (debug->check("make_timing_model", 3))
sta_->reportPathEnd(path_end);
Arrival data_delay = path_end->path()->arrival(sta_);
Delay clk_latency = path_end->targetClkDelay(sta_);
ArcDelay check_margin = path_end->margin(sta_);
Delay margin = min_max == MinMax::max()
? data_delay - clk_latency + check_margin
: clk_latency - data_delay + check_margin;
float delay1 = delayAsFloat(margin, MinMax::max(), sta_);
RiseFallMinMax &margins = margins_[tgt_clk_edge];
float max_margin;
bool max_exists;
margins.value(input_rf_, min_max, max_margin, max_exists);
// Always max margin, even for min/hold checks.
margins.setValue(input_rf_, min_max,
max_exists ? max(max_margin, delay1) : delay1);
}
}
// input -> register setup/hold

View File

@ -337,6 +337,8 @@ PropActivityVisitor::visit(Vertex *vertex)
vertex->name(network_),
activity.activity(),
activity.duty());
if (!power_->hasActivity(pin))
input_without_activity = true;
power_->setActivity(pin, activity);
}
else {
@ -567,12 +569,15 @@ Power::seedRegOutputActivities(const Instance *reg,
LibertyPort *output,
bool invert)
{
PwrActivity activity = evalActivity(seq->data(), reg);
if (invert)
activity.set(activity.activity(),
1.0 - activity.duty(),
activity.origin());
setSeqActivity(reg, output, activity);
const Pin *out_pin = network_->findPin(reg, output);
if (!hasUserActivity(out_pin)) {
PwrActivity activity = evalActivity(seq->data(), reg);
if (invert)
activity.set(activity.activity(),
1.0 - activity.duty(),
activity.origin());
setSeqActivity(reg, output, activity);
}
}
////////////////////////////////////////////////////////////////
@ -636,9 +641,9 @@ Power::findInputInternalPower(const Pin *pin,
// Return values.
PowerResult &result)
{
int lib_ap_index = corner->libertyIndex(MinMax::max());
LibertyCell *corner_cell = cell->cornerCell(lib_ap_index);
const LibertyPort *corner_port = port->cornerPort(lib_ap_index);
const MinMax *min_max = MinMax::max();
LibertyCell *corner_cell = cell->cornerCell(corner, min_max);
const LibertyPort *corner_port = port->cornerPort(corner, min_max);
if (corner_cell && corner_port) {
const InternalPowerSeq &internal_pwrs = corner_cell->internalPowers(corner_port);
if (!internal_pwrs.empty()) {
@ -779,9 +784,8 @@ Power::findOutputInternalPower(const Pin *to_pin,
cell->name());
const DcalcAnalysisPt *dcalc_ap = corner->findDcalcAnalysisPt(MinMax::max());
const Pvt *pvt = dcalc_ap->operatingConditions();
int lib_ap_index = corner->libertyIndex(MinMax::max());
LibertyCell *corner_cell = cell->cornerCell(lib_ap_index);
const LibertyPort *to_corner_port = to_port->cornerPort(lib_ap_index);
LibertyCell *corner_cell = cell->cornerCell(dcalc_ap);
const LibertyPort *to_corner_port = to_port->cornerPort(dcalc_ap);
debugPrint(debug_, "power", 2, " cap = %s",
units_->capacitanceUnit()->asString(load_cap));
FuncExpr *func = to_port->function();
@ -931,8 +935,7 @@ Power::findLeakagePower(const Instance *,
// Return values.
PowerResult &result)
{
int lib_ap_index = corner->libertyIndex(MinMax::max());
LibertyCell *corner_cell = cell->cornerCell(lib_ap_index);
LibertyCell *corner_cell = cell->cornerCell(corner, MinMax::max());
float cond_leakage = 0.0;
bool found_cond = false;
float default_leakage = 0.0;
@ -995,8 +998,7 @@ Power::findSwitchingPower(LibertyCell *cell,
{
MinMax *mm = MinMax::max();
const DcalcAnalysisPt *dcalc_ap = corner->findDcalcAnalysisPt(mm);
int lib_ap_index = corner->libertyIndex(MinMax::max());
LibertyCell *corner_cell = cell->cornerCell(lib_ap_index);
LibertyCell *corner_cell = cell->cornerCell(dcalc_ap);
float volt = portVoltage(corner_cell, to_port, dcalc_ap);
float switching = .5 * load_cap * volt * volt * activity.activity();
debugPrint(debug_, "power", 2, "switching %s/%s activity = %.2e volt = %.2f %.3e",

View File

@ -2760,14 +2760,16 @@ ReportPath::drvrFanout(Vertex *drvr,
VertexOutEdgeIterator iter(drvr, graph_);
while (iter.hasNext()) {
Edge *edge = iter.next();
Pin *pin = edge->to(graph_)->pin();
if (network_->isTopLevelPort(pin)) {
// Output port counts as a fanout.
Port *port = network_->port(pin);
fanout += sdc_->portExtFanout(port, min_max) + 1;
if (edge->isWire()) {
Pin *pin = edge->to(graph_)->pin();
if (network_->isTopLevelPort(pin)) {
// Output port counts as a fanout.
Port *port = network_->port(pin);
fanout += sdc_->portExtFanout(port, min_max) + 1;
}
else
fanout++;
}
else
fanout++;
}
return fanout;
}

View File

@ -41,6 +41,7 @@
#include "MakeConcreteParasitics.hh"
#include "Parasitics.hh"
#include "parasitics/SpefReader.hh"
#include "parasitics/ReportParasiticAnnotation.hh"
#include "DelayCalc.hh"
#include "ArcDelayCalc.hh"
#include "dcalc/GraphDelayCalc1.hh"
@ -296,13 +297,13 @@ Sta::makeComponents()
makeSdcNetwork();
makeReportPath();
makePower();
setCmdNamespace(CmdNamespace::sdc);
setCmdNamespace1(CmdNamespace::sdc);
setThreadCount1(defaultThreadCount());
updateComponentsState();
makeObservers();
// This must follow updateComponentsState.
makeParasiticAnalysisPts();
setThreadCount(defaultThreadCount());
}
void
@ -321,20 +322,24 @@ Sta::defaultThreadCount() const
void
Sta::setThreadCount(int thread_count)
{
setThreadCount1(thread_count);
updateComponentsState();
}
void
Sta::setThreadCount1(int thread_count)
{
thread_count_ = thread_count;
if (dispatch_queue_)
dispatch_queue_->setThreadCount(thread_count);
else if (thread_count > 1)
dispatch_queue_ = new DispatchQueue(thread_count);
updateComponentsState();
}
void
Sta::updateComponentsState()
{
// These components do not use StaState:
// units_
network_->copyState(this);
cmd_network_->copyState(this);
sdc_network_->copyState(this);
@ -610,6 +615,13 @@ Sta::cmdNamespace()
void
Sta::setCmdNamespace(CmdNamespace namespc)
{
setCmdNamespace1(namespc);
updateComponentsState();
}
void
Sta::setCmdNamespace1(CmdNamespace namespc)
{
cmd_namespace_ = namespc;
switch (cmd_namespace_) {
@ -620,7 +632,6 @@ Sta::setCmdNamespace(CmdNamespace namespc)
cmd_network_ = sdc_network_;
break;
}
updateComponentsState();
}
Instance *
@ -3774,8 +3785,7 @@ Sta::capacitance(const LibertyPort *port,
OperatingConditions *op_cond = operatingConditions(min_max);
float cap = min_max->initValue();
for (const Corner *corner : makeCornerSeq(corner)) {
int lib_ap = corner->libertyIndex(min_max);
const LibertyPort *corner_port = port->cornerPort(lib_ap);
const LibertyPort *corner_port = port->cornerPort(corner, min_max);
for (RiseFall *rf : RiseFall::range())
cap = min_max->minMax(cap, corner_port->capacitance(rf, min_max, op_cond, op_cond));
}
@ -3817,7 +3827,6 @@ Sta::readSpef(const char *filename,
Instance *instance,
const Corner *corner,
const MinMaxAll *min_max,
bool increment,
bool pin_cap_included,
bool keep_coupling_caps,
float coupling_cap_factor,
@ -3835,9 +3844,9 @@ Sta::readSpef(const char *filename,
ParasiticAnalysisPt *ap = corner->findParasiticAnalysisPt(cnst_min_max);
const OperatingConditions *op_cond =
sdc_->operatingConditions(cnst_min_max);
bool success = readSpefFile(filename, instance, ap, increment,
pin_cap_included,
keep_coupling_caps, coupling_cap_factor,
bool success = readSpefFile(filename, instance, ap,
pin_cap_included, keep_coupling_caps,
coupling_cap_factor,
reduce_to, delete_after_reduce,
op_cond, corner, cnst_min_max, quiet,
report_, network_, parasitics_);
@ -3866,6 +3875,15 @@ Sta::makeParasiticAnalysisPts()
parasitics_per_min_max_);
}
void
Sta::reportParasiticAnnotation(bool report_unannotated,
const Corner *corner)
{
ensureGraph();
findDelays();
sta::reportParasiticAnnotation(report_unannotated, corner, this);
}
void
Sta::findPiElmore(Pin *drvr_pin,
const RiseFall *rf,

View File

@ -344,6 +344,7 @@ VisitPathEnds::visitOutputDelayEnd1(OutputDelay *output_delay,
// but the exception may be -to clk.
ExceptionPath *exception = exceptionTo(path, pin, end_rf, tgt_clk_edge,
min_max);
ClockEdge *src_clk_edge = path->clkEdge(this);
if (exception
&& exception->isPathDelay()) {
PathDelay *path_delay = dynamic_cast<PathDelay*>(exception);
@ -351,7 +352,11 @@ VisitPathEnds::visitOutputDelayEnd1(OutputDelay *output_delay,
visitor->visit(&path_end);
is_constrained = true;
}
else if (tgt_clk_edge
else if (src_clk_edge
&& (search_->checkDefaultArrivalPaths()
|| src_clk_edge
!= sdc_->defaultArrivalClockEdge())
&& tgt_clk_edge
&& sdc_->sameClockGroup(path->clock(this), tgt_clk_edge->clock())
// False paths and path delays override.
&& (exception == nullptr

View File

@ -9,10 +9,10 @@ Path Type: max
0.00 0.00 clock network delay (ideal)
0.00 0.00 ^ r2/CK (DFF_X1)
0.23 0.23 v r2/Q (DFF_X1)
0.08 0.32 v u1/Z (BUF_X1)
0.10 0.42 v u2/ZN (AND2_X1)
0.00 0.42 v r3/D (DFF_X1)
0.42 data arrival time
0.08 0.31 v u1/Z (BUF_X1)
0.10 0.41 v u2/ZN (AND2_X1)
0.00 0.41 v r3/D (DFF_X1)
0.41 data arrival time
10.00 10.00 clock clk (rise edge)
0.00 10.00 clock network delay (ideal)
@ -22,7 +22,7 @@ Path Type: max
9.84 data required time
---------------------------------------------------------
9.84 data required time
-0.42 data arrival time
-0.41 data arrival time
---------------------------------------------------------
9.43 slack (MET)

View File

@ -36,10 +36,10 @@ Path Type: max
0.00 0.00 clock network delay (ideal)
0.00 0.00 ^ r2/CK (DFF_X1)
0.23 0.23 v r2/Q (DFF_X1)
0.08 0.32 v u1/Z (BUF_X1)
0.10 0.42 v u2/ZN (AND2_X1)
0.00 0.42 v r3/D (DFF_X1)
0.42 data arrival time
0.08 0.31 v u1/Z (BUF_X1)
0.10 0.41 v u2/ZN (AND2_X1)
0.00 0.41 v r3/D (DFF_X1)
0.41 data arrival time
10.00 10.00 clock clk (rise edge)
0.00 10.00 clock network delay (ideal)
@ -49,7 +49,7 @@ Path Type: max
9.84 data required time
---------------------------------------------------------
9.84 data required time
-0.42 data arrival time
-0.41 data arrival time
---------------------------------------------------------
9.43 slack (MET)

View File

@ -39,9 +39,9 @@ Corner: ss
0.00 0.00 ^ r2/CK (DFF_X1)
0.26 0.26 v r2/Q (DFF_X1)
0.09 0.35 v u1/Z (BUF_X1)
0.11 0.46 v u2/ZN (AND2_X1)
0.00 0.46 v r3/D (DFF_X1)
0.46 data arrival time
0.11 0.45 v u2/ZN (AND2_X1)
0.00 0.45 v r3/D (DFF_X1)
0.45 data arrival time
10.00 10.00 clock clk (rise edge)
0.00 10.00 clock network delay (ideal)
@ -51,9 +51,9 @@ Corner: ss
9.84 data required time
---------------------------------------------------------
9.84 data required time
-0.46 data arrival time
-0.45 data arrival time
---------------------------------------------------------
9.38 slack (MET)
9.39 slack (MET)
Startpoint: r2 (rising edge-triggered flip-flop clocked by clk)
@ -67,7 +67,7 @@ Corner: tt
0.00 0.00 clock clk (rise edge)
0.00 0.00 clock network delay (ideal)
0.00 0.00 ^ r2/CK (DFF_X1)
0.09 0.09 v r2/Q (DFF_X1)
0.08 0.08 v r2/Q (DFF_X1)
0.03 0.11 v u1/Z (BUF_X1)
0.03 0.14 v u2/ZN (AND2_X1)
0.00 0.14 v r3/D (DFF_X1)

View File

@ -0,0 +1,111 @@
# OpenSTA, Static Timing Analyzer
# Copyright (c) 2022, Parallax Software, Inc.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
# Regression variables.
# Application program to run tests on.
set app "sta"
set sta_dir [file dirname $test_dir]
set app_path [file join $sta_dir "app" $app]
# Application options.
set app_options "-no_init -no_splash -exit"
# Log files for each test are placed in result_dir.
set result_dir [file join $test_dir "results"]
# Collective diffs.
set diff_file [file join $result_dir "diffs"]
# File containing list of failed tests.
set failure_file [file join $result_dir "failures"]
# Use the DIFF_OPTIONS envar to change the diff options
# (Solaris diff doesn't support this envar)
set diff_options "-c"
if [info exists env(DIFF_OPTIONS)] {
set diff_options $env(DIFF_OPTIONS)
}
set valgrind_suppress [file join $test_dir valgrind.suppress]
set valgrind_options "--num-callers=20 --leak-check=full --freelist-vol=100000000 --leak-resolution=high --suppressions=$valgrind_suppress"
if { [exec "uname"] == "Darwin" } {
append valgrind_options " --dsymutil=yes"
}
proc cleanse_logfile { test log_file } {
# Nothing to be done here.
}
################################################################
# Record a test in the regression suite.
proc record_test { test cmd_dir } {
global cmd_dirs test_groups
set cmd_dirs($test) $cmd_dir
lappend test_groups(all) $test
return $test
}
# Record a test in the $STA/examples directory.
proc record_example_tests { tests } {
global test_dir test_groups
set example_dir [file join $test_dir ".." "examples"]
foreach test $tests {
# Prune commented tests from the list.
if { [string index $test 0] != "#" } {
record_test $test $example_dir
}
}
}
################################################################
proc define_test_group { name tests } {
global test_groups
set test_groups($name) $tests
}
proc group_tests { name } {
global test_groups
return $test_groups($name)
}
# Clear the test lists.
proc clear_tests {} {
global test_groups
unset test_groups
}
proc list_delete { list delete } {
set result {}
foreach item $list {
if { [lsearch $delete $item] == -1 } {
lappend result $item
}
}
return $result
}
################################################################
# Regression test lists.
# Record tests in sta/examples
record_example_tests {
example1
example2
example3
example4
example5
}
define_test_group fast [group_tests all]