aboutsummaryrefslogtreecommitdiffstats
path: root/ecp5/pack.cc
diff options
context:
space:
mode:
Diffstat (limited to 'ecp5/pack.cc')
-rw-r--r--ecp5/pack.cc17
1 files changed, 17 insertions, 0 deletions
diff --git a/ecp5/pack.cc b/ecp5/pack.cc
index 47480dee..ef65fd27 100644
--- a/ecp5/pack.cc
+++ b/ecp5/pack.cc
@@ -844,6 +844,19 @@ class Ecp5Packer
((!constval && str_or_default(uc->params, ctx->id("LSRMUX"), "LSR") == "LSR") ||
(constval && str_or_default(uc->params, ctx->id("LSRMUX"), "LSR") == "INV"))) {
uc->ports[user.port].net = nullptr;
+ } else if (uc->type == id_DP16KD) {
+ if (user.port == id_CLKA || user.port == id_CLKB || user.port == id_RSTA || user.port == id_RSTB ||
+ user.port == id_WEA || user.port == id_WEB || user.port == id_CEA || user.port == id_CEB ||
+ user.port == id_OCEA || user.port == id_OCEB || user.port == id_CSA0 || user.port == id_CSA1 ||
+ user.port == id_CSA2 || user.port == id_CSB0 || user.port == id_CSB1 || user.port == id_CSB2) {
+ // Connect to CIB CLK, LSR or CE. Default state is 1
+ uc->params[ctx->id(user.port.str(ctx) + "MUX")] = constval ? user.port.str(ctx) : "INV";
+ } else {
+ // Connected to CIB ABCD. Default state is bitstream configurable
+ uc->params[ctx->id(user.port.str(ctx) + "MUX")] = constval ? "1" : "0";
+ }
+ uc->ports[user.port].net = nullptr;
+
} else {
uc->ports[user.port].net = constnet;
constnet->users.push_back(user);
@@ -921,6 +934,8 @@ class Ecp5Packer
// Pack EBR
void pack_ebr()
{
+ // Autoincrement WID (starting from 3 seems to match vendor behaviour?)
+ int wid = 3;
for (auto cell : sorted(ctx->cells)) {
CellInfo *ci = cell.second;
if (ci->type == id_DP16KD) {
@@ -953,6 +968,8 @@ class Ecp5Packer
autocreate_empty_port(ci, id_OCEB);
autocreate_empty_port(ci, id_WEB);
autocreate_empty_port(ci, id_RSTB);
+
+ ci->attrs[ctx->id("WID")] = std::to_string(wid++);
}
}
}