ice40: Pack constants to LCs

Signed-off-by: David Shah <davey1576@gmail.com>
This commit is contained in:
David Shah 2018-06-12 13:09:36 +02:00
parent f72807f790
commit 67a5cedbe3
4 changed files with 35 additions and 8 deletions

View File

@ -1,3 +1,3 @@
read_verilog blinky.v
synth_ice40 -nocarry -top blinky
write_json blinky.json
write_json blinky_nopack.json

8
ice40/blinky_noyspack.sh Executable file
View File

@ -0,0 +1,8 @@
#!/bin/bash
set -ex
yosys blinky_nopack.ys
../nextpnr-ice40 --json blinky_nopack.json --asc blinky.asc --pack
icepack blinky.asc blinky.bin
icebox_vlog blinky.asc > blinky_chip.v
iverilog -o blinky_tb blinky_chip.v blinky_tb.v
vvp -N ./blinky_tb

View File

@ -1,9 +1,3 @@
read_verilog icebreaker.v
read_verilog -lib +/ice40/cells_sim.v
synth -top icebreaker
abc -lut 4
techmap -map blinky_map.v
splitnets
opt_clean
stat
synth_ice40 -nocarry -top icebreaker
write_json icebreaker.json

View File

@ -89,9 +89,34 @@ static void pack_nonlut_ffs(Design *design)
}
}
// 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";
CellInfo *vcc_cell = create_ice_cell(design, "ICESTORM_LC",
"$PACKER_VCC");
vcc_cell->attrs["LUT_INIT"] = "1";
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";
design->cells[gnd_cell->name] = gnd_cell;
} else if (ni->driver.cell != nullptr && ni->driver.cell->type == "VCC") {
ni->driver.cell = vcc_cell;
ni->driver.port = "O";
design->cells[vcc_cell->name] = vcc_cell;
}
}
}
// Main pack function
void pack_design(Design *design)
{
pack_constants(design);
pack_lut_lutffs(design);
pack_nonlut_ffs(design);
}