diff options
author | gatecat <gatecat@ds0.me> | 2023-01-25 09:26:12 +0100 |
---|---|---|
committer | gatecat <gatecat@ds0.me> | 2023-01-25 09:26:12 +0100 |
commit | c8cb0636562c276879ad617b6d35ec7e00b52fef (patch) | |
tree | 6a9893c8e10aa3df815ad6c1fa1c7ecb17f4ed2e /ecp5 | |
parent | b9ed39bc1c8668c0d17b73515568b4fb01d0e9ca (diff) | |
download | nextpnr-c8cb0636562c276879ad617b6d35ec7e00b52fef.tar.gz nextpnr-c8cb0636562c276879ad617b6d35ec7e00b52fef.tar.bz2 nextpnr-c8cb0636562c276879ad617b6d35ec7e00b52fef.zip |
ecp5: Improve IOFF CE handling robustness
Signed-off-by: gatecat <gatecat@ds0.me>
Diffstat (limited to 'ecp5')
-rw-r--r-- | ecp5/pack.cc | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/ecp5/pack.cc b/ecp5/pack.cc index f542934d..79d1688f 100644 --- a/ecp5/pack.cc +++ b/ecp5/pack.cc @@ -2230,13 +2230,21 @@ class Ecp5Packer // Handle CLK and CE muxes if (str_or_default(ci->params, id_CLKMUX) == "INV") iol->params[id_CLKIMUX] = std::string("INV"); - if (str_or_default(ci->params, id_CEMUX, "CE") == "CE") { + if (str_or_default(ci->params, id_CEMUX, "CE") == "CE" || + str_or_default(ci->params, id_CEMUX, "CE") == "INV") { iol->params[id_CEIMUX] = std::string("CEMUX"); - iol->params[id_CEMUX] = std::string("CE"); - if (ci->getPort(id_CE) == nullptr) + if (iol->getPort(id_CE) == nullptr) { + iol->params[id_CEMUX] = str_or_default(ci->params, id_CEMUX, "CE"); ci->movePortTo(id_CE, iol, id_CE); - else + } else { + if (iol->getPort(id_CE) != ci->getPort(id_CE) || + str_or_default(ci->params, id_CEMUX, "CE") != + str_or_default(iol->params, id_CEMUX, "CE")) + log_error("CE signal or polarity mismatch for IO flipflop %s with other IOFFs at " + "location.\n", + ctx->nameOf(ci)); ci->disconnectPort(id_CE); + } } else { iol->params[id_CEIMUX] = std::string("1"); } @@ -2288,13 +2296,21 @@ class Ecp5Packer // Handle CLK and CE muxes if (str_or_default(ci->params, id_CLKMUX) == "INV") iol->params[id_CLKOMUX] = std::string("INV"); - if (str_or_default(ci->params, id_CEMUX, "CE") == "CE") { + if (str_or_default(ci->params, id_CEMUX, "CE") == "CE" || + str_or_default(ci->params, id_CEMUX, "CE") == "INV") { iol->params[id_CEOMUX] = std::string("CEMUX"); - iol->params[id_CEMUX] = std::string("CE"); - if (ci->getPort(id_CE) == nullptr) + if (iol->getPort(id_CE) == nullptr) { + iol->params[id_CEMUX] = str_or_default(ci->params, id_CEMUX, "CE"); ci->movePortTo(id_CE, iol, id_CE); - else + } else { + if (iol->getPort(id_CE) != ci->getPort(id_CE) || + str_or_default(ci->params, id_CEMUX, "CE") != + str_or_default(iol->params, id_CEMUX, "CE")) + log_error("CE signal or polarity mismatch for IO flipflop %s with other IOFFs at " + "location.\n", + ctx->nameOf(ci)); ci->disconnectPort(id_CE); + } } else { iol->params[id_CEOMUX] = std::string("1"); } |