diff options
Diffstat (limited to 'common/design_utils.cc')
-rw-r--r-- | common/design_utils.cc | 143 |
1 files changed, 0 insertions, 143 deletions
diff --git a/common/design_utils.cc b/common/design_utils.cc index 9432b6cd..f52cc304 100644 --- a/common/design_utils.cc +++ b/common/design_utils.cc @@ -25,42 +25,6 @@ #include "util.h" NEXTPNR_NAMESPACE_BEGIN -void replace_port(CellInfo *old_cell, IdString old_name, CellInfo *rep_cell, IdString rep_name) -{ - if (!old_cell->ports.count(old_name)) - return; - PortInfo &old = old_cell->ports.at(old_name); - - // Create port on the replacement cell if it doesn't already exist - if (!rep_cell->ports.count(rep_name)) { - rep_cell->ports[rep_name].name = rep_name; - rep_cell->ports[rep_name].type = old.type; - } - - PortInfo &rep = rep_cell->ports.at(rep_name); - NPNR_ASSERT(old.type == rep.type); - - rep.net = old.net; - old.net = nullptr; - if (rep.type == PORT_OUT) { - if (rep.net != nullptr) { - rep.net->driver.cell = rep_cell; - rep.net->driver.port = rep_name; - } - } else if (rep.type == PORT_IN) { - if (rep.net != nullptr) { - for (PortRef &load : rep.net->users) { - if (load.cell == old_cell && load.port == old_name) { - load.cell = rep_cell; - load.port = rep_name; - } - } - } - } else { - NPNR_ASSERT(false); - } -} - // Print utilisation of a design void print_utilisation(const Context *ctx) { @@ -85,111 +49,4 @@ void print_utilisation(const Context *ctx) log_break(); } -// Connect a net to a port -void connect_port(const Context *ctx, NetInfo *net, CellInfo *cell, IdString port_name) -{ - if (net == nullptr) - return; - PortInfo &port = cell->ports.at(port_name); - NPNR_ASSERT(port.net == nullptr); - port.net = net; - if (port.type == PORT_OUT) { - NPNR_ASSERT(net->driver.cell == nullptr); - net->driver.cell = cell; - net->driver.port = port_name; - } else if (port.type == PORT_IN || port.type == PORT_INOUT) { - PortRef user; - user.cell = cell; - user.port = port_name; - net->users.push_back(user); - } else { - NPNR_ASSERT_FALSE("invalid port type for connect_port"); - } -} - -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()); - if (port.net->driver.cell == cell && port.net->driver.port == port_name) - port.net->driver.cell = nullptr; - port.net = nullptr; - } -} - -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 - NetInfo *p1net = ctx->createNet(ctx->id(cell1->name.str(ctx) + "$conn$" + port1_name.str(ctx))); - connect_port(ctx, p1net, cell1, port1_name); - } - 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; -} - -void rename_net(Context *ctx, NetInfo *net, IdString new_name) -{ - if (net == nullptr) - return; - NPNR_ASSERT(!ctx->nets.count(new_name)); - ctx->nets[new_name]; - std::swap(ctx->nets.at(net->name), ctx->nets.at(new_name)); - ctx->nets.erase(net->name); - net->name = new_name; -} - -void replace_bus(Context *ctx, CellInfo *old_cell, IdString old_name, int old_offset, bool old_brackets, - CellInfo *new_cell, IdString new_name, int new_offset, bool new_brackets, int width) -{ - for (int i = 0; i < width; i++) { - IdString old_port = ctx->id(stringf(old_brackets ? "%s[%d]" : "%s%d", old_name.c_str(ctx), i + old_offset)); - IdString new_port = ctx->id(stringf(new_brackets ? "%s[%d]" : "%s%d", new_name.c_str(ctx), i + new_offset)); - replace_port(old_cell, old_port, new_cell, new_port); - } -} - -void copy_port(Context *ctx, CellInfo *old_cell, IdString old_name, CellInfo *new_cell, IdString new_name) -{ - if (!old_cell->ports.count(old_name)) - return; - new_cell->ports[new_name].name = new_name; - new_cell->ports[new_name].type = old_cell->ports.at(old_name).type; - connect_port(ctx, old_cell->ports.at(old_name).net, new_cell, new_name); -} - -void copy_bus(Context *ctx, CellInfo *old_cell, IdString old_name, int old_offset, bool old_brackets, - CellInfo *new_cell, IdString new_name, int new_offset, bool new_brackets, int width) -{ - for (int i = 0; i < width; i++) { - IdString old_port = ctx->id(stringf(old_brackets ? "%s[%d]" : "%s%d", old_name.c_str(ctx), i + old_offset)); - IdString new_port = ctx->id(stringf(new_brackets ? "%s[%d]" : "%s%d", new_name.c_str(ctx), i + new_offset)); - copy_port(ctx, old_cell, old_port, new_cell, new_port); - } -} - NEXTPNR_NAMESPACE_END |