aboutsummaryrefslogtreecommitdiffstats
path: root/ecp5
diff options
context:
space:
mode:
authorgatecat <gatecat@ds0.me>2023-02-09 11:12:15 +0100
committergatecat <gatecat@ds0.me>2023-02-09 11:12:15 +0100
commita8a88d4813b63d8ec1ed93eaedc27ec2c8e14c7c (patch)
tree18bab67409871c2aaf3103255b815c0bc4cb1b03 /ecp5
parenta93f49eb04f4086065fd6fd8e6f777743f2509ff (diff)
downloadnextpnr-a8a88d4813b63d8ec1ed93eaedc27ec2c8e14c7c.tar.gz
nextpnr-a8a88d4813b63d8ec1ed93eaedc27ec2c8e14c7c.tar.bz2
nextpnr-a8a88d4813b63d8ec1ed93eaedc27ec2c8e14c7c.zip
ecp5: Handle the case where both CE are the same constant
Signed-off-by: gatecat <gatecat@ds0.me>
Diffstat (limited to 'ecp5')
-rw-r--r--ecp5/pack.cc10
1 files changed, 8 insertions, 2 deletions
diff --git a/ecp5/pack.cc b/ecp5/pack.cc
index 79d1688f..23d3a1ae 100644
--- a/ecp5/pack.cc
+++ b/ecp5/pack.cc
@@ -1508,6 +1508,10 @@ class Ecp5Packer
// Check if two nets have identical constant drivers
bool equal_constant(NetInfo *a, NetInfo *b)
{
+ if (a == nullptr && b == nullptr)
+ return true;
+ if ((a == nullptr) != (b == nullptr))
+ return false;
if (a->driver.cell == nullptr || b->driver.cell == nullptr)
return (a->driver.cell == nullptr && b->driver.cell == nullptr);
if (a->driver.cell->type != id_GND && a->driver.cell->type != id_VCC)
@@ -2237,7 +2241,8 @@ class Ecp5Packer
iol->params[id_CEMUX] = str_or_default(ci->params, id_CEMUX, "CE");
ci->movePortTo(id_CE, iol, id_CE);
} else {
- if (iol->getPort(id_CE) != ci->getPort(id_CE) ||
+ if ((iol->getPort(id_CE) != ci->getPort(id_CE) &&
+ !equal_constant(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 "
@@ -2303,7 +2308,8 @@ class Ecp5Packer
iol->params[id_CEMUX] = str_or_default(ci->params, id_CEMUX, "CE");
ci->movePortTo(id_CE, iol, id_CE);
} else {
- if (iol->getPort(id_CE) != ci->getPort(id_CE) ||
+ if ((iol->getPort(id_CE) != ci->getPort(id_CE) &&
+ !equal_constant(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 "