make_net/make_port bus bit without bus dcl pr441

Signed-off-by: James Cherry <cherry@CerezoBook.local>
This commit is contained in:
James Cherry 2026-05-29 16:32:47 -07:00
parent 4239842d34
commit 13cd475ffa
7 changed files with 50 additions and 14 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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<NetworkReader *>(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);