From 4c0225acc31162958e5124383322d93e66391986 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Tue, 9 Jun 2020 20:02:59 -0700 Subject: [PATCH] liberty is_memory_cell --- include/sta/Liberty.hh | 3 +++ liberty/Liberty.cc | 7 +++++++ liberty/LibertyReader.cc | 12 ++++++++++++ liberty/LibertyReaderPvt.hh | 1 + search/Power.cc | 3 ++- 5 files changed, 25 insertions(+), 1 deletion(-) diff --git a/include/sta/Liberty.hh b/include/sta/Liberty.hh index 4f39606e..5818e4bb 100644 --- a/include/sta/Liberty.hh +++ b/include/sta/Liberty.hh @@ -405,6 +405,8 @@ public: void setDontUse(bool dont_use); bool isMacro() const { return is_macro_; } void setIsMacro(bool is_macro); + bool isMemory() const { return is_memory_; } + void setIsMemory(bool is_memory); bool isPad() const { return is_pad_; } void setIsPad(bool is_pad); bool interfaceTiming() const { return interface_timing_; } @@ -525,6 +527,7 @@ protected: float area_; bool dont_use_; bool is_macro_; + bool is_memory_; bool is_pad_; bool has_internal_ports_; bool interface_timing_; diff --git a/liberty/Liberty.cc b/liberty/Liberty.cc index 4c328b77..38a64706 100644 --- a/liberty/Liberty.cc +++ b/liberty/Liberty.cc @@ -850,6 +850,7 @@ LibertyCell::LibertyCell(LibertyLibrary *library, area_(0.0), dont_use_(false), is_macro_(false), + is_memory_(false), is_pad_(false), has_internal_ports_(false), interface_timing_(false), @@ -995,6 +996,12 @@ LibertyCell::setIsMacro(bool is_macro) is_macro_ = is_macro; } +void +LibertyCell::setIsMemory(bool is_memory) +{ + is_memory_ = is_memory; +} + void LibertyCell::LibertyCell::setIsPad(bool is_pad) { diff --git a/liberty/LibertyReader.cc b/liberty/LibertyReader.cc index b83235e8..7e075d8a 100644 --- a/liberty/LibertyReader.cc +++ b/liberty/LibertyReader.cc @@ -286,6 +286,7 @@ LibertyReader::defineVisitors() defineAttrVisitor("area", &LibertyReader::visitArea); defineAttrVisitor("dont_use", &LibertyReader::visitDontUse); defineAttrVisitor("is_macro", &LibertyReader::visitIsMacro); + defineAttrVisitor("is_memory", &LibertyReader::visitIsMemory); defineAttrVisitor("is_pad", &LibertyReader::visitIsPad); defineAttrVisitor("interface_timing", &LibertyReader::visitInterfaceTiming); defineAttrVisitor("scaling_factors", &LibertyReader::visitScalingFactors); @@ -2426,6 +2427,17 @@ LibertyReader::visitIsMacro(LibertyAttr *attr) } } +void +LibertyReader::visitIsMemory(LibertyAttr *attr) +{ + if (cell_) { + bool is_memory, exists; + getAttrBool(attr, is_memory, exists); + if (exists) + cell_->setIsMemory(is_memory); + } +} + void LibertyReader::visitIsPad(LibertyAttr *attr) { diff --git a/liberty/LibertyReaderPvt.hh b/liberty/LibertyReaderPvt.hh index edeb0f24..2a356a61 100644 --- a/liberty/LibertyReaderPvt.hh +++ b/liberty/LibertyReaderPvt.hh @@ -181,6 +181,7 @@ public: virtual void visitArea(LibertyAttr *attr); virtual void visitDontUse(LibertyAttr *attr); virtual void visitIsMacro(LibertyAttr *attr); + virtual void visitIsMemory(LibertyAttr *attr); virtual void visitIsPad(LibertyAttr *attr); virtual void visitInterfaceTiming(LibertyAttr *attr); virtual void visitScalingFactors(LibertyAttr *attr); diff --git a/search/Power.cc b/search/Power.cc index ebe6ad5d..ad670771 100644 --- a/search/Power.cc +++ b/search/Power.cc @@ -154,7 +154,8 @@ Power::power(const Corner *corner, if (cell) { PowerResult inst_power; power(inst, corner, inst_power); - if (cell->isMacro()) + if (cell->isMacro() + || cell->isMemory()) macro.incr(inst_power); else if (cell->isPad()) pad.incr(inst_power);