diff --git a/include/sta/Liberty.hh b/include/sta/Liberty.hh index b9402f2c..fd8868ec 100644 --- a/include/sta/Liberty.hh +++ b/include/sta/Liberty.hh @@ -764,6 +764,8 @@ public: // Is the clock for timing checks. bool isCheckClk() const { return is_check_clk_; } void setIsCheckClk(bool is_clk); + bool isPad() const { return is_pad_; } + void setIsPad(bool is_pad); RiseFall *pulseClkTrigger() const { return pulse_clk_trigger_; } // Rise for high, fall for low. RiseFall *pulseClkSense() const { return pulse_clk_sense_; } @@ -863,6 +865,7 @@ protected: bool level_shifter_data_:1; bool is_switch_:1; bool is_disabled_constraint_:1; + bool is_pad_:1; private: friend class LibertyLibrary; diff --git a/liberty/Liberty.cc b/liberty/Liberty.cc index 4208f3ee..a6864052 100644 --- a/liberty/Liberty.cc +++ b/liberty/Liberty.cc @@ -1996,7 +1996,8 @@ LibertyPort::LibertyPort(LibertyCell *cell, isolation_cell_enable_(false), level_shifter_data_(false), is_switch_(false), - is_disabled_constraint_(false) + is_disabled_constraint_(false), + is_pad_(false) { liberty_port_ = this; min_pulse_width_[RiseFall::riseIndex()] = 0.0; diff --git a/liberty/LibertyReader.cc b/liberty/LibertyReader.cc index a9dbced1..fb23fe3e 100644 --- a/liberty/LibertyReader.cc +++ b/liberty/LibertyReader.cc @@ -297,6 +297,7 @@ LibertyReader::defineVisitors() defineAttrVisitor("dont_use", &LibertyReader::visitDontUse); defineAttrVisitor("is_macro_cell", &LibertyReader::visitIsMacro); defineAttrVisitor("is_memory", &LibertyReader::visitIsMemory); + defineAttrVisitor("pad_cell", &LibertyReader::visitIsPadCell); defineAttrVisitor("is_pad", &LibertyReader::visitIsPad); defineAttrVisitor("is_clock_cell", &LibertyReader::visitIsClockCell); defineAttrVisitor("is_level_shifter", &LibertyReader::visitIsLevelShifter); @@ -2887,13 +2888,13 @@ LibertyReader::visitIsMemory(LibertyAttr *attr) } void -LibertyReader::visitIsPad(LibertyAttr *attr) +LibertyReader::visitIsPadCell(LibertyAttr *attr) { if (cell_) { - bool is_pad, exists; - getAttrBool(attr, is_pad, exists); + bool pad_cell, exists; + getAttrBool(attr, pad_cell, exists); if (exists) - cell_->setIsPad(is_pad); + cell_->setIsPad(pad_cell); } } @@ -3358,6 +3359,19 @@ LibertyReader::visitClock(LibertyAttr *attr) } } +void +LibertyReader::visitIsPad(LibertyAttr *attr) +{ + if (ports_) { + bool is_pad, exists; + getAttrBool(attr, is_pad, exists); + if (exists) { + for (LibertyPort *port : *ports_) + port->setIsPad(is_pad); + } + } +} + void LibertyReader::visitCapacitance(LibertyAttr *attr) { diff --git a/liberty/LibertyReaderPvt.hh b/liberty/LibertyReaderPvt.hh index 5eee6cb1..5fc608a6 100644 --- a/liberty/LibertyReaderPvt.hh +++ b/liberty/LibertyReaderPvt.hh @@ -187,6 +187,7 @@ public: virtual void visitDontUse(LibertyAttr *attr); virtual void visitIsMacro(LibertyAttr *attr); virtual void visitIsMemory(LibertyAttr *attr); + virtual void visitIsPadCell(LibertyAttr *attr); virtual void visitIsPad(LibertyAttr *attr); virtual void visitIsClockCell(LibertyAttr *attr); virtual void visitIsLevelShifter(LibertyAttr *attr);