aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormyrtle <gatecat@ds0.me>2023-01-27 11:20:45 +0100
committerGitHub <noreply@github.com>2023-01-27 11:20:45 +0100
commitf80b871dd54b5215480a8eb00313a7ac16d9e883 (patch)
tree48c0fca499347e6dba1deeedec19e85cb2daaedc
parentd661d117af9b447a1ef6dc056742c521dbb33259 (diff)
parentc8cb0636562c276879ad617b6d35ec7e00b52fef (diff)
downloadnextpnr-f80b871dd54b5215480a8eb00313a7ac16d9e883.tar.gz
nextpnr-f80b871dd54b5215480a8eb00313a7ac16d9e883.tar.bz2
nextpnr-f80b871dd54b5215480a8eb00313a7ac16d9e883.zip
Merge pull request #1084 from YosysHQ/gatecat/ecp5-ioff-fix
ecp5: Improve IOFF CE handling robustness
-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");
}