aboutsummaryrefslogtreecommitdiffstats
path: root/ecp5
diff options
context:
space:
mode:
authorgatecat <gatecat@ds0.me>2023-01-25 09:26:12 +0100
committergatecat <gatecat@ds0.me>2023-01-25 09:26:12 +0100
commitc8cb0636562c276879ad617b6d35ec7e00b52fef (patch)
tree6a9893c8e10aa3df815ad6c1fa1c7ecb17f4ed2e /ecp5
parentb9ed39bc1c8668c0d17b73515568b4fb01d0e9ca (diff)
downloadnextpnr-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.cc32
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");
}