Merge branch 'master' into read_vcd
This commit is contained in:
commit
d33a091793
|
|
@ -116,6 +116,7 @@ set(STA_SOURCE
|
||||||
parasitics/NullParasitics.cc
|
parasitics/NullParasitics.cc
|
||||||
parasitics/Parasitics.cc
|
parasitics/Parasitics.cc
|
||||||
parasitics/ReduceParasitics.cc
|
parasitics/ReduceParasitics.cc
|
||||||
|
parasitics/ReportParasiticAnnotation.cc
|
||||||
parasitics/SpefNamespace.cc
|
parasitics/SpefNamespace.cc
|
||||||
parasitics/SpefReader.cc
|
parasitics/SpefReader.cc
|
||||||
parasitics/SpefReaderPvt.hh
|
parasitics/SpefReaderPvt.hh
|
||||||
|
|
|
||||||
|
|
@ -163,6 +163,9 @@ LumpedCapDelayCalc::gateDelay(const LibertyCell *drvr_cell,
|
||||||
ArcDelay gate_delay1;
|
ArcDelay gate_delay1;
|
||||||
Slew drvr_slew1;
|
Slew drvr_slew1;
|
||||||
float in_slew1 = delayAsFloat(in_slew);
|
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,
|
model->gateDelay(drvr_cell, pvt, in_slew1, load_cap, related_out_cap,
|
||||||
pocv_enabled_, gate_delay1, drvr_slew1);
|
pocv_enabled_, gate_delay1, drvr_slew1);
|
||||||
gate_delay = gate_delay1;
|
gate_delay = gate_delay1;
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,10 @@ OpenSTA Timing Analyzer Release Notes
|
||||||
|
|
||||||
This file summarizes user visible changes for each release.
|
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
|
Release 2.3.2 2022/07/03
|
||||||
-------------------------
|
-------------------------
|
||||||
|
|
||||||
|
|
|
||||||
BIN
doc/OpenSTA.odt
BIN
doc/OpenSTA.odt
Binary file not shown.
BIN
doc/OpenSTA.pdf
BIN
doc/OpenSTA.pdf
Binary file not shown.
|
|
@ -46,8 +46,10 @@ class TimingArcAttrs;
|
||||||
class InternalPowerAttrs;
|
class InternalPowerAttrs;
|
||||||
class LibertyPgPort;
|
class LibertyPgPort;
|
||||||
class StaState;
|
class StaState;
|
||||||
|
class Corner;
|
||||||
|
class Corners;
|
||||||
|
class DcalcAnalysisPt;
|
||||||
|
|
||||||
typedef Set<Library*> LibrarySet;
|
|
||||||
typedef Map<const char*, TableTemplate*, CharPtrLess> TableTemplateMap;
|
typedef Map<const char*, TableTemplate*, CharPtrLess> TableTemplateMap;
|
||||||
typedef Vector<TableTemplate*> TableTemplateSeq;
|
typedef Vector<TableTemplate*> TableTemplateSeq;
|
||||||
typedef Map<const char*, BusDcl *, CharPtrLess> BusDclMap;
|
typedef Map<const char*, BusDcl *, CharPtrLess> BusDclMap;
|
||||||
|
|
@ -294,6 +296,10 @@ public:
|
||||||
bool link,
|
bool link,
|
||||||
int ap_index,
|
int ap_index,
|
||||||
Report *report);
|
Report *report);
|
||||||
|
static void
|
||||||
|
checkCorners(LibertyCell *cell,
|
||||||
|
Corners *corners,
|
||||||
|
Report *report);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
float degradeWireSlew(const LibertyCell *cell,
|
float degradeWireSlew(const LibertyCell *cell,
|
||||||
|
|
@ -443,6 +449,9 @@ public:
|
||||||
RiseFall *&enable_rf) const;
|
RiseFall *&enable_rf) const;
|
||||||
RiseFall *latchCheckEnableEdge(TimingArcSet *check_set);
|
RiseFall *latchCheckEnableEdge(TimingArcSet *check_set);
|
||||||
bool isDisabledConstraint() const { return is_disabled_constraint_; }
|
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);
|
LibertyCell *cornerCell(int ap_index);
|
||||||
|
|
||||||
// AOCV
|
// AOCV
|
||||||
|
|
@ -489,6 +498,9 @@ public:
|
||||||
void bufferPorts(// Return values.
|
void bufferPorts(// Return values.
|
||||||
LibertyPort *&input,
|
LibertyPort *&input,
|
||||||
LibertyPort *&output) const;
|
LibertyPort *&output) const;
|
||||||
|
// Check all liberty cells to make sure they exist
|
||||||
|
// for all the defined corners.
|
||||||
|
static void checkLibertyCorners();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void addPort(ConcretePort *port);
|
void addPort(ConcretePort *port);
|
||||||
|
|
@ -515,6 +527,8 @@ protected:
|
||||||
const LibertyPort *output) const;
|
const LibertyPort *output) const;
|
||||||
bool hasInverterFunc(const LibertyPort *input,
|
bool hasInverterFunc(const LibertyPort *input,
|
||||||
const LibertyPort *output) const;
|
const LibertyPort *output) const;
|
||||||
|
bool checkCornerCell(const Corner *corner,
|
||||||
|
const MinMax *min_max) const;
|
||||||
|
|
||||||
LibertyLibrary *liberty_library_;
|
LibertyLibrary *liberty_library_;
|
||||||
float area_;
|
float area_;
|
||||||
|
|
@ -712,6 +726,12 @@ public:
|
||||||
RiseFall *sense);
|
RiseFall *sense);
|
||||||
bool isDisabledConstraint() const { return is_disabled_constraint_; }
|
bool isDisabledConstraint() const { return is_disabled_constraint_; }
|
||||||
void setIsDisabledConstraint(bool is_disabled);
|
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);
|
LibertyPort *cornerPort(int ap_index);
|
||||||
const LibertyPort *cornerPort(int ap_index) const;
|
const LibertyPort *cornerPort(int ap_index) const;
|
||||||
void setCornerPort(LibertyPort *corner_port,
|
void setCornerPort(LibertyPort *corner_port,
|
||||||
|
|
|
||||||
|
|
@ -127,6 +127,11 @@ public:
|
||||||
// This corresponds to a link_path of '*'.
|
// This corresponds to a link_path of '*'.
|
||||||
LibertyLibrary *defaultLibertyLibrary() const;
|
LibertyLibrary *defaultLibertyLibrary() const;
|
||||||
void setDefaultLibertyLibrary(LibertyLibrary *library);
|
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.
|
// Cell functions.
|
||||||
|
|
@ -514,7 +519,6 @@ public:
|
||||||
virtual void mergeInto(Net *net,
|
virtual void mergeInto(Net *net,
|
||||||
Net *into_net) = 0;
|
Net *into_net) = 0;
|
||||||
virtual Net *mergedInto(Net *net) = 0;
|
virtual Net *mergedInto(Net *net) = 0;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Network API to support the Parallax readers.
|
// Network API to support the Parallax readers.
|
||||||
|
|
|
||||||
|
|
@ -39,10 +39,11 @@ typedef Iterator<ParasiticNode*> ParasiticNodeIterator;
|
||||||
// Parasitic annotation for a pin or net may exist for one analysis point
|
// Parasitic annotation for a pin or net may exist for one analysis point
|
||||||
// and not another.
|
// and not another.
|
||||||
// If there is only one parasitic for both rise and fall transitions
|
// 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
|
class Parasitics : public StaState
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
Parasitics(StaState *sta);
|
||||||
virtual ~Parasitics() {}
|
virtual ~Parasitics() {}
|
||||||
virtual bool haveParasitics() = 0;
|
virtual bool haveParasitics() = 0;
|
||||||
// Clear all state.
|
// Clear all state.
|
||||||
|
|
@ -137,7 +138,7 @@ public:
|
||||||
virtual void poleResidue(const Parasitic *parasitic,
|
virtual void poleResidue(const Parasitic *parasitic,
|
||||||
int pole_index,
|
int pole_index,
|
||||||
ComplexFloat &pole,
|
ComplexFloat &pole,
|
||||||
ComplexFloat &residue) const=0;
|
ComplexFloat &residue) const = 0;
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
// Parasitic Network (detailed parasitics).
|
// Parasitic Network (detailed parasitics).
|
||||||
|
|
@ -300,7 +301,6 @@ protected:
|
||||||
float fanout,
|
float fanout,
|
||||||
const ParasiticAnalysisPt *ap);
|
const ParasiticAnalysisPt *ap);
|
||||||
|
|
||||||
Parasitics(StaState *sta);
|
|
||||||
Net *findParasiticNet(const Pin *pin) const;
|
Net *findParasiticNet(const Pin *pin) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1113,13 +1113,14 @@ public:
|
||||||
Instance *instance,
|
Instance *instance,
|
||||||
const Corner *corner,
|
const Corner *corner,
|
||||||
const MinMaxAll *min_max,
|
const MinMaxAll *min_max,
|
||||||
bool increment,
|
|
||||||
bool pin_cap_included,
|
bool pin_cap_included,
|
||||||
bool keep_coupling_caps,
|
bool keep_coupling_caps,
|
||||||
float coupling_cap_factor,
|
float coupling_cap_factor,
|
||||||
ReducedParasiticType reduce_to,
|
ReducedParasiticType reduce_to,
|
||||||
bool delete_after_reduce,
|
bool delete_after_reduce,
|
||||||
bool quiet);
|
bool quiet);
|
||||||
|
void reportParasiticAnnotation(bool report_unannotated,
|
||||||
|
const Corner *corner);
|
||||||
// Parasitics.
|
// Parasitics.
|
||||||
void findPiElmore(Pin *drvr_pin,
|
void findPiElmore(Pin *drvr_pin,
|
||||||
const RiseFall *rf,
|
const RiseFall *rf,
|
||||||
|
|
@ -1398,6 +1399,8 @@ protected:
|
||||||
CornerSeq makeCornerSeq(Corner *corner) const;
|
CornerSeq makeCornerSeq(Corner *corner) const;
|
||||||
void makeParasiticAnalysisPts();
|
void makeParasiticAnalysisPts();
|
||||||
void clkSkewPreamble();
|
void clkSkewPreamble();
|
||||||
|
void setCmdNamespace1(CmdNamespace namespc);
|
||||||
|
void setThreadCount1(int thread_count);
|
||||||
|
|
||||||
CmdNamespace cmd_namespace_;
|
CmdNamespace cmd_namespace_;
|
||||||
Instance *current_instance_;
|
Instance *current_instance_;
|
||||||
|
|
|
||||||
|
|
@ -195,7 +195,6 @@ public:
|
||||||
static int wireArcCount() { return 2; }
|
static int wireArcCount() { return 2; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void init(LibertyCell *cell);
|
|
||||||
TimingArcSet(TimingRole *role,
|
TimingArcSet(TimingRole *role,
|
||||||
TimingArcAttrsPtr attrs);
|
TimingArcAttrsPtr attrs);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -36,11 +36,11 @@
|
||||||
#include "EquivCells.hh"
|
#include "EquivCells.hh"
|
||||||
#include "Network.hh"
|
#include "Network.hh"
|
||||||
#include "PortDirection.hh"
|
#include "PortDirection.hh"
|
||||||
|
#include "Corner.hh"
|
||||||
|
#include "DcalcAnalysisPt.hh"
|
||||||
|
|
||||||
namespace sta {
|
namespace sta {
|
||||||
|
|
||||||
typedef Set<TimingModel*> TimingModelSet;
|
|
||||||
typedef Set<FuncExpr*> FuncExprSet;
|
|
||||||
typedef Set<LatchEnable*> LatchEnableSet;
|
typedef Set<LatchEnable*> LatchEnableSet;
|
||||||
|
|
||||||
void
|
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
|
float
|
||||||
|
|
@ -1497,15 +1514,40 @@ LibertyCell::setIsDisabledConstraint(bool is_disabled)
|
||||||
is_disabled_constraint_ = 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 *
|
||||||
LibertyCell::cornerCell(int ap_index)
|
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];
|
return corner_cells_[ap_index];
|
||||||
else
|
else
|
||||||
return nullptr;
|
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
|
void
|
||||||
LibertyCell::setCornerCell(LibertyCell *corner_cell,
|
LibertyCell::setCornerCell(LibertyCell *corner_cell,
|
||||||
int ap_index)
|
int ap_index)
|
||||||
|
|
@ -2323,26 +2365,52 @@ LibertyPort::setIsDisabledConstraint(bool is_disabled)
|
||||||
is_disabled_constraint_ = 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 *
|
||||||
LibertyPort::cornerPort(int ap_index)
|
LibertyPort::cornerPort(int ap_index)
|
||||||
{
|
{
|
||||||
if (ap_index < static_cast<int>(corner_ports_.size())) {
|
if (corner_ports_.empty())
|
||||||
LibertyPort *corner_port = corner_ports_[ap_index];
|
return this;
|
||||||
if (corner_port)
|
else if (ap_index < static_cast<int>(corner_ports_.size()))
|
||||||
return corner_port;
|
return corner_ports_[ap_index];
|
||||||
}
|
else
|
||||||
return this;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
const LibertyPort *
|
const LibertyPort *
|
||||||
LibertyPort::cornerPort(int ap_index) const
|
LibertyPort::cornerPort(int ap_index) const
|
||||||
{
|
{
|
||||||
if (ap_index < static_cast<int>(corner_ports_.size())) {
|
if (corner_ports_.empty())
|
||||||
LibertyPort *corner_port = corner_ports_[ap_index];
|
return this;
|
||||||
if (corner_port)
|
else if (ap_index < static_cast<int>(corner_ports_.size()))
|
||||||
return corner_port;
|
return corner_ports_[ap_index];
|
||||||
}
|
else
|
||||||
return this;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
||||||
|
|
@ -406,16 +406,11 @@ LibertyBuilder::makeFromTransitionArcs(LibertyCell *cell,
|
||||||
{
|
{
|
||||||
TimingArcSet *arc_set = makeTimingArcSet(cell, from_port, to_port,
|
TimingArcSet *arc_set = makeTimingArcSet(cell, from_port, to_port,
|
||||||
related_out, role, attrs);
|
related_out, role, attrs);
|
||||||
TimingModel *model;
|
for (auto to_rf : RiseFall::range()) {
|
||||||
RiseFall *to_rf;
|
TimingModel *model = attrs->model(to_rf);
|
||||||
to_rf = RiseFall::rise();
|
if (model)
|
||||||
model = attrs->model(to_rf);
|
makeTimingArc(arc_set, from_rf, to_rf, model);
|
||||||
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);
|
|
||||||
return arc_set;
|
return arc_set;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2266,6 +2266,8 @@ LibertyReader::makeTimingArcs(const char *from_port_name,
|
||||||
// one -> one
|
// one -> one
|
||||||
if (from_port_iter.hasNext()) {
|
if (from_port_iter.hasNext()) {
|
||||||
LibertyPort *from_port = from_port_iter.next();
|
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,
|
builder_->makeTimingArcs(cell_, from_port, to_port,
|
||||||
related_out_port, timing->attrs());
|
related_out_port, timing->attrs());
|
||||||
}
|
}
|
||||||
|
|
@ -2274,6 +2276,8 @@ LibertyReader::makeTimingArcs(const char *from_port_name,
|
||||||
// bus -> one
|
// bus -> one
|
||||||
while (from_port_iter.hasNext()) {
|
while (from_port_iter.hasNext()) {
|
||||||
LibertyPort *from_port = from_port_iter.next();
|
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,
|
builder_->makeTimingArcs(cell_, from_port, to_port,
|
||||||
related_out_port, timing->attrs());
|
related_out_port, timing->attrs());
|
||||||
}
|
}
|
||||||
|
|
@ -2282,6 +2286,8 @@ LibertyReader::makeTimingArcs(const char *from_port_name,
|
||||||
// one -> bus
|
// one -> bus
|
||||||
if (from_port_iter.hasNext()) {
|
if (from_port_iter.hasNext()) {
|
||||||
LibertyPort *from_port = from_port_iter.next();
|
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);
|
LibertyPortMemberIterator bit_iter(to_port);
|
||||||
while (bit_iter.hasNext()) {
|
while (bit_iter.hasNext()) {
|
||||||
LibertyPort *to_port_bit = bit_iter.next();
|
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()) {
|
while (from_port_iter.hasNext() && to_iter.hasNext()) {
|
||||||
LibertyPort *from_port_bit = from_port_iter.next();
|
LibertyPort *from_port_bit = from_port_iter.next();
|
||||||
LibertyPort *to_port_bit = to_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,
|
builder_->makeTimingArcs(cell_, from_port_bit, to_port_bit,
|
||||||
related_out_port, timing->attrs());
|
related_out_port, timing->attrs());
|
||||||
}
|
}
|
||||||
|
|
@ -2311,6 +2319,8 @@ LibertyReader::makeTimingArcs(const char *from_port_name,
|
||||||
else {
|
else {
|
||||||
while (from_port_iter.hasNext()) {
|
while (from_port_iter.hasNext()) {
|
||||||
LibertyPort *from_port_bit = from_port_iter.next();
|
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);
|
LibertyPortMemberIterator to_iter(to_port);
|
||||||
while (to_iter.hasNext()) {
|
while (to_iter.hasNext()) {
|
||||||
LibertyPort *to_port_bit = to_iter.next();
|
LibertyPort *to_port_bit = to_iter.next();
|
||||||
|
|
|
||||||
|
|
@ -190,10 +190,12 @@ TimingArcSet::TimingArcSet(LibertyCell *cell,
|
||||||
role_(role),
|
role_(role),
|
||||||
attrs_(attrs),
|
attrs_(attrs),
|
||||||
is_cond_default_(false),
|
is_cond_default_(false),
|
||||||
index_(0),
|
index_(cell->addTimingArcSet(this)),
|
||||||
is_disabled_constraint_(false)
|
is_disabled_constraint_(false),
|
||||||
|
from_arc1_{nullptr, nullptr},
|
||||||
|
from_arc2_{nullptr, nullptr},
|
||||||
|
to_arc_{nullptr, nullptr}
|
||||||
{
|
{
|
||||||
init(cell);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TimingArcSet::TimingArcSet(TimingRole *role,
|
TimingArcSet::TimingArcSet(TimingRole *role,
|
||||||
|
|
@ -205,22 +207,11 @@ TimingArcSet::TimingArcSet(TimingRole *role,
|
||||||
attrs_(attrs),
|
attrs_(attrs),
|
||||||
is_cond_default_(false),
|
is_cond_default_(false),
|
||||||
index_(0),
|
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()
|
TimingArcSet::~TimingArcSet()
|
||||||
|
|
|
||||||
437
messages.txt
437
messages.txt
|
|
@ -1,28 +1,29 @@
|
||||||
0001 DmpCeff.cc:1595 cell %s delay model not supported on SPF parasitics by DMP delay calculator
|
Warning: 705 duplicated
|
||||||
0002 Liberty.cc:739 cell %s/%s port %s not found in cell %s/%s.
|
0001 DmpCeff.cc:1597 cell %s delay model not supported on SPF parasitics by DMP delay calculator
|
||||||
0003 Liberty.cc:762 cell %s/%s %s -> %s timing group %s not found in cell %s/%s.
|
0002 Liberty.cc:748 cell %s/%s port %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.
|
0003 Liberty.cc:774 cell %s/%s %s -> %s timing group %s not found in cell %s/%s.
|
||||||
0005 Liberty.cc:1672 cell %s/%s %s -> %s latch enable %s_edge is inconsistent with latch group enable function positive sense.
|
0004 Liberty.cc:1680 cell %s/%s %s -> %s latch enable %s_edge is inconsistent with %s -> %s setup_%s check.
|
||||||
0006 Liberty.cc:1680 cell %s/%s %s -> %s latch enable %s_edge is inconsistent with latch group enable function negative sense.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
0016 LibertyReader.cc:996 default_max_fanout is 0.0.
|
||||||
0017 Sta.cc:2083 '%s' is not a valid endpoint.
|
0017 Sta.cc:2094 '%s' is not a valid endpoint.
|
||||||
0018 Sta.cc:2007 '%s' is not a valid startoint.
|
0018 Sta.cc:2018 '%s' is not a valid start point.
|
||||||
0021 SpefParse.yy:805 %d is not positive.
|
0021 SpefParse.yy:805 %d is not positive.
|
||||||
0022 SpefParse.yy:814 %.4f is not positive.
|
0022 SpefParse.yy:814 %.4f is not positive.
|
||||||
0023 SpefParse.yy:820 %.4f is not positive.
|
0023 SpefParse.yy:820 %.4f is not positive.
|
||||||
0024 WritePathSpice.cc:425 pg_pin %s/%s voltage %s not found,
|
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,
|
0025 WritePathSpice.cc:432 Liberty pg_port %s/%s missing voltage_name attribute,
|
||||||
0026 WritePathSpice.cc:962 %s pg_port %s not found,
|
0026 WritePathSpice.cc:960 %s pg_port %s not found,
|
||||||
0027 WritePathSpice.cc:1017 no register/latch found for path from %s to %s,
|
0027 WritePathSpice.cc:1015 no register/latch found for path from %s to %s,
|
||||||
0028 WritePathSpice.cc:1384 The following subkcts are missing from %s
|
0028 WritePathSpice.cc:1382 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.
|
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.
|
0030 LibertyReader.cc:575 library missing name.
|
||||||
0031 LibertyReader.cc:607 default_wire_load %s not found.
|
0031 LibertyReader.cc:607 default_wire_load %s not found.
|
||||||
0032 LibertyReader.cc:618 default_wire_selection %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.
|
0059 LibertyReader.cc:1114 default_wire_load_mode %s not found.
|
||||||
0060 LibertyReader.cc:630 default_operating_condition %s not found.
|
0060 LibertyReader.cc:630 default_operating_condition %s not found.
|
||||||
0061 LibertyReader.cc:1285 table template missing name.
|
0061 LibertyReader.cc:1285 table template missing name.
|
||||||
0062 LibertyReader.cc:1330 missing variable_%d attribute.
|
0062 LibertyReader.cc:1327 missing variable_%d attribute.
|
||||||
0063 LibertyReader.cc:1372 axis type %s not supported.
|
0063 LibertyReader.cc:1370 axis type %s not supported.
|
||||||
0064 LibertyReader.cc:1432 bus type %s missing bit_from.
|
0064 LibertyReader.cc:1430 bus type %s missing bit_from.
|
||||||
0065 LibertyReader.cc:1434 bus type %s missing bit_to.
|
0065 LibertyReader.cc:1432 bus type %s missing bit_to.
|
||||||
0066 LibertyReader.cc:1438 type missing name.
|
0066 LibertyReader.cc:1436 type missing name.
|
||||||
0067 LibertyReader.cc:1465 scaling_factors do not have a name.
|
0067 LibertyReader.cc:1463 scaling_factors do not have a name.
|
||||||
0068 LibertyReader.cc:1633 operating_conditions missing name.
|
0068 LibertyReader.cc:1631 operating_conditions missing name.
|
||||||
0069 LibertyReader.cc:1703 wire_load missing name.
|
0069 LibertyReader.cc:1701 wire_load missing name.
|
||||||
0070 LibertyReader.cc:1746 fanout_length is missing length and fanout.
|
0070 LibertyReader.cc:1744 fanout_length is missing length and fanout.
|
||||||
0071 LibertyReader.cc:1761 wire_load_selection missing name.
|
0071 LibertyReader.cc:1759 wire_load_selection missing name.
|
||||||
0072 LibertyReader.cc:1792 wireload %s not found.
|
0072 LibertyReader.cc:1790 wireload %s not found.
|
||||||
0074 LibertyReader.cc:1799 wire_load_from_area min not a float.
|
0074 LibertyReader.cc:1797 wire_load_from_area min not a float.
|
||||||
0075 LibertyReader.cc:1802 wire_load_from_area max not a float.
|
0075 LibertyReader.cc:1800 wire_load_from_area max not a float.
|
||||||
0076 LibertyReader.cc:1805 wire_load_from_area missing parameters.
|
0076 LibertyReader.cc:1803 wire_load_from_area missing parameters.
|
||||||
0077 LibertyReader.cc:1808 wire_load_from_area missing parameters.
|
0077 LibertyReader.cc:1806 wire_load_from_area missing parameters.
|
||||||
0078 LibertyReader.cc:1825 cell missing name.
|
0078 LibertyReader.cc:1823 cell missing name.
|
||||||
0079 LibertyReader.cc:1848 cell %s ocv_derate_group %s not found.
|
0079 LibertyReader.cc:1846 cell %s ocv_derate_group %s not found.
|
||||||
0080 LibertyReader.cc:1884 port %s function size does not match port size.
|
0080 LibertyReader.cc:1882 port %s function size does not match port size.
|
||||||
0081 LibertyReader.cc:1953 %s %s bus width mismatch.
|
0081 LibertyReader.cc:1950 %s %s bus width mismatch.
|
||||||
0082 LibertyReader.cc:1964 %s %s bus width mismatch.
|
0082 LibertyReader.cc:1961 %s %s bus width mismatch.
|
||||||
0083 LibertyReader.cc:1974 clear
|
0083 LibertyReader.cc:1971 clear
|
||||||
0084 LibertyReader.cc:1984 preset
|
0084 LibertyReader.cc:1981 preset
|
||||||
0085 LibertyReader.cc:2020 latch enable function is non-unate for port %s.
|
0085 LibertyReader.cc:2017 latch enable function is non-unate for port %s.
|
||||||
0086 LibertyReader.cc:2025 latch enable function is unknown for port %s.
|
0086 LibertyReader.cc:2022 latch enable function is unknown for port %s.
|
||||||
0087 LibertyReader.cc:2101 operating conditions %s not found.
|
0087 LibertyReader.cc:2098 operating conditions %s not found.
|
||||||
0088 LibertyReader.cc:2104 scaled_cell missing operating condition.
|
0088 LibertyReader.cc:2101 scaled_cell missing operating condition.
|
||||||
0089 LibertyReader.cc:2107 scaled_cell cell %s has not been defined.
|
0089 LibertyReader.cc:2104 scaled_cell cell %s has not been defined.
|
||||||
0090 LibertyReader.cc:2110 scaled_cell missing name.
|
0090 LibertyReader.cc:2107 scaled_cell missing name.
|
||||||
0091 LibertyReader.cc:2136 scaled_cell %s, %s port functions do not match cell port functions.
|
0091 LibertyReader.cc:2133 scaled_cell %s, %s port functions do not match cell port functions.
|
||||||
0092 LibertyReader.cc:2141 scaled_cell ports do not match cell ports.
|
0092 LibertyReader.cc:2138 scaled_cell ports do not match cell ports.
|
||||||
0093 LibertyReader.cc:2143 scaled_cell %s, %s timing does not match cell timing.
|
0093 LibertyReader.cc:2140 scaled_cell %s, %s timing does not match cell timing.
|
||||||
0094 LibertyReader.cc:2162 combinational timing to an input port.
|
0094 LibertyReader.cc:2159 combinational timing to an input port.
|
||||||
0095 LibertyReader.cc:2249 missing %s_transition.
|
0095 LibertyReader.cc:2247 missing %s_transition.
|
||||||
0096 LibertyReader.cc:2251 missing cell_%s.
|
0096 LibertyReader.cc:2249 missing cell_%s.
|
||||||
0099 LibertyReader.cc:2517 scaling_factors %s not found.
|
0099 LibertyReader.cc:2525 scaling_factors %s not found.
|
||||||
0100 LibertyReader.cc:2560 pin name is not a string.
|
0100 LibertyReader.cc:2568 pin name is not a string.
|
||||||
0101 LibertyReader.cc:2579 pin name is not a string.
|
0101 LibertyReader.cc:2587 pin name is not a string.
|
||||||
0102 LibertyReader.cc:2601 pin name is not a string.
|
0102 LibertyReader.cc:2609 pin name is not a string.
|
||||||
0103 LibertyReader.cc:2679 bus %s bus_type not found.
|
0103 LibertyReader.cc:2687 bus %s bus_type not found.
|
||||||
0104 LibertyReader.cc:2736 bus_type %s not found.
|
0104 LibertyReader.cc:2743 bus_type %s not found.
|
||||||
0105 LibertyReader.cc:2739 bus_type is not a string.
|
0105 LibertyReader.cc:2746 bus_type is not a string.
|
||||||
0106 LibertyReader.cc:2757 bundle %s member not found.
|
0106 LibertyReader.cc:2764 bundle %s member not found.
|
||||||
0107 LibertyReader.cc:2784 member is not a string.
|
0107 LibertyReader.cc:2791 member is not a string.
|
||||||
0108 LibertyReader.cc:2791 members attribute is missing values.
|
0108 LibertyReader.cc:2798 members attribute is missing values.
|
||||||
0109 LibertyReader.cc:2834 unknown port direction.
|
0109 LibertyReader.cc:2841 unknown port direction.
|
||||||
0110 LibertyReader.cc:3204 pulse_latch unknown pulse type.
|
0110 LibertyReader.cc:3211 pulse_latch unknown pulse type.
|
||||||
0111 LibertyReader.cc:3581 unknown timing_type %s.
|
0111 LibertyReader.cc:3588 unknown timing_type %s.
|
||||||
0112 LibertyReader.cc:3601 unknown timing_sense %s.
|
0112 LibertyReader.cc:3608 unknown timing_sense %s.
|
||||||
0113 LibertyReader.cc:3641 mode value is not a string.
|
0113 LibertyReader.cc:3648 mode value is not a string.
|
||||||
0114 LibertyReader.cc:3644 missing mode value.
|
0114 LibertyReader.cc:3651 missing mode value.
|
||||||
0115 LibertyReader.cc:3647 mode name is not a string.
|
0115 LibertyReader.cc:3654 mode name is not a string.
|
||||||
0116 LibertyReader.cc:3650 mode missing values.
|
0116 LibertyReader.cc:3657 mode missing values.
|
||||||
0117 LibertyReader.cc:3653 mode missing mode name and value.
|
0117 LibertyReader.cc:3660 mode missing mode name and value.
|
||||||
0118 LibertyReader.cc:3729 unsupported model axis.
|
0118 LibertyReader.cc:3736 unsupported model axis.
|
||||||
0119 LibertyReader.cc:3758 unsupported model axis.
|
0119 LibertyReader.cc:3765 unsupported model axis.
|
||||||
0120 LibertyReader.cc:3789 unsupported model axis.
|
0120 LibertyReader.cc:3796 unsupported model axis.
|
||||||
0121 LibertyReader.cc:3826 unsupported model axis.
|
0121 LibertyReader.cc:3833 unsupported model axis.
|
||||||
0122 LibertyReader.cc:3878 table template %s not found.
|
0122 LibertyReader.cc:3885 table template %s not found.
|
||||||
0123 LibertyReader.cc:3965 %s is missing values.
|
0123 LibertyReader.cc:3960 %s is missing values.
|
||||||
0124 LibertyReader.cc:3990 %s is not a list of floats.
|
0124 LibertyReader.cc:3985 %s is not a list of floats.
|
||||||
0125 LibertyReader.cc:3992 table row has %u columns but axis has %d.
|
0125 LibertyReader.cc:3987 table row has %u columns but axis has %d.
|
||||||
0126 LibertyReader.cc:4002 table has %u rows but axis has %d.
|
0126 LibertyReader.cc:3997 table has %u rows but axis has %d.
|
||||||
0127 LibertyReader.cc:4056 lut output is not a string.
|
0127 LibertyReader.cc:4050 lut output is not a string.
|
||||||
0128 LibertyReader.cc:4094 mode definition missing name.
|
0128 LibertyReader.cc:4088 mode definition missing name.
|
||||||
0129 LibertyReader.cc:4111 mode value missing name.
|
0129 LibertyReader.cc:4105 mode value missing name.
|
||||||
0130 LibertyReader.cc:4125 when attribute inside table model.
|
0130 LibertyReader.cc:4119 when attribute inside table model.
|
||||||
0131 LibertyReader.cc:4174 %s attribute is not a string.
|
0131 LibertyReader.cc:4168 %s attribute is not a string.
|
||||||
0132 LibertyReader.cc:4177 %s is not a simple attribute.
|
0132 LibertyReader.cc:4171 %s is not a simple attribute.
|
||||||
0133 LibertyReader.cc:4200 %s is not a simple attribute.
|
0133 LibertyReader.cc:4194 %s is not a simple attribute.
|
||||||
0134 LibertyReader.cc:4213 %s is not a simple attribute.
|
0134 LibertyReader.cc:4207 %s is not a simple attribute.
|
||||||
0135 LibertyReader.cc:4237 %s value %s is not a float.
|
0135 LibertyReader.cc:4231 %s value %s is not a float.
|
||||||
0136 LibertyReader.cc:4266 %s missing values.
|
0136 LibertyReader.cc:4260 %s missing values.
|
||||||
0137 LibertyReader.cc:4270 %s missing values.
|
0137 LibertyReader.cc:4264 %s missing values.
|
||||||
0138 LibertyReader.cc:4273 %s is not a complex attribute.
|
0138 LibertyReader.cc:4267 %s is not a complex attribute.
|
||||||
0139 LibertyReader.cc:4299 %s is not a float.
|
0139 LibertyReader.cc:4293 %s is not a float.
|
||||||
0140 LibertyReader.cc:4318 %s is missing values.
|
0140 LibertyReader.cc:4312 %s is missing values.
|
||||||
0141 LibertyReader.cc:4321 %s has more than one string.
|
0141 LibertyReader.cc:4315 %s has more than one string.
|
||||||
0142 LibertyReader.cc:4330 %s is missing values.
|
0142 LibertyReader.cc:4324 %s is missing values.
|
||||||
0143 LibertyReader.cc:4355 %s attribute is not boolean.
|
0143 LibertyReader.cc:4349 %s attribute is not boolean.
|
||||||
0144 LibertyReader.cc:4358 %s attribute is not boolean.
|
0144 LibertyReader.cc:4352 %s attribute is not boolean.
|
||||||
0145 LibertyReader.cc:4361 %s is not a simple attribute.
|
0145 LibertyReader.cc:4355 %s is not a simple attribute.
|
||||||
0146 LibertyReader.cc:4377 attribute %s value %s not recognized.
|
0146 LibertyReader.cc:4371 attribute %s value %s not recognized.
|
||||||
0147 LibertyReader.cc:4407 unknown early/late value.
|
0147 LibertyReader.cc:4401 unknown early/late value.
|
||||||
0148 LibertyReader.cc:4633 OCV derate group named %s not found.
|
0148 LibertyReader.cc:4627 OCV derate group named %s not found.
|
||||||
0149 LibertyReader.cc:4649 ocv_derate missing name.
|
0149 LibertyReader.cc:4643 ocv_derate missing name.
|
||||||
0150 LibertyReader.cc:4702 unknown rise/fall.
|
0150 LibertyReader.cc:4696 unknown rise/fall.
|
||||||
0151 LibertyReader.cc:4722 unknown derate type.
|
0151 LibertyReader.cc:4716 unknown derate type.
|
||||||
0152 LibertyReader.cc:4754 unsupported model axis.
|
0152 LibertyReader.cc:4748 unsupported model axis.
|
||||||
0153 LibertyReader.cc:4788 unsupported model axis.
|
0153 LibertyReader.cc:4782 unsupported model axis.
|
||||||
0154 LibertyReader.cc:4822 unsupported model axis.
|
0154 LibertyReader.cc:4816 unsupported model axis.
|
||||||
0155 LibertyReader.cc:4895 unknown pg_type.
|
0155 LibertyReader.cc:4889 unknown pg_type.
|
||||||
0156 LibertyReader.cc:5272 port %s subscript out of range.
|
0156 LibertyReader.cc:5263 port %s subscript out of range.
|
||||||
0157 LibertyReader.cc:5276 port range %s of non-bus port %s.
|
0157 LibertyReader.cc:5267 port range %s of non-bus port %s.
|
||||||
0158 LibertyReader.cc:5290 port %s not found.
|
0158 LibertyReader.cc:5281 port %s not found.
|
||||||
0159 LibertyReader.cc:5360 port %s not found.
|
0159 LibertyReader.cc:5351 port %s not found.
|
||||||
0160 LibertyReader.cc:981 default_max_transition is 0.0.
|
0160 LibertyReader.cc:981 default_max_transition is 0.0.
|
||||||
0161 LibertyReader.cc:3092 max_transition is 0.0.
|
0161 LibertyReader.cc:3099 max_transition is 0.0.
|
||||||
0162 LibertyReader.cc:4197 %s attribute is not an integer.
|
0162 LibertyReader.cc:4191 %s attribute is not an integer.
|
||||||
0163 LibertyReader.cc:1086 default_fanout_load is 0.0.
|
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.
|
0190 VerilogReader.cc:1728 %s is not a verilog module.
|
||||||
0191 VerilogReader.cc:1733 %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.
|
0201 StaTcl.i:129 no network has been linked.
|
||||||
0202 StaTcl.i:143 network does not support edits.
|
0202 StaTcl.i:143 network does not support edits.
|
||||||
0204 StaTcl.i:4182 POCV support requires compilation with SSTA=1.
|
0204 StaTcl.i:4182 POCV support requires compilation with SSTA=1.
|
||||||
0206 LibertyExpr.cc:171 %s %s.
|
0206 LibertyExpr.cc:171 %s %s.
|
||||||
0207 GraphDelayCalc1.cc:742 port not found in cell
|
0207 GraphDelayCalc1.cc:738 port not found in cell
|
||||||
0208 Graph.cc:795 arc_delay_annotated array bounds exceeded
|
0208 Graph.cc:793 arc_delay_annotated array bounds exceeded
|
||||||
0209 Graph.cc:810 arc_delay_annotated array bounds exceeded
|
0209 Graph.cc:808 arc_delay_annotated array bounds exceeded
|
||||||
0210 Graph.cc:822 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
|
0211 SdcNetwork.cc:1026 inst path string lenth estimate busted
|
||||||
0212 SdcNetwork.cc:1098 inst path string lenth estimate exceeded
|
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
|
0214 WriteSdc.cc:1317 unknown exception type
|
||||||
0215 WriteSdc.cc:1888 illegal set_logic value
|
0215 WriteSdc.cc:1888 illegal set_logic value
|
||||||
0216 WriteSdc.cc:1932 invalid set_case_analysis 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
|
0251 PathEnumed.cc:126 enumerated path required time
|
||||||
0252 PathEnumed.cc:135 enumerated path required time
|
0252 PathEnumed.cc:135 enumerated path required time
|
||||||
0253 PathGroup.cc:402 unknown path end type
|
0253 PathGroup.cc:402 unknown path end type
|
||||||
|
|
@ -183,16 +189,16 @@
|
||||||
0257 ReportPath.cc:349 unsupported path type
|
0257 ReportPath.cc:349 unsupported path type
|
||||||
0258 ReportPath.cc:2228 generated clock pll source path too short.
|
0258 ReportPath.cc:2228 generated clock pll source path too short.
|
||||||
0259 ReportPath.cc:2392 unsupported path type
|
0259 ReportPath.cc:2392 unsupported path type
|
||||||
0260 Search.cc:2668 max tag group index exceeded
|
0260 Search.cc:2637 max tag group index exceeded
|
||||||
0261 Search.cc:2900 max tag index exceeded
|
0261 Search.cc:2869 max tag index exceeded
|
||||||
0262 Search.cc:3595 unexpected filter path
|
0262 Search.cc:3561 unexpected filter path
|
||||||
0263 Search.cc:3763 tns incr existing vertex
|
0263 Search.cc:3729 tns incr existing vertex
|
||||||
0264 Sta.cc:4132 corresponding timing arc set not found in equiv cells
|
0264 Sta.cc:4150 corresponding timing arc set not found in equiv cells
|
||||||
0265 TagGroup.cc:297 tag group missing tag
|
0265 TagGroup.cc:297 tag group missing tag
|
||||||
0266 Sta.cc:2080 '%s' is not a valid endpoint.
|
0266 Sta.cc:2091 '%s' is not a valid endpoint.
|
||||||
0267 Sta.cc:2004 '%s' is not a valid startpoint.
|
0267 Sta.cc:2015 '%s' is not a valid start point.
|
||||||
0272 StaTcl.i:4168 unknown common clk pessimism mode.
|
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'.
|
0300 Util.tcl:218 no commands match '$pattern'.
|
||||||
0301 Power.tcl:215 activity should be 0.0 to 1.0 or 2.0
|
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
|
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.
|
0314 Cmds.tcl:850 $arg_name must be a single net.
|
||||||
0315 Cmds.tcl:856 $arg_name '$object_type' is not a net.
|
0315 Cmds.tcl:856 $arg_name '$object_type' is not a net.
|
||||||
0316 Cmds.tcl:861 $arg_name '$arg' not found.
|
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].
|
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.
|
0320 Sdc.tcl:480 current_design for other than top cell not supported.
|
||||||
0321 Sdc.tcl:517 patterns argument not supported with -of_objects.
|
0321 Sdc.tcl:517 patterns argument not supported with -of_objects.
|
||||||
|
|
@ -232,32 +238,32 @@
|
||||||
0345 Sdc.tcl:1575 -pulse argument not supported.
|
0345 Sdc.tcl:1575 -pulse argument not supported.
|
||||||
0346 Sdc.tcl:1584 -positive, -negative, -stop_propagation and -pulse are mutually exclusive.
|
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.
|
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.
|
0349 Sdc.tcl:1467 unknown keyword argument $arg.
|
||||||
0350 Sdc.tcl:1947 -from, -through or -to required.
|
0350 Sdc.tcl:1953 -from, -through or -to required.
|
||||||
0351 Sdc.tcl:2026 -source_latency_included ignored with -reference_pin.
|
0351 Sdc.tcl:2032 -source_latency_included ignored with -reference_pin.
|
||||||
0352 Sdc.tcl:2029 -network_latency_included ignored with -reference_pin.
|
0352 Sdc.tcl:2035 -network_latency_included ignored with -reference_pin.
|
||||||
0353 Sdc.tcl:2048 $cmd not allowed on [pin_direction $pin] port '[get_full_name $pin]'.
|
0353 Sdc.tcl:2054 $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.
|
0354 Sdc.tcl:2056 $cmd relative to a clock defined on the same port/pin not allowed.
|
||||||
0355 Sdc.tcl:2093 '$args' ignored.
|
0355 Sdc.tcl:2099 '$args' ignored.
|
||||||
0356 Sdc.tcl:2223 '$args' ignored.
|
0356 Sdc.tcl:2229 '$args' ignored.
|
||||||
0357 Sdc.tcl:2270 virtual clock [get_name $clk] can not be propagated.
|
0357 Sdc.tcl:2276 virtual clock [get_name $clk] can not be propagated.
|
||||||
0358 Sdc.tcl:2419 -multiply_by ignored.
|
0358 Sdc.tcl:2425 -multiply_by ignored.
|
||||||
0359 Sdc.tcl:2422 -dont_scale ignored.
|
0359 Sdc.tcl:2428 -dont_scale ignored.
|
||||||
0360 Sdc.tcl:2425 -no_design_rule ignored.
|
0360 Sdc.tcl:2431 -no_design_rule ignored.
|
||||||
0361 Sdc.tcl:2466 -clock not supported.
|
0361 Sdc.tcl:2472 -clock not supported.
|
||||||
0362 Sdc.tcl:2469 -clock_fall not supported.
|
0362 Sdc.tcl:2475 -clock_fall not supported.
|
||||||
0363 Sdc.tcl:2515 -pin_load not allowed for net objects.
|
0363 Sdc.tcl:2521 -pin_load not allowed for net objects.
|
||||||
0364 Sdc.tcl:2518 -wire_load not allowed for net objects.
|
0364 Sdc.tcl:2524 -wire_load not allowed for net objects.
|
||||||
0365 Sdc.tcl:2521 -rise/-fall not allowed for net objects.
|
0365 Sdc.tcl:2527 -rise/-fall not allowed for net objects.
|
||||||
0366 Sdc.tcl:2654 -data_path, -clock_path, -rise, -fall ignored for ports and designs.
|
0366 Sdc.tcl:2660 -data_path, -clock_path, -rise, -fall ignored for ports and designs.
|
||||||
0367 Sdc.tcl:2724 derating factor greater than 2.0.
|
0367 Sdc.tcl:2730 derating factor greater than 2.0.
|
||||||
0368 Sdc.tcl:2761 -cell_delay and -cell_check flags ignored for net objects.
|
0368 Sdc.tcl:2767 -cell_delay and -cell_check flags ignored for net objects.
|
||||||
0369 Sdc.tcl:2820 no valid objects specified for $key.
|
0369 Sdc.tcl:2826 no valid objects specified for $key.
|
||||||
0370 Sdc.tcl:2853 no valid objects specified for $key
|
0370 Sdc.tcl:2859 no valid objects specified for $key
|
||||||
0371 Sdc.tcl:3014 set_wire_load_min_block_size not supported.
|
0371 Sdc.tcl:3020 set_wire_load_min_block_size not supported.
|
||||||
0372 NetworkEdit.tcl:80 connect_pins is deprecated. Use connect_pin.
|
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.
|
0400 Util.tcl:44 $cmd $key missing value.
|
||||||
0401 Util.tcl:61 $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.
|
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.
|
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.
|
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.
|
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.
|
0430 Sdf.tcl:46 -cond_use min_max cannot be used with analysis type single.
|
||||||
0432 Sdf.tcl:157 SDF -divider must be / or .
|
0432 Sdf.tcl:157 SDF -divider must be / or .
|
||||||
0433 Parasitics.tcl:47 path instance '$path' not found.
|
0433 Parasitics.tcl:45 path instance '$path' not found.
|
||||||
0434 Parasitics.tcl:65 -reduce_to must be pi_elmore or pi_pole_residue2.
|
0434 Parasitics.tcl:62 -reduce_to must be pi_elmore or pi_pole_residue2.
|
||||||
0435 DelayCalc.tcl:119 delay calculator $alg not found.
|
0435 DelayCalc.tcl:119 delay calculator $alg not found.
|
||||||
0436 Variables.tcl:45 sta_report_default_digits must be a positive integer.
|
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.
|
0437 Variables.tcl:70 sta_crpr_mode must be pin or transition.
|
||||||
0438 Variables.tcl:187 $var_name value must be 0 or 1.
|
0438 Variables.tcl:187 $var_name value must be 0 or 1.
|
||||||
0439 Sta.tcl:941 unsupported object type $list_type.
|
0439 Sta.tcl:935 unsupported object type $list_type.
|
||||||
0440 Sta.tcl:1239 -from/-to arguments not supported with -of_objects.
|
0440 Sta.tcl:1233 -from/-to arguments not supported with -of_objects.
|
||||||
0441 Sta.tcl:1377 unsupported -filter expression.
|
0441 Sta.tcl:1361 unsupported -filter expression.
|
||||||
0442 Sta.tcl:657 $cmd missing -from argument.
|
0442 Sta.tcl:657 $cmd missing -from argument.
|
||||||
0443 Sta.tcl:662 $cmd missing -to argument.
|
0443 Sta.tcl:662 $cmd missing -to argument.
|
||||||
0444 Sta.tcl:667 $cmd delay is not a float.
|
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].
|
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]
|
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.
|
0448 Sta.tcl:688 $cmd -cell or -net required.
|
||||||
0449 Sta.tcl:757 $cmd missing -from argument.
|
0449 Sta.tcl:754 $cmd missing -from argument.
|
||||||
0450 Sta.tcl:766 $cmd -clock must be rise or fall.
|
0450 Sta.tcl:763 $cmd -clock must be rise or fall.
|
||||||
0451 Sta.tcl:773 $cmd missing -to argument.
|
0451 Sta.tcl:770 $cmd missing -to argument.
|
||||||
0452 Sta.tcl:788 $cmd missing -setup|-hold|-recovery|-removal check type..
|
0452 Sta.tcl:785 $cmd missing -setup|-hold|-recovery|-removal check type..
|
||||||
0453 Sta.tcl:796 $cmd check_value is not a float.
|
0453 Sta.tcl:793 $cmd check_value is not a float.
|
||||||
0454 Sta.tcl:100 the -all and -name options are mutually exclusive.
|
0454 Sta.tcl:100 the -all and -name options are mutually exclusive.
|
||||||
0455 Sta.tcl:103 either -all or -name options must be specified.
|
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.
|
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.
|
0488 Cmds.tcl:727 $arg_name type '$object_type' is not a pin or port.
|
||||||
0489 Cmds.tcl:734 pin '$arg' not found.
|
0489 Cmds.tcl:734 pin '$arg' not found.
|
||||||
0490 Cmds.tcl:754 $arg_name type '$object_type' is not a port.
|
0490 Cmds.tcl:754 $arg_name type '$object_type' is not a port.
|
||||||
0491 Sta.tcl:1091 $cmd object is null.
|
0491 Sta.tcl:1085 $cmd object is null.
|
||||||
0492 Sta.tcl:1096 $cmd $type_key must be specified with object name argument.
|
0492 Sta.tcl:1090 $cmd $type_key must be specified with object name argument.
|
||||||
0493 Sta.tcl:1139 get_property $object is not an object.
|
0493 Sta.tcl:1133 get_property $object is not an object.
|
||||||
0494 Sta.tcl:1162 $object_type not supported.
|
0494 Sta.tcl:1156 $object_type not supported.
|
||||||
0495 Sta.tcl:1165 $object_type '$object_name' not found.
|
0495 Sta.tcl:1159 $object_type '$object_name' not found.
|
||||||
0496 Sta.tcl:1492 Directory $spice_dir not found.
|
0496 Sta.tcl:1476 Directory $spice_dir not found.
|
||||||
0497 Sta.tcl:1495 $spice_dir is not a directory.
|
0497 Sta.tcl:1479 $spice_dir is not a directory.
|
||||||
0498 Sta.tcl:1498 Cannot write in $spice_dir.
|
0498 Sta.tcl:1482 Cannot write in $spice_dir.
|
||||||
0499 Sta.tcl:1501 No -spice_directory specified.
|
0499 Sta.tcl:1485 No -spice_directory specified.
|
||||||
0500 Sta.tcl:1507 -lib_subckt_file $lib_subckt_file is not readable.
|
0500 Sta.tcl:1491 -lib_subckt_file $lib_subckt_file is not readable.
|
||||||
0501 Sta.tcl:1510 No -lib_subckt_file specified.
|
0501 Sta.tcl:1494 No -lib_subckt_file specified.
|
||||||
0502 Sta.tcl:1516 -model_file $model_file is not readable.
|
0502 Sta.tcl:1500 -model_file $model_file is not readable.
|
||||||
0503 Sta.tcl:1519 No -model_file specified.
|
0503 Sta.tcl:1503 No -model_file specified.
|
||||||
0504 Sta.tcl:1525 No -power specified.
|
0504 Sta.tcl:1509 No -power specified.
|
||||||
0505 Sta.tcl:1531 No -ground specified.
|
0505 Sta.tcl:1515 No -ground specified.
|
||||||
0506 Sta.tcl:1535 No -path_args specified.
|
0506 Sta.tcl:1519 No -path_args specified.
|
||||||
0507 Sta.tcl:1540 No paths found for -path_args $path_args.
|
0507 Sta.tcl:1524 No paths found for -path_args $path_args.
|
||||||
0508 Search.tcl:794 -min and -max cannot both be specified.
|
0508 Search.tcl:794 -min and -max cannot both be specified.
|
||||||
0509 Search.tcl:814 pin '$pin_arg' is hierarchical.
|
0509 Search.tcl:814 pin '$pin_arg' is hierarchical.
|
||||||
0510 Search.tcl:880 -format $format not recognized.
|
0510 Search.tcl:880 -format $format not recognized.
|
||||||
|
|
@ -417,31 +423,31 @@
|
||||||
0558 Sdc.tcl:1552 set_sense -type clock|data
|
0558 Sdc.tcl:1552 set_sense -type clock|data
|
||||||
0559 Sdc.tcl:1621 transition time can not be specified for virtual clocks.
|
0559 Sdc.tcl:1621 transition time can not be specified for virtual clocks.
|
||||||
0560 Sdc.tcl:1642 missing uncertainty value.
|
0560 Sdc.tcl:1642 missing uncertainty value.
|
||||||
0561 Sdc.tcl:1684 -from/-to must be used together.
|
0561 Sdc.tcl:1690 -from/-to must be used together.
|
||||||
0562 Sdc.tcl:1704 -rise, -fall options not allowed for single clock uncertainty.
|
0562 Sdc.tcl:1710 -rise, -fall options not allowed for single clock uncertainty.
|
||||||
0563 Sdc.tcl:1745 missing -from, -rise_from or -fall_from argument.
|
0563 Sdc.tcl:1751 missing -from, -rise_from or -fall_from argument.
|
||||||
0564 Sdc.tcl:1757 missing -to, -rise_to or -fall_to argument.
|
0564 Sdc.tcl:1763 missing -to, -rise_to or -fall_to argument.
|
||||||
0565 Sdc.tcl:1829 -from/-to hierarchical instance not supported.
|
0565 Sdc.tcl:1835 -from/-to hierarchical instance not supported.
|
||||||
0566 Sdc.tcl:1861 pin '[get_full_name $inst]${hierarchy_separator}${port_name}' not found.
|
0566 Sdc.tcl:1867 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.
|
0567 Sdc.tcl:1908 pin '[get_name $cell]${hierarchy_separator}${port_name}' not found.
|
||||||
0568 Sdc.tcl:2087 missing delay argument.
|
0568 Sdc.tcl:2093 missing delay argument.
|
||||||
0569 Sdc.tcl:2218 missing path multiplier argument.
|
0569 Sdc.tcl:2224 missing path multiplier argument.
|
||||||
0570 Sdc.tcl:2230 cannot use -start with -end.
|
0570 Sdc.tcl:2236 cannot use -start with -end.
|
||||||
0571 Sdc.tcl:2298 value must be 0, zero, 1, one, rise, rising, fall, or falling.
|
0571 Sdc.tcl:2304 value must be 0, zero, 1, one, rise, rising, fall, or falling.
|
||||||
0572 Sdc.tcl:2356 cell '$lib_name:$cell_name' not found.
|
0572 Sdc.tcl:2362 cell '$lib_name:$cell_name' not found.
|
||||||
0573 Sdc.tcl:2362 '$cell_name' not found.
|
0573 Sdc.tcl:2368 '$cell_name' not found.
|
||||||
0574 Sdc.tcl:2366 missing -lib_cell argument.
|
0574 Sdc.tcl:2372 missing -lib_cell argument.
|
||||||
0575 Sdc.tcl:2374 port '$to_port_name' not found.
|
0575 Sdc.tcl:2380 port '$to_port_name' not found.
|
||||||
0576 Sdc.tcl:2386 -pin argument required for cells with multiple outputs.
|
0576 Sdc.tcl:2392 -pin argument required for cells with multiple outputs.
|
||||||
0577 Sdc.tcl:2401 port '$from_port_name' not found.
|
0577 Sdc.tcl:2407 port '$from_port_name' not found.
|
||||||
0578 Sdc.tcl:2608 port '[get_name $port]' is not an input.
|
0578 Sdc.tcl:2614 port '[get_name $port]' is not an input.
|
||||||
0579 Sdc.tcl:2970 operating condition '$op_cond_name' not found.
|
0579 Sdc.tcl:2976 operating condition '$op_cond_name' not found.
|
||||||
0580 Sdc.tcl:2988 operating condition '$op_cond_name' not found.
|
0580 Sdc.tcl:2994 operating condition '$op_cond_name' not found.
|
||||||
0581 Sdc.tcl:3002 -analysis_type must be single, bc_wc or on_chip_variation.
|
0581 Sdc.tcl:3008 -analysis_type must be single, bc_wc or on_chip_variation.
|
||||||
0582 Sdc.tcl:3027 mode must be top, enclosed or segmented.
|
0582 Sdc.tcl:3033 mode must be top, enclosed or segmented.
|
||||||
0583 Sdc.tcl:3042 no wire load model specified.
|
0583 Sdc.tcl:3048 no wire load model specified.
|
||||||
0584 Sdc.tcl:3103 wire load selection group '$selection_name' not found.
|
0584 Sdc.tcl:3109 wire load selection group '$selection_name' not found.
|
||||||
0585 Sdc.tcl:3234 no default operating conditions found.
|
0585 Sdc.tcl:3240 no default operating conditions found.
|
||||||
0586 NetworkEdit.tcl:50 unsupported object type $object_type.
|
0586 NetworkEdit.tcl:50 unsupported object type $object_type.
|
||||||
0587 NetworkEdit.tcl:119 unsupported object type $object_type.
|
0587 NetworkEdit.tcl:119 unsupported object type $object_type.
|
||||||
0588 NetworkEdit.tcl:135 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.
|
0595 DelayNormal2.cc:378 unknown early/late value.
|
||||||
0596 Sim.cc:205 unknown function operator
|
0596 Sim.cc:205 unknown function operator
|
||||||
0597 EstimateParasitics.cc:188 load pin not leaf or top level
|
0597 EstimateParasitics.cc:188 load pin not leaf or top level
|
||||||
0600 Sdc.tcl:1943 '$args' ignored.
|
0600 Sdc.tcl:1949 '$args' ignored.
|
||||||
0601 Sdc.tcl:2442 set_fanout_load not supported.
|
0601 Sdc.tcl:2448 set_fanout_load not supported.
|
||||||
0602 Sdc.tcl:2902 no valid objects specified for $key.
|
0602 Sdc.tcl:2908 no valid objects specified for $key.
|
||||||
0603 NetworkEdit.tcl:172 disconnect_pins is deprecated. Use disconnect_pin.
|
0603 NetworkEdit.tcl:172 disconnect_pins is deprecated. Use disconnect_pin.
|
||||||
0604 Sdc.tcl:272 unknown $unit prefix '$prefix'.
|
0604 Sdc.tcl:272 unknown $unit prefix '$prefix'.
|
||||||
0605 Sdc.tcl:3064 wire load model '$model_name' not found.
|
0605 Sdc.tcl:3070 wire load model '$model_name' not found.
|
||||||
0606 Sta.tcl:1136 get_property unsupported object type $object_type.
|
0606 Sta.tcl:1130 get_property unsupported object type $object_type.
|
||||||
0607 StaTcl.i:4418 unknown report path field %s
|
0607 StaTcl.i:4418 unknown report path field %s
|
||||||
0608 StaTcl.i:4430 unknown report path field %s
|
0608 StaTcl.i:4430 unknown report path field %s
|
||||||
0609 Search.tcl:427 -all_violators is deprecated. Use -violators
|
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.
|
0612 Sdf.tcl:41 -cond_use must be min, max or min_max.
|
||||||
0616 Search.tcl:1024 specify one of -setup and -hold.
|
0616 Search.tcl:1024 specify one of -setup and -hold.
|
||||||
0617 Sdf.tcl:50 -analysis_type is deprecated. Use set_operating_conditions -analysis_type.
|
0617 Sdf.tcl:50 -analysis_type is deprecated. Use set_operating_conditions -analysis_type.
|
||||||
0618 DmpCeff.cc:1579 parasitic Pi model has NaNs.
|
0618 DmpCeff.cc:1581 parasitic Pi model has NaNs.
|
||||||
0619 PathEnum.cc:477 path diversion missing edge.
|
0619 PathEnum.cc:474 path diversion missing edge.
|
||||||
0620 PathVertex.cc:236 missing arrivals.
|
0620 PathVertex.cc:236 missing arrivals.
|
||||||
0621 PathVertex.cc:250 missing arrivals.
|
0621 PathVertex.cc:250 missing arrivals.
|
||||||
0622 PathVertex.cc:279 missing requireds.
|
0622 PathVertex.cc:279 missing requireds.
|
||||||
0623 PathVertexRep.cc:153 missing arrivals.
|
0623 PathVertexRep.cc:153 missing arrivals.
|
||||||
0624 PathVertexRep.cc:150 missing arrivals
|
0624 PathVertexRep.cc:150 missing arrivals
|
||||||
0701 LibertyWriter.cc:360 %s/%s/%s timing model not supported.
|
0701 LibertyWriter.cc:416 %s/%s/%s timing model not supported.
|
||||||
0702 LibertyWriter.cc:379 3 axis table models not supported.
|
0702 LibertyWriter.cc:436 3 axis table models not supported.
|
||||||
0703 LibertyWriter.cc:504 %s/%s/%s timing arc type %s 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
|
||||||
|
|
|
||||||
|
|
@ -1849,6 +1849,8 @@ ConcreteNetwork::linkNetwork(const char *top_cell_name,
|
||||||
clearConstantNets();
|
clearConstantNets();
|
||||||
deleteTopInstance();
|
deleteTopInstance();
|
||||||
top_instance_ = link_func_(top_cell_name, make_black_boxes, report, this);
|
top_instance_ = link_func_(top_cell_name, make_black_boxes, report, this);
|
||||||
|
if (top_instance_)
|
||||||
|
checkNetworkLibertyCorners();
|
||||||
return top_instance_ != nullptr;
|
return top_instance_ != nullptr;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,7 @@
|
||||||
#include "PatternMatch.hh"
|
#include "PatternMatch.hh"
|
||||||
#include "Liberty.hh"
|
#include "Liberty.hh"
|
||||||
#include "PortDirection.hh"
|
#include "PortDirection.hh"
|
||||||
|
#include "Corner.hh"
|
||||||
|
|
||||||
namespace sta {
|
namespace sta {
|
||||||
|
|
||||||
|
|
@ -94,6 +95,47 @@ Network::setDefaultLibertyLibrary(LibertyLibrary *library)
|
||||||
default_liberty_ = 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.
|
// Only used by Sta::setMinLibrary so linear search is acceptable.
|
||||||
LibertyLibrary *
|
LibertyLibrary *
|
||||||
Network::findLibertyFilename(const char *filename)
|
Network::findLibertyFilename(const char *filename)
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,6 @@ read_spef_cmd(const char *filename,
|
||||||
Instance *instance,
|
Instance *instance,
|
||||||
const Corner *corner,
|
const Corner *corner,
|
||||||
const MinMaxAll *min_max,
|
const MinMaxAll *min_max,
|
||||||
bool increment,
|
|
||||||
bool pin_cap_included,
|
bool pin_cap_included,
|
||||||
bool keep_coupling_caps,
|
bool keep_coupling_caps,
|
||||||
float coupling_cap_factor,
|
float coupling_cap_factor,
|
||||||
|
|
@ -48,9 +47,17 @@ read_spef_cmd(const char *filename,
|
||||||
{
|
{
|
||||||
cmdLinkedNetwork();
|
cmdLinkedNetwork();
|
||||||
return Sta::sta()->readSpef(filename, instance, corner, min_max,
|
return Sta::sta()->readSpef(filename, instance, corner, min_max,
|
||||||
increment, pin_cap_included,
|
pin_cap_included, keep_coupling_caps,
|
||||||
keep_coupling_caps, coupling_cap_factor,
|
coupling_cap_factor, reduce_to,
|
||||||
reduce_to, delete_after_reduce, quiet);
|
delete_after_reduce, quiet);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
report_parasitic_annotation_cmd(bool report_unannotated,
|
||||||
|
const Corner *corner)
|
||||||
|
{
|
||||||
|
cmdLinkedNetwork();
|
||||||
|
Sta::sta()->reportParasiticAnnotation(report_unannotated, corner);
|
||||||
}
|
}
|
||||||
|
|
||||||
TmpFloatSeq *
|
TmpFloatSeq *
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,6 @@ define_cmd_args "read_spef" \
|
||||||
[-min]\
|
[-min]\
|
||||||
[-max]\
|
[-max]\
|
||||||
[-path path]\
|
[-path path]\
|
||||||
[-increment]\
|
|
||||||
[-pin_cap_included]\
|
[-pin_cap_included]\
|
||||||
[-keep_capacitive_coupling]\
|
[-keep_capacitive_coupling]\
|
||||||
[-coupling_reduction_factor factor]\
|
[-coupling_reduction_factor factor]\
|
||||||
|
|
@ -34,8 +33,7 @@ define_cmd_args "read_spef" \
|
||||||
proc_redirect read_spef {
|
proc_redirect read_spef {
|
||||||
parse_key_args "read_spef" args \
|
parse_key_args "read_spef" args \
|
||||||
keys {-path -coupling_reduction_factor -reduce_to -corner} \
|
keys {-path -coupling_reduction_factor -reduce_to -corner} \
|
||||||
flags {-min -max -increment -pin_cap_included \
|
flags {-min -max -increment -pin_cap_included -keep_capacitive_coupling \
|
||||||
-keep_capacitive_coupling \
|
|
||||||
-delete_after_reduce -quiet -save}
|
-delete_after_reduce -quiet -save}
|
||||||
check_argc_eq1 "report_spef" $args
|
check_argc_eq1 "report_spef" $args
|
||||||
|
|
||||||
|
|
@ -49,7 +47,6 @@ proc_redirect read_spef {
|
||||||
}
|
}
|
||||||
set corner [parse_corner_or_all keys]
|
set corner [parse_corner_or_all keys]
|
||||||
set min_max [parse_min_max_all_flags flags]
|
set min_max [parse_min_max_all_flags flags]
|
||||||
set increment [info exists flags(-increment)]
|
|
||||||
set coupling_reduction_factor 1.0
|
set coupling_reduction_factor 1.0
|
||||||
if [info exists keys(-coupling_reduction_factor)] {
|
if [info exists keys(-coupling_reduction_factor)] {
|
||||||
set coupling_reduction_factor $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 quiet [info exists flags(-quiet)]
|
||||||
set save [info exists flags(-save)]
|
set save [info exists flags(-save)]
|
||||||
set filename [file nativename [lindex $args 0]]
|
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 \
|
$pin_cap_included $keep_coupling_caps $coupling_reduction_factor \
|
||||||
$reduce_to $delete_after_reduce $quiet]
|
$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
|
# set_pi_model [-min] [-max] drvr_pin c2 rpi c1
|
||||||
proc set_pi_model { args } {
|
proc set_pi_model { args } {
|
||||||
parse_key_args "set_pi_model" args keys {} flags {-max -min}
|
parse_key_args "set_pi_model" args keys {} flags {-max -min}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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
|
||||||
|
|
@ -45,7 +45,6 @@ bool
|
||||||
readSpefFile(const char *filename,
|
readSpefFile(const char *filename,
|
||||||
Instance *instance,
|
Instance *instance,
|
||||||
ParasiticAnalysisPt *ap,
|
ParasiticAnalysisPt *ap,
|
||||||
bool increment,
|
|
||||||
bool pin_cap_included,
|
bool pin_cap_included,
|
||||||
bool keep_coupling_caps,
|
bool keep_coupling_caps,
|
||||||
float coupling_cap_factor,
|
float coupling_cap_factor,
|
||||||
|
|
@ -63,7 +62,7 @@ readSpefFile(const char *filename,
|
||||||
// Use zlib to uncompress gzip'd files automagically.
|
// Use zlib to uncompress gzip'd files automagically.
|
||||||
gzFile stream = gzopen(filename, "rb");
|
gzFile stream = gzopen(filename, "rb");
|
||||||
if (stream) {
|
if (stream) {
|
||||||
SpefReader reader(filename, stream, instance, ap, increment,
|
SpefReader reader(filename, stream, instance, ap,
|
||||||
pin_cap_included, keep_coupling_caps, coupling_cap_factor,
|
pin_cap_included, keep_coupling_caps, coupling_cap_factor,
|
||||||
reduce_to, delete_after_reduce, op_cond, corner,
|
reduce_to, delete_after_reduce, op_cond, corner,
|
||||||
cnst_min_max, quiet, report, network, parasitics);
|
cnst_min_max, quiet, report, network, parasitics);
|
||||||
|
|
@ -83,7 +82,6 @@ SpefReader::SpefReader(const char *filename,
|
||||||
gzFile stream,
|
gzFile stream,
|
||||||
Instance *instance,
|
Instance *instance,
|
||||||
ParasiticAnalysisPt *ap,
|
ParasiticAnalysisPt *ap,
|
||||||
bool increment,
|
|
||||||
bool pin_cap_included,
|
bool pin_cap_included,
|
||||||
bool keep_coupling_caps,
|
bool keep_coupling_caps,
|
||||||
float coupling_cap_factor,
|
float coupling_cap_factor,
|
||||||
|
|
@ -99,7 +97,6 @@ SpefReader::SpefReader(const char *filename,
|
||||||
filename_(filename),
|
filename_(filename),
|
||||||
instance_(instance),
|
instance_(instance),
|
||||||
ap_(ap),
|
ap_(ap),
|
||||||
increment_(increment),
|
|
||||||
pin_cap_included_(pin_cap_included),
|
pin_cap_included_(pin_cap_included),
|
||||||
keep_coupling_caps_(keep_coupling_caps),
|
keep_coupling_caps_(keep_coupling_caps),
|
||||||
reduce_to_(reduce_to),
|
reduce_to_(reduce_to),
|
||||||
|
|
@ -391,7 +388,7 @@ void
|
||||||
SpefReader::rspfBegin(Net *net,
|
SpefReader::rspfBegin(Net *net,
|
||||||
SpefTriple *total_cap)
|
SpefTriple *total_cap)
|
||||||
{
|
{
|
||||||
if (net && !increment_)
|
if (net)
|
||||||
parasitics_->deleteParasitics(net, ap_);
|
parasitics_->deleteParasitics(net, ap_);
|
||||||
// Net total capacitance is ignored.
|
// Net total capacitance is ignored.
|
||||||
delete total_cap;
|
delete total_cap;
|
||||||
|
|
@ -407,19 +404,15 @@ SpefReader::rspfDrvrBegin(Pin *drvr_pin,
|
||||||
SpefRspfPi *pi)
|
SpefRspfPi *pi)
|
||||||
{
|
{
|
||||||
if (drvr_pin) {
|
if (drvr_pin) {
|
||||||
// Incremental parasitics do not overwrite existing parasitics.
|
float c2 = pi->c2()->value(triple_index_) * cap_scale_;
|
||||||
if (!(increment_ &&
|
float rpi = pi->r1()->value(triple_index_) * res_scale_;
|
||||||
parasitics_->findPiElmore(drvr_pin, RiseFall::rise(), ap_))) {
|
float c1 = pi->c1()->value(triple_index_) * cap_scale_;
|
||||||
float c2 = pi->c2()->value(triple_index_) * cap_scale_;
|
// Delete pi model and elmore delays.
|
||||||
float rpi = pi->r1()->value(triple_index_) * res_scale_;
|
parasitics_->deleteParasitics(drvr_pin, ap_);
|
||||||
float c1 = pi->c1()->value(triple_index_) * cap_scale_;
|
// Only one parasitic, save it under rise transition.
|
||||||
// Delete pi model and elmore delays.
|
parasitic_ = parasitics_->makePiElmore(drvr_pin,
|
||||||
parasitics_->deleteParasitics(drvr_pin, ap_);
|
RiseFall::rise(),
|
||||||
// Only one parasitic, save it under rise transition.
|
ap_, c2, rpi, c1);
|
||||||
parasitic_ = parasitics_->makePiElmore(drvr_pin,
|
|
||||||
RiseFall::rise(),
|
|
||||||
ap_, c2, rpi, c1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
delete pi;
|
delete pi;
|
||||||
}
|
}
|
||||||
|
|
@ -447,14 +440,23 @@ SpefReader::dspfBegin(Net *net,
|
||||||
SpefTriple *total_cap)
|
SpefTriple *total_cap)
|
||||||
{
|
{
|
||||||
if (net) {
|
if (net) {
|
||||||
// Incremental parasitics do not overwrite existing parasitics.
|
if (network_->isTopInstance(instance_)) {
|
||||||
if (increment_
|
|
||||||
&& parasitics_->findParasiticNetwork(net, ap_))
|
|
||||||
parasitic_ = nullptr;
|
|
||||||
else {
|
|
||||||
parasitics_->deleteReducedParasitics(net, ap_);
|
parasitics_->deleteReducedParasitics(net, ap_);
|
||||||
parasitic_ = parasitics_->makeParasiticNetwork(net, pin_cap_included_,
|
parasitic_ = parasitics_->makeParasiticNetwork(net, pin_cap_included_, ap_);
|
||||||
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;
|
net_ = net;
|
||||||
}
|
}
|
||||||
|
|
@ -469,7 +471,6 @@ void
|
||||||
SpefReader::dspfFinish()
|
SpefReader::dspfFinish()
|
||||||
{
|
{
|
||||||
if (parasitic_) {
|
if (parasitic_) {
|
||||||
// Checking "should" be done by report_annotated_parasitics.
|
|
||||||
if (!quiet_)
|
if (!quiet_)
|
||||||
parasitics_->check(parasitic_);
|
parasitics_->check(parasitic_);
|
||||||
if (reduce_to_ != ReducedParasiticType::none) {
|
if (reduce_to_ != ReducedParasiticType::none) {
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,6 @@ bool
|
||||||
readSpefFile(const char *filename,
|
readSpefFile(const char *filename,
|
||||||
Instance *instance,
|
Instance *instance,
|
||||||
ParasiticAnalysisPt *ap,
|
ParasiticAnalysisPt *ap,
|
||||||
bool increment,
|
|
||||||
bool pin_cap_included,
|
bool pin_cap_included,
|
||||||
bool keep_coupling_caps,
|
bool keep_coupling_caps,
|
||||||
float coupling_cap_factor,
|
float coupling_cap_factor,
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,6 @@ public:
|
||||||
gzFile stream,
|
gzFile stream,
|
||||||
Instance *instance,
|
Instance *instance,
|
||||||
ParasiticAnalysisPt *ap,
|
ParasiticAnalysisPt *ap,
|
||||||
bool increment,
|
|
||||||
bool pin_cap_included,
|
bool pin_cap_included,
|
||||||
bool keep_coupling_caps,
|
bool keep_coupling_caps,
|
||||||
float coupling_cap_factor,
|
float coupling_cap_factor,
|
||||||
|
|
@ -143,7 +142,6 @@ private:
|
||||||
const char *filename_;
|
const char *filename_;
|
||||||
Instance *instance_;
|
Instance *instance_;
|
||||||
const ParasiticAnalysisPt *ap_;
|
const ParasiticAnalysisPt *ap_;
|
||||||
bool increment_;
|
|
||||||
bool pin_cap_included_;
|
bool pin_cap_included_;
|
||||||
bool keep_coupling_caps_;
|
bool keep_coupling_caps_;
|
||||||
ReducedParasiticType reduce_to_;
|
ReducedParasiticType reduce_to_;
|
||||||
|
|
|
||||||
|
|
@ -3296,7 +3296,7 @@ Sdc::portCapacitance(Instance *inst,
|
||||||
Pvt *inst_pvt = nullptr;
|
Pvt *inst_pvt = nullptr;
|
||||||
if (inst)
|
if (inst)
|
||||||
inst_pvt = pvt(inst, min_max);
|
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);
|
return corner_port->capacitance(rf, min_max, op_cond, inst_pvt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -248,14 +248,16 @@ SdfReader::findWireEdge(Pin *from_pin,
|
||||||
{
|
{
|
||||||
Vertex *to_vertex, *to_vertex_bidirect_drvr;
|
Vertex *to_vertex, *to_vertex_bidirect_drvr;
|
||||||
graph_->pinVertices(to_pin, to_vertex, to_vertex_bidirect_drvr);
|
graph_->pinVertices(to_pin, to_vertex, to_vertex_bidirect_drvr);
|
||||||
// Fanin < fanout, so search for driver from load.
|
if (to_vertex) {
|
||||||
VertexInEdgeIterator edge_iter(to_vertex, graph_);
|
// Fanin < fanout, so search for driver from load.
|
||||||
while (edge_iter.hasNext()) {
|
VertexInEdgeIterator edge_iter(to_vertex, graph_);
|
||||||
Edge *edge = edge_iter.next();
|
while (edge_iter.hasNext()) {
|
||||||
const TimingRole *edge_role = edge->role();
|
Edge *edge = edge_iter.next();
|
||||||
if (edge->from(graph_)->pin() == from_pin
|
const TimingRole *edge_role = edge->role();
|
||||||
&& edge_role->sdfRole()->isWire())
|
if (edge->from(graph_)->pin() == from_pin
|
||||||
return edge;
|
&& edge_role->sdfRole()->isWire())
|
||||||
|
return edge;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -174,7 +174,7 @@ CheckCapacitanceLimits::findLimit(const Pin *pin,
|
||||||
LibertyPort *to_port;
|
LibertyPort *to_port;
|
||||||
drive->driveCell(rf, min_max, cell, from_port, from_slews, to_port);
|
drive->driveCell(rf, min_max, cell, from_port, from_slews, to_port);
|
||||||
if (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);
|
corner_port->capacitanceLimit(min_max, limit1, exists1);
|
||||||
if (!exists1
|
if (!exists1
|
||||||
&& corner_port->direction()->isAnyOutput()
|
&& corner_port->direction()->isAnyOutput()
|
||||||
|
|
@ -202,7 +202,7 @@ CheckCapacitanceLimits::findLimit(const Pin *pin,
|
||||||
}
|
}
|
||||||
LibertyPort *port = network->libertyPort(pin);
|
LibertyPort *port = network->libertyPort(pin);
|
||||||
if (port) {
|
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);
|
corner_port->capacitanceLimit(min_max, limit1, exists1);
|
||||||
if (!exists1
|
if (!exists1
|
||||||
&& port->direction()->isAnyOutput())
|
&& port->direction()->isAnyOutput())
|
||||||
|
|
|
||||||
|
|
@ -224,7 +224,7 @@ CheckSlewLimits::findLimit(const Pin *pin,
|
||||||
LibertyPort *to_port;
|
LibertyPort *to_port;
|
||||||
drive->driveCell(rf, min_max, cell, from_port, from_slews, to_port);
|
drive->driveCell(rf, min_max, cell, from_port, from_slews, to_port);
|
||||||
if (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);
|
corner_port->slewLimit(min_max, limit1, exists1);
|
||||||
if (!exists1
|
if (!exists1
|
||||||
&& corner_port->direction()->isAnyOutput()
|
&& corner_port->direction()->isAnyOutput()
|
||||||
|
|
@ -268,7 +268,7 @@ CheckSlewLimits::findLimit(const LibertyPort *port,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (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);
|
corner_port->slewLimit(min_max, limit1, exists1);
|
||||||
if (!exists1
|
if (!exists1
|
||||||
// default_max_transition only applies to outputs.
|
// default_max_transition only applies to outputs.
|
||||||
|
|
|
||||||
|
|
@ -172,16 +172,21 @@ ClkSkews::findWorstClkSkew(const Corner *corner,
|
||||||
ClockSet clks;
|
ClockSet clks;
|
||||||
for (Clock *clk : *sdc_->clocks())
|
for (Clock *clk : *sdc_->clocks())
|
||||||
clks.insert(clk);
|
clks.insert(clk);
|
||||||
float worst_skew = INF;
|
|
||||||
ClkSkewMap skews;
|
ClkSkewMap skews;
|
||||||
findClkSkew(&clks, corner, setup_hold, skews);
|
findClkSkew(&clks, corner, setup_hold, skews);
|
||||||
for (auto clk_skew_itr : skews) {
|
if (!skews.empty()) {
|
||||||
ClkSkew *clk_skew = clk_skew_itr.second;
|
float worst_skew = INF;
|
||||||
float skew = clk_skew->skew();
|
for (auto clk_skew_itr : skews) {
|
||||||
if (skew < worst_skew)
|
ClkSkew *clk_skew = clk_skew_itr.second;
|
||||||
worst_skew = skew;
|
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
|
void
|
||||||
|
|
|
||||||
|
|
@ -208,30 +208,32 @@ void
|
||||||
MakeEndTimingArcs::visit(PathEnd *path_end)
|
MakeEndTimingArcs::visit(PathEnd *path_end)
|
||||||
{
|
{
|
||||||
ClockEdge *tgt_clk_edge = path_end->targetClkEdge(sta_);
|
ClockEdge *tgt_clk_edge = path_end->targetClkEdge(sta_);
|
||||||
Debug *debug = sta_->debug();
|
if (tgt_clk_edge) {
|
||||||
const MinMax *min_max = path_end->minMax(sta_);
|
Debug *debug = sta_->debug();
|
||||||
debugPrint(debug, "make_timing_model", 2, "%s %s -> clock %s %s %s",
|
const MinMax *min_max = path_end->minMax(sta_);
|
||||||
sta_->network()->pathName(input_pin_),
|
debugPrint(debug, "make_timing_model", 2, "%s %s -> clock %s %s %s",
|
||||||
input_rf_->shortName(),
|
sta_->network()->pathName(input_pin_),
|
||||||
tgt_clk_edge->name(),
|
input_rf_->shortName(),
|
||||||
path_end->typeName(),
|
tgt_clk_edge->name(),
|
||||||
min_max->asString());
|
path_end->typeName(),
|
||||||
if (debug->check("make_timing_model", 3))
|
min_max->asString());
|
||||||
sta_->reportPathEnd(path_end);
|
if (debug->check("make_timing_model", 3))
|
||||||
Arrival data_delay = path_end->path()->arrival(sta_);
|
sta_->reportPathEnd(path_end);
|
||||||
Delay clk_latency = path_end->targetClkDelay(sta_);
|
Arrival data_delay = path_end->path()->arrival(sta_);
|
||||||
ArcDelay check_margin = path_end->margin(sta_);
|
Delay clk_latency = path_end->targetClkDelay(sta_);
|
||||||
Delay margin = min_max == MinMax::max()
|
ArcDelay check_margin = path_end->margin(sta_);
|
||||||
? data_delay - clk_latency + check_margin
|
Delay margin = min_max == MinMax::max()
|
||||||
: clk_latency - data_delay + check_margin;
|
? data_delay - clk_latency + check_margin
|
||||||
float delay1 = delayAsFloat(margin, MinMax::max(), sta_);
|
: clk_latency - data_delay + check_margin;
|
||||||
RiseFallMinMax &margins = margins_[tgt_clk_edge];
|
float delay1 = delayAsFloat(margin, MinMax::max(), sta_);
|
||||||
float max_margin;
|
RiseFallMinMax &margins = margins_[tgt_clk_edge];
|
||||||
bool max_exists;
|
float max_margin;
|
||||||
margins.value(input_rf_, min_max, max_margin, max_exists);
|
bool max_exists;
|
||||||
// Always max margin, even for min/hold checks.
|
margins.value(input_rf_, min_max, max_margin, max_exists);
|
||||||
margins.setValue(input_rf_, min_max,
|
// Always max margin, even for min/hold checks.
|
||||||
max_exists ? max(max_margin, delay1) : delay1);
|
margins.setValue(input_rf_, min_max,
|
||||||
|
max_exists ? max(max_margin, delay1) : delay1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// input -> register setup/hold
|
// input -> register setup/hold
|
||||||
|
|
|
||||||
|
|
@ -337,6 +337,8 @@ PropActivityVisitor::visit(Vertex *vertex)
|
||||||
vertex->name(network_),
|
vertex->name(network_),
|
||||||
activity.activity(),
|
activity.activity(),
|
||||||
activity.duty());
|
activity.duty());
|
||||||
|
if (!power_->hasActivity(pin))
|
||||||
|
input_without_activity = true;
|
||||||
power_->setActivity(pin, activity);
|
power_->setActivity(pin, activity);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
@ -567,12 +569,15 @@ Power::seedRegOutputActivities(const Instance *reg,
|
||||||
LibertyPort *output,
|
LibertyPort *output,
|
||||||
bool invert)
|
bool invert)
|
||||||
{
|
{
|
||||||
PwrActivity activity = evalActivity(seq->data(), reg);
|
const Pin *out_pin = network_->findPin(reg, output);
|
||||||
if (invert)
|
if (!hasUserActivity(out_pin)) {
|
||||||
activity.set(activity.activity(),
|
PwrActivity activity = evalActivity(seq->data(), reg);
|
||||||
1.0 - activity.duty(),
|
if (invert)
|
||||||
activity.origin());
|
activity.set(activity.activity(),
|
||||||
setSeqActivity(reg, output, activity);
|
1.0 - activity.duty(),
|
||||||
|
activity.origin());
|
||||||
|
setSeqActivity(reg, output, activity);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
@ -636,9 +641,9 @@ Power::findInputInternalPower(const Pin *pin,
|
||||||
// Return values.
|
// Return values.
|
||||||
PowerResult &result)
|
PowerResult &result)
|
||||||
{
|
{
|
||||||
int lib_ap_index = corner->libertyIndex(MinMax::max());
|
const MinMax *min_max = MinMax::max();
|
||||||
LibertyCell *corner_cell = cell->cornerCell(lib_ap_index);
|
LibertyCell *corner_cell = cell->cornerCell(corner, min_max);
|
||||||
const LibertyPort *corner_port = port->cornerPort(lib_ap_index);
|
const LibertyPort *corner_port = port->cornerPort(corner, min_max);
|
||||||
if (corner_cell && corner_port) {
|
if (corner_cell && corner_port) {
|
||||||
const InternalPowerSeq &internal_pwrs = corner_cell->internalPowers(corner_port);
|
const InternalPowerSeq &internal_pwrs = corner_cell->internalPowers(corner_port);
|
||||||
if (!internal_pwrs.empty()) {
|
if (!internal_pwrs.empty()) {
|
||||||
|
|
@ -779,9 +784,8 @@ Power::findOutputInternalPower(const Pin *to_pin,
|
||||||
cell->name());
|
cell->name());
|
||||||
const DcalcAnalysisPt *dcalc_ap = corner->findDcalcAnalysisPt(MinMax::max());
|
const DcalcAnalysisPt *dcalc_ap = corner->findDcalcAnalysisPt(MinMax::max());
|
||||||
const Pvt *pvt = dcalc_ap->operatingConditions();
|
const Pvt *pvt = dcalc_ap->operatingConditions();
|
||||||
int lib_ap_index = corner->libertyIndex(MinMax::max());
|
LibertyCell *corner_cell = cell->cornerCell(dcalc_ap);
|
||||||
LibertyCell *corner_cell = cell->cornerCell(lib_ap_index);
|
const LibertyPort *to_corner_port = to_port->cornerPort(dcalc_ap);
|
||||||
const LibertyPort *to_corner_port = to_port->cornerPort(lib_ap_index);
|
|
||||||
debugPrint(debug_, "power", 2, " cap = %s",
|
debugPrint(debug_, "power", 2, " cap = %s",
|
||||||
units_->capacitanceUnit()->asString(load_cap));
|
units_->capacitanceUnit()->asString(load_cap));
|
||||||
FuncExpr *func = to_port->function();
|
FuncExpr *func = to_port->function();
|
||||||
|
|
@ -931,8 +935,7 @@ Power::findLeakagePower(const Instance *,
|
||||||
// Return values.
|
// Return values.
|
||||||
PowerResult &result)
|
PowerResult &result)
|
||||||
{
|
{
|
||||||
int lib_ap_index = corner->libertyIndex(MinMax::max());
|
LibertyCell *corner_cell = cell->cornerCell(corner, MinMax::max());
|
||||||
LibertyCell *corner_cell = cell->cornerCell(lib_ap_index);
|
|
||||||
float cond_leakage = 0.0;
|
float cond_leakage = 0.0;
|
||||||
bool found_cond = false;
|
bool found_cond = false;
|
||||||
float default_leakage = 0.0;
|
float default_leakage = 0.0;
|
||||||
|
|
@ -995,8 +998,7 @@ Power::findSwitchingPower(LibertyCell *cell,
|
||||||
{
|
{
|
||||||
MinMax *mm = MinMax::max();
|
MinMax *mm = MinMax::max();
|
||||||
const DcalcAnalysisPt *dcalc_ap = corner->findDcalcAnalysisPt(mm);
|
const DcalcAnalysisPt *dcalc_ap = corner->findDcalcAnalysisPt(mm);
|
||||||
int lib_ap_index = corner->libertyIndex(MinMax::max());
|
LibertyCell *corner_cell = cell->cornerCell(dcalc_ap);
|
||||||
LibertyCell *corner_cell = cell->cornerCell(lib_ap_index);
|
|
||||||
float volt = portVoltage(corner_cell, to_port, dcalc_ap);
|
float volt = portVoltage(corner_cell, to_port, dcalc_ap);
|
||||||
float switching = .5 * load_cap * volt * volt * activity.activity();
|
float switching = .5 * load_cap * volt * volt * activity.activity();
|
||||||
debugPrint(debug_, "power", 2, "switching %s/%s activity = %.2e volt = %.2f %.3e",
|
debugPrint(debug_, "power", 2, "switching %s/%s activity = %.2e volt = %.2f %.3e",
|
||||||
|
|
|
||||||
|
|
@ -2760,14 +2760,16 @@ ReportPath::drvrFanout(Vertex *drvr,
|
||||||
VertexOutEdgeIterator iter(drvr, graph_);
|
VertexOutEdgeIterator iter(drvr, graph_);
|
||||||
while (iter.hasNext()) {
|
while (iter.hasNext()) {
|
||||||
Edge *edge = iter.next();
|
Edge *edge = iter.next();
|
||||||
Pin *pin = edge->to(graph_)->pin();
|
if (edge->isWire()) {
|
||||||
if (network_->isTopLevelPort(pin)) {
|
Pin *pin = edge->to(graph_)->pin();
|
||||||
// Output port counts as a fanout.
|
if (network_->isTopLevelPort(pin)) {
|
||||||
Port *port = network_->port(pin);
|
// Output port counts as a fanout.
|
||||||
fanout += sdc_->portExtFanout(port, min_max) + 1;
|
Port *port = network_->port(pin);
|
||||||
|
fanout += sdc_->portExtFanout(port, min_max) + 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
fanout++;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
fanout++;
|
|
||||||
}
|
}
|
||||||
return fanout;
|
return fanout;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,7 @@
|
||||||
#include "MakeConcreteParasitics.hh"
|
#include "MakeConcreteParasitics.hh"
|
||||||
#include "Parasitics.hh"
|
#include "Parasitics.hh"
|
||||||
#include "parasitics/SpefReader.hh"
|
#include "parasitics/SpefReader.hh"
|
||||||
|
#include "parasitics/ReportParasiticAnnotation.hh"
|
||||||
#include "DelayCalc.hh"
|
#include "DelayCalc.hh"
|
||||||
#include "ArcDelayCalc.hh"
|
#include "ArcDelayCalc.hh"
|
||||||
#include "dcalc/GraphDelayCalc1.hh"
|
#include "dcalc/GraphDelayCalc1.hh"
|
||||||
|
|
@ -296,13 +297,13 @@ Sta::makeComponents()
|
||||||
makeSdcNetwork();
|
makeSdcNetwork();
|
||||||
makeReportPath();
|
makeReportPath();
|
||||||
makePower();
|
makePower();
|
||||||
setCmdNamespace(CmdNamespace::sdc);
|
setCmdNamespace1(CmdNamespace::sdc);
|
||||||
|
setThreadCount1(defaultThreadCount());
|
||||||
updateComponentsState();
|
updateComponentsState();
|
||||||
|
|
||||||
makeObservers();
|
makeObservers();
|
||||||
// This must follow updateComponentsState.
|
// This must follow updateComponentsState.
|
||||||
makeParasiticAnalysisPts();
|
makeParasiticAnalysisPts();
|
||||||
setThreadCount(defaultThreadCount());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -321,20 +322,24 @@ Sta::defaultThreadCount() const
|
||||||
|
|
||||||
void
|
void
|
||||||
Sta::setThreadCount(int thread_count)
|
Sta::setThreadCount(int thread_count)
|
||||||
|
{
|
||||||
|
setThreadCount1(thread_count);
|
||||||
|
updateComponentsState();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Sta::setThreadCount1(int thread_count)
|
||||||
{
|
{
|
||||||
thread_count_ = thread_count;
|
thread_count_ = thread_count;
|
||||||
if (dispatch_queue_)
|
if (dispatch_queue_)
|
||||||
dispatch_queue_->setThreadCount(thread_count);
|
dispatch_queue_->setThreadCount(thread_count);
|
||||||
else if (thread_count > 1)
|
else if (thread_count > 1)
|
||||||
dispatch_queue_ = new DispatchQueue(thread_count);
|
dispatch_queue_ = new DispatchQueue(thread_count);
|
||||||
updateComponentsState();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Sta::updateComponentsState()
|
Sta::updateComponentsState()
|
||||||
{
|
{
|
||||||
// These components do not use StaState:
|
|
||||||
// units_
|
|
||||||
network_->copyState(this);
|
network_->copyState(this);
|
||||||
cmd_network_->copyState(this);
|
cmd_network_->copyState(this);
|
||||||
sdc_network_->copyState(this);
|
sdc_network_->copyState(this);
|
||||||
|
|
@ -610,6 +615,13 @@ Sta::cmdNamespace()
|
||||||
|
|
||||||
void
|
void
|
||||||
Sta::setCmdNamespace(CmdNamespace namespc)
|
Sta::setCmdNamespace(CmdNamespace namespc)
|
||||||
|
{
|
||||||
|
setCmdNamespace1(namespc);
|
||||||
|
updateComponentsState();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Sta::setCmdNamespace1(CmdNamespace namespc)
|
||||||
{
|
{
|
||||||
cmd_namespace_ = namespc;
|
cmd_namespace_ = namespc;
|
||||||
switch (cmd_namespace_) {
|
switch (cmd_namespace_) {
|
||||||
|
|
@ -620,7 +632,6 @@ Sta::setCmdNamespace(CmdNamespace namespc)
|
||||||
cmd_network_ = sdc_network_;
|
cmd_network_ = sdc_network_;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
updateComponentsState();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Instance *
|
Instance *
|
||||||
|
|
@ -3774,8 +3785,7 @@ Sta::capacitance(const LibertyPort *port,
|
||||||
OperatingConditions *op_cond = operatingConditions(min_max);
|
OperatingConditions *op_cond = operatingConditions(min_max);
|
||||||
float cap = min_max->initValue();
|
float cap = min_max->initValue();
|
||||||
for (const Corner *corner : makeCornerSeq(corner)) {
|
for (const Corner *corner : makeCornerSeq(corner)) {
|
||||||
int lib_ap = corner->libertyIndex(min_max);
|
const LibertyPort *corner_port = port->cornerPort(corner, min_max);
|
||||||
const LibertyPort *corner_port = port->cornerPort(lib_ap);
|
|
||||||
for (RiseFall *rf : RiseFall::range())
|
for (RiseFall *rf : RiseFall::range())
|
||||||
cap = min_max->minMax(cap, corner_port->capacitance(rf, min_max, op_cond, op_cond));
|
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,
|
Instance *instance,
|
||||||
const Corner *corner,
|
const Corner *corner,
|
||||||
const MinMaxAll *min_max,
|
const MinMaxAll *min_max,
|
||||||
bool increment,
|
|
||||||
bool pin_cap_included,
|
bool pin_cap_included,
|
||||||
bool keep_coupling_caps,
|
bool keep_coupling_caps,
|
||||||
float coupling_cap_factor,
|
float coupling_cap_factor,
|
||||||
|
|
@ -3835,9 +3844,9 @@ Sta::readSpef(const char *filename,
|
||||||
ParasiticAnalysisPt *ap = corner->findParasiticAnalysisPt(cnst_min_max);
|
ParasiticAnalysisPt *ap = corner->findParasiticAnalysisPt(cnst_min_max);
|
||||||
const OperatingConditions *op_cond =
|
const OperatingConditions *op_cond =
|
||||||
sdc_->operatingConditions(cnst_min_max);
|
sdc_->operatingConditions(cnst_min_max);
|
||||||
bool success = readSpefFile(filename, instance, ap, increment,
|
bool success = readSpefFile(filename, instance, ap,
|
||||||
pin_cap_included,
|
pin_cap_included, keep_coupling_caps,
|
||||||
keep_coupling_caps, coupling_cap_factor,
|
coupling_cap_factor,
|
||||||
reduce_to, delete_after_reduce,
|
reduce_to, delete_after_reduce,
|
||||||
op_cond, corner, cnst_min_max, quiet,
|
op_cond, corner, cnst_min_max, quiet,
|
||||||
report_, network_, parasitics_);
|
report_, network_, parasitics_);
|
||||||
|
|
@ -3866,6 +3875,15 @@ Sta::makeParasiticAnalysisPts()
|
||||||
parasitics_per_min_max_);
|
parasitics_per_min_max_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Sta::reportParasiticAnnotation(bool report_unannotated,
|
||||||
|
const Corner *corner)
|
||||||
|
{
|
||||||
|
ensureGraph();
|
||||||
|
findDelays();
|
||||||
|
sta::reportParasiticAnnotation(report_unannotated, corner, this);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Sta::findPiElmore(Pin *drvr_pin,
|
Sta::findPiElmore(Pin *drvr_pin,
|
||||||
const RiseFall *rf,
|
const RiseFall *rf,
|
||||||
|
|
|
||||||
|
|
@ -344,6 +344,7 @@ VisitPathEnds::visitOutputDelayEnd1(OutputDelay *output_delay,
|
||||||
// but the exception may be -to clk.
|
// but the exception may be -to clk.
|
||||||
ExceptionPath *exception = exceptionTo(path, pin, end_rf, tgt_clk_edge,
|
ExceptionPath *exception = exceptionTo(path, pin, end_rf, tgt_clk_edge,
|
||||||
min_max);
|
min_max);
|
||||||
|
ClockEdge *src_clk_edge = path->clkEdge(this);
|
||||||
if (exception
|
if (exception
|
||||||
&& exception->isPathDelay()) {
|
&& exception->isPathDelay()) {
|
||||||
PathDelay *path_delay = dynamic_cast<PathDelay*>(exception);
|
PathDelay *path_delay = dynamic_cast<PathDelay*>(exception);
|
||||||
|
|
@ -351,7 +352,11 @@ VisitPathEnds::visitOutputDelayEnd1(OutputDelay *output_delay,
|
||||||
visitor->visit(&path_end);
|
visitor->visit(&path_end);
|
||||||
is_constrained = true;
|
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())
|
&& sdc_->sameClockGroup(path->clock(this), tgt_clk_edge->clock())
|
||||||
// False paths and path delays override.
|
// False paths and path delays override.
|
||||||
&& (exception == nullptr
|
&& (exception == nullptr
|
||||||
|
|
|
||||||
|
|
@ -9,10 +9,10 @@ Path Type: max
|
||||||
0.00 0.00 clock network delay (ideal)
|
0.00 0.00 clock network delay (ideal)
|
||||||
0.00 0.00 ^ r2/CK (DFF_X1)
|
0.00 0.00 ^ r2/CK (DFF_X1)
|
||||||
0.23 0.23 v r2/Q (DFF_X1)
|
0.23 0.23 v r2/Q (DFF_X1)
|
||||||
0.08 0.32 v u1/Z (BUF_X1)
|
0.08 0.31 v u1/Z (BUF_X1)
|
||||||
0.10 0.42 v u2/ZN (AND2_X1)
|
0.10 0.41 v u2/ZN (AND2_X1)
|
||||||
0.00 0.42 v r3/D (DFF_X1)
|
0.00 0.41 v r3/D (DFF_X1)
|
||||||
0.42 data arrival time
|
0.41 data arrival time
|
||||||
|
|
||||||
10.00 10.00 clock clk (rise edge)
|
10.00 10.00 clock clk (rise edge)
|
||||||
0.00 10.00 clock network delay (ideal)
|
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
|
||||||
---------------------------------------------------------
|
---------------------------------------------------------
|
||||||
9.84 data required time
|
9.84 data required time
|
||||||
-0.42 data arrival time
|
-0.41 data arrival time
|
||||||
---------------------------------------------------------
|
---------------------------------------------------------
|
||||||
9.43 slack (MET)
|
9.43 slack (MET)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -36,10 +36,10 @@ Path Type: max
|
||||||
0.00 0.00 clock network delay (ideal)
|
0.00 0.00 clock network delay (ideal)
|
||||||
0.00 0.00 ^ r2/CK (DFF_X1)
|
0.00 0.00 ^ r2/CK (DFF_X1)
|
||||||
0.23 0.23 v r2/Q (DFF_X1)
|
0.23 0.23 v r2/Q (DFF_X1)
|
||||||
0.08 0.32 v u1/Z (BUF_X1)
|
0.08 0.31 v u1/Z (BUF_X1)
|
||||||
0.10 0.42 v u2/ZN (AND2_X1)
|
0.10 0.41 v u2/ZN (AND2_X1)
|
||||||
0.00 0.42 v r3/D (DFF_X1)
|
0.00 0.41 v r3/D (DFF_X1)
|
||||||
0.42 data arrival time
|
0.41 data arrival time
|
||||||
|
|
||||||
10.00 10.00 clock clk (rise edge)
|
10.00 10.00 clock clk (rise edge)
|
||||||
0.00 10.00 clock network delay (ideal)
|
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
|
||||||
---------------------------------------------------------
|
---------------------------------------------------------
|
||||||
9.84 data required time
|
9.84 data required time
|
||||||
-0.42 data arrival time
|
-0.41 data arrival time
|
||||||
---------------------------------------------------------
|
---------------------------------------------------------
|
||||||
9.43 slack (MET)
|
9.43 slack (MET)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -39,9 +39,9 @@ Corner: ss
|
||||||
0.00 0.00 ^ r2/CK (DFF_X1)
|
0.00 0.00 ^ r2/CK (DFF_X1)
|
||||||
0.26 0.26 v r2/Q (DFF_X1)
|
0.26 0.26 v r2/Q (DFF_X1)
|
||||||
0.09 0.35 v u1/Z (BUF_X1)
|
0.09 0.35 v u1/Z (BUF_X1)
|
||||||
0.11 0.46 v u2/ZN (AND2_X1)
|
0.11 0.45 v u2/ZN (AND2_X1)
|
||||||
0.00 0.46 v r3/D (DFF_X1)
|
0.00 0.45 v r3/D (DFF_X1)
|
||||||
0.46 data arrival time
|
0.45 data arrival time
|
||||||
|
|
||||||
10.00 10.00 clock clk (rise edge)
|
10.00 10.00 clock clk (rise edge)
|
||||||
0.00 10.00 clock network delay (ideal)
|
0.00 10.00 clock network delay (ideal)
|
||||||
|
|
@ -51,9 +51,9 @@ Corner: ss
|
||||||
9.84 data required time
|
9.84 data required time
|
||||||
---------------------------------------------------------
|
---------------------------------------------------------
|
||||||
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)
|
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 clk (rise edge)
|
||||||
0.00 0.00 clock network delay (ideal)
|
0.00 0.00 clock network delay (ideal)
|
||||||
0.00 0.00 ^ r2/CK (DFF_X1)
|
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.11 v u1/Z (BUF_X1)
|
||||||
0.03 0.14 v u2/ZN (AND2_X1)
|
0.03 0.14 v u2/ZN (AND2_X1)
|
||||||
0.00 0.14 v r3/D (DFF_X1)
|
0.00 0.14 v r3/D (DFF_X1)
|
||||||
|
|
|
||||||
|
|
@ -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]
|
||||||
Loading…
Reference in New Issue