aboutsummaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
Diffstat (limited to 'common')
-rw-r--r--common/design.h6
-rw-r--r--common/rulecheck.cc61
2 files changed, 64 insertions, 3 deletions
diff --git a/common/design.h b/common/design.h
index 4ff28855..314c2fd7 100644
--- a/common/design.h
+++ b/common/design.h
@@ -109,7 +109,7 @@ struct CellInfo
BelId bel;
// cell_port -> bel_pin
- dict<IdString, IdString> pins;
+ dict<IdString, IdString> pins;
};
struct Design
@@ -120,8 +120,8 @@ struct Design
// ...
}
- dict<IdString, NetInfo*> nets;
- dict<IdString, CellInfo*> cells;
+ dict<IdString, NetInfo*> nets;
+ dict<IdString, CellInfo*> cells;
};
#endif
diff --git a/common/rulecheck.cc b/common/rulecheck.cc
new file mode 100644
index 00000000..4b355368
--- /dev/null
+++ b/common/rulecheck.cc
@@ -0,0 +1,61 @@
+#include <string>
+#include <assert.h>
+#include "common/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.net);
+ assert(port.name.size() > 0);
+ if (debug) log_info(" Checking for a net named \'%s\'\n",
+ port.net->name.c_str());
+ assert(design->nets.count(port.net->name)>0);
+ // assert(design->nets[port.net->name]->driver.cell);
+ }
+ }
+
+ 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");
+}
+