verilog reader cleanups
commit 1f29e7bd737c70e408d61cd6c55be567a97c2aec
Author: James Cherry <cherry@parallaxsw.com>
Date: Sat Dec 28 15:31:41 2024 -0800
mv unconnected_net_name_ into VerilogReader
Signed-off-by: James Cherry <cherry@parallaxsw.com>
commit 1824cc9609c6b3d44792ebfa19b550472ff1306d
Author: James Cherry <cherry@parallaxsw.com>
Date: Sat Dec 28 14:45:22 2024 -0800
verilog reader use std::string for filename
Signed-off-by: James Cherry <cherry@parallaxsw.com>
commit 8d1d4c6639c54efcae85c476d46734e50909854c
Author: James Cherry <cherry@parallaxsw.com>
Date: Sat Dec 28 13:49:59 2024 -0800
attribute_stmts() -> attributeStmts()
Signed-off-by: James Cherry <cherry@parallaxsw.com>
commit 7e6bb731a279c0827a43dd3f66ab5885aea73014
Author: James Cherry <cherry@parallaxsw.com>
Date: Sat Dec 28 13:47:15 2024 -0800
Sta::readerilog
Signed-off-by: James Cherry <cherry@parallaxsw.com>
Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
parent
26fccd8e7f
commit
adaf73cb3a
|
|
@ -112,6 +112,7 @@ public:
|
||||||
bool infer_latches);
|
bool infer_latches);
|
||||||
bool setMinLibrary(const char *min_filename,
|
bool setMinLibrary(const char *min_filename,
|
||||||
const char *max_filename);
|
const char *max_filename);
|
||||||
|
bool readVerilog(const char *filename);
|
||||||
// Network readers call this to notify the Sta to delete any previously
|
// Network readers call this to notify the Sta to delete any previously
|
||||||
// linked network.
|
// linked network.
|
||||||
void readNetlistBefore();
|
void readNetlistBefore();
|
||||||
|
|
|
||||||
|
|
@ -723,6 +723,18 @@ Sta::setMinLibrary(const char *min_filename,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
Sta::readVerilog(const char *filename)
|
||||||
|
{
|
||||||
|
NetworkReader *network = networkReader();
|
||||||
|
if (network) {
|
||||||
|
readNetlistBefore();
|
||||||
|
return readVerilogFile(filename, network);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Sta::readNetlistBefore()
|
Sta::readNetlistBefore()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -32,14 +32,7 @@ using sta::readVerilogFile;
|
||||||
bool
|
bool
|
||||||
read_verilog_cmd(const char *filename)
|
read_verilog_cmd(const char *filename)
|
||||||
{
|
{
|
||||||
Sta *sta = Sta::sta();
|
return Sta::sta()->readVerilog(filename);
|
||||||
NetworkReader *network = sta->networkReader();
|
|
||||||
if (network) {
|
|
||||||
sta->readNetlistBefore();
|
|
||||||
return readVerilogFile(filename, network);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -54,9 +47,9 @@ write_verilog_cmd(const char *filename,
|
||||||
bool include_pwr_gnd,
|
bool include_pwr_gnd,
|
||||||
CellSeq *remove_cells)
|
CellSeq *remove_cells)
|
||||||
{
|
{
|
||||||
|
Sta *sta = Sta::sta();
|
||||||
// This does NOT want the SDC (cmd) network because it wants
|
// This does NOT want the SDC (cmd) network because it wants
|
||||||
// to see the sta internal names.
|
// to see the sta internal names.
|
||||||
Sta *sta = Sta::sta();
|
|
||||||
Network *network = sta->network();
|
Network *network = sta->network();
|
||||||
writeVerilog(filename, sort, include_pwr_gnd, remove_cells, network);
|
writeVerilog(filename, sort, include_pwr_gnd, remove_cells, network);
|
||||||
delete remove_cells;
|
delete remove_cells;
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@ VerilogParse_parse();
|
||||||
namespace sta {
|
namespace sta {
|
||||||
|
|
||||||
VerilogReader *verilog_reader;
|
VerilogReader *verilog_reader;
|
||||||
static const char *unconnected_net_name = reinterpret_cast<const char*>(1);
|
const char *VerilogReader::unconnected_net_name_ = reinterpret_cast<const char*>(1);
|
||||||
|
|
||||||
static string
|
static string
|
||||||
verilogBusBitName(const char *bus_name,
|
verilogBusBitName(const char *bus_name,
|
||||||
|
|
@ -156,12 +156,8 @@ VerilogReader::~VerilogReader()
|
||||||
void
|
void
|
||||||
VerilogReader::deleteModules()
|
VerilogReader::deleteModules()
|
||||||
{
|
{
|
||||||
StringSet filenames;
|
for (const auto [name, module] : module_map_)
|
||||||
for (const auto [name, module] : module_map_) {
|
|
||||||
filenames.insert(module->filename());
|
|
||||||
delete module;
|
delete module;
|
||||||
}
|
|
||||||
deleteContents(&filenames);
|
|
||||||
module_map_.clear();
|
module_map_.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -187,7 +183,8 @@ void
|
||||||
VerilogReader::init(const char *filename)
|
VerilogReader::init(const char *filename)
|
||||||
{
|
{
|
||||||
// Statements point to verilog_filename, so copy it.
|
// Statements point to verilog_filename, so copy it.
|
||||||
filename_ = stringCopy(filename);
|
filename_ = filename;
|
||||||
|
filenames_.push_back(filename);
|
||||||
line_ = 1;
|
line_ = 1;
|
||||||
|
|
||||||
library_ = network_->findLibrary("verilog");
|
library_ = network_->findLibrary("verilog");
|
||||||
|
|
@ -267,12 +264,11 @@ VerilogReader::makeModule(const char *module_vname,
|
||||||
|
|
||||||
VerilogModule *module = new VerilogModule(module_name.c_str(), ports, stmts,
|
VerilogModule *module = new VerilogModule(module_name.c_str(), ports, stmts,
|
||||||
attribute_stmts, filename_, line, this);
|
attribute_stmts, filename_, line, this);
|
||||||
cell = network_->makeCell(library_, module_name.c_str(), false, filename_);
|
cell = network_->makeCell(library_, module_name.c_str(), false, filename_.c_str());
|
||||||
|
|
||||||
for (VerilogAttributeStmt *stmt : *attribute_stmts) {
|
for (VerilogAttributeStmt *stmt : *attribute_stmts) {
|
||||||
for (VerilogAttributeEntry *entry : *stmt->attribute_sequence()) {
|
for (VerilogAttributeEntry *entry : *stmt->attribute_sequence())
|
||||||
network_->setAttribute(cell, entry->key(), entry->value());
|
network_->setAttribute(cell, entry->key(), entry->value());
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module_map_[cell] = module;
|
module_map_[cell] = module;
|
||||||
|
|
@ -582,10 +578,10 @@ VerilogReader::makeModuleInst(const char *module_vname,
|
||||||
int pin_index = lport->pinIndex();
|
int pin_index = lport->pinIndex();
|
||||||
const char *prev_net_name = net_names[pin_index];
|
const char *prev_net_name = net_names[pin_index];
|
||||||
if (prev_net_name
|
if (prev_net_name
|
||||||
&& prev_net_name !=unconnected_net_name)
|
&& prev_net_name != unconnected_net_name_)
|
||||||
// Repeated port reference.
|
// Repeated port reference.
|
||||||
stringDelete(prev_net_name);
|
stringDelete(prev_net_name);
|
||||||
net_names[pin_index]=(net_name == nullptr) ? unconnected_net_name : net_name;
|
net_names[pin_index]=(net_name == nullptr) ? unconnected_net_name_ : net_name;
|
||||||
delete vpin;
|
delete vpin;
|
||||||
net_port_ref_scalar_net_count_--;
|
net_port_ref_scalar_net_count_--;
|
||||||
}
|
}
|
||||||
|
|
@ -841,7 +837,7 @@ VerilogModule::VerilogModule(const char *name,
|
||||||
VerilogNetSeq *ports,
|
VerilogNetSeq *ports,
|
||||||
VerilogStmtSeq *stmts,
|
VerilogStmtSeq *stmts,
|
||||||
VerilogAttributeStmtSeq *attribute_stmts,
|
VerilogAttributeStmtSeq *attribute_stmts,
|
||||||
const char *filename,
|
string &filename,
|
||||||
int line,
|
int line,
|
||||||
VerilogReader *reader) :
|
VerilogReader *reader) :
|
||||||
VerilogStmt(line),
|
VerilogStmt(line),
|
||||||
|
|
@ -908,7 +904,7 @@ VerilogModule::parseDcl(VerilogDcl *dcl,
|
||||||
dcl_map_[net_name] = dcl;
|
dcl_map_[net_name] = dcl;
|
||||||
else if (!dcl->direction()->isInternal()) {
|
else if (!dcl->direction()->isInternal()) {
|
||||||
string net_vname = reader->netVerilogName(net_name);
|
string net_vname = reader->netVerilogName(net_name);
|
||||||
reader->warn(1395, filename_, dcl->line(),
|
reader->warn(1395, filename_.c_str(), dcl->line(),
|
||||||
"signal %s previously declared on line %d.",
|
"signal %s previously declared on line %d.",
|
||||||
net_vname.c_str(),
|
net_vname.c_str(),
|
||||||
existing_dcl->line());
|
existing_dcl->line());
|
||||||
|
|
@ -937,7 +933,7 @@ VerilogModule::checkInstanceName(VerilogInst *inst,
|
||||||
replacement_name = stringPrint("%s_%d", inst_name, i++);
|
replacement_name = stringPrint("%s_%d", inst_name, i++);
|
||||||
} while (inst_names.findKey(replacement_name));
|
} while (inst_names.findKey(replacement_name));
|
||||||
string inst_vname = reader->instanceVerilogName(inst_name);
|
string inst_vname = reader->instanceVerilogName(inst_name);
|
||||||
reader->warn(1396, filename_, inst->line(),
|
reader->warn(1396, filename_.c_str(), inst->line(),
|
||||||
"instance name %s duplicated - renamed to %s.",
|
"instance name %s duplicated - renamed to %s.",
|
||||||
inst_vname.c_str(),
|
inst_vname.c_str(),
|
||||||
replacement_name);
|
replacement_name);
|
||||||
|
|
@ -1035,8 +1031,7 @@ VerilogLibertyInst::~VerilogLibertyInst()
|
||||||
int port_count = cell_->portBitCount();
|
int port_count = cell_->portBitCount();
|
||||||
for (int i = 0; i < port_count; i++) {
|
for (int i = 0; i < port_count; i++) {
|
||||||
const char *net_name = net_names_[i];
|
const char *net_name = net_names_[i];
|
||||||
if (net_name
|
if (net_name != VerilogReader::unconnected_net_name_)
|
||||||
&& net_name != unconnected_net_name)
|
|
||||||
stringDelete(net_name);
|
stringDelete(net_name);
|
||||||
}
|
}
|
||||||
delete [] net_names_;
|
delete [] net_names_;
|
||||||
|
|
@ -1937,7 +1932,7 @@ VerilogReader::makeModuleInstNetwork(VerilogModuleInst *mod_inst,
|
||||||
cell = network_->cell(lib_cell);
|
cell = network_->cell(lib_cell);
|
||||||
Instance *inst = network_->makeInstance(cell, mod_inst->instanceName(),
|
Instance *inst = network_->makeInstance(cell, mod_inst->instanceName(),
|
||||||
parent);
|
parent);
|
||||||
VerilogAttributeStmtSeq *attribute_stmts = mod_inst->attribute_stmts();
|
VerilogAttributeStmtSeq *attribute_stmts = mod_inst->attributeStmts();
|
||||||
for (VerilogAttributeStmt *stmt : *attribute_stmts) {
|
for (VerilogAttributeStmt *stmt : *attribute_stmts) {
|
||||||
for (VerilogAttributeEntry *entry : *stmt->attribute_sequence()) {
|
for (VerilogAttributeEntry *entry : *stmt->attribute_sequence()) {
|
||||||
network_->setAttribute(inst, entry->key(), entry->value());
|
network_->setAttribute(inst, entry->key(), entry->value());
|
||||||
|
|
@ -2129,7 +2124,7 @@ VerilogReader::makeLibertyInst(VerilogLibertyInst *lib_inst,
|
||||||
Cell *cell = reinterpret_cast<Cell*>(lib_cell);
|
Cell *cell = reinterpret_cast<Cell*>(lib_cell);
|
||||||
Instance *inst = network_->makeInstance(cell, lib_inst->instanceName(),
|
Instance *inst = network_->makeInstance(cell, lib_inst->instanceName(),
|
||||||
parent);
|
parent);
|
||||||
VerilogAttributeStmtSeq *attribute_stmts = lib_inst->attribute_stmts();
|
VerilogAttributeStmtSeq *attribute_stmts = lib_inst->attributeStmts();
|
||||||
for (VerilogAttributeStmt *stmt : *attribute_stmts) {
|
for (VerilogAttributeStmt *stmt : *attribute_stmts) {
|
||||||
for (VerilogAttributeEntry *entry : *stmt->attribute_sequence()) {
|
for (VerilogAttributeEntry *entry : *stmt->attribute_sequence()) {
|
||||||
network_->setAttribute(inst, entry->key(), entry->value());
|
network_->setAttribute(inst, entry->key(), entry->value());
|
||||||
|
|
@ -2144,7 +2139,7 @@ VerilogReader::makeLibertyInst(VerilogLibertyInst *lib_inst,
|
||||||
if (net_name) {
|
if (net_name) {
|
||||||
Net *net = nullptr;
|
Net *net = nullptr;
|
||||||
// If the pin is unconnected (ie, .A()) make the pin but not the net.
|
// If the pin is unconnected (ie, .A()) make the pin but not the net.
|
||||||
if (net_name != unconnected_net_name) {
|
if (net_name != unconnected_net_name_) {
|
||||||
VerilogDcl *dcl = parent_module->declaration(net_name);
|
VerilogDcl *dcl = parent_module->declaration(net_name);
|
||||||
// Check for single bit bus reference .A(BUS) -> .A(BUS[LSB]).
|
// Check for single bit bus reference .A(BUS) -> .A(BUS[LSB]).
|
||||||
if (dcl && dcl->isBus()) {
|
if (dcl && dcl->isBus()) {
|
||||||
|
|
|
||||||
|
|
@ -33,6 +33,7 @@ VerilogParse_error(const char *msg);
|
||||||
namespace sta {
|
namespace sta {
|
||||||
|
|
||||||
using std::string;
|
using std::string;
|
||||||
|
using std::vector;
|
||||||
using std::set;
|
using std::set;
|
||||||
|
|
||||||
class Debug;
|
class Debug;
|
||||||
|
|
@ -158,7 +159,7 @@ public:
|
||||||
bool make_black_boxes,
|
bool make_black_boxes,
|
||||||
Report *report);
|
Report *report);
|
||||||
int line() const { return line_; }
|
int line() const { return line_; }
|
||||||
const char *filename() const { return filename_; }
|
const char *filename() const { return filename_.c_str(); }
|
||||||
void incrLine();
|
void incrLine();
|
||||||
Report *report() const { return report_; }
|
Report *report() const { return report_; }
|
||||||
void error(int id,
|
void error(int id,
|
||||||
|
|
@ -181,6 +182,7 @@ public:
|
||||||
instanceVerilogName(const char *inst_name);
|
instanceVerilogName(const char *inst_name);
|
||||||
string
|
string
|
||||||
netVerilogName(const char *net_name);
|
netVerilogName(const char *net_name);
|
||||||
|
static const char *unconnected_net_name_;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void init(const char *filename);
|
void init(const char *filename);
|
||||||
|
|
@ -279,7 +281,8 @@ protected:
|
||||||
Debug *debug_;
|
Debug *debug_;
|
||||||
NetworkReader *network_;
|
NetworkReader *network_;
|
||||||
|
|
||||||
const char *filename_;
|
string filename_;
|
||||||
|
vector<string> filenames_;
|
||||||
int line_;
|
int line_;
|
||||||
gzFile stream_;
|
gzFile stream_;
|
||||||
|
|
||||||
|
|
@ -340,13 +343,13 @@ public:
|
||||||
VerilogNetSeq *ports,
|
VerilogNetSeq *ports,
|
||||||
VerilogStmtSeq *stmts,
|
VerilogStmtSeq *stmts,
|
||||||
VerilogAttributeStmtSeq *attribute_stmts,
|
VerilogAttributeStmtSeq *attribute_stmts,
|
||||||
const char *filename,
|
string &filename,
|
||||||
int line,
|
int line,
|
||||||
VerilogReader *reader);
|
VerilogReader *reader);
|
||||||
virtual ~VerilogModule();
|
virtual ~VerilogModule();
|
||||||
const char *name() { return name_; }
|
const char *name() { return name_; }
|
||||||
const char *filename() { return filename_; }
|
const char *filename() { return filename_.c_str(); }
|
||||||
VerilogAttributeStmtSeq *attribute_stmts() { return attribute_stmts_; }
|
VerilogAttributeStmtSeq *attributeStmts() { return attribute_stmts_; }
|
||||||
VerilogNetSeq *ports() { return ports_; }
|
VerilogNetSeq *ports() { return ports_; }
|
||||||
VerilogDcl *declaration(const char *net_name);
|
VerilogDcl *declaration(const char *net_name);
|
||||||
VerilogStmtSeq *stmts() { return stmts_; }
|
VerilogStmtSeq *stmts() { return stmts_; }
|
||||||
|
|
@ -361,7 +364,7 @@ private:
|
||||||
VerilogReader *reader);
|
VerilogReader *reader);
|
||||||
|
|
||||||
const char *name_;
|
const char *name_;
|
||||||
const char *filename_;
|
string &filename_;
|
||||||
VerilogNetSeq *ports_;
|
VerilogNetSeq *ports_;
|
||||||
VerilogStmtSeq *stmts_;
|
VerilogStmtSeq *stmts_;
|
||||||
VerilogDclMap dcl_map_;
|
VerilogDclMap dcl_map_;
|
||||||
|
|
@ -461,7 +464,7 @@ public:
|
||||||
virtual ~VerilogInst();
|
virtual ~VerilogInst();
|
||||||
virtual bool isInstance() const { return true; }
|
virtual bool isInstance() const { return true; }
|
||||||
const char *instanceName() const { return inst_name_; }
|
const char *instanceName() const { return inst_name_; }
|
||||||
VerilogAttributeStmtSeq *attribute_stmts() const { return attribute_stmts_; }
|
VerilogAttributeStmtSeq *attributeStmts() const { return attribute_stmts_; }
|
||||||
void setInstanceName(const char *inst_name);
|
void setInstanceName(const char *inst_name);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue