diff --git a/include/sta/TableModel.hh b/include/sta/TableModel.hh index dafad465..7c29d7b8 100644 --- a/include/sta/TableModel.hh +++ b/include/sta/TableModel.hh @@ -469,15 +469,14 @@ private: class ReceiverModel { public: - ReceiverModel(); ~ReceiverModel(); void setCapacitanceModel(TableModel *table_model, - int index, + size_t segment, RiseFall *rf); static bool checkAxes(TablePtr table); private: - TableModel *capacitance_models_[2][RiseFall::index_count]; + std::vector capacitance_models_; }; // Two dimensional (slew/cap) table of one dimensional time/current tables. diff --git a/liberty/LibertyReader.cc b/liberty/LibertyReader.cc index ae7cc4b9..a9dbced1 100644 --- a/liberty/LibertyReader.cc +++ b/liberty/LibertyReader.cc @@ -478,10 +478,19 @@ LibertyReader::defineVisitors() defineAttrVisitor("pg_type", &LibertyReader::visitPgType); defineAttrVisitor("voltage_name", &LibertyReader::visitVoltageName); - // ccs receiver + // ccs receiver capacitance defineGroupVisitor("receiver_capacitance", &LibertyReader::beginReceiverCapacitance, &LibertyReader::endReceiverCapacitance); + + defineGroupVisitor("receiver_capacitance_rise", + &LibertyReader::beginReceiverCapacitance1Rise, + &LibertyReader::endReceiverCapacitanceRiseFall); + defineGroupVisitor("receiver_capacitance_fall", + &LibertyReader::beginReceiverCapacitance1Fall, + &LibertyReader::endReceiverCapacitanceRiseFall); + defineAttrVisitor("segment", &LibertyReader::visitSegement); + defineGroupVisitor("receiver_capacitance1_rise", &LibertyReader::beginReceiverCapacitance1Rise, &LibertyReader::endReceiverCapacitanceRiseFall); @@ -2448,10 +2457,10 @@ LibertyReader::makeTimingArcs(LibertyPort *to_port, //////////////////////////////////////////////////////////////// +// Group that encloses receiver_capacitance1/2 etc groups. void LibertyReader::beginReceiverCapacitance(LibertyGroup *) { - receiver_model_ = make_shared(); } @@ -2465,6 +2474,20 @@ LibertyReader::endReceiverCapacitance(LibertyGroup *) receiver_model_ = nullptr; } +// For receiver_capacitance groups with mulitiple segments this +// overrides the index passed in beginReceiverCapacitance1Rise/Fall. +void +LibertyReader::visitSegement(LibertyAttr *attr) +{ + if (receiver_model_) { + int segment; + bool exists; + getAttrInt(attr, segment, exists); + if (exists) + index_ = segment; + } +} + void LibertyReader::beginReceiverCapacitance1Rise(LibertyGroup *group) { diff --git a/liberty/LibertyReaderPvt.hh b/liberty/LibertyReaderPvt.hh index 6ef9365f..5eee6cb1 100644 --- a/liberty/LibertyReaderPvt.hh +++ b/liberty/LibertyReaderPvt.hh @@ -424,9 +424,12 @@ public: virtual void visitPgType(LibertyAttr *attr); virtual void visitVoltageName(LibertyAttr *attr); - // ccs receiver + // ccs receiver capacitance virtual void beginReceiverCapacitance(LibertyGroup *group); virtual void endReceiverCapacitance(LibertyGroup *group); + + virtual void visitSegement(LibertyAttr *attr); + virtual void beginReceiverCapacitance1Rise(LibertyGroup *group); virtual void endReceiverCapacitanceRiseFall(LibertyGroup *group); virtual void beginReceiverCapacitance1Fall(LibertyGroup *group); diff --git a/liberty/TableModel.cc b/liberty/TableModel.cc index 28606d57..ab68dd72 100644 --- a/liberty/TableModel.cc +++ b/liberty/TableModel.cc @@ -355,25 +355,21 @@ GateTableModel::checkAxis(const TableAxis *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]; - } + for (TableModel *model : capacitance_models_) + delete model; } void ReceiverModel::setCapacitanceModel(TableModel *table_model, - int index, + size_t segment, RiseFall *rf) { - capacitance_models_[index][rf->index()] = table_model; + if ((segment + 1) * RiseFall::index_count > capacitance_models_.size()) + capacitance_models_.resize((segment + 1) * RiseFall::index_count); + size_t idx = segment * RiseFall::index_count + rf->index(); + capacitance_models_[idx] = table_model; } bool