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 <mliberty@precisioninno.com>
This commit is contained in:
Matt Liberty 2024-10-15 17:37:57 -07:00 committed by GitHub
parent 61fefed647
commit 26f20e48b5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 38 additions and 1 deletions

View File

@ -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;

View File

@ -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) :

View File

@ -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

View File

@ -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);

View File

@ -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()) {