From 0d138393305793d8b4a506cad4a175d33ba98bbb Mon Sep 17 00:00:00 2001 From: James Cherry Date: Fri, 15 Nov 2024 15:53:02 -0800 Subject: [PATCH] liberty test_cell port signal_type Signed-off-by: James Cherry --- include/sta/Liberty.hh | 2 ++ liberty/Liberty.cc | 19 +++++++++++++++++++ liberty/Liberty.i | 6 ++++++ liberty/LibertyReader.cc | 13 +++---------- liberty/LibertyReaderPvt.hh | 1 - 5 files changed, 30 insertions(+), 11 deletions(-) diff --git a/include/sta/Liberty.hh b/include/sta/Liberty.hh index d94110a3..b0550f8b 100644 --- a/include/sta/Liberty.hh +++ b/include/sta/Liberty.hh @@ -1147,5 +1147,7 @@ private: string portLibertyToSta(const char *port_name); +const char * +scanSignalTypeName(ScanSignalType scan_type); } // namespace diff --git a/liberty/Liberty.cc b/liberty/Liberty.cc index 5c69c36d..d03e4a5b 100644 --- a/liberty/Liberty.cc +++ b/liberty/Liberty.cc @@ -2139,6 +2139,25 @@ LibertyPort::setScanSignalType(ScanSignalType type) scan_signal_type_ = type; } +static EnumNameMap scan_signal_type_map = + {{ScanSignalType::enable, "enable"}, + {ScanSignalType::enable_inverted, "enable_inverted"}, + {ScanSignalType::clock, "clock"}, + {ScanSignalType::clock_a, "clock_a"}, + {ScanSignalType::clock_b, "clock_b"}, + {ScanSignalType::input, "input"}, + {ScanSignalType::input_inverted, "input_inverted"}, + {ScanSignalType::output, "output"}, + {ScanSignalType::output_inverted, "output_inverted"}, + {ScanSignalType::none, "none"}}; + + +const char * +scanSignalTypeName(ScanSignalType scan_type) +{ + return scan_signal_type_map.find(scan_type); +} + LibertyPort * LibertyPort::findLibertyMember(int index) const { diff --git a/liberty/Liberty.i b/liberty/Liberty.i index ec1ddec0..5bba029e 100644 --- a/liberty/Liberty.i +++ b/liberty/Liberty.i @@ -339,6 +339,12 @@ set_direction(const char *dir) self->setDirection(PortDirection::find(dir)); } +const char * +scan_signal_type() +{ + return scanSignalTypeName(self->scanSignalType()); +} + } // LibertyPort methods %extend TimingArcSet { diff --git a/liberty/LibertyReader.cc b/liberty/LibertyReader.cc index 6298ca12..98207fd8 100644 --- a/liberty/LibertyReader.cc +++ b/liberty/LibertyReader.cc @@ -96,7 +96,6 @@ LibertyReader::init(const char *filename, ocv_derate_name_ = nullptr; op_cond_ = nullptr; ports_ = nullptr; - port_ = nullptr; port_group_ = nullptr; saved_ports_ = nullptr; saved_port_group_ = nullptr; @@ -3171,11 +3170,6 @@ LibertyReader::beginPin(LibertyGroup *group) port_group_ = new PortGroup(ports_, group->line()); cell_port_groups_.push_back(port_group_); } - if (test_cell_) { - const char *pin_name = group->firstName(); - if (pin_name) - port_ = findPort(save_cell_, pin_name); - } } void @@ -3188,7 +3182,6 @@ LibertyReader::endPin(LibertyGroup *) port_group_ = saved_port_group_; } } - port_ = nullptr; } void @@ -3786,7 +3779,7 @@ LibertyReader::visitIsPllFeedbackPin(LibertyAttr *attr) void LibertyReader::visitSignalType(LibertyAttr *attr) { - if (test_cell_ && port_) { + if (test_cell_ && ports_) { const char *type = getAttrString(attr); if (type) { ScanSignalType signal_type = ScanSignalType::none; @@ -3812,8 +3805,8 @@ LibertyReader::visitSignalType(LibertyAttr *attr) libWarn(1299, attr, "unknown signal_type %s.", type); return; } - if (port_) - port_->setScanSignalType(signal_type); + for (LibertyPort *port : *ports_) + port->setScanSignalType(signal_type); } } } diff --git a/liberty/LibertyReaderPvt.hh b/liberty/LibertyReaderPvt.hh index 780cee5b..6fa7a0b9 100644 --- a/liberty/LibertyReaderPvt.hh +++ b/liberty/LibertyReaderPvt.hh @@ -618,7 +618,6 @@ protected: PortGroupSeq cell_port_groups_; OperatingConditions *op_cond_; LibertyPortSeq *ports_; - LibertyPort *port_; // Used by test_cell. PortGroup *port_group_; LibertyPortSeq *saved_ports_; PortGroup *saved_port_group_;