diff options
-rw-r--r-- | json/jsonparse.cc | 17 | ||||
m--------- | tests | 0 |
2 files changed, 13 insertions, 4 deletions
diff --git a/json/jsonparse.cc b/json/jsonparse.cc index a0479c2e..eec7041c 100644 --- a/json/jsonparse.cc +++ b/json/jsonparse.cc @@ -692,11 +692,22 @@ void json_import(Context *ctx, string modname, JsonNode *node) log_info("Importing module %s\n", modname.c_str()); + JsonNode *ports_parent = nullptr; + if (node->data_dict.count("ports") > 0) + ports_parent = node->data_dict.at("ports"); + // Multiple labels might refer to the same net. For now we resolve conflicts thus: + // - (toplevel) ports are always preferred // - names with fewer $ are always prefered // - between equal $ counts, fewer .s are prefered // - ties are resolved alphabetically - auto prefer_netlabel = [](const std::string &a, const std::string &b) { + auto prefer_netlabel = [ports_parent](const std::string &a, const std::string &b) { + if (ports_parent != nullptr) { + if (ports_parent->data_dict.count(a)) + return true; + if (ports_parent->data_dict.count(b)) + return false; + } if (b.empty()) return true; long a_dollars = std::count(a.begin(), a.end(), '$'), b_dollars = std::count(b.begin(), b.end(), '$'); @@ -753,9 +764,7 @@ void json_import(Context *ctx, string modname, JsonNode *node) } } - if (node->data_dict.count("ports")) { - JsonNode *ports_parent = node->data_dict.at("ports"); - + if (ports_parent != nullptr) { // N.B. ports must be imported after cells for tristate behaviour // to be correct // Loop through all ports, first non-tristate then tristate to handle diff --git a/tests b/tests -Subproject 0d369eb3fe3425fa74c0f6309268a012aac5040 +Subproject 5182fd4bec49a568cc3fa37d62d9f9a82f28091 |