diff options
author | Clifford Wolf <clifford@clifford.at> | 2015-02-01 15:43:35 +0100 |
---|---|---|
committer | Clifford Wolf <clifford@clifford.at> | 2015-02-01 15:43:35 +0100 |
commit | 6978f3a77baa1220ba0f8a41ca26f5f7bc98dd0a (patch) | |
tree | 9953d379cf3c0551298048744a21c61acafa22de /backends | |
parent | 1b159bc95528fd572443d6fb543b7e21bdbbf2a5 (diff) | |
download | yosys-6978f3a77baa1220ba0f8a41ca26f5f7bc98dd0a.tar.gz yosys-6978f3a77baa1220ba0f8a41ca26f5f7bc98dd0a.tar.bz2 yosys-6978f3a77baa1220ba0f8a41ca26f5f7bc98dd0a.zip |
Added EDIF backend support for multi-bit cell ports
Diffstat (limited to 'backends')
-rw-r--r-- | backends/edif/edif.cc | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/backends/edif/edif.cc b/backends/edif/edif.cc index 15b562ca2..b089be143 100644 --- a/backends/edif/edif.cc +++ b/backends/edif/edif.cc @@ -111,7 +111,7 @@ struct EdifBackend : public Backend { log_header("Executing EDIF backend.\n"); std::string top_module_name; - std::map<RTLIL::IdString, std::set<RTLIL::IdString>> lib_cell_ports; + std::map<RTLIL::IdString, std::map<RTLIL::IdString, int>> lib_cell_ports; CellTypes ct(design); EdifNames edif_names; @@ -150,12 +150,8 @@ struct EdifBackend : public Backend { RTLIL::Cell *cell = cell_it.second; if (!design->modules_.count(cell->type) || design->modules_.at(cell->type)->get_bool_attribute("\\blackbox")) { lib_cell_ports[cell->type]; - for (auto p : cell->connections()) { - if (p.second.size() > 1) - log_error("Found multi-bit port %s on library cell %s.%s (%s): not supported in EDIF backend!\n", - RTLIL::id2cstr(p.first), RTLIL::id2cstr(module->name), RTLIL::id2cstr(cell->name), RTLIL::id2cstr(cell->type)); - lib_cell_ports[cell->type].insert(p.first); - } + for (auto p : cell->connections()) + lib_cell_ports[cell->type][p.first] = GetSize(p.second); } } } @@ -198,12 +194,15 @@ struct EdifBackend : public Backend { for (auto &port_it : cell_it.second) { const char *dir = "INOUT"; if (ct.cell_known(cell_it.first)) { - if (!ct.cell_output(cell_it.first, port_it)) + if (!ct.cell_output(cell_it.first, port_it.first)) dir = "INPUT"; - else if (!ct.cell_input(cell_it.first, port_it)) + else if (!ct.cell_input(cell_it.first, port_it.first)) dir = "OUTPUT"; } - *f << stringf(" (port %s (direction %s))\n", EDIF_DEF(port_it), dir); + if (port_it.second == 1) + *f << stringf(" (port %s (direction %s))\n", EDIF_DEF(port_it.first), dir); + else + *f << stringf(" (port (array %s %d) (direction %s))\n", EDIF_DEF(port_it.first), port_it.second, dir); } *f << stringf(" )\n"); *f << stringf(" )\n"); @@ -303,7 +302,7 @@ struct EdifBackend : public Backend { char digit_str[2] = { "0123456789abcdef"[digit_value], 0 }; hex_string = std::string(digit_str) + hex_string; } - *f << stringf("\n (property %s (string \"%s\"))", EDIF_DEF(p.first), hex_string.c_str()); + *f << stringf("\n (property %s (string \"%d'h%s\"))", EDIF_DEF(p.first), GetSize(p.second.bits), hex_string.c_str()); } *f << stringf(")\n"); for (auto &p : cell->connections()) { |