From 13cd475ffa9a03f8a476b89035970226bc5b34ea Mon Sep 17 00:00:00 2001 From: James Cherry Date: Fri, 29 May 2026 16:32:47 -0700 Subject: [PATCH] make_net/make_port bus bit without bus dcl pr441 Signed-off-by: James Cherry --- include/sta/Network.hh | 4 ++-- include/sta/ParseBus.hh | 3 ++- include/sta/SdcNetwork.hh | 8 ++++++++ liberty/LibertyReader.cc | 3 ++- network/ParseBus.cc | 9 +++++---- network/SdcNetwork.cc | 31 +++++++++++++++++++++++++++---- search/Sta.cc | 6 ++++-- 7 files changed, 50 insertions(+), 14 deletions(-) diff --git a/include/sta/Network.hh b/include/sta/Network.hh index 70580e90..9c45f095 100644 --- a/include/sta/Network.hh +++ b/include/sta/Network.hh @@ -502,6 +502,8 @@ class NetworkEdit : public Network public: NetworkEdit() = default; bool isEditable() const override { return true; } + virtual Port *makePort(Cell *cell, + std::string_view name) = 0; virtual Instance *makeInstance(LibertyCell *cell, std::string_view name, Instance *parent) = 0; @@ -556,8 +558,6 @@ public: virtual void setAttribute(Instance *instance, std::string_view key, std::string_view value) = 0; - virtual Port *makePort(Cell *cell, - std::string_view name) = 0; virtual Port *makeBusPort(Cell *cell, std::string_view name, int from_index, diff --git a/include/sta/ParseBus.hh b/include/sta/ParseBus.hh index e6236fa8..aa0b67d3 100644 --- a/include/sta/ParseBus.hh +++ b/include/sta/ParseBus.hh @@ -94,11 +94,12 @@ parseBusName(std::string_view name, int &to, bool &subscript_wild); -// Insert escapes before ch1 and ch2 in token. +// Insert escapes before ch1, ch2 or ch3 in token. std::string escapeChars(std::string_view token, char ch1, char ch2, + char ch3, char escape); } // namespace sta diff --git a/include/sta/SdcNetwork.hh b/include/sta/SdcNetwork.hh index ea4c8304..52192abd 100644 --- a/include/sta/SdcNetwork.hh +++ b/include/sta/SdcNetwork.hh @@ -92,6 +92,8 @@ public: int index) const override; PortMemberIterator *memberIterator(const Port *port) const override; bool hasMembers(const Port *port) const override; + Port *makePort(Cell *cell, + std::string_view name) override; ObjectId id(const Instance *instance) const override; std::string getAttribute(const Instance *inst, @@ -146,6 +148,7 @@ public: char pathEscape() const override; void setPathEscape(char escape) override; + // NetworkEdit bool isEditable() const override; LibertyLibrary *makeLibertyLibrary(std::string_view name, std::string_view filename) override; @@ -202,6 +205,8 @@ public: const PatternMatch *pattern) const override; std::string name(const Port *port) const override; std::string busName(const Port *port) const override; + Port *makePort(Cell *cell, + std::string_view name) override; std::string name(const Instance *instance) const override; std::string pathName(const Instance *instance) const override; @@ -289,5 +294,8 @@ escapeDividers(std::string_view name, std::string escapeBrackets(std::string_view name, const Network *network); +std::string +escapeDividerBrackets(std::string_view name, + const Network *network); } // namespace sta diff --git a/liberty/LibertyReader.cc b/liberty/LibertyReader.cc index 56d64408..09733ca8 100644 --- a/liberty/LibertyReader.cc +++ b/liberty/LibertyReader.cc @@ -3081,7 +3081,8 @@ libertyReaderFindPort(const LibertyCell *cell, char brkt_right = library->busBrktRight(); const char escape = '\\'; // Pins at top level with bus names have escaped brackets. - std::string escaped_port_name = escapeChars(port_name, brkt_left, brkt_right, escape); + std::string escaped_port_name = escapeChars(port_name, brkt_left, brkt_right, + '\0', escape); port = cell->findLibertyPort(escaped_port_name); } return port; diff --git a/network/ParseBus.cc b/network/ParseBus.cc index 8205dead..11c66138 100644 --- a/network/ParseBus.cc +++ b/network/ParseBus.cc @@ -163,9 +163,10 @@ parseBusName(std::string_view name, std::string escapeChars(std::string_view token, - const char ch1, - const char ch2, - const char escape) + char ch1, + char ch2, + char ch3, + char escape) { std::string escaped; escaped.reserve(token.size()); @@ -180,7 +181,7 @@ escapeChars(std::string_view token, else escaped += ch; } - else if (ch == ch1 || ch == ch2) { + else if (ch == ch1 || ch == ch2 || ch == ch3) { escaped += escape; escaped += ch; } diff --git a/network/SdcNetwork.cc b/network/SdcNetwork.cc index 0542f95a..50bc533d 100644 --- a/network/SdcNetwork.cc +++ b/network/SdcNetwork.cc @@ -330,6 +330,13 @@ NetworkNameAdapter::memberIterator(const Port *port) const return network_->memberIterator(port); } +Port * +NetworkNameAdapter::makePort(Cell *cell, + std::string_view name) +{ + return network_edit_->makePort(cell, name); +} + //////////////////////////////////////////////////////////////// ObjectId @@ -736,6 +743,14 @@ SdcNetwork::busName(const Port *port) const return staToSdc(network_->busName(port)); } +Port * +SdcNetwork::makePort(Cell *cell, + std::string_view name) +{ + std::string escaped_name = escapeDividerBrackets(name, network_edit_); + return network_edit_->makePort(cell, escaped_name); +} + std::string SdcNetwork::name(const Instance *instance) const { @@ -1073,7 +1088,7 @@ SdcNetwork::makeInstance(LibertyCell *cell, std::string_view name, Instance *parent) { - std::string escaped_name = escapeDividers(std::string(name), this); + std::string escaped_name = escapeDividerBrackets(name, this); return network_edit_->makeInstance(cell, escaped_name, parent); } @@ -1081,7 +1096,7 @@ Net * SdcNetwork::makeNet(std::string_view name, Instance *parent) { - std::string escaped_name = escapeDividers(std::string(name), this); + std::string escaped_name = escapeDividerBrackets(name, this); return network_edit_->makeNet(escaped_name, parent); } @@ -1254,11 +1269,19 @@ SdcNetwork::visitMatches(const Instance *parent, //////////////////////////////////////////////////////////////// +std::string +escapeDividerBrackets(std::string_view name, + const Network *network) +{ + return escapeChars(name, network->pathDivider(), '[', ']', + network->pathEscape()); +} + std::string escapeDividers(std::string_view name, const Network *network) { - return escapeChars(name, network->pathDivider(), '\0', + return escapeChars(name, network->pathDivider(), '\0', '\0', network->pathEscape()); } @@ -1266,7 +1289,7 @@ std::string escapeBrackets(std::string_view name, const Network *network) { - return escapeChars(name, '[', ']', network->pathEscape()); + return escapeChars(name, '[', ']', '\0', network->pathEscape()); } } // namespace sta diff --git a/search/Sta.cc b/search/Sta.cc index 27b2119b..ba98b3f6 100644 --- a/search/Sta.cc +++ b/search/Sta.cc @@ -4412,7 +4412,8 @@ Sta::makeNet(const char *name, Instance *parent) { NetworkEdit *network = networkCmdEdit(); - Net *net = network->makeNet(name, parent); + std::string escaped = escapeBrackets(name, network); + Net *net = network->makeNet(escaped, parent); // Sta notification unnecessary. return net; } @@ -4460,8 +4461,9 @@ Sta::makePortPin(const char *port_name, ensureLinked(); NetworkReader *network = dynamic_cast(network_); Instance *top_inst = network->topInstance(); + std::string escaped = escapeBrackets(port_name, network); Cell *top_cell = network->cell(top_inst); - Port *port = network->makePort(top_cell, port_name); + Port *port = network->makePort(top_cell, escaped); network->setDirection(port, dir); Pin *pin = network->makePin(top_inst, port, nullptr); makePortPinAfter(pin);