design_utils: Adding some design helper functions

Signed-off-by: David Shah <davey1576@gmail.com>
This commit is contained in:
David Shah 2018-10-01 15:43:02 +01:00
parent d770eb672f
commit a4ac174ccb
2 changed files with 36 additions and 0 deletions

View File

@ -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

View File

@ -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