From c8cb0636562c276879ad617b6d35ec7e00b52fef Mon Sep 17 00:00:00 2001 From: gatecat Date: Wed, 25 Jan 2023 09:26:12 +0100 Subject: ecp5: Improve IOFF CE handling robustness Signed-off-by: gatecat --- ecp5/pack.cc | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) (limited to 'ecp5/pack.cc') 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"); } -- cgit v1.2.3