aboutsummaryrefslogtreecommitdiffstats
path: root/json
diff options
context:
space:
mode:
authorDavid Shah <dave@ds0.me>2019-03-20 16:05:43 +0000
committerDavid Shah <dave@ds0.me>2019-03-20 16:07:47 +0000
commit997a66791e13c8e983fcd01473d51a66cbb971b7 (patch)
tree013f1e858cc2e38041431a00b0ae1de8a15a4b74 /json
parentcadbf42054f224d84e5c5800baf82c0fa3a2a6db (diff)
downloadnextpnr-997a66791e13c8e983fcd01473d51a66cbb971b7.tar.gz
nextpnr-997a66791e13c8e983fcd01473d51a66cbb971b7.tar.bz2
nextpnr-997a66791e13c8e983fcd01473d51a66cbb971b7.zip
json: Fix inputs directly driving inouts
Signed-off-by: David Shah <dave@ds0.me>
Diffstat (limited to 'json')
-rw-r--r--json/jsonparse.cc17
1 files changed, 16 insertions, 1 deletions
diff --git a/json/jsonparse.cc b/json/jsonparse.cc
index 5f4df0a2..a0479c2e 100644
--- a/json/jsonparse.cc
+++ b/json/jsonparse.cc
@@ -758,11 +758,26 @@ void json_import(Context *ctx, string modname, JsonNode *node)
// N.B. ports must be imported after cells for tristate behaviour
// to be correct
- // Loop through all ports
+ // Loop through all ports, first non-tristate then tristate to handle
+ // interconnected ports correctly
for (int portid = 0; portid < GetSize(ports_parent->data_dict_keys); portid++) {
JsonNode *here;
here = ports_parent->data_dict.at(ports_parent->data_dict_keys[portid]);
+ JsonNode *dir_node = here->data_dict.at("direction");
+ NPNR_ASSERT(dir_node->type == 'S');
+ if (dir_node->data_string == "inout")
+ continue;
+ json_import_toplevel_port(ctx, modname, netids, ports_parent->data_dict_keys[portid], here);
+ }
+ for (int portid = 0; portid < GetSize(ports_parent->data_dict_keys); portid++) {
+ JsonNode *here;
+
+ here = ports_parent->data_dict.at(ports_parent->data_dict_keys[portid]);
+ JsonNode *dir_node = here->data_dict.at("direction");
+ NPNR_ASSERT(dir_node->type == 'S');
+ if (dir_node->data_string != "inout")
+ continue;
json_import_toplevel_port(ctx, modname, netids, ports_parent->data_dict_keys[portid], here);
}
}