aboutsummaryrefslogtreecommitdiffstats
path: root/ice40
diff options
context:
space:
mode:
authorDavid Shah <davey1576@gmail.com>2018-06-13 14:01:42 +0200
committerDavid Shah <davey1576@gmail.com>2018-06-13 14:01:42 +0200
commit9374ef29bf24c6a9223e7b6742e3debd66a66bf9 (patch)
tree3e189679d0e6b1184699c058f78533467202db91 /ice40
parent991cf1979baaf12d83dc50c223160879d08bdd3a (diff)
downloadnextpnr-9374ef29bf24c6a9223e7b6742e3debd66a66bf9.tar.gz
nextpnr-9374ef29bf24c6a9223e7b6742e3debd66a66bf9.tar.bz2
nextpnr-9374ef29bf24c6a9223e7b6742e3debd66a66bf9.zip
Fixing implementation of constants
Signed-off-by: David Shah <davey1576@gmail.com>
Diffstat (limited to 'ice40')
-rw-r--r--ice40/icebreaker.pcf5
-rw-r--r--ice40/icebreaker.v9
-rw-r--r--ice40/pack.cc46
3 files changed, 52 insertions, 8 deletions
diff --git a/ice40/icebreaker.pcf b/ice40/icebreaker.pcf
index 4564c84e..bc4a2974 100644
--- a/ice40/icebreaker.pcf
+++ b/ice40/icebreaker.pcf
@@ -3,7 +3,12 @@ set_io led2 25
set_io led3 21
set_io led4 23
set_io led5 26
+set_io ledr 11
+set_io ledg 37
+
set_io clki 35
set_io btn1 20
set_io btn2 19
set_io btn3 18
+set_io btn_n 10
+
diff --git a/ice40/icebreaker.v b/ice40/icebreaker.v
index 2ad2397d..1c8c0863 100644
--- a/ice40/icebreaker.v
+++ b/ice40/icebreaker.v
@@ -3,11 +3,15 @@ module icebreaker (
input btn1,
input btn2,
input btn3,
+ input btn_n,
+
output led1,
output led2,
output led3,
output led4,
- output led5
+ output led5,
+ output ledr,
+ output ledg,
);
wire clk;
SB_GB clk_gb(.USER_SIGNAL_TO_GLOBAL_BUFFER(clki), .GLOBAL_BUFFER_OUTPUT(clk));
@@ -22,5 +26,6 @@ module icebreaker (
outcnt <= counter >> LOG2DELAY;
end
assign {led1, led2, led3, led4, led5} = outcnt ^ (outcnt >> 1);
- //assign {led1, led2, led3, led4, led5} = {!btn1, btn2, btn3, btn2, btn1};
+
+ assign {ledr, ledg} = ~(!btn_n + btn1 + btn2 + btn3);
endmodule
diff --git a/ice40/pack.cc b/ice40/pack.cc
index 72dcadea..49c95ad6 100644
--- a/ice40/pack.cc
+++ b/ice40/pack.cc
@@ -110,28 +110,62 @@ static void pack_nonlut_ffs(Design *design)
}
}
+// Merge a net into a constant net
+static void set_net_constant(NetInfo *orig, NetInfo *constnet, bool constval)
+{
+ orig->driver.cell = nullptr;
+ for (auto user : orig->users) {
+ if (user.cell != nullptr) {
+ CellInfo *uc = user.cell;
+ log_info("%s user %s\n", orig->name.c_str(), uc->name.c_str());
+ if (is_lut(uc) && (user.port.str().at(0) == 'I') && !constval) {
+ uc->ports[user.port].net = nullptr;
+ } else {
+ uc->ports[user.port].net = constnet;
+ constnet->users.push_back(user);
+ }
+ }
+ }
+ orig->users.clear();
+}
+
// Pack constants (simple implementation)
static void pack_constants(Design *design)
{
CellInfo *gnd_cell = create_ice_cell(design, "ICESTORM_LC", "$PACKER_GND");
- gnd_cell->attrs["LUT_INIT"] = "0";
+ gnd_cell->params["LUT_INIT"] = "0";
+ NetInfo *gnd_net = new NetInfo;
+ gnd_net->name = "$PACKER_GND_NET";
+ gnd_net->driver.cell = gnd_cell;
+ gnd_net->driver.port = "O";
CellInfo *vcc_cell = create_ice_cell(design, "ICESTORM_LC", "$PACKER_VCC");
- vcc_cell->attrs["LUT_INIT"] = "1";
+ vcc_cell->params["LUT_INIT"] = "1";
+ NetInfo *vcc_net = new NetInfo;
+ vcc_net->name = "$PACKER_VCC_NET";
+ vcc_net->driver.cell = vcc_cell;
+ vcc_net->driver.port = "O";
+
+ std::vector<IdString> dead_nets;
for (auto net : design->nets) {
NetInfo *ni = net.second;
if (ni->driver.cell != nullptr && ni->driver.cell->type == "GND") {
- ni->driver.cell = gnd_cell;
- ni->driver.port = "O";
+ set_net_constant(ni, gnd_net, false);
design->cells[gnd_cell->name] = gnd_cell;
+ design->nets[gnd_net->name] = gnd_net;
+ dead_nets.push_back(net.first);
} else if (ni->driver.cell != nullptr &&
ni->driver.cell->type == "VCC") {
- ni->driver.cell = vcc_cell;
- ni->driver.port = "O";
+ set_net_constant(ni, vcc_net, true);
design->cells[vcc_cell->name] = vcc_cell;
+ design->nets[vcc_net->name] = vcc_net;
+ dead_nets.push_back(net.first);
}
}
+
+ for (auto dn : dead_nets)
+ design->nets.erase(dn);
}
static bool is_nextpnr_iob(CellInfo *cell)