Merge pull request #1084 from YosysHQ/gatecat/ecp5-ioff-fix

ecp5: Improve IOFF CE handling robustness
This commit is contained in:
myrtle 2023-01-27 11:20:45 +01:00 committed by GitHub
commit f80b871dd5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -2230,13 +2230,21 @@ class Ecp5Packer
// Handle CLK and CE muxes // Handle CLK and CE muxes
if (str_or_default(ci->params, id_CLKMUX) == "INV") if (str_or_default(ci->params, id_CLKMUX) == "INV")
iol->params[id_CLKIMUX] = std::string("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_CEIMUX] = std::string("CEMUX");
iol->params[id_CEMUX] = std::string("CE"); if (iol->getPort(id_CE) == nullptr) {
if (ci->getPort(id_CE) == nullptr) iol->params[id_CEMUX] = str_or_default(ci->params, id_CEMUX, "CE");
ci->movePortTo(id_CE, iol, id_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); ci->disconnectPort(id_CE);
}
} else { } else {
iol->params[id_CEIMUX] = std::string("1"); iol->params[id_CEIMUX] = std::string("1");
} }
@ -2288,13 +2296,21 @@ class Ecp5Packer
// Handle CLK and CE muxes // Handle CLK and CE muxes
if (str_or_default(ci->params, id_CLKMUX) == "INV") if (str_or_default(ci->params, id_CLKMUX) == "INV")
iol->params[id_CLKOMUX] = std::string("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_CEOMUX] = std::string("CEMUX");
iol->params[id_CEMUX] = std::string("CE"); if (iol->getPort(id_CE) == nullptr) {
if (ci->getPort(id_CE) == nullptr) iol->params[id_CEMUX] = str_or_default(ci->params, id_CEMUX, "CE");
ci->movePortTo(id_CE, iol, id_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); ci->disconnectPort(id_CE);
}
} else { } else {
iol->params[id_CEOMUX] = std::string("1"); iol->params[id_CEOMUX] = std::string("1");
} }