Skip to content

Commit

Permalink
Merge branch 'parallaxsw:master' into main
Browse files Browse the repository at this point in the history
  • Loading branch information
akashlevy authored Oct 21, 2024
2 parents cd06ff6 + a2d445b commit 14811a1
Showing 1 changed file with 88 additions and 64 deletions.
152 changes: 88 additions & 64 deletions verilog/VerilogWriter.cc
Original file line number Diff line number Diff line change
Expand Up @@ -41,41 +41,42 @@ class VerilogWriter
CellSeq *remove_cells,
FILE *stream,
Network *network);
void writeModule(Instance *inst);
void writeModules();

protected:
void writePorts(Cell *cell);
void writePortDcls(Cell *cell);
void writeWireDcls(Instance *inst);
void writeModule(const Instance *inst);
InstanceSeq findHierChildren();
void findHierChildren(const Instance *inst,
InstanceSeq &children,
CellSet &cells);
void writePorts(const Cell *cell);
void writePortDcls(const Cell *cell);
void writeWireDcls(const Instance *inst);
const char *verilogPortDir(PortDirection *dir);
void writeChildren(Instance *inst);
void writeChild(Instance *child);
void writeInstPin(Instance *inst,
Port *port,
void writeChildren(const Instance *inst);
void writeChild(const Instance *child);
void writeInstPin(const Instance *inst,
const Port *port,
bool &first_port);
void writeInstBusPin(Instance *inst,
Port *port,
void writeInstBusPin(const Instance *inst,
const Port *port,
bool &first_port);
void writeInstBusPinBit(Instance *inst,
Port *port,
void writeInstBusPinBit(const Instance *inst,
const Port *port,
bool &first_member);
void writeAssigns(Instance *inst);
void writeAssigns(const Instance *inst);

int findUnconnectedNetCount();
int findNCcount(Instance *inst);
int findChildNCcount(Instance *child);
int findPortNCcount(Instance *inst,
Port *port);
int findUnconnectedNetCount(const Instance *inst);
int findChildNCcount(const Instance *child);
int findPortNCcount(const Instance *inst,
const Port *port);

const char *filename_;
bool sort_;
bool include_pwr_gnd_;
CellSet remove_cells_;
FILE *stream_;
Network *network_;

CellSet written_cells_;
Vector<Instance*> pending_children_;
int unconnected_net_index_;
};

Expand All @@ -91,7 +92,7 @@ writeVerilog(const char *filename,
if (stream) {
VerilogWriter writer(filename, sort, include_pwr_gnd,
remove_cells, stream, network);
writer.writeModule(network->topInstance());
writer.writeModules();
fclose(stream);
}
else
Expand All @@ -111,7 +112,6 @@ VerilogWriter::VerilogWriter(const char *filename,
remove_cells_(network),
stream_(stream),
network_(network),
written_cells_(network),
unconnected_net_index_(1)
{
if (remove_cells) {
Expand All @@ -121,7 +121,54 @@ VerilogWriter::VerilogWriter(const char *filename,
}

void
VerilogWriter::writeModule(Instance *inst)
VerilogWriter::writeModules()
{
// Write the top level modeule first.
writeModule(network_->topInstance());
InstanceSeq hier_childrenn = findHierChildren();
for (const Instance *child : hier_childrenn)
writeModule(child);
}

InstanceSeq
VerilogWriter::findHierChildren()
{
InstanceSeq children;
CellSet cells(network_);
findHierChildren(network_->topInstance(), children, cells);

if (sort_)
sort(children, [this](const Instance *inst1,
const Instance *inst2) {
const char *cell_name1 = network_->cellName(inst1);
const char *cell_name2 = network_->cellName(inst2);
return stringLess(cell_name1, cell_name2);
});

return children;
}

void
VerilogWriter::findHierChildren(const Instance *inst,
InstanceSeq &children,
CellSet &cells)
{
InstanceChildIterator *child_iter = network_->childIterator(inst);
while (child_iter->hasNext()) {
const Instance *child = child_iter->next();
const Cell *cell = network_->cell(child);
if (network_->isHierarchical(child)
&& !cells.hasKey(cell)) {
children.push_back(child);
cells.insert(cell);
findHierChildren(child, children, cells);
}
}
delete child_iter;
}

void
VerilogWriter::writeModule(const Instance *inst)
{
Cell *cell = network_->cell(inst);
fprintf(stream_, "module %s (",
Expand All @@ -134,22 +181,10 @@ VerilogWriter::writeModule(Instance *inst)
writeChildren(inst);
writeAssigns(inst);
fprintf(stream_, "endmodule\n");
written_cells_.insert(cell);

if (sort_)
sort(pending_children_, [this](const Instance *inst1,
const Instance *inst2) {
return stringLess(network_->cellName(inst1), network_->cellName(inst2));
});
for (auto child : pending_children_) {
Cell *child_cell = network_->cell(child);
if (!written_cells_.hasKey(child_cell))
writeModule(child);
}
}

void
VerilogWriter::writePorts(Cell *cell)
VerilogWriter::writePorts(const Cell *cell)
{
bool first = true;
CellPortIterator *port_iter = network_->portIterator(cell);
Expand All @@ -170,7 +205,7 @@ VerilogWriter::writePorts(Cell *cell)
}

void
VerilogWriter::writePortDcls(Cell *cell)
VerilogWriter::writePortDcls(const Cell *cell)
{
CellPortIterator *port_iter = network_->portIterator(cell);
while (port_iter->hasNext()) {
Expand Down Expand Up @@ -228,7 +263,7 @@ VerilogWriter::verilogPortDir(PortDirection *dir)
typedef std::pair<int, int> BusIndexRange;

void
VerilogWriter::writeWireDcls(Instance *inst)
VerilogWriter::writeWireDcls(const Instance *inst)
{
Cell *cell = network_->cell(inst);
char escape = network_->pathEscape();
Expand Down Expand Up @@ -268,22 +303,19 @@ VerilogWriter::writeWireDcls(Instance *inst)
}

// Wire net dcls for writeInstBusPinBit.
int nc_count = findUnconnectedNetCount();
int nc_count = findUnconnectedNetCount(inst);
for (int i = 1; i < nc_count + 1; i++)
fprintf(stream_, " wire _NC%d;\n", i);
}

void
VerilogWriter::writeChildren(Instance *inst)
VerilogWriter::writeChildren(const Instance *inst)
{
Vector<Instance*> children;
InstanceChildIterator *child_iter = network_->childIterator(inst);
while (child_iter->hasNext()) {
Instance *child = child_iter->next();
children.push_back(child);
if (network_->isHierarchical(child)) {
pending_children_.push_back(child);
}
}
delete child_iter;

Expand All @@ -298,7 +330,7 @@ VerilogWriter::writeChildren(Instance *inst)
}

void
VerilogWriter::writeChild(Instance *child)
VerilogWriter::writeChild(const Instance *child)
{
Cell *child_cell = network_->cell(child);
if (!remove_cells_.hasKey(child_cell)) {
Expand All @@ -325,8 +357,8 @@ VerilogWriter::writeChild(Instance *child)
}

void
VerilogWriter::writeInstPin(Instance *inst,
Port *port,
VerilogWriter::writeInstPin(const Instance *inst,
const Port *port,
bool &first_port)
{
Pin *pin = network_->findPin(inst, port);
Expand All @@ -348,8 +380,8 @@ VerilogWriter::writeInstPin(Instance *inst,
}

void
VerilogWriter::writeInstBusPin(Instance *inst,
Port *port,
VerilogWriter::writeInstBusPin(const Instance *inst,
const Port *port,
bool &first_port)
{
if (!first_port)
Expand Down Expand Up @@ -382,8 +414,8 @@ VerilogWriter::writeInstBusPin(Instance *inst,
}

void
VerilogWriter::writeInstBusPinBit(Instance *inst,
Port *port,
VerilogWriter::writeInstBusPinBit(const Instance *inst,
const Port *port,
bool &first_member)
{
Pin *pin = network_->findPin(inst, port);
Expand All @@ -405,7 +437,7 @@ VerilogWriter::writeInstBusPinBit(Instance *inst,
// Use an assign statement to alias the net when it is connected to
// multiple output ports.
void
VerilogWriter::writeAssigns(Instance *inst)
VerilogWriter::writeAssigns(const Instance *inst)
{
InstancePinIterator *pin_iter = network_->pinIterator(inst);
while (pin_iter->hasNext()) {
Expand Down Expand Up @@ -436,16 +468,8 @@ VerilogWriter::writeAssigns(Instance *inst)

////////////////////////////////////////////////////////////////

// Walk the hierarchy counting unconnected nets used to connect to
// bus ports with concatenation.
int
VerilogWriter::findUnconnectedNetCount()
{
return findNCcount(network_->topInstance());
}

int
VerilogWriter::findNCcount(Instance *inst)
VerilogWriter::findUnconnectedNetCount(const Instance *inst)
{
int nc_count = 0;
InstanceChildIterator *child_iter = network_->childIterator(inst);
Expand All @@ -458,7 +482,7 @@ VerilogWriter::findNCcount(Instance *inst)
}

int
VerilogWriter::findChildNCcount(Instance *child)
VerilogWriter::findChildNCcount(const Instance *child)
{
int nc_count = 0;
Cell *child_cell = network_->cell(child);
Expand All @@ -475,8 +499,8 @@ VerilogWriter::findChildNCcount(Instance *child)
}

int
VerilogWriter::findPortNCcount(Instance *inst,
Port *port)
VerilogWriter::findPortNCcount(const Instance *inst,
const Port *port)
{
int nc_count = 0;
LibertyPort *lib_port = network_->libertyPort(port);
Expand Down

0 comments on commit 14811a1

Please sign in to comment.