nextpnr/common/rulecheck.cc
ZipCPU f32b9622d5 Initial (random) placer capability
This commit also includes changes to jsonparse to allow it to
1) recognize ports with no connection, and set their net pointers to NULL
2) recognize designs with a ports node rather than a ports_direction

The rule checker has also been modified to accommodate possible NULL netlists

The ice40 chip now also has iterator operations ++bi and bi++.
2018-06-07 09:38:14 -04:00

68 lines
1.8 KiB
C++

#include <string>
#include <assert.h>
#include "design.h"
#include "log.h"
bool check_all_nets_driven(Design *design) {
const bool debug = false;
log_info("Verifying all cells\n");
for(auto cell_entry : design->cells) {
CellInfo *cell = cell_entry.second;
if (debug) log_info(" Examining cell \'%s\', of type \'%s\'\n",
cell->name.c_str(),
cell->type.c_str());
for(auto port_entry : cell->ports) {
PortInfo &port = port_entry.second;
if (debug) log_info(" Checking name of port \'%s\' "
"against \'%s\'\n",
port_entry.first.c_str(),
port.name.c_str());
assert(port.name.compare(port_entry.first)==0);
assert(port.name.size() > 0);
if (port.net == NULL) {
if (debug) log_warning(" Port \'%s\' in cell \'%s\' is unconnected\n",
port.name.c_str(), cell->name.c_str());
} else {
assert(port.net);
if (debug) log_info(" Checking for a net named \'%s\'\n",
port.net->name.c_str());
assert(design->nets.count(port.net->name)>0);
}
}
}
for(auto net_entry : design->nets) {
NetInfo *net = net_entry.second;
assert(net->name.compare(net_entry.first) == 0);
if ((net->driver.cell != NULL)
&&(net->driver.cell->type.compare("GND") != 0)
&&(net->driver.cell->type.compare("VCC") != 0)) {
if (debug) log_info(" Checking for a driver cell named \'%s\'\n",
net->driver.cell->name.c_str());
assert(design->cells.count(net->driver.cell->name) >0);
}
for(auto user : net->users) {
if ((user.cell != NULL)
&&(user.cell->type.compare("GND") != 0)
&&(user.cell->type.compare("VCC") != 0)) {
if (debug) log_info(" Checking for a user cell named \'%s\'\n",
user.cell->name.c_str());
assert(design->cells.count(user.cell->name) >0);
}
}
}
if (debug) log_info(" Verified!\n");
return true;
}