aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Shah <dave@ds0.me>2019-05-10 18:51:45 +0100
committerDavid Shah <dave@ds0.me>2019-05-10 18:51:45 +0100
commit12f375a239a8695f027c80c8c01d5fb1dff6568d (patch)
tree84f1d7cd502055f28df4a8f055bf79538ec05a89
parent5344bc3b65f4e06f983db781e9a82d30b3f1512b (diff)
downloadnextpnr-12f375a239a8695f027c80c8c01d5fb1dff6568d.tar.gz
nextpnr-12f375a239a8695f027c80c8c01d5fb1dff6568d.tar.bz2
nextpnr-12f375a239a8695f027c80c8c01d5fb1dff6568d.zip
ecp5: Fix USRMCLK primitive
Signed-off-by: David Shah <dave@ds0.me>
-rw-r--r--common/design_utils.cc17
-rw-r--r--common/design_utils.h3
-rw-r--r--ecp5/pack.cc14
3 files changed, 34 insertions, 0 deletions
diff --git a/common/design_utils.cc b/common/design_utils.cc
index da170030..bdf5ca5c 100644
--- a/common/design_utils.cc
+++ b/common/design_utils.cc
@@ -129,4 +129,21 @@ void connect_ports(Context *ctx, CellInfo *cell1, IdString port1_name, CellInfo
connect_port(ctx, port1.net, cell2, port2_name);
}
+void rename_port(Context *ctx, CellInfo *cell, IdString old_name, IdString new_name)
+{
+ if (!cell->ports.count(old_name))
+ return;
+ PortInfo pi = cell->ports.at(old_name);
+ if (pi.net != nullptr) {
+ if (pi.net->driver.cell == cell && pi.net->driver.port == old_name)
+ pi.net->driver.port = new_name;
+ for (auto &usr : pi.net->users)
+ if (usr.cell == cell && usr.port == old_name)
+ usr.port = new_name;
+ }
+ cell->ports.erase(old_name);
+ pi.name = new_name;
+ cell->ports[new_name] = pi;
+}
+
NEXTPNR_NAMESPACE_END
diff --git a/common/design_utils.h b/common/design_utils.h
index 8a42d21f..3eb9024f 100644
--- a/common/design_utils.h
+++ b/common/design_utils.h
@@ -91,6 +91,9 @@ void disconnect_port(const Context *ctx, CellInfo *cell, IdString port_name);
// Connect two ports together
void connect_ports(Context *ctx, CellInfo *cell1, IdString port1_name, CellInfo *cell2, IdString port2_name);
+// Rename a port if it exists on a cell
+void rename_port(Context *ctx, CellInfo *cell, IdString old_name, IdString new_name);
+
void print_utilisation(const Context *ctx);
NEXTPNR_NAMESPACE_END
diff --git a/ecp5/pack.cc b/ecp5/pack.cc
index 1b07c2ae..7f00de1f 100644
--- a/ecp5/pack.cc
+++ b/ecp5/pack.cc
@@ -1390,6 +1390,19 @@ class Ecp5Packer
}
}
+ // Miscellaneous packer tasks
+ void pack_misc()
+ {
+ for (auto cell : sorted(ctx->cells)) {
+ CellInfo *ci = cell.second;
+ if (ci->type == id_USRMCLK) {
+ rename_port(ctx, ci, ctx->id("USRMCLKI"), id_PADDO);
+ rename_port(ctx, ci, ctx->id("USRMCLKTS"), id_PADDT);
+ rename_port(ctx, ci, ctx->id("USRMCLKO"), id_PADDI);
+ }
+ }
+ }
+
// Preplace PLL
void preplace_plls()
{
@@ -2371,6 +2384,7 @@ class Ecp5Packer
pack_ebr();
pack_dsps();
pack_dcus();
+ pack_misc();
preplace_plls();
pack_constants();
pack_dram();