From 26f20e48b51c084087ad7f41ecebb1011a556da7 Mon Sep 17 00:00:00 2001 From: Matt Liberty Date: Tue, 15 Oct 2024 17:37:57 -0700 Subject: [PATCH] Parse and store user_function_class from Liberty. (#90) Added user_function_class and cell_footprint to LibertyWriter for testing. Signed-off-by: Matt Liberty --- include/sta/Liberty.hh | 3 +++ liberty/Liberty.cc | 16 +++++++++++++++- liberty/LibertyReader.cc | 12 ++++++++++++ liberty/LibertyReaderPvt.hh | 1 + liberty/LibertyWriter.cc | 7 +++++++ 5 files changed, 38 insertions(+), 1 deletion(-) diff --git a/include/sta/Liberty.hh b/include/sta/Liberty.hh index dc2de8b5..0d751c65 100644 --- a/include/sta/Liberty.hh +++ b/include/sta/Liberty.hh @@ -543,6 +543,8 @@ public: void ensureVoltageWaveforms(const DcalcAnalysisPtSeq &dcalc_aps); const char *footprint() const; void setFootprint(const char *footprint); + const char *userFunctionClass() const; + void setUserFunctionClass(const char *user_function_class); protected: void addPort(ConcretePort *port); @@ -634,6 +636,7 @@ protected: bool have_voltage_waveforms_; std::mutex waveform_lock_; const char *footprint_; + const char *user_function_class_; private: friend class LibertyLibrary; diff --git a/liberty/Liberty.cc b/liberty/Liberty.cc index 2450a4ec..1609ae97 100644 --- a/liberty/Liberty.cc +++ b/liberty/Liberty.cc @@ -941,7 +941,8 @@ LibertyCell::LibertyCell(LibertyLibrary *library, leakage_power_exists_(false), has_internal_ports_(false), have_voltage_waveforms_(false), - footprint_(nullptr) + footprint_(nullptr), + user_function_class_(nullptr) { liberty_cell_ = this; } @@ -971,6 +972,7 @@ LibertyCell::~LibertyCell() pg_port_map_.deleteContents(); stringDelete(footprint_); + stringDelete(user_function_class_); } LibertyPort * @@ -2004,6 +2006,18 @@ LibertyCell::footprint() const return footprint_; } +void +LibertyCell::setUserFunctionClass(const char *user_function_class) +{ + user_function_class_ = stringCopy(user_function_class); +} + +const char* +LibertyCell::userFunctionClass() const +{ + return user_function_class_; +} + //////////////////////////////////////////////////////////////// LibertyCellPortIterator::LibertyCellPortIterator(const LibertyCell *cell) : diff --git a/liberty/LibertyReader.cc b/liberty/LibertyReader.cc index d781a38c..83cb0a4f 100644 --- a/liberty/LibertyReader.cc +++ b/liberty/LibertyReader.cc @@ -311,6 +311,8 @@ LibertyReader::defineVisitors() defineAttrVisitor("interface_timing", &LibertyReader::visitInterfaceTiming); defineAttrVisitor("scaling_factors", &LibertyReader::visitScalingFactors); defineAttrVisitor("cell_footprint", &LibertyReader::visitCellFootprint); + defineAttrVisitor("user_function_class", + &LibertyReader::visitCellUserFunctionClass); // Pins defineGroupVisitor("pin", &LibertyReader::beginPin,&LibertyReader::endPin); @@ -3077,6 +3079,16 @@ LibertyReader::visitCellFootprint(LibertyAttr *attr) } } +void +LibertyReader::visitCellUserFunctionClass(LibertyAttr *attr) +{ + if (cell_) { + const char *user_function_class = getAttrString(attr); + if (user_function_class) + cell_->setUserFunctionClass(stringCopy(user_function_class)); + } +} + //////////////////////////////////////////////////////////////// void diff --git a/liberty/LibertyReaderPvt.hh b/liberty/LibertyReaderPvt.hh index 23106440..9cd3b795 100644 --- a/liberty/LibertyReaderPvt.hh +++ b/liberty/LibertyReaderPvt.hh @@ -206,6 +206,7 @@ public: virtual void visitScalingFactors(LibertyAttr *attr); virtual void visitCellLeakagePower(LibertyAttr *attr); virtual void visitCellFootprint(LibertyAttr *attr); + virtual void visitCellUserFunctionClass(LibertyAttr *attr); virtual void beginPin(LibertyGroup *group); virtual void endPin(LibertyGroup *group); diff --git a/liberty/LibertyWriter.cc b/liberty/LibertyWriter.cc index 8fa4bf34..2dfe32f7 100644 --- a/liberty/LibertyWriter.cc +++ b/liberty/LibertyWriter.cc @@ -289,6 +289,13 @@ LibertyWriter::writeCell(const LibertyCell *cell) fprintf(stream_, " is_macro_cell : true;\n"); if (cell->interfaceTiming()) fprintf(stream_, " interface_timing : true;\n"); + const char *footprint = cell->footprint(); + if (footprint) + fprintf(stream_, " cell_footprint : \"%s\";\n", footprint); + const char *user_function_class = cell->userFunctionClass(); + if (user_function_class) + fprintf(stream_, " user_function_class : \"%s\";\n", + user_function_class); LibertyCellPortIterator port_iter(cell); while (port_iter.hasNext()) {