aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Shah <davey1576@gmail.com>2018-10-01 15:43:02 +0100
committerDavid Shah <davey1576@gmail.com>2018-10-01 15:43:02 +0100
commita4ac174ccbc26eeef3cb49dab89658e2b5ecd90f (patch)
tree980baf5b9c6662a932832fd302e39f668c63e2da
parentd770eb672fcaf303d391d4fb22e57b13dd130ca5 (diff)
downloadnextpnr-a4ac174ccbc26eeef3cb49dab89658e2b5ecd90f.tar.gz
nextpnr-a4ac174ccbc26eeef3cb49dab89658e2b5ecd90f.tar.bz2
nextpnr-a4ac174ccbc26eeef3cb49dab89658e2b5ecd90f.zip
design_utils: Adding some design helper functions
Signed-off-by: David Shah <davey1576@gmail.com>
-rw-r--r--common/design_utils.cc30
-rw-r--r--common/design_utils.h6
2 files changed, 36 insertions, 0 deletions
diff --git a/common/design_utils.cc b/common/design_utils.cc
index e3051d20..a0b87764 100644
--- a/common/design_utils.cc
+++ b/common/design_utils.cc
@@ -19,6 +19,7 @@
*/
#include "design_utils.h"
+#include <algorithm>
#include <map>
#include "log.h"
#include "util.h"
@@ -95,4 +96,33 @@ void connect_port(const Context *ctx, NetInfo *net, CellInfo *cell, IdString por
}
}
+void disconnect_port(const Context *ctx, CellInfo *cell, IdString port_name)
+{
+ if (!cell->ports.count(port_name))
+ return;
+ PortInfo &port = cell->ports.at(port_name);
+ if (port.net != nullptr) {
+ port.net->users.erase(std::remove_if(port.net->users.begin(), port.net->users.end(),
+ [cell, port_name](const PortRef &user) {
+ return user.cell == cell && user.port == port_name;
+ }),
+ port.net->users.end());
+ }
+}
+
+void connect_ports(Context *ctx, CellInfo *cell1, IdString port1_name, CellInfo *cell2, IdString port2_name)
+{
+ PortInfo &port1 = cell1->ports.at(port1_name);
+ if (port1.net == nullptr) {
+ // No net on port1; need to create one
+ std::unique_ptr<NetInfo> p1net(new NetInfo());
+ p1net->name = ctx->id(cell1->name.str(ctx) + "$conn$" + port1_name.str(ctx));
+ connect_port(ctx, p1net.get(), cell1, port1_name);
+ IdString p1name = p1net->name;
+ NPNR_ASSERT(!ctx->cells.count(p1name));
+ ctx->nets[p1name] = std::move(p1net);
+ }
+ connect_port(ctx, port1.net, cell2, port2_name);
+}
+
NEXTPNR_NAMESPACE_END
diff --git a/common/design_utils.h b/common/design_utils.h
index ccf2463b..8a42d21f 100644
--- a/common/design_utils.h
+++ b/common/design_utils.h
@@ -85,6 +85,12 @@ template <typename F1> CellInfo *net_driven_by(const Context *ctx, const NetInfo
// Connect a net to a port
void connect_port(const Context *ctx, NetInfo *net, CellInfo *cell, IdString port_name);
+// Disconnect a net from a port
+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);
+
void print_utilisation(const Context *ctx);
NEXTPNR_NAMESPACE_END