write_verilog escaped bus port name "input [7:0] \in[0] ;"

This commit is contained in:
James Cherry 2019-07-03 21:18:38 -07:00
parent 7af69066df
commit 74e287a7eb
7 changed files with 83 additions and 56 deletions

View File

@ -43,6 +43,7 @@ void
parseBusName(const char *name, parseBusName(const char *name,
const char brkt_left, const char brkt_left,
const char brkt_right, const char brkt_right,
// Return values.
char *&bus_name, char *&bus_name,
int &index) int &index)
{ {
@ -55,6 +56,7 @@ void
parseBusName(const char *name, parseBusName(const char *name,
const char *brkts_left, const char *brkts_left,
const char *brkts_right, const char *brkts_right,
// Return values.
char *&bus_name, char *&bus_name,
int &index) int &index)
{ {
@ -81,6 +83,7 @@ void
parseBusRange(const char *name, parseBusRange(const char *name,
const char brkt_left, const char brkt_left,
const char brkt_right, const char brkt_right,
// Return values.
char *&bus_name, char *&bus_name,
int &from, int &from,
int &to) int &to)
@ -94,6 +97,7 @@ void
parseBusRange(const char *name, parseBusRange(const char *name,
const char *brkts_left, const char *brkts_left,
const char *brkts_right, const char *brkts_right,
// Return values.
char *&bus_name, char *&bus_name,
int &from, int &from,
int &to) int &to)

View File

@ -27,7 +27,7 @@ isBusName(const char *name,
// Parse name as a bus. // Parse name as a bus.
// signal // signal
// bus_name = 0 // bus_name = nullptr
// bus[bit] // bus[bit]
// bus_name = "bus" // bus_name = "bus"
// index = bit // index = bit
@ -36,6 +36,7 @@ void
parseBusName(const char *name, parseBusName(const char *name,
const char brkt_left, const char brkt_left,
const char brkt_right, const char brkt_right,
// Return values.
char *&bus_name, char *&bus_name,
int &index); int &index);
// Allow multiple different left/right bus brackets. // Allow multiple different left/right bus brackets.
@ -43,6 +44,7 @@ void
parseBusName(const char *name, parseBusName(const char *name,
const char *brkts_left, const char *brkts_left,
const char *brkts_right, const char *brkts_right,
// Return values.
char *&bus_name, char *&bus_name,
int &index); int &index);
@ -53,6 +55,7 @@ void
parseBusRange(const char *name, parseBusRange(const char *name,
const char brkt_left, const char brkt_left,
const char brkt_right, const char brkt_right,
// Return values.
char *&bus_name, char *&bus_name,
int &from, int &from,
int &to); int &to);
@ -62,6 +65,7 @@ void
parseBusRange(const char *name, parseBusRange(const char *name,
const char *brkts_left, const char *brkts_left,
const char *brkts_right, const char *brkts_right,
// Return values.
char *&bus_name, char *&bus_name,
int &from, int &from,
int &to); int &to);

View File

@ -17,6 +17,7 @@
#include <ctype.h> #include <ctype.h>
#include "Machine.hh" #include "Machine.hh"
#include "StringUtil.hh" #include "StringUtil.hh"
#include "ParseBus.hh"
#include "VerilogNamespace.hh" #include "VerilogNamespace.hh"
namespace sta { namespace sta {
@ -25,21 +26,29 @@ const char *
instanceVerilogName(const char *sta_name, instanceVerilogName(const char *sta_name,
const char escape) const char escape)
{ {
return staToVerilog(sta_name, true, escape); return staToVerilog(sta_name, escape);
} }
const char * const char *
netVerilogName(const char *sta_name, netVerilogName(const char *sta_name,
const char escape) const char escape)
{ {
return staToVerilog(sta_name, false, escape); char *bus_name;
int index;
parseBusName(sta_name, '[', ']', bus_name, index);
if (bus_name)
return stringPrintTmp("%s[%d]",
staToVerilog(bus_name, escape),
index);
else
return staToVerilog(sta_name, escape);
} }
const char * const char *
portVerilogName(const char *sta_name, portVerilogName(const char *sta_name,
const char escape) const char escape)
{ {
return staToVerilog(sta_name, false, escape); return staToVerilog(sta_name, escape);
} }
// Append ch to str at insert. Resize str if necessary. // Append ch to str at insert. Resize str if necessary.
@ -63,7 +72,6 @@ vstringAppend(char *&str,
const char * const char *
staToVerilog(const char *sta_name, staToVerilog(const char *sta_name,
bool escape_brkts,
const char escape) const char escape)
{ {
const char bus_brkt_left = '['; const char bus_brkt_left = '[';
@ -93,7 +101,7 @@ staToVerilog(const char *sta_name,
else { else {
bool is_brkt = (ch == bus_brkt_left || ch == bus_brkt_right); bool is_brkt = (ch == bus_brkt_left || ch == bus_brkt_right);
if ((!(isalnum(ch) || ch == '_') && !is_brkt) if ((!(isalnum(ch) || ch == '_') && !is_brkt)
|| (is_brkt && escape_brkts)) || is_brkt)
escaped = true; escaped = true;
vstringAppend(verilog_name, verilog_name_end, v, ch); vstringAppend(verilog_name, verilog_name_end, v, ch);
} }

View File

@ -21,7 +21,6 @@ namespace sta {
const char * const char *
staToVerilog(const char *sta_name, staToVerilog(const char *sta_name,
bool escape_brkts,
const char escape); const char escape);
const char * const char *
verilogToSta(const char *verilog_name); verilogToSta(const char *verilog_name);

View File

@ -53,7 +53,10 @@ void
write_verilog_cmd(const char *filename, write_verilog_cmd(const char *filename,
bool sort) bool sort)
{ {
Network *network = cmdNetwork(); // This does NOT want the SDC (cmd) network because it wants
// to see the sta internal names.
Sta *sta = Sta::sta();
Network *network = sta->network();
writeVerilog(filename, sort, network); writeVerilog(filename, sort, network);
} }

View File

@ -1721,38 +1721,44 @@ VerilogReader::linkNetwork(const char *top_cell_name,
bool make_black_boxes, bool make_black_boxes,
Report *report) Report *report)
{ {
Cell *top_cell = network_->findCell(library_, top_cell_name); if (library_) {
VerilogModule *module = verilog_reader->module(top_cell); Cell *top_cell = network_->findCell(library_, top_cell_name);
if (module) { VerilogModule *module = this->module(top_cell);
// Seed the recursion for expansion with the top level instance. if (module) {
Instance *top_instance = network_->makeInstance(top_cell, "", nullptr); // Seed the recursion for expansion with the top level instance.
VerilogBindingTbl bindings(zero_net_name_, one_net_name_); Instance *top_instance = network_->makeInstance(top_cell, "", nullptr);
VerilogNetSeq::Iterator port_iter(module->ports()); VerilogBindingTbl bindings(zero_net_name_, one_net_name_);
while (port_iter.hasNext()) { VerilogNetSeq::Iterator port_iter(module->ports());
VerilogNet *mod_port = port_iter.next(); while (port_iter.hasNext()) {
VerilogNetNameIterator *net_name_iter = mod_port->nameIterator(module, VerilogNet *mod_port = port_iter.next();
this); VerilogNetNameIterator *net_name_iter = mod_port->nameIterator(module,
while (net_name_iter->hasNext()) { this);
const char *net_name = net_name_iter->next(); while (net_name_iter->hasNext()) {
Port *port = network_->findPort(top_cell, net_name); const char *net_name = net_name_iter->next();
Net *net = bindings.ensureNetBinding(net_name, top_instance, network_); Port *port = network_->findPort(top_cell, net_name);
// Guard against repeated port name. Net *net = bindings.ensureNetBinding(net_name, top_instance, network_);
if (network_->findPin(top_instance, port) == nullptr) { // Guard against repeated port name.
Pin *pin = network_->makePin(top_instance, port, nullptr); if (network_->findPin(top_instance, port) == nullptr) {
network_->makeTerm(pin, net); Pin *pin = network_->makePin(top_instance, port, nullptr);
network_->makeTerm(pin, net);
}
} }
delete net_name_iter;
} }
delete net_name_iter; makeModuleInstBody(module, top_instance, &bindings, make_black_boxes);
bool errors = reportLinkErrors(report);
deleteModules();
if (errors) {
network_->deleteInstance(top_instance);
return nullptr;
}
else
return top_instance;
} }
makeModuleInstBody(module, top_instance, &bindings, make_black_boxes); else {
bool errors = reportLinkErrors(report); report->error("%s is not a verilog module.\n", top_cell_name);
deleteModules();
if (errors) {
network_->deleteInstance(top_instance);
return nullptr; return nullptr;
} }
else
return top_instance;
} }
else { else {
report->error("%s is not a verilog module.\n", top_cell_name); report->error("%s is not a verilog module.\n", top_cell_name);
@ -1848,7 +1854,7 @@ VerilogReader::makeModuleInstNetwork(VerilogModuleInst *mod_inst,
parent_module, parent_bindings, is_leaf); parent_module, parent_bindings, is_leaf);
} }
if (!is_leaf) { if (!is_leaf) {
VerilogModule *module = verilog_reader->module(cell); VerilogModule *module = this->module(cell);
makeModuleInstBody(module, inst, &bindings, make_black_boxes); makeModuleInstBody(module, inst, &bindings, make_black_boxes);
} }
} }

View File

@ -66,14 +66,16 @@ writeVerilog(const char *filename,
bool sort, bool sort,
Network *network) Network *network)
{ {
FILE *stream = fopen(filename, "w"); if (network->topInstance()) {
if (stream) { FILE *stream = fopen(filename, "w");
VerilogWriter writer(filename, sort, stream, network); if (stream) {
writer.writeModule(network->topInstance()); VerilogWriter writer(filename, sort, stream, network);
fclose(stream); writer.writeModule(network->topInstance());
fclose(stream);
}
else
throw FileNotWritable(filename);
} }
else
throw FileNotWritable(filename);
} }
VerilogWriter::VerilogWriter(const char *filename, VerilogWriter::VerilogWriter(const char *filename,
@ -117,8 +119,8 @@ VerilogWriter::writePorts(Cell *cell)
Port *port = port_iter->next(); Port *port = port_iter->next();
if (!first) if (!first)
fprintf(stream_, ",\n "); fprintf(stream_, ",\n ");
fprintf(stream_, "%s", fprintf(stream_, "%s", portVerilogName(network_->name(port),
network_->name(port)); network_->pathEscape()));
first = false; first = false;
} }
delete port_iter; delete port_iter;
@ -132,23 +134,23 @@ VerilogWriter::writePortDcls(Cell *cell)
while (port_iter->hasNext()) { while (port_iter->hasNext()) {
Port *port = port_iter->next(); Port *port = port_iter->next();
PortDirection *dir = network_->direction(port); PortDirection *dir = network_->direction(port);
if (dir) { const char *port_name = portVerilogName(network_->name(port),
fprintf(stream_, " %s", network_->pathEscape());
verilogPortDir(dir)); const char *vtype = verilogPortDir(dir);
if (vtype) {
fprintf(stream_, " %s", vtype);
if (network_->isBus(port)) if (network_->isBus(port))
fprintf(stream_, " [%d:%d]", fprintf(stream_, " [%d:%d]",
network_->fromIndex(port), network_->fromIndex(port),
network_->toIndex(port)); network_->toIndex(port));
fprintf(stream_, " %s;\n", fprintf(stream_, " %s;\n", port_name);
network_->name(port));
if (dir->isTristate()) { if (dir->isTristate()) {
fprintf(stream_, " tri"); fprintf(stream_, " tri");
if (network_->isBus(port)) if (network_->isBus(port))
fprintf(stream_, " [%d:%d]", fprintf(stream_, " [%d:%d]",
network_->fromIndex(port), network_->fromIndex(port),
network_->toIndex(port)); network_->toIndex(port));
fprintf(stream_, " %s;\n", fprintf(stream_, " %s;\n", port_name);
network_->name(port));
} }
} }
} }
@ -226,7 +228,8 @@ VerilogWriter::writeInstPin(Instance *inst,
const char *net_vname = netVerilogName(net_name, network_->pathEscape()); const char *net_vname = netVerilogName(net_name, network_->pathEscape());
if (!first_port) if (!first_port)
fprintf(stream_, ",\n "); fprintf(stream_, ",\n ");
const char *port_name = network_->name(port); const char *port_name = portVerilogName(network_->name(port),
network_->pathEscape());
fprintf(stream_, ".%s(%s)", fprintf(stream_, ".%s(%s)",
port_name, port_name,
net_vname); net_vname);