aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Shah <davey1576@gmail.com>2019-03-21 12:36:11 +0000
committerGitHub <noreply@github.com>2019-03-21 12:36:11 +0000
commit0d064c05f91b548638530e6e159ca9f8aa0fa352 (patch)
tree98cd8f35fd28dfc7c7dbcd17cb1b439fab892d35
parent85bff663932db051a4f7760e9a02bfd20e471108 (diff)
parent997a66791e13c8e983fcd01473d51a66cbb971b7 (diff)
downloadnextpnr-0d064c05f91b548638530e6e159ca9f8aa0fa352.tar.gz
nextpnr-0d064c05f91b548638530e6e159ca9f8aa0fa352.tar.bz2
nextpnr-0d064c05f91b548638530e6e159ca9f8aa0fa352.zip
Merge pull request #252 from YosysHQ/tristate_json
json: Fix inputs directly driving inouts
-rw-r--r--common/placer1.cc2
-rw-r--r--json/jsonparse.cc17
m---------tests0
3 files changed, 17 insertions, 2 deletions
diff --git a/common/placer1.cc b/common/placer1.cc
index cec37847..5b72602f 100644
--- a/common/placer1.cc
+++ b/common/placer1.cc
@@ -230,7 +230,7 @@ class SAPlacer
double upper = 0.6, lower = 0.4;
- if (curr_metric < 0.95 * avg_metric) {
+ if (curr_metric < 0.95 * avg_metric && curr_metric > 0) {
avg_metric = 0.8 * avg_metric + 0.2 * curr_metric;
} else {
if (Raccept >= 0.8) {
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);
}
}
diff --git a/tests b/tests
-Subproject ee3ff3c4bdce20c47bd6c35a2f7430497b28380
+Subproject f29dcbe187b517d01964b1074eb7ff0b90849ee