From ecc2c486d9988a44eed7c2a197b0a0e50bd96248 Mon Sep 17 00:00:00 2001 From: David Shah Date: Tue, 19 Jun 2018 13:48:04 +0200 Subject: [PATCH] ice40: Fix constant packer Signed-off-by: David Shah --- ice40/pack.cc | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/ice40/pack.cc b/ice40/pack.cc index 1569fe01..542e3e96 100644 --- a/ice40/pack.cc +++ b/ice40/pack.cc @@ -202,22 +202,32 @@ static void pack_constants(Context *ctx) std::vector dead_nets; + bool gnd_used = false, vcc_used = false; + for (auto net : ctx->nets) { NetInfo *ni = net.second; if (ni->driver.cell != nullptr && ni->driver.cell->type == ctx->id("GND")) { set_net_constant(ctx, ni, gnd_net, false); - ctx->cells[gnd_cell->name] = gnd_cell; - ctx->nets[gnd_net->name] = gnd_net; + gnd_used = true; dead_nets.push_back(net.first); } else if (ni->driver.cell != nullptr && ni->driver.cell->type == ctx->id("VCC")) { set_net_constant(ctx, ni, vcc_net, true); - ctx->cells[vcc_cell->name] = vcc_cell; - ctx->nets[vcc_net->name] = vcc_net; + vcc_used = true; dead_nets.push_back(net.first); } } + if (gnd_used) { + ctx->cells[gnd_cell->name] = gnd_cell; + ctx->nets[gnd_net->name] = gnd_net; + } + + if (vcc_used) { + ctx->cells[vcc_cell->name] = vcc_cell; + ctx->nets[vcc_net->name] = vcc_net; + } + for (auto dn : dead_nets) ctx->nets.erase(dn); }