diff --git a/include/sta/Liberty.hh b/include/sta/Liberty.hh index 9ba8f7dd..d1ede379 100644 --- a/include/sta/Liberty.hh +++ b/include/sta/Liberty.hh @@ -137,6 +137,7 @@ public: LibertyCellSeq findLibertyCellsMatching(PatternMatch *pattern); // Liberty cells that are buffers. LibertyCellSeq *buffers(); + LibertyCellSeq *inverters(); DelayModelType delayModelType() const { return delay_model_type_; } void setDelayModelType(DelayModelType type); @@ -369,6 +370,7 @@ protected: OcvDerateMap ocv_derate_map_; SupplyVoltageMap supply_voltage_map_; LibertyCellSeq *buffers_; + LibertyCellSeq *inverters_; DriverWaveformMap driver_waveform_map_; // Unnamed driver waveform. DriverWaveform *driver_waveform_default_; diff --git a/liberty/Liberty.cc b/liberty/Liberty.cc index d834210b..4ed08ec1 100644 --- a/liberty/Liberty.cc +++ b/liberty/Liberty.cc @@ -83,6 +83,7 @@ LibertyLibrary::LibertyLibrary(const char *name, ocv_arc_depth_(0.0), default_ocv_derate_(nullptr), buffers_(nullptr), + inverters_(nullptr), driver_waveform_default_(nullptr) { // Scalar templates are builtin. @@ -125,6 +126,7 @@ LibertyLibrary::~LibertyLibrary() stringDelete(supply_name); } delete buffers_; + delete inverters_; driver_waveform_map_.deleteContents(); delete driver_waveform_default_; } @@ -148,6 +150,22 @@ LibertyLibrary::findLibertyCellsMatching(PatternMatch *pattern) return matches; } +LibertyCellSeq * +LibertyLibrary::inverters() +{ + if (inverters_ == nullptr) { + inverters_ = new LibertyCellSeq; + LibertyCellIterator cell_iter(this); + while (cell_iter.hasNext()) { + LibertyCell *cell = cell_iter.next(); + if (!cell->dontUse() + && cell->isInverter()) + inverters_->push_back(cell); + } + } + return inverters_; +} + LibertyCellSeq * LibertyLibrary::buffers() {