diff --git a/include/sta/Liberty.hh b/include/sta/Liberty.hh index 14dab380..5f10462c 100644 --- a/include/sta/Liberty.hh +++ b/include/sta/Liberty.hh @@ -423,6 +423,8 @@ public: void setIsMemory(bool is_memory); bool isPad() const { return is_pad_; } void setIsPad(bool is_pad); + bool isClockCell() const { return is_clock_cell_; } + void setIsClockCell(bool is_clock_cell); bool isLevelShifter() const { return is_level_shifter_; } void setIsLevelShifter(bool is_level_shifter); LevelShifterType levelShifterType() const { return level_shifter_type_; } @@ -564,6 +566,7 @@ protected: bool is_macro_; bool is_memory_; bool is_pad_; + bool is_clock_cell_; bool is_level_shifter_; LevelShifterType level_shifter_type_; bool is_isolation_cell_; diff --git a/liberty/Liberty.cc b/liberty/Liberty.cc index 6e8a91c0..1878f113 100644 --- a/liberty/Liberty.cc +++ b/liberty/Liberty.cc @@ -925,6 +925,7 @@ LibertyCell::LibertyCell(LibertyLibrary *library, is_macro_(false), is_memory_(false), is_pad_(false), + is_clock_cell_(false), is_level_shifter_(false), level_shifter_type_(LevelShifterType::HL_LH), is_isolation_cell_(false), @@ -1077,6 +1078,12 @@ LibertyCell::LibertyCell::setIsPad(bool is_pad) is_pad_ = is_pad; } +void +LibertyCell::LibertyCell::setIsClockCell(bool is_clock_cell) +{ + is_clock_cell_ = is_clock_cell; +} + void LibertyCell::setIsLevelShifter(bool is_level_shifter) { diff --git a/liberty/LibertyReader.cc b/liberty/LibertyReader.cc index 7cf3491d..f25cc79f 100644 --- a/liberty/LibertyReader.cc +++ b/liberty/LibertyReader.cc @@ -298,6 +298,7 @@ LibertyReader::defineVisitors() defineAttrVisitor("is_macro", &LibertyReader::visitIsMacro); defineAttrVisitor("is_memory", &LibertyReader::visitIsMemory); defineAttrVisitor("is_pad", &LibertyReader::visitIsPad); + defineAttrVisitor("is_clock_cell", &LibertyReader::visitIsClockCell); defineAttrVisitor("is_level_shifter", &LibertyReader::visitIsLevelShifter); defineAttrVisitor("level_shifter_type", &LibertyReader::visitLevelShifterType); defineAttrVisitor("is_isolation_cell", &LibertyReader::visitIsIsolationCell); @@ -2819,6 +2820,17 @@ LibertyReader::visitIsPad(LibertyAttr *attr) } } +void +LibertyReader::visitIsClockCell(LibertyAttr *attr) +{ + if (cell_) { + bool is_clock_cell, exists; + getAttrBool(attr, is_clock_cell, exists); + if (exists) + cell_->setIsClockCell(is_clock_cell); + } +} + void LibertyReader::visitIsLevelShifter(LibertyAttr *attr) { diff --git a/liberty/LibertyReaderPvt.hh b/liberty/LibertyReaderPvt.hh index f99fa1f1..6c7ea2d1 100644 --- a/liberty/LibertyReaderPvt.hh +++ b/liberty/LibertyReaderPvt.hh @@ -188,6 +188,7 @@ public: virtual void visitIsMacro(LibertyAttr *attr); virtual void visitIsMemory(LibertyAttr *attr); virtual void visitIsPad(LibertyAttr *attr); + virtual void visitIsClockCell(LibertyAttr *attr); virtual void visitIsLevelShifter(LibertyAttr *attr); virtual void visitLevelShifterType(LibertyAttr *attr); virtual void visitIsIsolationCell(LibertyAttr *attr);