diff --git a/include/sta/Liberty.hh b/include/sta/Liberty.hh index 850d84ee..22b38aa2 100644 --- a/include/sta/Liberty.hh +++ b/include/sta/Liberty.hh @@ -85,7 +85,7 @@ enum class DelayModelType { cmos_linear, cmos_pwl, cmos2, table, polynomial, dcm enum class ScaleFactorPvt { process, volt, temp, unknown }; constexpr int scale_factor_pvt_count = int(ScaleFactorPvt::unknown) + 1; -enum class TableTemplateType { delay, power, output_current, ocv }; +enum class TableTemplateType { delay, power, output_current, capacitance, ocv }; constexpr int table_template_type_count = int(TableTemplateType::ocv) + 1; enum class LevelShifterType { HL, LH, HL_LH }; @@ -778,6 +778,8 @@ public: void setRelatedGroundPin(const char *related_ground_pin); const char *relatedPowerPin() const { return related_power_pin_; } void setRelatedPowerPin(const char *related_power_pin); + ReceiverModelPtr receiverModel() const { return receiver_model_; } + void setReceiverModel(ReceiverModelPtr receiver_model); static bool equiv(const LibertyPort *port1, const LibertyPort *port2); @@ -817,6 +819,7 @@ protected: const char *related_ground_pin_; const char *related_power_pin_; Vector corner_ports_; + ReceiverModelPtr receiver_model_; unsigned int min_pulse_width_exists_:RiseFall::index_count; bool min_period_exists_:1; diff --git a/include/sta/LibertyClass.hh b/include/sta/LibertyClass.hh index b5d8bc2f..29f903c2 100644 --- a/include/sta/LibertyClass.hh +++ b/include/sta/LibertyClass.hh @@ -57,6 +57,7 @@ class TimingRole; class Transition; class RiseFall; class RiseFallBoth; +class ReceiverModel; typedef Vector LibertyLibrarySeq; typedef Vector LibertyCellSeq; @@ -66,11 +67,10 @@ typedef Vector LibertyPortSeq; typedef Set LibertyPortSet; typedef std::pair LibertyPortPair; typedef Set LibertyCellSet; -typedef Vector FloatSeq; -typedef Vector FloatTable; typedef std::shared_ptr TablePtr; typedef std::shared_ptr TimingArcAttrsPtr; typedef std::shared_ptr TableAxisPtr; +typedef std::shared_ptr ReceiverModelPtr; enum class ScaleFactorType : unsigned { pin_cap, diff --git a/include/sta/TableModel.hh b/include/sta/TableModel.hh index 0d905190..fab7aa87 100644 --- a/include/sta/TableModel.hh +++ b/include/sta/TableModel.hh @@ -33,6 +33,12 @@ class Unit; class Units; class Report; class Table; +class OutputCurrent; +class OutputCurrentWaveform; + +typedef Vector FloatSeq; +typedef Vector FloatTable; +typedef Vector OutputCurrentWaveformSeq; TableAxisVariable stringTableAxisVariable(const char *variable); @@ -48,7 +54,9 @@ public: GateTableModel(TableModel *delay_model, TableModel *delay_sigma_models[EarlyLate::index_count], TableModel *slew_model, - TableModel *slew_sigma_models[EarlyLate::index_count]); + TableModel *slew_sigma_models[EarlyLate::index_count], + ReceiverModelPtr receiver_model, + OutputCurrent *output_current); virtual ~GateTableModel(); virtual void gateDelay(const LibertyCell *cell, const Pvt *pvt, @@ -118,6 +126,8 @@ protected: TableModel *delay_sigma_models_[EarlyLate::index_count]; TableModel *slew_model_; TableModel *slew_sigma_models_[EarlyLate::index_count]; + ReceiverModelPtr receiver_model_; + OutputCurrent *output_current_; }; class CheckTableModel : public CheckTimingModel @@ -223,7 +233,8 @@ public: const char *comment1, float value2, float value3, - int digits, + const Unit *table_unit, + int digits, string *result) const; void report(const Units *units, Report *report) const; @@ -246,7 +257,7 @@ protected: bool is_scaled_:1; }; -// Abstract base class for tables. +// Abstract base class for 0, 1, 2, or 3 dimesnion float tables. class Table { public: @@ -280,6 +291,7 @@ public: const char *comment1, float value2, float value3, + const Unit *table_unit, int digits, string *result) const = 0; virtual void report(const Units *units, @@ -306,6 +318,7 @@ public: const char *comment1, float value2, float value3, + const Unit *table_unit, int digits, string *result) const; virtual void report(const Units *units, @@ -340,6 +353,7 @@ public: const char *comment1, float value2, float value3, + const Unit *table_unit, int digits, string *result) const; virtual void report(const Units *units, @@ -370,6 +384,7 @@ public: virtual float findValue(float value1, float value2, float value3) const; + FloatTable *values3() { return values_; } virtual void reportValue(const char *result_name, const LibertyLibrary *library, const LibertyCell *cell, @@ -378,6 +393,7 @@ public: const char *comment1, float value2, float value3, + const Unit *table_unit, int digits, string *result) const; virtual void report(const Units *units, @@ -417,6 +433,7 @@ public: const char *comment1, float value2, float value3, + const Unit *table_unit, int digits, string *result) const; virtual void report(const Units *units, @@ -434,10 +451,16 @@ public: FloatSeq *values); ~TableAxis(); TableAxisVariable variable() const { return variable_; } + const char *variableString() const; + const Unit *unit(const Units *units); size_t size() const { return values_->size(); } float axisValue(size_t index) const { return (*values_)[index]; } // Find the index for value such that axis[index] <= value < axis[index+1]. size_t findAxisIndex(float value) const; + void findAxisIndex(float value, + // Return values. + size_t &index, + bool &exists) const; FloatSeq *values() const { return values_; } private: @@ -445,4 +468,79 @@ private: FloatSeq *values_; }; +//////////////////////////////////////////////////////////////// + +class ReceiverModel +{ +public: + ReceiverModel(); + ~ReceiverModel(); + void setCapacitanceModel(TableModel *table_model, + int index, + RiseFall *rf); + static bool checkAxes(TablePtr table); + +private: + TableModel *capacitance_models_[2][RiseFall::index_count]; +}; + +class OutputCurrentWaveform +{ +public: + OutputCurrentWaveform(float axis_value1, + float axis_value2, + TableAxisPtr axis, + Table1 *currents, + float reference_time); + ~OutputCurrentWaveform(); + float axisValue1() const { return axis_value1_; } + float axisValue2() const { return axis_value2_; } + TableAxisPtr axis() const { return axis_; } + Table1 *currents() const { return currents_; } + float referenceTime() const { return reference_time_; } + void reportWaveform(const Units *units, + int digits, + string *result); + static bool checkAxes(TableTemplate *tbl_template); + +private: + float axis_value1_; + float axis_value2_; + TableAxisPtr axis_; + Table1 *currents_; + float reference_time_; +}; + +// Two dimensional table of one dimensional time/current tables. +class OutputCurrent +{ +public: + OutputCurrent(TableAxisPtr axis1, + TableAxisPtr axis2, + Vector &waveforms); + ~OutputCurrent(); + void reportWaveform(const LibertyCell *cell, + const Pvt *pvt, + float in_slew, + float load_cap, + int digits, + string *result) const; + +private: + void findAxisValues(float in_slew, + float load_cap, + // Return values. + float &axis_value1, + float &axis_value2) const; + float axisValue(TableAxisPtr axis, + float in_slew, + float load_cap) const; + + // Row. + TableAxisPtr axis1_; + // Column. + TableAxisPtr axis2_; + OutputCurrentWaveformSeq waveforms_; +}; + } // namespace diff --git a/include/sta/TimingModel.hh b/include/sta/TimingModel.hh index 3a8ba341..2ad0bbc0 100644 --- a/include/sta/TimingModel.hh +++ b/include/sta/TimingModel.hh @@ -24,7 +24,7 @@ namespace sta { using std::string; -// Abstract base class for timing models. +// Abstract base class for GateTimingModel and CheckTimingModel. class TimingModel { public: @@ -36,7 +36,7 @@ protected: friend class LibertyCell; }; -// Abstract base class for gate timing models. +// Abstract base class for LinearModel and TableModel. class GateTimingModel : public TimingModel { public: diff --git a/liberty/InternalPower.cc b/liberty/InternalPower.cc index a911c2d3..c9d8ec3c 100644 --- a/liberty/InternalPower.cc +++ b/liberty/InternalPower.cc @@ -19,6 +19,7 @@ #include "FuncExpr.hh" #include "TableModel.hh" #include "Liberty.hh" +#include "Units.hh" namespace sta { @@ -152,7 +153,8 @@ InternalPowerModel::reportPower(const LibertyCell *cell, axis_value1, axis_value2, axis_value3); const LibertyLibrary *library = cell->libertyLibrary(); model_->reportValue("Power", library, cell, pvt, - axis_value1, nullptr, axis_value2, axis_value3, digits, result); + axis_value1, nullptr, axis_value2, axis_value3, + library->units()->powerUnit(), digits, result); } } @@ -212,9 +214,9 @@ InternalPowerModel::axisValue(TableAxisPtr axis, bool InternalPowerModel::checkAxes(const TableModel *model) { - TableAxisPtr axis1 = model->axis1(); - TableAxisPtr axis2 = model->axis2(); - TableAxisPtr axis3 = model->axis3(); + const TableAxisPtr axis1 = model->axis1(); + const TableAxisPtr axis2 = model->axis2(); + const TableAxisPtr axis3 = model->axis3(); bool axis_ok = true; if (axis1) axis_ok &= checkAxis(model->axis1()); diff --git a/liberty/Liberty.cc b/liberty/Liberty.cc index afe13b81..b3683b64 100644 --- a/liberty/Liberty.cc +++ b/liberty/Liberty.cc @@ -1919,6 +1919,7 @@ LibertyPort::LibertyPort(LibertyCell *cell, pulse_clk_sense_(nullptr), related_ground_pin_(nullptr), related_power_pin_(nullptr), + receiver_model_(nullptr), min_pulse_width_exists_(false), min_period_exists_(false), is_clk_(false), @@ -2492,6 +2493,12 @@ LibertyPort::setRelatedPowerPin(const char *related_power_pin) related_power_pin_ = stringCopy(related_power_pin); } +void +LibertyPort::setReceiverModel(ReceiverModelPtr receiver_model) +{ + receiver_model_ = receiver_model; +} + //////////////////////////////////////////////////////////////// LibertyPortSeq diff --git a/liberty/LibertyReader.cc b/liberty/LibertyReader.cc index ef92272b..980c511d 100644 --- a/liberty/LibertyReader.cc +++ b/liberty/LibertyReader.cc @@ -127,6 +127,8 @@ LibertyReader::readLibertyFile(const char *filename, internal_power_ = nullptr; leakage_power_ = nullptr; table_ = nullptr; + rf_ = nullptr; + index_ = 0; table_model_scale_ = 1.0; mode_def_ = nullptr; mode_value_ = nullptr; @@ -134,6 +136,7 @@ LibertyReader::readLibertyFile(const char *filename, pg_port_ = nullptr; have_resistance_unit_ = false; default_operating_condition_ = nullptr; + receiver_model_ = nullptr; for (auto rf_index : RiseFall::rangeIndex()) { have_input_threshold_[rf_index] = false; @@ -474,6 +477,34 @@ LibertyReader::defineVisitors() &LibertyReader::endPgPin); defineAttrVisitor("pg_type", &LibertyReader::visitPgType); defineAttrVisitor("voltage_name", &LibertyReader::visitVoltageName); + + // ccs receiver + defineGroupVisitor("receiver_capacitance", + &LibertyReader::beginReceiverCapacitance, + &LibertyReader::endReceiverCapacitance); + defineGroupVisitor("receiver_capacitance1_rise", + &LibertyReader::beginReceiverCapacitance1Rise, + &LibertyReader::endReceiverCapacitanceRiseFall); + defineGroupVisitor("receiver_capacitance1_fall", + &LibertyReader::beginReceiverCapacitance1Fall, + &LibertyReader::endReceiverCapacitanceRiseFall); + defineGroupVisitor("receiver_capacitance2_rise", + &LibertyReader::beginReceiverCapacitance2Rise, + &LibertyReader::endReceiverCapacitanceRiseFall); + defineGroupVisitor("receiver_capacitance2_fall", + &LibertyReader::beginReceiverCapacitance2Fall, + &LibertyReader::endReceiverCapacitanceRiseFall); + // ccs + defineGroupVisitor("output_current_rise", + &LibertyReader::beginOutputCurrentRise, + &LibertyReader::endOutputCurrentRiseFall); + defineGroupVisitor("output_current_fall", + &LibertyReader::beginOutputCurrentFall, + &LibertyReader::endOutputCurrentRiseFall); + defineGroupVisitor("vector", + &LibertyReader::beginVector, + &LibertyReader::endVector); + defineAttrVisitor("reference_time", &LibertyReader::visitReferenceTime); } void @@ -1326,6 +1357,7 @@ LibertyReader::endTableTemplate(LibertyGroup *group) if (axis3) tbl_template_->setAxis3(axis3); tbl_template_ = nullptr; + axis_var_[0] = axis_var_[1] = axis_var_[2] = TableAxisVariable::unknown; } } @@ -1335,13 +1367,15 @@ LibertyReader::makeAxis(int index, { TableAxisVariable axis_var = axis_var_[index]; FloatSeq *axis_values = axis_values_[index]; - if (axis_var != TableAxisVariable::unknown && axis_values) { - const Units *units = library_->units(); - float scale = tableVariableUnit(axis_var, units)->scale(); - scaleFloats(axis_values, scale); + if (axis_var != TableAxisVariable::unknown) { + if (axis_values) { + const Units *units = library_->units(); + float scale = tableVariableUnit(axis_var, units)->scale(); + scaleFloats(axis_values, scale); + } return std::make_shared(axis_var, axis_values); } - else if (axis_var == TableAxisVariable::unknown && axis_values) { + else if (axis_values) { libWarn(62, group, "missing variable_%d attribute.", index + 1); delete axis_values; axis_values_[index] = nullptr; @@ -2237,16 +2271,19 @@ TimingGroup::makeLinearModels(LibertyLibrary *library) } void -TimingGroup::makeTableModels(LibertyReader *visitor) +TimingGroup::makeTableModels(LibertyReader *reader) { for (auto rf : RiseFall::range()) { int rf_index = rf->index(); TableModel *cell = cell_[rf_index]; - TableModel *constraint = constraint_[rf_index]; TableModel *transition = transition_[rf_index]; + TableModel *constraint = constraint_[rf_index]; if (cell || transition) { attrs_->setModel(rf, new GateTableModel(cell, delay_sigma_[rf_index], - transition, slew_sigma_[rf_index])); + transition, + slew_sigma_[rf_index], + receiver_model_, + output_current_[rf_index])); TimingType timing_type = attrs_->timingType(); if (timing_type == TimingType::clear || timing_type == TimingType::combinational @@ -2262,12 +2299,11 @@ TimingGroup::makeTableModels(LibertyReader *visitor) || timing_type == TimingType::three_state_enable_fall || timing_type == TimingType::three_state_enable_rise) { if (transition == nullptr) - visitor->libWarn(95, line_, "missing %s_transition.", rf->name()); + reader->libWarn(95, line_, "missing %s_transition.", rf->name()); if (cell == nullptr) - visitor->libWarn(96, line_, "missing cell_%s.", rf->name()); + reader->libWarn(96, line_, "missing cell_%s.", rf->name()); } - } - if (constraint) + } else if (constraint) attrs_->setModel(rf, new CheckTableModel(constraint, constraint_sigma_[rf_index])); } @@ -2352,6 +2388,196 @@ LibertyReader::makeTimingArcs(const char *from_port_name, //////////////////////////////////////////////////////////////// +void +LibertyReader::beginReceiverCapacitance(LibertyGroup *) +{ + + receiver_model_ = make_shared(); +} + +void +LibertyReader::endReceiverCapacitance(LibertyGroup *) +{ + if (ports_) { + for (LibertyPort *port : *ports_) + port->setReceiverModel(receiver_model_); + } + receiver_model_ = nullptr; +} + +void +LibertyReader::beginReceiverCapacitance1Rise(LibertyGroup *group) +{ + beginReceiverCapacitance(group, 0, RiseFall::rise()); +} + +void +LibertyReader::beginReceiverCapacitance1Fall(LibertyGroup *group) +{ + beginReceiverCapacitance(group, 0, RiseFall::fall()); +} + +void +LibertyReader::beginReceiverCapacitance2Rise(LibertyGroup *group) +{ + beginReceiverCapacitance(group, 1, RiseFall::rise()); +} + +void +LibertyReader::beginReceiverCapacitance2Fall(LibertyGroup *group) +{ + beginReceiverCapacitance(group, 1, RiseFall::fall()); +} + +void +LibertyReader::beginReceiverCapacitance(LibertyGroup *group, + int index, + RiseFall *rf) +{ + if (timing_ || ports_) { + beginTableModel(group, TableTemplateType::delay, rf, 1.0, + ScaleFactorType::pin_cap); + index_ = index; + } + else + libWarn(904, group, "receiver_capacitance group not in timing or pin group."); +} + +void +LibertyReader::endReceiverCapacitanceRiseFall(LibertyGroup *group) +{ + if (table_) { + if (ReceiverModel::checkAxes(table_)) { + TableModel *table_model = new TableModel(table_, tbl_template_, + scale_factor_type_, rf_); + if (timing_ && receiver_model_ == nullptr) { + receiver_model_ = make_shared(); + timing_->setReceiverModel(receiver_model_); + } + receiver_model_->setCapacitanceModel(table_model, index_, rf_); + } + else + libWarn(902, group, "unsupported model axis."); + } + endTableModel(); +} + +//////////////////////////////////////////////////////////////// + +void +LibertyReader::beginOutputCurrentRise(LibertyGroup *group) +{ + beginOutputCurrent(RiseFall::rise(), group); +} + +void +LibertyReader::beginOutputCurrentFall(LibertyGroup *group) +{ + beginOutputCurrent(RiseFall::fall(), group); +} + +void +LibertyReader::beginOutputCurrent(RiseFall *rf, + LibertyGroup *group) +{ + if (timing_) + rf_ = rf; + else + libWarn(907, group, "output_current_%s group not in timing group.", + rf->name()); +} + +void +LibertyReader::endOutputCurrentRiseFall(LibertyGroup *group) +{ + Set axis_set1, axis_set2; + FloatSeq *axis_values1 = new FloatSeq; + FloatSeq *axis_values2 = new FloatSeq; + for (OutputCurrentWaveform *waveform : output_current_waveforms_) { + float axis_value1 = waveform->axisValue1(); + if (!axis_set1.hasKey(axis_value1)) { + axis_set1.insert(axis_value1); + axis_values1->push_back(axis_value1); + } + float axis_value2 = waveform->axisValue2(); + if (!axis_set2.hasKey(axis_value2)) { + axis_set2.insert(axis_value2); + axis_values2->push_back(axis_value2); + } + } + sort(axis_values1, std::less()); + sort(axis_values2, std::less()); + TableAxisPtr axis1 = std::make_shared(axis_[0]->variable(), + axis_values1); + TableAxisPtr axis2 = std::make_shared(axis_[1]->variable(), + axis_values2); + Vector waveforms(axis1->size() * axis2->size()); + for (OutputCurrentWaveform *waveform : output_current_waveforms_) { + size_t index1, index2; + bool exists1, exists2; + axis1->findAxisIndex(waveform->axisValue1(), index1, exists1); + axis2->findAxisIndex(waveform->axisValue2(), index2, exists2); + if (exists1 && exists2) { + size_t index = index1 * axis2->size() + index2; + waveforms[index] = waveform; + } + else + libWarn(913, group, "output current waveform %.2e %.2e not found.", + waveform->axisValue1(), + waveform->axisValue2()); + } + OutputCurrent *output_current = new OutputCurrent(axis1, axis2, waveforms); + timing_->setOutputCurrent(rf_, output_current); +} + +void +LibertyReader::beginVector(LibertyGroup *group) +{ + if (timing_) { + beginTable(group, TableTemplateType::output_current, 1.0); + scale_factor_type_ = ScaleFactorType::unknown; + reference_time_exists_ = false; + if (!OutputCurrentWaveform::checkAxes(tbl_template_)) + libWarn(118, group, "unsupported model axis."); + } +} + +void +LibertyReader::visitReferenceTime(LibertyAttr *attr) +{ + getAttrFloat(attr, reference_time_, reference_time_exists_); +} + +void +LibertyReader::endVector(LibertyGroup *group) +{ + FloatSeq *axis_values1 = axis_values_[0]; + FloatSeq *axis_values2 = axis_values_[1]; + if (axis_values1->size() == 1 && axis_values2->size() == 1) { + // Convert 1x1xN Table3 to Table1. + float axis_value1 = (*axis_values1)[0]; + float axis_value2 = (*axis_values2)[0]; + Table3 *table3 = dynamic_cast(table_.get()); + FloatTable *values3 = table3->values3(); + // Steal the values. + FloatSeq *values = (*values3)[0]; + (*values3)[0] = nullptr; + Table1 *table1 = new Table1(values, axis_[2]); + OutputCurrentWaveform *waveform = new OutputCurrentWaveform(axis_value1, + axis_value2, + axis_[2], table1, + reference_time_); + output_current_waveforms_.push_back(waveform); + } + else + libWarn(912, group->line(), "vector index_1 and index_2 must have one value."); + if (!reference_time_exists_) + libWarn(908, group->line(), "vector reference_time not found."); + reference_time_exists_ = false; +} + +/////////////////////////////////////////////////////////////// + void LibertyReader::makeInternalPowers(LibertyPort *port, InternalPowerGroup *power_group) @@ -2910,9 +3136,7 @@ LibertyReader::visitDirection(LibertyAttr *attr) else libWarn(109, attr, "unknown port direction."); - LibertyPortSeq::Iterator port_iter(ports_); - while (port_iter.hasNext()) { - LibertyPort *port = port_iter.next(); + for (LibertyPort *port : *ports_) { // Tristate enable function sets direction to tristate; don't // clobber it. if (!port->direction()->isTristate()) @@ -3554,17 +3778,11 @@ void LibertyReader::beginTiming(LibertyGroup *group) { if (port_group_) { - timing_ = makeTimingGroup(group->line()); + timing_ = new TimingGroup(group->line()); port_group_->addTimingGroup(timing_); } } -TimingGroup * -LibertyReader::makeTimingGroup(int line) -{ - return new TimingGroup(line); -} - void LibertyReader::endTiming(LibertyGroup *group) { @@ -3579,8 +3797,9 @@ LibertyReader::endTiming(LibertyGroup *group) } if (timing_->relatedPortNames() == nullptr) libWarn(170, group, "timing group missing related_pin/related_bus_pin."); - timing_ = nullptr; } + timing_ = nullptr; + receiver_model_ = nullptr; } void @@ -3806,7 +4025,7 @@ LibertyReader::endCellRiseFall(LibertyGroup *group) timing_->setCell(rf_, table_model); } else - libWarn(118, group, "unsupported model axis."); + libWarn(906, group, "unsupported model axis."); } endTableModel(); } @@ -3912,6 +4131,8 @@ LibertyReader::beginTimingTableModel(LibertyGroup *group, if (timing_) beginTableModel(group, TableTemplateType::delay, rf, time_scale_, scale_factor_type); + else + libWarn(903, group, "%s group not in timing group.", group->firstName()); } void @@ -3931,6 +4152,9 @@ void LibertyReader::endTableModel() { endTable(); + scale_factor_type_ = ScaleFactorType::unknown; + sigma_type_ = nullptr; + index_ = 0; } void @@ -3993,6 +4217,7 @@ LibertyReader::makeTable(LibertyAttr *attr, makeTableAxis(1); makeTableAxis(2); if (axis_[0] && axis_[1] && axis_[2]) { + // 3D table // Column index1*size(index2) + index2 // Row index3 FloatTable *table = makeFloatTable(attr, @@ -4001,6 +4226,7 @@ LibertyReader::makeTable(LibertyAttr *attr, table_ = make_shared(table, axis_[0], axis_[1], axis_[2]); } else if (axis_[0] && axis_[1]) { + // 2D table // Row variable1/axis[0] // Column variable2/axis[1] FloatTable *table = makeFloatTable(attr, axis_[0]->size(), @@ -4008,12 +4234,14 @@ LibertyReader::makeTable(LibertyAttr *attr, table_ = make_shared(table, axis_[0], axis_[1]); } else if (axis_[0]) { + // 1D table FloatTable *table = makeFloatTable(attr, 1, axis_[0]->size(), scale); FloatSeq *values = (*table)[0]; delete table; table_ = make_shared(values, axis_[0]); } else { + // scalar FloatTable *table = makeFloatTable(attr, 1, 1, scale); float value = (*(*table)[0])[0]; delete (*table)[0]; @@ -4377,6 +4605,10 @@ LibertyReader::readFloatSeq(LibertyAttr *attr, values = new FloatSeq; parseStringFloatList(value->stringValue(), scale, values, attr); } + else if (value->isFloat()) { + values = new FloatSeq; + values->push_back(value->floatValue()); + } else libWarn(140, attr, "%s is missing values.", attr->name()); } @@ -5115,7 +5347,8 @@ RelatedPortGroup::setIsOneToOne(bool one) TimingGroup::TimingGroup(int line) : RelatedPortGroup(line), attrs_(std::make_shared()), - related_output_port_name_(nullptr) + related_output_port_name_(nullptr), + receiver_model_(nullptr) { for (auto rf_index : RiseFall::rangeIndex()) { cell_[rf_index] = nullptr; @@ -5125,6 +5358,7 @@ TimingGroup::TimingGroup(int line) : intrinsic_exists_[rf_index] = false; resistance_[rf_index] = 0.0F; resistance_exists_[rf_index] = false; + output_current_[rf_index] = nullptr; for (auto el_index : EarlyLate::rangeIndex()) { delay_sigma_[rf_index][el_index] = nullptr; @@ -5249,6 +5483,25 @@ TimingGroup::setConstraintSigma(RiseFall *rf, constraint_sigma_[rf->index()][early_late->index()] = model; } +void +TimingGroup::setReceiverModel(ReceiverModelPtr receiver_model) +{ + receiver_model_ = receiver_model; +} + +OutputCurrent * +TimingGroup::outputCurrent(RiseFall *rf) +{ + return output_current_[rf->index()]; +} + +void +TimingGroup::setOutputCurrent(RiseFall *rf, + OutputCurrent *output_current) +{ + output_current_[rf->index()] = output_current; +} + //////////////////////////////////////////////////////////////// InternalPowerGroup::InternalPowerGroup(int line) : diff --git a/liberty/LibertyReaderPvt.hh b/liberty/LibertyReaderPvt.hh index 772b00d4..f1a64685 100644 --- a/liberty/LibertyReaderPvt.hh +++ b/liberty/LibertyReaderPvt.hh @@ -57,6 +57,7 @@ typedef Vector TimingGroupSeq; typedef Vector InternalPowerGroupSeq; typedef Vector LeakagePowerGroupSeq; typedef void (LibertyPort::*LibertyPortBoolSetter)(bool value); +typedef Vector OutputCurrentWaveformSeq; class LibertyReader : public LibertyGroupVisitor { @@ -297,7 +298,6 @@ public: virtual void beginTiming(LibertyGroup *group); virtual void endTiming(LibertyGroup *group); - virtual TimingGroup *makeTimingGroup(int line); virtual void visitRelatedPin(LibertyAttr *attr); virtual void visitRelatedPin(LibertyAttr *attr, RelatedPortGroup *group); @@ -419,6 +419,30 @@ public: virtual void visitPgType(LibertyAttr *attr); virtual void visitVoltageName(LibertyAttr *attr); + // ccs receiver + virtual void beginReceiverCapacitance(LibertyGroup *group); + virtual void endReceiverCapacitance(LibertyGroup *group); + virtual void beginReceiverCapacitance1Rise(LibertyGroup *group); + virtual void endReceiverCapacitanceRiseFall(LibertyGroup *group); + virtual void beginReceiverCapacitance1Fall(LibertyGroup *group); + virtual void beginReceiverCapacitance2Rise(LibertyGroup *group); + virtual void beginReceiverCapacitance2Fall(LibertyGroup *group); + void beginReceiverCapacitance(LibertyGroup *group, + int index, + RiseFall *rf); + void endReceiverCapacitance(LibertyGroup *group, + int index, + RiseFall *rf); + // ccs + void beginOutputCurrentRise(LibertyGroup *group); + void beginOutputCurrentFall(LibertyGroup *group); + void beginOutputCurrent(RiseFall *rf, + LibertyGroup *group); + void endOutputCurrentRiseFall(LibertyGroup *group); + void beginVector(LibertyGroup *group); + void endVector(LibertyGroup *group); + void visitReferenceTime(LibertyAttr *attr); + // Visitors for derived classes to overload. virtual void beginGroup1(LibertyGroup *) {} virtual void beginGroup2(LibertyGroup *) {} @@ -453,6 +477,7 @@ protected: void parseNames(const char *name_str); void clearAxisValues(); void makeTableAxis(int index); + StringSeq *parseNameList(const char *name_list); LibertyPort *findPort(const char *port_name); LibertyPort *findPort(LibertyCell *cell, @@ -567,6 +592,7 @@ protected: LeakagePowerGroup *leakage_power_; LeakagePowerGroupSeq leakage_powers_; RiseFall *rf_; + int index_; OcvDerate *ocv_derate_; RiseFallBoth *rf_type_; EarlyLateAll *derate_type_; @@ -590,6 +616,12 @@ protected: float distance_scale_; bool have_resistance_unit_; const char *default_operating_condition_; + ReceiverModelPtr receiver_model_; + OutputCurrentWaveformSeq output_current_waveforms_; + OutputCurrent *output_current_; + float reference_time_; + bool reference_time_exists_; + static constexpr char escape_ = '\\'; private: @@ -636,12 +668,15 @@ public: void addTimingGroup(TimingGroup *timing); InternalPowerGroupSeq *internalPowerGroups() { return &internal_power_groups_; } void addInternalPowerGroup(InternalPowerGroup *internal_power); + ReceiverModel *receiverModel() const { return receiver_model_; } + void setReceiverModel(ReceiverModelPtr receiver_model); int line() const { return line_; } private: LibertyPortSeq *ports_; TimingGroupSeq timings_; InternalPowerGroupSeq internal_power_groups_; + ReceiverModel *receiver_model_; int line_; }; @@ -747,10 +782,14 @@ public: void setConstraintSigma(RiseFall *rf, EarlyLate *early_late, TableModel *model); - + void setReceiverModel(ReceiverModelPtr receiver_model); + OutputCurrent *outputCurrent(RiseFall *rf); + void setOutputCurrent(RiseFall *rf, + OutputCurrent *output_current); + protected: void makeLinearModels(LibertyLibrary *library); - void makeTableModels(LibertyReader *visitor); + void makeTableModels(LibertyReader *reader); TimingArcAttrsPtr attrs_; const char *related_output_port_name_; @@ -764,6 +803,8 @@ protected: TableModel *transition_[RiseFall::index_count]; TableModel *delay_sigma_[RiseFall::index_count][EarlyLate::index_count]; TableModel *slew_sigma_[RiseFall::index_count][EarlyLate::index_count]; + OutputCurrent *output_current_[RiseFall::index_count]; + ReceiverModelPtr receiver_model_; }; class InternalPowerGroup : public InternalPowerAttrs, public RelatedPortGroup diff --git a/liberty/TableModel.cc b/liberty/TableModel.cc index dc18396c..dddda04b 100644 --- a/liberty/TableModel.cc +++ b/liberty/TableModel.cc @@ -41,9 +41,13 @@ appendSpaces(string *result, GateTableModel::GateTableModel(TableModel *delay_model, TableModel *delay_sigma_models[EarlyLate::index_count], TableModel *slew_model, - TableModel *slew_sigma_models[EarlyLate::index_count]) : + TableModel *slew_sigma_models[EarlyLate::index_count], + ReceiverModelPtr receiver_model, + OutputCurrent *output_current) : delay_model_(delay_model), - slew_model_(slew_model) + slew_model_(slew_model), + receiver_model_(receiver_model), + output_current_(output_current) { for (auto el_index : EarlyLate::rangeIndex()) { slew_sigma_models_[el_index] = slew_sigma_models ? slew_sigma_models[el_index] : nullptr; @@ -55,6 +59,7 @@ GateTableModel::~GateTableModel() { delete delay_model_; delete slew_model_; + delete output_current_; deleteSigmaModels(slew_sigma_models_); deleteSigmaModels(delay_sigma_models_); } @@ -160,6 +165,8 @@ GateTableModel::reportGateDelay(const LibertyCell *cell, load_cap, related_out_cap); if (drvr_slew < 0.0) *result += "Negative slew clipped to 0.0\n"; + if (output_current_) + output_current_->reportWaveform(cell, pvt, in_slew, load_cap, digits, result); } void @@ -180,7 +187,7 @@ GateTableModel::reportTableLookup(const char *result_name, axis_value1, axis_value2, axis_value3); model->reportValue(result_name, library, cell, pvt, axis_value1, nullptr, axis_value2, axis_value3, - digits, result); + library->units()->timeUnit(), digits, result); } } @@ -327,11 +334,11 @@ GateTableModel::checkAxes(const TablePtr table) TableAxisPtr axis3 = table->axis3(); bool axis_ok = true; if (axis1) - axis_ok &= checkAxis(table->axis1()); + axis_ok &= checkAxis(axis1); if (axis2) - axis_ok &= checkAxis(table->axis2()); + axis_ok &= checkAxis(axis2); if (axis3) - axis_ok &= checkAxis(table->axis3()); + axis_ok &= checkAxis(axis3); return axis_ok; } @@ -347,6 +354,46 @@ GateTableModel::checkAxis(TableAxisPtr axis) //////////////////////////////////////////////////////////////// +ReceiverModel::ReceiverModel() : + capacitance_models_{{nullptr, nullptr}, {nullptr, nullptr}} +{ +} + +ReceiverModel::~ReceiverModel() +{ + for (int index = 0; index < 2; index++) { + for (auto rf_index : RiseFall::rangeIndex()) + delete capacitance_models_[index][rf_index]; + } +} + +void +ReceiverModel::setCapacitanceModel(TableModel *table_model, + int index, + RiseFall *rf) +{ + capacitance_models_[index][rf->index()] = table_model; +} + +bool +ReceiverModel::checkAxes(TablePtr table) +{ + TableAxisPtr axis1 = table->axis1(); + TableAxisPtr axis2 = table->axis2(); + TableAxisPtr axis3 = table->axis3(); + return (axis1 && axis1->variable() == TableAxisVariable::input_net_transition + && axis2 == nullptr + && axis3 == nullptr) + || (axis1 && axis1->variable() == TableAxisVariable::input_net_transition + && axis2 && axis2->variable() == TableAxisVariable::total_output_net_capacitance + && axis3 == nullptr) + || (axis1 && axis1->variable() == TableAxisVariable::total_output_net_capacitance + && axis2 && axis2->variable() == TableAxisVariable::input_net_transition + && axis3 == nullptr); +} + +//////////////////////////////////////////////////////////////// + CheckTableModel::CheckTableModel(TableModel *model, TableModel *sigma_models[EarlyLate::index_count]) : model_(model) @@ -464,7 +511,7 @@ CheckTableModel::reportTableDelay(const char *result_name, reportPvt(library, pvt, digits, result); model_->reportValue(result_name, library, cell, pvt, axis_value1, from_slew_annotation, axis_value2, - axis_value3, digits, result); + axis_value3, library->units()->timeUnit(), digits, result); } } @@ -536,11 +583,11 @@ CheckTableModel::checkAxes(const TablePtr table) TableAxisPtr axis3 = table->axis3(); bool axis_ok = true; if (axis1) - axis_ok &= checkAxis(table->axis1()); + axis_ok &= checkAxis(axis1); if (axis2) - axis_ok &= checkAxis(table->axis2()); + axis_ok &= checkAxis(axis2); if (axis3) - axis_ok &= checkAxis(table->axis3()); + axis_ok &= checkAxis(axis3); return axis_ok; } @@ -646,16 +693,15 @@ TableModel::reportValue(const char *result_name, const char *comment1, float value2, float value3, + const Unit *table_unit, int digits, string *result) const { table_->reportValue("Table value", library, cell, pvt, value1, - comment1, value2, value3, digits, result); + comment1, value2, value3, table_unit, digits, result); reportPvtScaleFactor(library, cell, pvt, digits, result); - const Units *units = library->units(); - const Unit *table_unit = units->timeUnit(); *result += result_name; *result += " = "; *result += table_unit->asString(findValue(library, cell, pvt, @@ -725,18 +771,17 @@ Table0::findValue(float, void Table0::reportValue(const char *result_name, - const LibertyLibrary *library, + const LibertyLibrary *, const LibertyCell *, const Pvt *, float value1, const char *comment1, float value2, float value3, + const Unit *table_unit, int digits, string *result) const { - const Units *units = library->units(); - const Unit *table_unit = units->timeUnit(); *result += result_name; *result += " constant = "; *result += table_unit->asString(findValue(value1, value2, value3), digits); @@ -811,16 +856,15 @@ Table1::reportValue(const char *result_name, const const char *comment1, float value2, float value3, + const Unit *table_unit, int digits, string *result) const { - TableAxisVariable var1 = axis1_->variable(); const Units *units = library->units(); - const Unit *table_unit = units->timeUnit(); - const Unit *unit1 = tableVariableUnit(var1, units); + const Unit *unit1 = axis1_->unit(units); *result += "Table is indexed by\n"; *result += " "; - *result += tableVariableString(var1); + *result += axis1_->variableString(); *result += " = "; *result += unit1->asString(value1, digits); if (comment1) @@ -856,7 +900,7 @@ Table1::report(const Units *units, Report *report) const { int digits = 4; - const Unit *unit1 = tableVariableUnit(axis1_->variable(), units); + const Unit *unit1 = axis1_->unit(units); const Unit *table_unit = units->timeUnit(); report->reportLine("%s", tableVariableString(axis1_->variable())); report->reportLine("------------------------------"); @@ -980,17 +1024,15 @@ Table2::reportValue(const char *result_name, const char *comment1, float value2, float value3, + const Unit *table_unit, int digits, string *result) const { - TableAxisVariable var1 = axis1_->variable(); - TableAxisVariable var2 = axis2_->variable(); const Units *units = library->units(); - const Unit *table_unit = units->timeUnit(); - const Unit *unit1 = tableVariableUnit(var1, units); - const Unit *unit2 = tableVariableUnit(var2, units); + const Unit *unit1 = axis1_->unit(units); + const Unit *unit2 = axis2_->unit(units); *result += "------- "; - *result += tableVariableString(var1), + *result += axis1_->variableString(), *result += " = "; *result += unit1->asString(value1, digits); if (comment1) @@ -998,7 +1040,7 @@ Table2::reportValue(const char *result_name, *result += '\n'; *result += "| "; - *result += tableVariableString(var2); + *result += axis2_->variableString(); *result += " = "; *result += unit2->asString(value2, digits); *result += '\n'; @@ -1047,8 +1089,8 @@ Table2::report(const Units *units, { int digits = 4; const Unit *table_unit = units->timeUnit(); - const Unit *unit1 = tableVariableUnit(axis1_->variable(), units); - const Unit *unit2 = tableVariableUnit(axis2_->variable(), units); + const Unit *unit1 = axis1_->unit(units); + const Unit *unit2 = axis2_->unit(units); report->reportLine("%s", tableVariableString(axis2_->variable())); report->reportLine(" ------------------------------"); string line = " "; @@ -1173,20 +1215,17 @@ Table3::reportValue(const char *result_name, const char *comment1, float value2, float value3, + const Unit *table_unit, int digits, string *result) const { - TableAxisVariable var1 = axis1_->variable(); - TableAxisVariable var2 = axis2_->variable(); - TableAxisVariable var3 = axis3_->variable(); const Units *units = library->units(); - const Unit *table_unit = units->timeUnit(); - const Unit *unit1 = tableVariableUnit(var1, units); - const Unit *unit2 = tableVariableUnit(var2, units); - const Unit *unit3 = tableVariableUnit(var3, units); + const Unit *unit1 = axis1_->unit(units); + const Unit *unit2 = axis2_->unit(units); + const Unit *unit3 = axis3_->unit(units); *result += " --------- "; - *result += tableVariableString(var1), + *result += axis1_->variableString(), *result += " = "; *result += unit1->asString(value1, digits); if (comment1) @@ -1194,13 +1233,13 @@ Table3::reportValue(const char *result_name, *result += '\n'; *result += " | ---- "; - *result += tableVariableString(var2), + *result += axis2_->variableString(), *result += " = "; *result += unit2->asString(value2, digits); *result += '\n'; *result += " | | "; - *result += tableVariableString(var3); + *result += axis3_->variableString(); *result += " = "; *result += unit3->asString(value3, digits); *result += '\n'; @@ -1296,9 +1335,9 @@ Table3::report(const Units *units, { int digits = 4; const Unit *table_unit = units->timeUnit(); - const Unit *unit1 = tableVariableUnit(axis1_->variable(), units); - const Unit *unit2 = tableVariableUnit(axis2_->variable(), units); - const Unit *unit3 = tableVariableUnit(axis3_->variable(), units); + const Unit *unit1 = axis1_->unit(units); + const Unit *unit2 = axis2_->unit(units); + const Unit *unit3 = axis3_->unit(units); for (size_t index1 = 0; index1 < axis1_->size(); index1++) { report->reportLine("%s %s", tableVariableString(axis1_->variable()), unit1->asString(axis1_->axisValue(index1), digits)); @@ -1363,6 +1402,47 @@ TableAxis::findAxisIndex(float value) const } } +void +TableAxis::findAxisIndex(float value, + // Return values. + size_t &index, + bool &exists) const +{ + int max = static_cast(values_->size()) - 1; + if (!values_->empty() + && value >= (*values_)[0] + && value <= (*values_)[max]) { + int lower = -1; + int upper = max + 1; + bool ascend = ((*values_)[max] >= (*values_)[0]); + while (upper - lower > 1) { + int mid = (upper + lower) >> 1; + if (value == (*values_)[mid]) { + index = mid; + exists = true; + return; + } + if ((value > (*values_)[mid]) == ascend) + lower = mid; + else + upper = mid; + } + } + exists = false; +} + +const char * +TableAxis::variableString() const +{ + return tableVariableString(variable_); +} + +const Unit * +TableAxis::unit(const Units *units) +{ + return tableVariableUnit(variable_, units); +} + //////////////////////////////////////////////////////////////// static EnumNameMap table_axis_variable_map = @@ -1432,4 +1512,120 @@ tableVariableUnit(TableAxisVariable variable, return nullptr; } +//////////////////////////////////////////////////////////////// + +OutputCurrentWaveform::OutputCurrentWaveform(float axis_value1, + float axis_value2, + TableAxisPtr axis, + Table1 *currents, + float reference_time) : + axis_value1_(axis_value1), + axis_value2_(axis_value2), + axis_(axis), + currents_(currents), + reference_time_(reference_time) +{ +} + +OutputCurrentWaveform::~OutputCurrentWaveform() +{ + delete currents_; +} + +bool +OutputCurrentWaveform::checkAxes(TableTemplate *tbl_template) +{ + TableAxisPtr axis1 = tbl_template->axis1(); + TableAxisPtr axis2 = tbl_template->axis2(); + TableAxisPtr axis3 = tbl_template->axis3(); + return (axis1 && axis1->variable() == TableAxisVariable::input_net_transition + && axis2->variable() == TableAxisVariable::time + && axis3 == nullptr) + || (axis1 && axis1->variable() == TableAxisVariable::input_net_transition + && axis2 && axis2->variable() == TableAxisVariable::total_output_net_capacitance + && axis3->variable() == TableAxisVariable::time) + || (axis1 && axis1->variable() == TableAxisVariable::total_output_net_capacitance + && axis2 && axis2->variable() == TableAxisVariable::input_net_transition + && axis3->variable() == TableAxisVariable::time); +} + +void +OutputCurrentWaveform::reportWaveform(const Units *units, + int digits, + string *result) +{ + const Unit *time_unit = units->timeUnit(); + const Unit *current_unit = units->currentUnit(); + for (size_t i = 0; i < axis_->values()->size(); i++) { + *result += time_unit->asString(axis_->axisValue(i), digits); + *result += " "; + } + *result += '\n'; + for (size_t i = 0; i < currents_->axis1()->size(); i++) { + *result += current_unit->asString(currents_->value(i), digits); + *result += " "; + } + *result += '\n'; +} + +//////////////////////////////////////////////////////////////// + +OutputCurrent::OutputCurrent(TableAxisPtr axis1, + TableAxisPtr axis2, + OutputCurrentWaveformSeq &waveforms) : + axis1_(axis1), + axis2_(axis2), + waveforms_(waveforms) +{ +} + +OutputCurrent::~OutputCurrent() +{ + waveforms_.deleteContents(); +} + +void +OutputCurrent::reportWaveform(const LibertyCell *cell, + const Pvt *, + float in_slew, + float load_cap, + int digits, + string *result) const +{ + float axis_value1, axis_value2; + findAxisValues(in_slew, load_cap, + axis_value1, axis_value2); + size_t index1 = axis1_->findAxisIndex(axis_value1); + size_t index2 = axis2_->findAxisIndex(axis_value2); + size_t index = index1 * axis2_->size() + index2; + waveforms_[index]->reportWaveform(cell->libertyLibrary()->units(), digits, result); +} + +void +OutputCurrent::findAxisValues(float in_slew, + float load_cap, + // Return values. + float &axis_value1, + float &axis_value2) const +{ + axis_value1 = axisValue(axis1_, in_slew, load_cap); + axis_value2 = axisValue(axis2_, in_slew, load_cap); +} + +float +OutputCurrent::axisValue(TableAxisPtr axis, + float in_slew, + float load_cap) const +{ + TableAxisVariable var = axis->variable(); + if (var == TableAxisVariable::input_net_transition) + return in_slew; + else if (var == TableAxisVariable::total_output_net_capacitance) + return load_cap; + else { + criticalError(240, "unsupported table axes"); + return 0.0; + } +} + } // namespace diff --git a/messages.txt b/messages.txt index 0eccbb62..a55f20a8 100644 --- a/messages.txt +++ b/messages.txt @@ -1,18 +1,18 @@ 0001 DmpCeff.cc:1597 cell %s delay model not supported on SPF parasitics by DMP delay calculator -0002 Liberty.cc:748 cell %s/%s port %s not found in cell %s/%s. -0003 Liberty.cc:774 cell %s/%s %s -> %s timing group %s not found in cell %s/%s. -0004 Liberty.cc:1708 cell %s/%s %s -> %s latch enable %s_edge is inconsistent with %s -> %s setup_%s check. -0005 Liberty.cc:1722 cell %s/%s %s -> %s latch enable %s_edge is inconsistent with latch group enable function positive sense. -0006 Liberty.cc:1730 cell %s/%s %s -> %s latch enable %s_edge is inconsistent with latch group enable function negative sense. +0002 Liberty.cc:749 cell %s/%s port %s not found in cell %s/%s. +0003 Liberty.cc:775 cell %s/%s %s -> %s timing group %s not found in cell %s/%s. +0004 Liberty.cc:1710 cell %s/%s %s -> %s latch enable %s_edge is inconsistent with %s -> %s setup_%s check. +0005 Liberty.cc:1724 cell %s/%s %s -> %s latch enable %s_edge is inconsistent with latch group enable function positive sense. +0006 Liberty.cc:1732 cell %s/%s %s -> %s latch enable %s_edge is inconsistent with latch group enable function negative sense. 0007 LibertyExpr.cc:78 %s references unknown port %s. -0008 ConcreteNetwork.cc:1857 cell type %s can not be linked. +0008 ConcreteNetwork.cc:1924 cell type %s can not be linked. 0009 CycleAccting.cc:87 No common period was found between clocks %s and %s. 0010 Genclks.cc:274 no master clock found for generated clock %s. 0013 Genclks.cc:938 generated clock %s source pin %s missing paths from master clock %s. -0015 Sim.cc:871 propagated logic value %c differs from constraint value of %c on pin %s. -0016 LibertyReader.cc:1012 default_max_fanout is 0.0. -0017 Sta.cc:2091 '%s' is not a valid endpoint. -0018 Sta.cc:2015 '%s' is not a valid start point. +0015 Sim.cc:865 propagated logic value %c differs from constraint value of %c on pin %s. +0016 LibertyReader.cc:1045 default_max_fanout is 0.0. +0017 Sta.cc:2093 '%s' is not a valid endpoint. +0018 Sta.cc:2017 '%s' is not a valid start point. 0021 SpefParse.yy:805 %d is not positive. 0022 SpefParse.yy:814 %.4f is not positive. 0023 SpefParse.yy:820 %.4f is not positive. @@ -22,167 +22,167 @@ 0027 WritePathSpice.cc:1015 no register/latch found for path from %s to %s, 0028 WritePathSpice.cc:1382 The following subkcts are missing from %s 0029 WritePathSpice.cc:1440 subckt %s port %s has no corresponding liberty port, pg_port and is not power or ground. -0030 LibertyReader.cc:591 library missing name. -0031 LibertyReader.cc:623 default_wire_load %s not found. -0032 LibertyReader.cc:634 default_wire_selection %s not found. -0033 LibertyReader.cc:656 input_threshold_pct_%s not found. -0034 LibertyReader.cc:660 output_threshold_pct_%s not found. -0035 LibertyReader.cc:664 slew_lower_threshold_pct_%s not found. -0036 LibertyReader.cc:668 slew_upper_threshold_pct_%s not found. -0037 LibertyReader.cc:673 Library %s is missing one or more thresholds. -0038 LibertyReader.cc:763 unknown unit multiplier %s. -0039 LibertyReader.cc:782 unknown unit scale %c. -0040 LibertyReader.cc:785 unknown unit suffix %s. -0041 LibertyReader.cc:811 capacitive_load_units are not ff or pf. -0042 LibertyReader.cc:814 capacitive_load_units are not a string. -0043 LibertyReader.cc:817 capacitive_load_units missing suffix. -0044 LibertyReader.cc:820 capacitive_load_units scale is not a float. -0045 LibertyReader.cc:823 capacitive_load_units missing scale and suffix. -0046 LibertyReader.cc:826 capacitive_load_unit missing values suffix. -0047 LibertyReader.cc:844 delay_model %s not supported. -0048 LibertyReader.cc:848 delay_model %s not supported. -0049 LibertyReader.cc:852 delay_model %s not supported. -0050 LibertyReader.cc:857 delay_model %s not supported. +0030 LibertyReader.cc:624 library missing name. +0031 LibertyReader.cc:656 default_wire_load %s not found. +0032 LibertyReader.cc:667 default_wire_selection %s not found. +0033 LibertyReader.cc:689 input_threshold_pct_%s not found. +0034 LibertyReader.cc:693 output_threshold_pct_%s not found. +0035 LibertyReader.cc:697 slew_lower_threshold_pct_%s not found. +0036 LibertyReader.cc:701 slew_upper_threshold_pct_%s not found. +0037 LibertyReader.cc:706 Library %s is missing one or more thresholds. +0038 LibertyReader.cc:796 unknown unit multiplier %s. +0039 LibertyReader.cc:815 unknown unit scale %c. +0040 LibertyReader.cc:818 unknown unit suffix %s. +0041 LibertyReader.cc:844 capacitive_load_units are not ff or pf. +0042 LibertyReader.cc:847 capacitive_load_units are not a string. +0043 LibertyReader.cc:850 capacitive_load_units missing suffix. +0044 LibertyReader.cc:853 capacitive_load_units scale is not a float. +0045 LibertyReader.cc:856 capacitive_load_units missing scale and suffix. +0046 LibertyReader.cc:859 capacitive_load_unit missing values suffix. +0047 LibertyReader.cc:877 delay_model %s not supported. +0048 LibertyReader.cc:881 delay_model %s not supported. +0049 LibertyReader.cc:885 delay_model %s not supported. +0050 LibertyReader.cc:890 delay_model %s not supported. . -0051 LibertyReader.cc:860 unknown delay_model %s +0051 LibertyReader.cc:893 unknown delay_model %s . -0052 LibertyReader.cc:879 unknown bus_naming_style format. -0053 LibertyReader.cc:557 library %s already exists. -0054 LibertyReader.cc:900 voltage_map voltage is not a float. -0055 LibertyReader.cc:903 voltage_map missing voltage. -0056 LibertyReader.cc:906 voltage_map supply name is not a string. -0057 LibertyReader.cc:909 voltage_map missing supply name and voltage. -0058 LibertyReader.cc:912 voltage_map missing values suffix. -0059 LibertyReader.cc:1130 default_wire_load_mode %s not found. -0060 LibertyReader.cc:646 default_operating_condition %s not found. -0061 LibertyReader.cc:1301 table template missing name. -0062 LibertyReader.cc:1343 missing variable_%d attribute. -0063 LibertyReader.cc:1386 axis type %s not supported. -0064 LibertyReader.cc:1446 bus type %s missing bit_from. -0065 LibertyReader.cc:1448 bus type %s missing bit_to. -0066 LibertyReader.cc:1452 type missing name. -0067 LibertyReader.cc:1479 scaling_factors do not have a name. -0068 LibertyReader.cc:1647 operating_conditions missing name. -0069 LibertyReader.cc:1717 wire_load missing name. -0070 LibertyReader.cc:1760 fanout_length is missing length and fanout. -0071 LibertyReader.cc:1775 wire_load_selection missing name. -0072 LibertyReader.cc:1806 wireload %s not found. -0074 LibertyReader.cc:1813 wire_load_from_area min not a float. -0075 LibertyReader.cc:1816 wire_load_from_area max not a float. -0076 LibertyReader.cc:1819 wire_load_from_area missing parameters. -0077 LibertyReader.cc:1822 wire_load_from_area missing parameters. -0078 LibertyReader.cc:1839 cell missing name. -0079 LibertyReader.cc:1862 cell %s ocv_derate_group %s not found. -0080 LibertyReader.cc:1898 port %s function size does not match port size. -0081 LibertyReader.cc:1966 %s %s bus width mismatch. -0082 LibertyReader.cc:1977 %s %s bus width mismatch. -0083 LibertyReader.cc:1987 clear -0084 LibertyReader.cc:1997 preset -0085 LibertyReader.cc:2033 latch enable function is non-unate for port %s. -0086 LibertyReader.cc:2038 latch enable function is unknown for port %s. -0087 LibertyReader.cc:2114 operating conditions %s not found. -0088 LibertyReader.cc:2117 scaled_cell missing operating condition. -0089 LibertyReader.cc:2120 scaled_cell cell %s has not been defined. -0090 LibertyReader.cc:2123 scaled_cell missing name. -0091 LibertyReader.cc:2149 scaled_cell %s, %s port functions do not match cell port functions. -0092 LibertyReader.cc:2154 scaled_cell ports do not match cell ports. -0093 LibertyReader.cc:2156 scaled_cell %s, %s timing does not match cell timing. -0094 LibertyReader.cc:2175 combinational timing to an input port. -0095 LibertyReader.cc:2263 missing %s_transition. -0096 LibertyReader.cc:2265 missing cell_%s. -0099 LibertyReader.cc:2593 scaling_factors %s not found. -0100 LibertyReader.cc:2636 pin name is not a string. -0101 LibertyReader.cc:2655 pin name is not a string. -0102 LibertyReader.cc:2677 pin name is not a string. -0103 LibertyReader.cc:2755 bus %s bus_type not found. -0104 LibertyReader.cc:2811 bus_type %s not found. -0105 LibertyReader.cc:2814 bus_type is not a string. -0106 LibertyReader.cc:2832 bundle %s member not found. -0107 LibertyReader.cc:2859 member is not a string. -0108 LibertyReader.cc:2866 members attribute is missing values. -0109 LibertyReader.cc:2909 unknown port direction. -0110 LibertyReader.cc:3279 pulse_latch unknown pulse type. -0111 LibertyReader.cc:3659 unknown timing_type %s. -0112 LibertyReader.cc:3679 unknown timing_sense %s. -0113 LibertyReader.cc:3719 mode value is not a string. -0114 LibertyReader.cc:3722 missing mode value. -0115 LibertyReader.cc:3725 mode name is not a string. -0116 LibertyReader.cc:3728 mode missing values. -0117 LibertyReader.cc:3731 mode missing mode name and value. -0118 LibertyReader.cc:3807 unsupported model axis. -0119 LibertyReader.cc:3836 unsupported model axis. -0120 LibertyReader.cc:3867 unsupported model axis. -0121 LibertyReader.cc:3904 unsupported model axis. -0122 LibertyReader.cc:3956 table template %s not found. -0123 LibertyReader.cc:4031 %s is missing values. -0124 LibertyReader.cc:4056 %s is not a list of floats. -0125 LibertyReader.cc:4058 table row has %u columns but axis has %d. -0126 LibertyReader.cc:4068 table has %u rows but axis has %d. -0127 LibertyReader.cc:4121 lut output is not a string. -0128 LibertyReader.cc:4163 mode definition missing name. -0129 LibertyReader.cc:4180 mode value missing name. -0130 LibertyReader.cc:4194 when attribute inside table model. -0131 LibertyReader.cc:4243 %s attribute is not a string. -0132 LibertyReader.cc:4246 %s is not a simple attribute. -0133 LibertyReader.cc:4269 %s is not a simple attribute. -0134 LibertyReader.cc:4282 %s is not a simple attribute. -0135 LibertyReader.cc:4306 %s value %s is not a float. -0136 LibertyReader.cc:4335 %s missing values. -0137 LibertyReader.cc:4339 %s missing values. -0138 LibertyReader.cc:4342 %s is not a complex attribute. -0139 LibertyReader.cc:4368 %s is not a float. -0140 LibertyReader.cc:4387 %s is missing values. -0141 LibertyReader.cc:4390 %s has more than one string. -0142 LibertyReader.cc:4399 %s is missing values. -0143 LibertyReader.cc:4424 %s attribute is not boolean. -0144 LibertyReader.cc:4427 %s attribute is not boolean. -0145 LibertyReader.cc:4430 %s is not a simple attribute. -0146 LibertyReader.cc:4446 attribute %s value %s not recognized. -0147 LibertyReader.cc:4476 unknown early/late value. -0148 LibertyReader.cc:4702 OCV derate group named %s not found. -0149 LibertyReader.cc:4718 ocv_derate missing name. -0150 LibertyReader.cc:4771 unknown rise/fall. -0151 LibertyReader.cc:4791 unknown derate type. -0152 LibertyReader.cc:4823 unsupported model axis. -0153 LibertyReader.cc:4857 unsupported model axis. -0154 LibertyReader.cc:4891 unsupported model axis. -0155 LibertyReader.cc:4964 unknown pg_type. -0156 LibertyReader.cc:5338 port %s subscript out of range. -0157 LibertyReader.cc:5342 port range %s of non-bus port %s. -0158 LibertyReader.cc:5356 port %s not found. -0159 LibertyReader.cc:5426 port %s not found. -0160 LibertyReader.cc:997 default_max_transition is 0.0. -0161 LibertyReader.cc:3167 max_transition is 0.0. -0162 LibertyReader.cc:4266 %s attribute is not an integer. -0163 LibertyReader.cc:1102 default_fanout_load is 0.0. -0164 LibertyReader.cc:2286 timing group from output port. -0165 LibertyReader.cc:2296 timing group from output port. -0166 LibertyReader.cc:2306 timing group from output port. -0167 LibertyReader.cc:2324 timing group from output port. -0168 LibertyReader.cc:2339 timing group from output port. -0169 LibertyReader.cc:4138 cell %s test_cell redefinition. -0170 LibertyReader.cc:3579 timing group missing related_pin/related_bus_pin. +0052 LibertyReader.cc:912 unknown bus_naming_style format. +0053 LibertyReader.cc:590 library %s already exists. +0054 LibertyReader.cc:933 voltage_map voltage is not a float. +0055 LibertyReader.cc:936 voltage_map missing voltage. +0056 LibertyReader.cc:939 voltage_map supply name is not a string. +0057 LibertyReader.cc:942 voltage_map missing supply name and voltage. +0058 LibertyReader.cc:945 voltage_map missing values suffix. +0059 LibertyReader.cc:1163 default_wire_load_mode %s not found. +0060 LibertyReader.cc:679 default_operating_condition %s not found. +0061 LibertyReader.cc:1334 table template missing name. +0062 LibertyReader.cc:1379 missing variable_%d attribute. +0063 LibertyReader.cc:1422 axis type %s not supported. +0064 LibertyReader.cc:1482 bus type %s missing bit_from. +0065 LibertyReader.cc:1484 bus type %s missing bit_to. +0066 LibertyReader.cc:1488 type missing name. +0067 LibertyReader.cc:1515 scaling_factors do not have a name. +0068 LibertyReader.cc:1683 operating_conditions missing name. +0069 LibertyReader.cc:1753 wire_load missing name. +0070 LibertyReader.cc:1796 fanout_length is missing length and fanout. +0071 LibertyReader.cc:1811 wire_load_selection missing name. +0072 LibertyReader.cc:1842 wireload %s not found. +0074 LibertyReader.cc:1849 wire_load_from_area min not a float. +0075 LibertyReader.cc:1852 wire_load_from_area max not a float. +0076 LibertyReader.cc:1855 wire_load_from_area missing parameters. +0077 LibertyReader.cc:1858 wire_load_from_area missing parameters. +0078 LibertyReader.cc:1875 cell missing name. +0079 LibertyReader.cc:1898 cell %s ocv_derate_group %s not found. +0080 LibertyReader.cc:1934 port %s function size does not match port size. +0081 LibertyReader.cc:2002 %s %s bus width mismatch. +0082 LibertyReader.cc:2013 %s %s bus width mismatch. +0083 LibertyReader.cc:2023 clear +0084 LibertyReader.cc:2033 preset +0085 LibertyReader.cc:2069 latch enable function is non-unate for port %s. +0086 LibertyReader.cc:2074 latch enable function is unknown for port %s. +0087 LibertyReader.cc:2150 operating conditions %s not found. +0088 LibertyReader.cc:2153 scaled_cell missing operating condition. +0089 LibertyReader.cc:2156 scaled_cell cell %s has not been defined. +0090 LibertyReader.cc:2159 scaled_cell missing name. +0091 LibertyReader.cc:2185 scaled_cell %s, %s port functions do not match cell port functions. +0092 LibertyReader.cc:2190 scaled_cell ports do not match cell ports. +0093 LibertyReader.cc:2192 scaled_cell %s, %s timing does not match cell timing. +0094 LibertyReader.cc:2211 combinational timing to an input port. +0095 LibertyReader.cc:2302 missing %s_transition. +0096 LibertyReader.cc:2304 missing cell_%s. +0099 LibertyReader.cc:2817 scaling_factors %s not found. +0100 LibertyReader.cc:2860 pin name is not a string. +0101 LibertyReader.cc:2879 pin name is not a string. +0102 LibertyReader.cc:2901 pin name is not a string. +0103 LibertyReader.cc:2979 bus %s bus_type not found. +0104 LibertyReader.cc:3035 bus_type %s not found. +0105 LibertyReader.cc:3038 bus_type is not a string. +0106 LibertyReader.cc:3056 bundle %s member not found. +0107 LibertyReader.cc:3083 member is not a string. +0108 LibertyReader.cc:3090 members attribute is missing values. +0109 LibertyReader.cc:3133 unknown port direction. +0110 LibertyReader.cc:3501 pulse_latch unknown pulse type. +0111 LibertyReader.cc:3876 unknown timing_type %s. +0112 LibertyReader.cc:3896 unknown timing_sense %s. +0113 LibertyReader.cc:3936 mode value is not a string. +0114 LibertyReader.cc:3939 missing mode value. +0115 LibertyReader.cc:3942 mode name is not a string. +0116 LibertyReader.cc:3945 mode missing values. +0117 LibertyReader.cc:3948 mode missing mode name and value. +0118 LibertyReader.cc:2537 unsupported model axis. +0119 LibertyReader.cc:4051 unsupported model axis. +0120 LibertyReader.cc:4080 unsupported model axis. +0121 LibertyReader.cc:4115 unsupported model axis. +0122 LibertyReader.cc:4170 table template %s not found. +0123 LibertyReader.cc:4249 %s is missing values. +0124 LibertyReader.cc:4274 %s is not a list of floats. +0125 LibertyReader.cc:4276 table row has %u columns but axis has %d. +0126 LibertyReader.cc:4286 table has %u rows but axis has %d. +0127 LibertyReader.cc:4339 lut output is not a string. +0128 LibertyReader.cc:4381 mode definition missing name. +0129 LibertyReader.cc:4398 mode value missing name. +0130 LibertyReader.cc:4412 when attribute inside table model. +0131 LibertyReader.cc:4461 %s attribute is not a string. +0132 LibertyReader.cc:4464 %s is not a simple attribute. +0133 LibertyReader.cc:4487 %s is not a simple attribute. +0134 LibertyReader.cc:4500 %s is not a simple attribute. +0135 LibertyReader.cc:4524 %s value %s is not a float. +0136 LibertyReader.cc:4553 %s missing values. +0137 LibertyReader.cc:4557 %s missing values. +0138 LibertyReader.cc:4560 %s is not a complex attribute. +0139 LibertyReader.cc:4586 %s is not a float. +0140 LibertyReader.cc:4609 %s is missing values. +0141 LibertyReader.cc:4612 %s has more than one string. +0142 LibertyReader.cc:4621 %s is missing values. +0143 LibertyReader.cc:4646 %s attribute is not boolean. +0144 LibertyReader.cc:4649 %s attribute is not boolean. +0145 LibertyReader.cc:4652 %s is not a simple attribute. +0146 LibertyReader.cc:4668 attribute %s value %s not recognized. +0147 LibertyReader.cc:4698 unknown early/late value. +0148 LibertyReader.cc:4924 OCV derate group named %s not found. +0149 LibertyReader.cc:4940 ocv_derate missing name. +0150 LibertyReader.cc:4993 unknown rise/fall. +0151 LibertyReader.cc:5013 unknown derate type. +0152 LibertyReader.cc:5045 unsupported model axis. +0153 LibertyReader.cc:5077 unsupported model axis. +0154 LibertyReader.cc:5109 unsupported model axis. +0155 LibertyReader.cc:5180 unknown pg_type. +0156 LibertyReader.cc:5575 port %s subscript out of range. +0157 LibertyReader.cc:5579 port range %s of non-bus port %s. +0158 LibertyReader.cc:5593 port %s not found. +0159 LibertyReader.cc:5663 port %s not found. +0160 LibertyReader.cc:1030 default_max_transition is 0.0. +0161 LibertyReader.cc:3389 max_transition is 0.0. +0162 LibertyReader.cc:4484 %s attribute is not an integer. +0163 LibertyReader.cc:1135 default_fanout_load is 0.0. +0164 LibertyReader.cc:2324 timing group from output port. +0165 LibertyReader.cc:2334 timing group from output port. +0166 LibertyReader.cc:2344 timing group from output port. +0167 LibertyReader.cc:2362 timing group from output port. +0168 LibertyReader.cc:2377 timing group from output port. +0169 LibertyReader.cc:4356 cell %s test_cell redefinition. +0170 LibertyReader.cc:3795 timing group missing related_pin/related_bus_pin. 0179 SpefReader.cc:733 %s. 0190 VerilogReader.cc:1728 %s is not a verilog module. 0191 VerilogReader.cc:1733 %s is not a verilog module. -0201 StaTcl.i:128 no network has been linked. -0202 StaTcl.i:142 network does not support edits. -0204 StaTcl.i:4179 POCV support requires compilation with SSTA=1. +0201 StaTcl.i:117 no network has been linked. +0202 StaTcl.i:131 network does not support edits. +0204 StaTcl.i:4021 POCV support requires compilation with SSTA=1. 0206 LibertyExpr.cc:171 %s %s. 0207 GraphDelayCalc1.cc:738 port not found in cell 0208 Graph.cc:793 arc_delay_annotated array bounds exceeded 0209 Graph.cc:808 arc_delay_annotated array bounds exceeded 0210 Graph.cc:820 arc_delay_annotated array bounds exceeded -0211 SdcNetwork.cc:1026 inst path string lenth estimate busted -0212 SdcNetwork.cc:1098 inst path string lenth estimate exceeded -0213 Sdc.cc:4156 group path name and is_default are mutually exclusive. -0214 WriteSdc.cc:1306 unknown exception type -0215 WriteSdc.cc:1877 illegal set_logic value -0216 WriteSdc.cc:1921 invalid set_case_analysis value +0211 SdcNetwork.cc:1077 inst path string lenth estimate busted +0212 SdcNetwork.cc:1149 inst path string lenth estimate exceeded +0213 Sdc.cc:4021 group path name and is_default are mutually exclusive. +0214 WriteSdc.cc:1254 unknown exception type +0215 WriteSdc.cc:1795 illegal set_logic value +0216 WriteSdc.cc:1836 invalid set_case_analysis value 0228 Graph.cc:833 arc_delay_annotated array bounds exceeded 0251 PathEnumed.cc:126 enumerated path required time 0252 PathEnumed.cc:135 enumerated path required time -0253 PathGroup.cc:402 unknown path end type +0253 PathGroup.cc:399 unknown path end type 0254 PathVertexRep.cc:145 tag group missing tag 0255 ReportPath.cc:289 unsupported path type 0256 ReportPath.cc:310 unsupported path type @@ -190,109 +190,109 @@ 0259 ReportPath.cc:2378 unsupported path type 0260 Search.cc:2628 max tag group index exceeded 0261 Search.cc:2860 max tag index exceeded -0262 Search.cc:3543 unexpected filter path -0263 Search.cc:3711 tns incr existing vertex -0264 Sta.cc:4161 corresponding timing arc set not found in equiv cells +0262 Search.cc:3551 unexpected filter path +0263 Search.cc:3719 tns incr existing vertex +0264 Sta.cc:4174 corresponding timing arc set not found in equiv cells 0265 TagGroup.cc:297 tag group missing tag -0266 Sta.cc:2088 '%s' is not a valid endpoint. -0267 Sta.cc:2012 '%s' is not a valid start point. -0272 StaTcl.i:4165 unknown common clk pessimism mode. -0273 StaTcl.i:5121 unknown clock sense +0266 Sta.cc:2090 '%s' is not a valid endpoint. +0267 Sta.cc:2014 '%s' is not a valid start point. +0272 StaTcl.i:4007 unknown common clk pessimism mode. +0273 StaTcl.i:4963 unknown clock sense 0299 Power.tcl:241 activity cannot be set on clock ports. -0300 Util.tcl:218 no commands match '$pattern'. +0300 CmdUtil.tcl:44 no commands match '$pattern'. 0301 Power.tcl:218 activity should be 0.0 to 1.0 or 2.0 0302 Power.tcl:226 duty should be 0.0 to 1.0 -0303 Sta.tcl:155 -clock ignored for clock objects. -0304 Sta.tcl:384 -from/-to keywords ignored for lib_pin, port and pin arguments. -0305 Cmds.tcl:166 object '$obj' not found. -0313 Cmds.tcl:841 unsupported object type $object_type. -0314 Cmds.tcl:856 $arg_name must be a single net. -0315 Cmds.tcl:862 $arg_name '$object_type' is not a net. -0316 Cmds.tcl:867 $arg_name '$arg' not found. -0318 Search.tcl:1073 unknown path group '$name'. +0303 Sdc.tcl:1586 -clock ignored for clock objects. +0304 Sdc.tcl:2178 -from/-to keywords ignored for lib_pin, port and pin arguments. +0305 CmdArgs.tcl:166 object '$obj' not found. +0313 CmdArgs.tcl:842 unsupported object type $object_type. +0314 CmdArgs.tcl:857 $arg_name must be a single net. +0315 CmdArgs.tcl:863 $arg_name '$object_type' is not a net. +0316 CmdArgs.tcl:868 $arg_name '$arg' not found. +0318 Search.tcl:1067 unknown path group '$name'. 0319 Sdc.tcl:288 $unit scale [format %.0e $scale] does not match library scale [format %.0e $unit_scale]. -0320 Sdc.tcl:496 current_design for other than top cell not supported. -0321 Sdc.tcl:533 patterns argument not supported with -of_objects. -0322 Sdc.tcl:568 instance '$pattern' not found. -0323 Sdc.tcl:629 clock '$pattern' not found. -0324 Sdc.tcl:656 positional arguments not supported with -of_objects. -0325 Sdc.tcl:682 library '$lib_name' not found. -0326 Sdc.tcl:694 cell '$cell_pattern' not found. -0327 Sdc.tcl:741 library/cell/port '$pattern' not found. -0328 Sdc.tcl:761 port '$port_pattern' not found. -0329 Sdc.tcl:766 library '$lib_name' not found. -0330 Sdc.tcl:776 -nocase ignored without -regexp. -0331 Sdc.tcl:802 library '$pattern' not found. -0332 Sdc.tcl:865 patterns argument not supported with -of_objects. -0333 Sdc.tcl:889 net '$pattern' not found. -0334 Sdc.tcl:918 patterns argument not supported with -of_objects. -0335 Sdc.tcl:955 pin '$pattern' not found. -0336 Sdc.tcl:1012 patterns argument not supported with -of_objects. -0337 Sdc.tcl:1026 port '$pattern' not found. -0338 Sdc.tcl:1124 non-increasing clock -waveform edge times. -0339 Sdc.tcl:1127 -waveform time greater than two periods. -0341 Sdc.tcl:1460 extra positional argument $arg. -0342 Sdc.tcl:1493 -clock ignored for clock objects. -0343 Sdc.tcl:1539 set_sense -type data not supported. -0344 Sdc.tcl:1554 set_clock_sense is deprecated as of SDC 2.1. Use set_sense -type clock. -0345 Sdc.tcl:1566 -pulse argument not supported. -0346 Sdc.tcl:1575 -positive, -negative, -stop_propagation and -pulse are mutually exclusive. -0347 Sdc.tcl:1588 hierarchical pin '[get_full_name $pin]' not supported. -0348 Sdc.tcl:1796 -from/-to keywords ignored for lib_pin, port and pin arguments. -0349 Sdc.tcl:1458 unknown keyword argument $arg. -0350 Sdc.tcl:1944 -from, -through or -to required. -0351 Sdc.tcl:2023 -source_latency_included ignored with -reference_pin. -0352 Sdc.tcl:2026 -network_latency_included ignored with -reference_pin. -0353 Sdc.tcl:2045 $cmd not allowed on [pin_direction $pin] port '[get_full_name $pin]'. -0354 Sdc.tcl:2047 $cmd relative to a clock defined on the same port/pin not allowed. -0355 Sdc.tcl:2090 '$args' ignored. -0356 Sdc.tcl:2220 '$args' ignored. -0357 Sdc.tcl:2267 virtual clock [get_name $clk] can not be propagated. -0358 Sdc.tcl:2416 -multiply_by ignored. -0359 Sdc.tcl:2419 -dont_scale ignored. -0360 Sdc.tcl:2422 -no_design_rule ignored. -0361 Sdc.tcl:2463 -clock not supported. -0362 Sdc.tcl:2466 -clock_fall not supported. -0363 Sdc.tcl:2512 -pin_load not allowed for net objects. -0364 Sdc.tcl:2515 -wire_load not allowed for net objects. -0365 Sdc.tcl:2518 -rise/-fall not allowed for net objects. -0366 Sdc.tcl:2651 -data_path, -clock_path, -rise, -fall ignored for ports and designs. -0367 Sdc.tcl:2721 derating factor greater than 2.0. -0368 Sdc.tcl:2758 -cell_delay and -cell_check flags ignored for net objects. -0369 Sdc.tcl:2817 no valid objects specified for $key. -0370 Sdc.tcl:2850 no valid objects specified for $key -0371 Sdc.tcl:3011 set_wire_load_min_block_size not supported. -0372 NetworkEdit.tcl:80 connect_pins is deprecated. Use connect_pin. -0373 Sdc.tcl:3161 define_corners must be called before read_liberty. +0320 Sdc.tcl:437 current_design for other than top cell not supported. +0321 Sdc.tcl:474 patterns argument not supported with -of_objects. +0322 Sdc.tcl:509 instance '$pattern' not found. +0323 Sdc.tcl:570 clock '$pattern' not found. +0324 Sdc.tcl:597 positional arguments not supported with -of_objects. +0325 Sdc.tcl:623 library '$lib_name' not found. +0326 Sdc.tcl:635 cell '$cell_pattern' not found. +0327 Sdc.tcl:682 library/cell/port '$pattern' not found. +0328 Sdc.tcl:702 port '$port_pattern' not found. +0329 Sdc.tcl:707 library '$lib_name' not found. +0330 Sdc.tcl:717 -nocase ignored without -regexp. +0331 Sdc.tcl:743 library '$pattern' not found. +0332 Sdc.tcl:806 patterns argument not supported with -of_objects. +0333 Sdc.tcl:830 net '$pattern' not found. +0334 Sdc.tcl:859 patterns argument not supported with -of_objects. +0335 Sdc.tcl:896 pin '$pattern' not found. +0336 Sdc.tcl:953 patterns argument not supported with -of_objects. +0337 Sdc.tcl:967 port '$pattern' not found. +0338 Sdc.tcl:1065 non-increasing clock -waveform edge times. +0339 Sdc.tcl:1068 -waveform time greater than two periods. +0341 Sdc.tcl:1443 extra positional argument $arg. +0342 Sdc.tcl:1536 -clock ignored for clock objects. +0343 Sdc.tcl:1626 set_sense -type data not supported. +0344 Sdc.tcl:1641 set_clock_sense is deprecated as of SDC 2.1. Use set_sense -type clock. +0345 Sdc.tcl:1653 -pulse argument not supported. +0346 Sdc.tcl:1662 -positive, -negative, -stop_propagation and -pulse are mutually exclusive. +0347 Sdc.tcl:1675 hierarchical pin '[get_full_name $pin]' not supported. +0348 Sdc.tcl:2041 -from/-to keywords ignored for lib_pin, port and pin arguments. +0349 Sdc.tcl:1441 unknown keyword argument $arg. +0350 Sdc.tcl:2288 -from, -through or -to required. +0351 Sdc.tcl:2367 -source_latency_included ignored with -reference_pin. +0352 Sdc.tcl:2370 -network_latency_included ignored with -reference_pin. +0353 Sdc.tcl:2389 $cmd not allowed on [pin_direction $pin] port '[get_full_name $pin]'. +0354 Sdc.tcl:2391 $cmd relative to a clock defined on the same port/pin not allowed. +0355 Sdc.tcl:2445 '$args' ignored. +0356 Sdc.tcl:2575 '$args' ignored. +0357 Sdc.tcl:2710 virtual clock [get_name $clk] can not be propagated. +0358 Sdc.tcl:2884 -multiply_by ignored. +0359 Sdc.tcl:2887 -dont_scale ignored. +0360 Sdc.tcl:2890 -no_design_rule ignored. +0361 Sdc.tcl:2937 -clock not supported. +0362 Sdc.tcl:2940 -clock_fall not supported. +0363 Sdc.tcl:2986 -pin_load not allowed for net objects. +0364 Sdc.tcl:2989 -wire_load not allowed for net objects. +0365 Sdc.tcl:2992 -rise/-fall not allowed for net objects. +0366 Sdc.tcl:3125 -data_path, -clock_path, -rise, -fall ignored for ports and designs. +0367 Sdc.tcl:3196 derating factor greater than 2.0. +0368 Sdc.tcl:3233 -cell_delay and -cell_check flags ignored for net objects. +0369 Sdc.tcl:3303 no valid objects specified for $key. +0370 Sdc.tcl:3336 no valid objects specified for $key +0371 Sdc.tcl:3497 set_wire_load_min_block_size not supported. +0372 NetworkEdit.tcl:129 connect_pins is deprecated. Use connect_pin. +0373 Sdc.tcl:3647 define_corners must be called before read_liberty. 0400 Util.tcl:44 $cmd $key missing value. 0401 Util.tcl:61 $cmd $key missing value. 0402 Util.tcl:71 $cmd $arg is not a known keyword or flag. 0403 Util.tcl:93 $cmd $arg is not a known keyword or flag. -0404 Util.tcl:191 Usage: $cmd $cmd_args($cmd) -0405 Util.tcl:193 Usage: $cmd argument error -0406 Util.tcl:313 $cmd positional arguments not supported. -0407 Util.tcl:319 $cmd requires one positional argument. -0408 Util.tcl:326 $cmd requires zero or one positional arguments. -0409 Util.tcl:332 $cmd requires two positional arguments. -0410 Util.tcl:339 $cmd requires one or two positional arguments. -0411 Util.tcl:345 $cmd requires three positional arguments. -0412 Util.tcl:351 $cmd requires four positional arguments. -0413 Util.tcl:359 $cmd_arg '$arg' is not a float. -0414 Util.tcl:365 $cmd_arg '$arg' is not a positive float. -0415 Util.tcl:371 $cmd_arg '$arg' is not an integer. -0416 Util.tcl:377 $cmd_arg '$arg' is not a positive integer. -0417 Util.tcl:383 $cmd_arg '$arg' is not an integer greater than or equal to one. -0418 Util.tcl:389 $cmd_arg '$arg' is not between 0 and 100. -0419 Search.tcl:342 report_clock_skew -setup and -hold are mutually exclusive options. +0404 CmdUtil.tcl:89 Usage: $cmd $cmd_args($cmd) +0405 CmdUtil.tcl:91 Usage: $cmd argument error +0406 Util.tcl:241 $cmd positional arguments not supported. +0407 Util.tcl:247 $cmd requires one positional argument. +0408 Util.tcl:254 $cmd requires zero or one positional arguments. +0409 Util.tcl:260 $cmd requires two positional arguments. +0410 Util.tcl:267 $cmd requires one or two positional arguments. +0411 Util.tcl:273 $cmd requires three positional arguments. +0412 Util.tcl:279 $cmd requires four positional arguments. +0413 Util.tcl:287 $cmd_arg '$arg' is not a float. +0414 Util.tcl:293 $cmd_arg '$arg' is not a positive float. +0415 Util.tcl:299 $cmd_arg '$arg' is not an integer. +0416 Util.tcl:305 $cmd_arg '$arg' is not a positive integer. +0417 Util.tcl:311 $cmd_arg '$arg' is not an integer greater than or equal to one. +0418 Util.tcl:317 $cmd_arg '$arg' is not between 0 and 100. +0419 Search.tcl:336 report_clock_skew -setup and -hold are mutually exclusive options. 0420 Search.tcl:136 $cmd -path_delay must be min, min_rise, min_fall, max, max_rise, max_fall or min_max. 0421 Search.tcl:146 $cmd command failed. 0422 Search.tcl:165 -endpoint_count must be a positive integer. 0423 Search.tcl:174 -group_count must be >= 1. 0424 Search.tcl:205 '$arg' is not a known keyword or flag. 0425 Search.tcl:207 positional arguments not supported. -0426 Search.tcl:526 analysis type single is not consistent with doing both setup/max and hold/min checks. -0427 Search.tcl:531 positional arguments not supported. -0428 Sta.tcl:859 set_assigned_transition transition is not a float. +0426 Search.tcl:520 analysis type single is not consistent with doing both setup/max and hold/min checks. +0427 Search.tcl:525 positional arguments not supported. +0428 DelayCalc.tcl:350 set_assigned_transition transition is not a float. 0430 Sdf.tcl:46 -cond_use min_max cannot be used with analysis type single. 0432 Sdf.tcl:157 SDF -divider must be / or . 0433 Parasitics.tcl:45 path instance '$path' not found. @@ -301,174 +301,173 @@ 0436 Variables.tcl:45 sta_report_default_digits must be a positive integer. 0437 Variables.tcl:70 sta_crpr_mode must be pin or transition. 0438 Variables.tcl:187 $var_name value must be 0 or 1. -0439 Sta.tcl:933 unsupported object type $list_type. -0440 Sta.tcl:1235 -from/-to arguments not supported with -of_objects. -0441 Sta.tcl:1363 unsupported -filter expression. -0442 Sta.tcl:657 $cmd missing -from argument. -0443 Sta.tcl:662 $cmd missing -to argument. -0444 Sta.tcl:667 $cmd delay is not a float. -0445 Sta.tcl:672 set_annotated_delay -cell and -net options are mutually excluive. -0446 Sta.tcl:678 $cmd pin [get_full_name $pin] is not attached to instance [get_full_name $inst]. -0447 Sta.tcl:683 $cmd pin [get_full_name $pin] is not attached to instance [get_full_name $inst] -0448 Sta.tcl:688 $cmd -cell or -net required. -0449 Sta.tcl:752 $cmd missing -from argument. -0450 Sta.tcl:761 $cmd -clock must be rise or fall. -0451 Sta.tcl:768 $cmd missing -to argument. -0452 Sta.tcl:783 $cmd missing -setup|-hold|-recovery|-removal check type.. -0453 Sta.tcl:791 $cmd check_value is not a float. -0454 Sta.tcl:100 the -all and -name options are mutually exclusive. -0455 Sta.tcl:103 either -all or -name options must be specified. -0456 Sta.tcl:111 one of -logically_exclusive, -physically_exclusive or -asynchronous is required. -0457 Sta.tcl:114 the keywords -logically_exclusive, -physically_exclusive and -asynchronous are mutually exclusive. -0458 Sta.tcl:167 -source '[$pin path_name]' is not a clock pin. -0459 Sta.tcl:246 -from/-to must be used together. -0460 Sta.tcl:266 -rise, -fall options not allowed for single clock uncertainty. -0461 Sta.tcl:310 missing -from, -rise_from or -fall_from argument. -0462 Sta.tcl:322 missing -to, -rise_to or -fall_to argument. -0463 Sta.tcl:436 -from/-to hierarchical instance not supported. -0464 Sta.tcl:562 $cmd command failed. -0465 Sta.tcl:569 positional arguments not supported. -0466 Sta.tcl:573 -from, -through or -to required. -0467 Cmds.tcl:108 unsupported object type $object_type. -0468 Cmds.tcl:405 $corner_name is not the name of process corner. -0469 Cmds.tcl:410 -corner keyword required with multi-corner analysis. -0470 Cmds.tcl:425 $corner_name is not the name of process corner. -0471 Cmds.tcl:430 missing -corner arg. -0472 Cmds.tcl:441 $corner_name is not the name of process corner. -0473 Cmds.tcl:457 $corner_name is not the name of process corner. -0474 Cmds.tcl:482 both -min and -max specified. -0475 Cmds.tcl:496 both -min and -max specified. -0476 Cmds.tcl:523 only one of -early and -late can be specified. -0477 Cmds.tcl:529 -early or -late must be specified. -0478 Cmds.tcl:536 both -early and -late specified. -0479 Cmds.tcl:551 $arg_name must be a single library. -0480 Cmds.tcl:557 $arg_name type '$object_type' is not a library. -0481 Cmds.tcl:562 library '$arg' not found. -0482 Cmds.tcl:579 $arg_name must be a single lib cell. -0483 Cmds.tcl:635 $arg_name must be a single instance. -0484 Cmds.tcl:641 $arg_name type '$object_type' is not an instance. -0485 Cmds.tcl:646 instance '$arg' not found. -0486 Cmds.tcl:665 $arg_name type '$object_type' is not an instance. -0487 Cmds.tcl:672 instance '$arg' not found. -0488 Cmds.tcl:733 $arg_name type '$object_type' is not a pin or port. -0489 Cmds.tcl:740 pin '$arg' not found. -0490 Cmds.tcl:760 $arg_name type '$object_type' is not a port. -0491 Sta.tcl:1083 $cmd object is null. -0492 Sta.tcl:1088 $cmd $type_key must be specified with object name argument. -0493 Sta.tcl:1131 get_property $object is not an object. -0494 Sta.tcl:1158 $object_type not supported. -0495 Sta.tcl:1161 $object_type '$object_name' not found. -0496 Sta.tcl:1478 Directory $spice_dir not found. -0497 Sta.tcl:1481 $spice_dir is not a directory. -0498 Sta.tcl:1484 Cannot write in $spice_dir. -0499 Sta.tcl:1487 No -spice_directory specified. -0500 Sta.tcl:1493 -lib_subckt_file $lib_subckt_file is not readable. -0501 Sta.tcl:1496 No -lib_subckt_file specified. -0502 Sta.tcl:1502 -model_file $model_file is not readable. -0503 Sta.tcl:1505 No -model_file specified. -0504 Sta.tcl:1511 No -power specified. -0505 Sta.tcl:1517 No -ground specified. -0506 Sta.tcl:1521 No -path_args specified. -0507 Sta.tcl:1526 No paths found for -path_args $path_args. -0508 Search.tcl:794 -min and -max cannot both be specified. -0509 Search.tcl:814 pin '$pin_arg' is hierarchical. -0510 Search.tcl:880 -format $format not recognized. +0439 CmdUtil.tcl:209 unsupported object type $list_type. +0440 Sta.tcl:158 -from/-to arguments not supported with -of_objects. +0441 Sta.tcl:286 unsupported -filter expression. +0442 DelayCalc.tcl:148 $cmd missing -from argument. +0443 DelayCalc.tcl:153 $cmd missing -to argument. +0444 DelayCalc.tcl:158 $cmd delay is not a float. +0445 DelayCalc.tcl:163 set_annotated_delay -cell and -net options are mutually excluive. +0446 DelayCalc.tcl:169 $cmd pin [get_full_name $pin] is not attached to instance [get_full_name $inst]. +0447 DelayCalc.tcl:174 $cmd pin [get_full_name $pin] is not attached to instance [get_full_name $inst] +0448 DelayCalc.tcl:179 $cmd -cell or -net required. +0449 DelayCalc.tcl:243 $cmd missing -from argument. +0450 DelayCalc.tcl:252 $cmd -clock must be rise or fall. +0451 DelayCalc.tcl:259 $cmd missing -to argument. +0452 DelayCalc.tcl:274 $cmd missing -setup|-hold|-recovery|-removal check type.. +0453 DelayCalc.tcl:282 $cmd check_value is not a float. +0454 Sdc.tcl:1472 the -all and -name options are mutually exclusive. +0455 Sdc.tcl:1475 either -all or -name options must be specified. +0456 Sdc.tcl:1483 one of -logically_exclusive, -physically_exclusive or -asynchronous is required. +0457 Sdc.tcl:1486 the keywords -logically_exclusive, -physically_exclusive and -asynchronous are mutually exclusive. +0458 Sdc.tcl:1598 -source '[$pin path_name]' is not a clock pin. +0459 Sdc.tcl:1866 -from/-to must be used together. +0460 Sdc.tcl:1886 -rise, -fall options not allowed for single clock uncertainty. +0461 Sdc.tcl:1987 missing -from, -rise_from or -fall_from argument. +0462 Sdc.tcl:1999 missing -to, -rise_to or -fall_to argument. +0463 Sdc.tcl:2230 -from/-to hierarchical instance not supported. +0464 Sdc.tcl:2632 $cmd command failed. +0465 Sdc.tcl:2639 positional arguments not supported. +0466 Sdc.tcl:2643 -from, -through or -to required. +0467 CmdArgs.tcl:108 unsupported object type $object_type. +0468 CmdArgs.tcl:405 $corner_name is not the name of process corner. +0469 CmdArgs.tcl:410 -corner keyword required with multi-corner analysis. +0470 CmdArgs.tcl:425 $corner_name is not the name of process corner. +0471 CmdArgs.tcl:430 missing -corner arg. +0472 CmdArgs.tcl:441 $corner_name is not the name of process corner. +0473 CmdArgs.tcl:458 $corner_name is not the name of process corner. +0474 CmdArgs.tcl:483 both -min and -max specified. +0475 CmdArgs.tcl:497 both -min and -max specified. +0476 CmdArgs.tcl:524 only one of -early and -late can be specified. +0477 CmdArgs.tcl:530 -early or -late must be specified. +0478 CmdArgs.tcl:537 both -early and -late specified. +0479 CmdArgs.tcl:552 $arg_name must be a single library. +0480 CmdArgs.tcl:558 $arg_name type '$object_type' is not a library. +0481 CmdArgs.tcl:563 library '$arg' not found. +0482 CmdArgs.tcl:580 $arg_name must be a single lib cell. +0483 CmdArgs.tcl:636 $arg_name must be a single instance. +0484 CmdArgs.tcl:642 $arg_name type '$object_type' is not an instance. +0485 CmdArgs.tcl:647 instance '$arg' not found. +0486 CmdArgs.tcl:666 $arg_name type '$object_type' is not an instance. +0487 CmdArgs.tcl:673 instance '$arg' not found. +0488 CmdArgs.tcl:734 $arg_name type '$object_type' is not a pin or port. +0489 CmdArgs.tcl:741 pin '$arg' not found. +0490 CmdArgs.tcl:761 $arg_name type '$object_type' is not a port. +0491 Property.tcl:32 $cmd object is null. +0492 Property.tcl:37 $cmd $type_key must be specified with object name argument. +0493 Property.tcl:80 get_property $object is not an object. +0494 Property.tcl:107 $object_type not supported. +0495 Property.tcl:110 $object_type '$object_name' not found. +0496 WritePathSpice.tcl:35 Directory $spice_dir not found. +0497 WritePathSpice.tcl:38 $spice_dir is not a directory. +0498 WritePathSpice.tcl:41 Cannot write in $spice_dir. +0499 WritePathSpice.tcl:44 No -spice_directory specified. +0500 WritePathSpice.tcl:50 -lib_subckt_file $lib_subckt_file is not readable. +0501 WritePathSpice.tcl:53 No -lib_subckt_file specified. +0502 WritePathSpice.tcl:59 -model_file $model_file is not readable. +0503 WritePathSpice.tcl:62 No -model_file specified. +0504 WritePathSpice.tcl:68 No -power specified. +0505 WritePathSpice.tcl:74 No -ground specified. +0506 WritePathSpice.tcl:78 No -path_args specified. +0507 WritePathSpice.tcl:83 No paths found for -path_args $path_args. +0508 Search.tcl:788 -min and -max cannot both be specified. +0509 Search.tcl:808 pin '$pin_arg' is hierarchical. +0510 Search.tcl:874 -format $format not recognized. 0511 Sdc.tcl:73 cannot open '$filename'. 0512 Sdc.tcl:128 incomplete command at end of file. 0513 Sdc.tcl:212 hierarchy separator must be one of '$sdc_dividers'. 0514 Sdc.tcl:259 unknown unit $unit '$suffix'. -0515 Sdc.tcl:332 unknown $unit unit '$suffix'. -0516 Sdc.tcl:602 unsupported instance -filter expression. -0517 Sdc.tcl:987 unsupported pin -filter expression. -0518 Sdc.tcl:1063 unsupported port -filter expression. -0519 Sdc.tcl:1096 -add requires -name. -0520 Sdc.tcl:1101 -name or port_pin_list must be specified. -0521 Sdc.tcl:1109 missing -period argument. -0522 Sdc.tcl:1115 -waveform edge_list must have an even number of edge times. -0523 Sdc.tcl:1167 empty ports/pins/nets argument. -0524 Sdc.tcl:1175 -add requires -name. -0525 Sdc.tcl:1180 name or port_pin_list must be specified. -0526 Sdc.tcl:1187 missing -source argument. -0527 Sdc.tcl:1202 -master_clock argument empty. -0528 Sdc.tcl:1205 -add requireds -master_clock. -0529 Sdc.tcl:1209 -multiply_by and -divide_by options are exclusive. -0530 Sdc.tcl:1213 -divide_by is not an integer greater than one. -0531 Sdc.tcl:1216 -combinational implies -divide_by 1. -0532 Sdc.tcl:1221 -multiply_by is not an integer greater than one. -0533 Sdc.tcl:1227 -duty_cycle is not a float between 0 and 100. -0534 Sdc.tcl:1233 -edges only supported for three edges. -0535 Sdc.tcl:1239 edges times are not monotonically increasing. -0536 Sdc.tcl:1248 -edge_shift length does not match -edges length. -0537 Sdc.tcl:1254 missing -multiply_by, -divide_by, -combinational or -edges argument. -0538 Sdc.tcl:1262 cannot specify -invert without -multiply_by, -divide_by or -combinational. -0539 Sdc.tcl:1268 -duty_cycle requires -multiply_by value. -0545 Sdc.tcl:1304 group_path command failed. -0546 Sdc.tcl:1311 positional arguments not supported. -0547 Sdc.tcl:1315 -from, -through or -to required. -0548 Sdc.tcl:1321 -name and -default are mutually exclusive. -0549 Sdc.tcl:1323 -name or -default option is required. -0550 Sdc.tcl:1364 cannot specify both -high and -low. -0551 Sdc.tcl:1372 missing -setup or -hold argument. -0552 Sdc.tcl:1386 -high and -low only permitted for pins and instances. -0553 Sdc.tcl:1393 -high and -low only permitted for pins and instances. -0554 Sdc.tcl:1436 one of -logically_exclusive, -physically_exclusive or -asynchronous is required. -0555 Sdc.tcl:1439 the keywords -logically_exclusive, -physically_exclusive and -asynchronous are mutually exclusive. -0556 Sdc.tcl:1507 -source '[get_full_name $pin]' is not a clock pin. -0557 Sdc.tcl:1514 -early/-late is only allowed with -source. -0558 Sdc.tcl:1543 set_sense -type clock|data -0559 Sdc.tcl:1612 transition time can not be specified for virtual clocks. -0560 Sdc.tcl:1633 missing uncertainty value. -0561 Sdc.tcl:1681 -from/-to must be used together. -0562 Sdc.tcl:1701 -rise, -fall options not allowed for single clock uncertainty. -0563 Sdc.tcl:1742 missing -from, -rise_from or -fall_from argument. -0564 Sdc.tcl:1754 missing -to, -rise_to or -fall_to argument. -0565 Sdc.tcl:1826 -from/-to hierarchical instance not supported. -0566 Sdc.tcl:1858 pin '[get_full_name $inst]${hierarchy_separator}${port_name}' not found. -0567 Sdc.tcl:1899 pin '[get_name $cell]${hierarchy_separator}${port_name}' not found. -0568 Sdc.tcl:2084 missing delay argument. -0569 Sdc.tcl:2215 missing path multiplier argument. -0570 Sdc.tcl:2227 cannot use -start with -end. -0571 Sdc.tcl:2295 value must be 0, zero, 1, one, rise, rising, fall, or falling. -0572 Sdc.tcl:2353 cell '$lib_name:$cell_name' not found. -0573 Sdc.tcl:2359 '$cell_name' not found. -0574 Sdc.tcl:2363 missing -lib_cell argument. -0575 Sdc.tcl:2371 port '$to_port_name' not found. -0576 Sdc.tcl:2383 -pin argument required for cells with multiple outputs. -0577 Sdc.tcl:2398 port '$from_port_name' not found. -0578 Sdc.tcl:2605 port '[get_name $port]' is not an input. -0579 Sdc.tcl:2967 operating condition '$op_cond_name' not found. -0580 Sdc.tcl:2985 operating condition '$op_cond_name' not found. -0581 Sdc.tcl:2999 -analysis_type must be single, bc_wc or on_chip_variation. -0582 Sdc.tcl:3024 mode must be top, enclosed or segmented. -0583 Sdc.tcl:3039 no wire load model specified. -0584 Sdc.tcl:3100 wire load selection group '$selection_name' not found. -0585 Sdc.tcl:3231 no default operating conditions found. -0586 NetworkEdit.tcl:50 unsupported object type $object_type. -0587 NetworkEdit.tcl:119 unsupported object type $object_type. -0588 NetworkEdit.tcl:135 unsupported object type $object_type. -0589 Network.tcl:25 unknown namespace $namespc. -0590 Network.tcl:55 instance $instance_path not found. -0591 Network.tcl:283 net $net_path not found. -0592 Network.tcl:286 net $net_path not found. +0515 CmdUtil.tcl:161 unknown $unit unit '$suffix'. +0516 Sdc.tcl:543 unsupported instance -filter expression. +0517 Sdc.tcl:928 unsupported pin -filter expression. +0518 Sdc.tcl:1004 unsupported port -filter expression. +0519 Sdc.tcl:1037 -add requires -name. +0520 Sdc.tcl:1042 -name or port_pin_list must be specified. +0521 Sdc.tcl:1050 missing -period argument. +0522 Sdc.tcl:1056 -waveform edge_list must have an even number of edge times. +0523 Sdc.tcl:1126 empty ports/pins/nets argument. +0524 Sdc.tcl:1134 -add requires -name. +0525 Sdc.tcl:1139 name or port_pin_list must be specified. +0526 Sdc.tcl:1146 missing -source argument. +0527 Sdc.tcl:1161 -master_clock argument empty. +0528 Sdc.tcl:1164 -add requireds -master_clock. +0529 Sdc.tcl:1168 -multiply_by and -divide_by options are exclusive. +0530 Sdc.tcl:1172 -divide_by is not an integer greater than one. +0531 Sdc.tcl:1175 -combinational implies -divide_by 1. +0532 Sdc.tcl:1180 -multiply_by is not an integer greater than one. +0533 Sdc.tcl:1186 -duty_cycle is not a float between 0 and 100. +0534 Sdc.tcl:1192 -edges only supported for three edges. +0535 Sdc.tcl:1198 edges times are not monotonically increasing. +0536 Sdc.tcl:1207 -edge_shift length does not match -edges length. +0537 Sdc.tcl:1213 missing -multiply_by, -divide_by, -combinational or -edges argument. +0538 Sdc.tcl:1221 cannot specify -invert without -multiply_by, -divide_by or -combinational. +0539 Sdc.tcl:1227 -duty_cycle requires -multiply_by value. +0545 Sdc.tcl:1287 group_path command failed. +0546 Sdc.tcl:1294 positional arguments not supported. +0547 Sdc.tcl:1298 -from, -through or -to required. +0548 Sdc.tcl:1304 -name and -default are mutually exclusive. +0549 Sdc.tcl:1306 -name or -default option is required. +0550 Sdc.tcl:1347 cannot specify both -high and -low. +0551 Sdc.tcl:1355 missing -setup or -hold argument. +0552 Sdc.tcl:1369 -high and -low only permitted for pins and instances. +0553 Sdc.tcl:1376 -high and -low only permitted for pins and instances. +0554 Sdc.tcl:1419 one of -logically_exclusive, -physically_exclusive or -asynchronous is required. +0555 Sdc.tcl:1422 the keywords -logically_exclusive, -physically_exclusive and -asynchronous are mutually exclusive. +0556 Sdc.tcl:1550 -source '[get_full_name $pin]' is not a clock pin. +0557 Sdc.tcl:1557 -early/-late is only allowed with -source. +0558 Sdc.tcl:1630 set_sense -type clock|data +0559 Sdc.tcl:1699 transition time can not be specified for virtual clocks. +0560 Sdc.tcl:1732 missing uncertainty value. +0561 Sdc.tcl:1780 -from/-to must be used together. +0562 Sdc.tcl:1800 -rise, -fall options not allowed for single clock uncertainty. +0563 Sdc.tcl:1927 missing -from, -rise_from or -fall_from argument. +0564 Sdc.tcl:1939 missing -to, -rise_to or -fall_to argument. +0565 Sdc.tcl:2071 -from/-to hierarchical instance not supported. +0566 Sdc.tcl:2103 pin '[get_full_name $inst]${hierarchy_separator}${port_name}' not found. +0567 Sdc.tcl:2144 pin '[get_name $cell]${hierarchy_separator}${port_name}' not found. +0568 Sdc.tcl:2439 missing delay argument. +0569 Sdc.tcl:2570 missing path multiplier argument. +0570 Sdc.tcl:2582 cannot use -start with -end. +0571 Sdc.tcl:2752 value must be 0, zero, 1, one, rise, rising, fall, or falling. +0572 Sdc.tcl:2821 cell '$lib_name:$cell_name' not found. +0573 Sdc.tcl:2827 '$cell_name' not found. +0574 Sdc.tcl:2831 missing -lib_cell argument. +0575 Sdc.tcl:2839 port '$to_port_name' not found. +0576 Sdc.tcl:2851 -pin argument required for cells with multiple outputs. +0577 Sdc.tcl:2866 port '$from_port_name' not found. +0578 Sdc.tcl:3079 port '[get_name $port]' is not an input. +0579 Sdc.tcl:3453 operating condition '$op_cond_name' not found. +0580 Sdc.tcl:3471 operating condition '$op_cond_name' not found. +0581 Sdc.tcl:3485 -analysis_type must be single, bc_wc or on_chip_variation. +0582 Sdc.tcl:3510 mode must be top, enclosed or segmented. +0583 Sdc.tcl:3525 no wire load model specified. +0584 Sdc.tcl:3586 wire load selection group '$selection_name' not found. +0585 Sdc.tcl:3717 no default operating conditions found. +0586 NetworkEdit.tcl:99 unsupported object type $object_type. +0587 NetworkEdit.tcl:198 unsupported object type $object_type. +0588 NetworkEdit.tcl:216 unsupported object type $object_type. +0589 CmdUtil.tcl:226 unknown namespace $namespc. +0590 Network.tcl:35 instance $instance_path not found. +0591 Network.tcl:241 net $net_path not found. +0592 Network.tcl:244 net $net_path not found. 0593 Link.tcl:34 missing top_cell_name argument and no current_design. 0594 DelayNormal1.cc:203 unknown early/late value. 0595 DelayNormal2.cc:378 unknown early/late value. -0596 Sim.cc:205 unknown function operator +0596 Sim.cc:210 unknown function operator 0597 EstimateParasitics.cc:188 load pin not leaf or top level -0600 Sdc.tcl:1940 '$args' ignored. -0601 Sdc.tcl:2439 set_fanout_load not supported. -0602 Sdc.tcl:2899 no valid objects specified for $key. -0603 NetworkEdit.tcl:172 disconnect_pins is deprecated. Use disconnect_pin. +0600 Sdc.tcl:2284 '$args' ignored. +0601 Sdc.tcl:2913 set_fanout_load not supported. +0602 Sdc.tcl:3385 no valid objects specified for $key. 0604 Sdc.tcl:281 unknown $unit prefix '$prefix'. -0605 Sdc.tcl:3061 wire load model '$model_name' not found. -0606 Sta.tcl:1128 get_property unsupported object type $object_type. -0607 StaTcl.i:4415 unknown report path field %s -0608 StaTcl.i:4427 unknown report path field %s -0609 Search.tcl:427 -all_violators is deprecated. Use -violators -0610 Search.tcl:507 -max_transition deprecated. Use -max_slew. -0611 Search.tcl:512 -min_transition deprecated. Use -min_slew. +0605 Sdc.tcl:3547 wire load model '$model_name' not found. +0606 Property.tcl:77 get_property unsupported object type $object_type. +0607 StaTcl.i:4257 unknown report path field %s +0608 StaTcl.i:4269 unknown report path field %s +0609 Search.tcl:421 -all_violators is deprecated. Use -violators +0610 Search.tcl:501 -max_transition deprecated. Use -max_slew. +0611 Search.tcl:506 -min_transition deprecated. Use -min_slew. 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:1018 specify one of -setup and -hold. 0617 Sdf.tcl:50 -analysis_type is deprecated. Use set_operating_conditions -analysis_type. 0618 DmpCeff.cc:1581 parasitic Pi model has NaNs. 0619 PathEnum.cc:474 path diversion missing edge. @@ -481,16 +480,23 @@ 0702 LibertyWriter.cc:436 3 axis table models not supported. 0703 LibertyWriter.cc:576 %s/%s/%s timing arc type %s not supported. 0704 LibertyWriter.cc:289 %s/%s bundled ports not supported. -0705 Liberty.cc:793 Liberty cell %s/%s for corner %s/%s not found +0705 Liberty.cc:794 Liberty cell %s/%s for corner %s/%s not found. 0706 Parasitics.tcl:70 read_spef -increment is deprecated. -0710 LumpedCapDelayCalc.cc:168 gate delay input variable is NaN +0710 LumpedCapDelayCalc.cc:169 gate delay input variable is NaN 0800 VcdReader.cc:109 unhandled vcd command. 0801 VcdReader.cc:145 timescale syntax error. 0802 VcdReader.cc:159 Unknown timescale unit. 0804 VcdReader.cc:200 Variable syntax error. 0805 Vcd.cc:172 Unknown variable %s ID %s -0806 ReadVcdActivities.cc:227 clock %s vcd period %s differs from SDC clock period %s -0807 Sdc.tcl:453 only one of -cells, -data_pins, -clock_pins, -async_pins, -output_pins are suppported. -0810 MakeTimingModel.cc:188 clock %s pin %s is inside model block. -0900 LibertyReader.cc:2533 level_shifter_type must be HL, LH, or HL_LH -0901 LibertyReader.cc:2569 switch_cell_type must be coarse_grain or fine_grain +0806 ReadVcdActivities.cc:251 clock %s vcd period %s differs from SDC clock period %s +0807 Sdc.tcl:394 only one of -cells, -data_pins, -clock_pins, -async_pins, -output_pins are suppported. +0810 MakeTimingModel.cc:189 clock %s pin %s is inside model block. +0900 LibertyReader.cc:2757 level_shifter_type must be HL, LH, or HL_LH +0901 LibertyReader.cc:2793 switch_cell_type must be coarse_grain or fine_grain +0902 LibertyReader.cc:2460 unsupported model axis. +0903 LibertyReader.cc:4131 %s group not in timing group. +0904 LibertyReader.cc:2443 receiver_capacitance group not in timing or pin group. +0906 LibertyReader.cc:4024 unsupported model axis. +0907 LibertyReader.cc:2486 output_current_%s group not in timing group. +0908 LibertyReader.cc:2571 vector reference_time not found. +0912 LibertyReader.cc:2569 vector index_1 and index_2 must have one value. diff --git a/search/MakeTimingModel.cc b/search/MakeTimingModel.cc index 388fd830..84554d55 100644 --- a/search/MakeTimingModel.cc +++ b/search/MakeTimingModel.cc @@ -524,7 +524,8 @@ MakeTimingModel::makeGateModelScalar(Delay delay, TableModel *slew_model = new TableModel(slew_table, tbl_template, ScaleFactorType::cell, rf); GateTableModel *gate_model = new GateTableModel(delay_model, nullptr, - slew_model, nullptr); + slew_model, nullptr, + nullptr, nullptr); return gate_model; } @@ -606,7 +607,8 @@ MakeTimingModel::makeGateModelTable(const Pin *output_pin, TableModel *slew_model = new TableModel(slew_table, tbl_template, ScaleFactorType::cell, rf); GateTableModel *gate_model = new GateTableModel(delay_model, nullptr, - slew_model, nullptr); + slew_model, nullptr, + nullptr, nullptr); return gate_model; } }