diff options
author | Clifford Wolf <clifford@clifford.at> | 2018-06-10 16:31:06 +0200 |
---|---|---|
committer | Clifford Wolf <clifford@clifford.at> | 2018-06-10 16:31:06 +0200 |
commit | 602e6fab1e1d90a00b868733953a0d25632d8414 (patch) | |
tree | e4920eb7f3f1d6dd9867b86ee75f4aac334f1081 /ice40/bitstream.cc | |
parent | 02b83d6db6c2d0d690b302459fbe490eaa5d140c (diff) | |
download | nextpnr-602e6fab1e1d90a00b868733953a0d25632d8414.tar.gz nextpnr-602e6fab1e1d90a00b868733953a0d25632d8414.tar.bz2 nextpnr-602e6fab1e1d90a00b868733953a0d25632d8414.zip |
Add support for iCE40 global buffers (currently only for 1k devices)
Signed-off-by: Clifford Wolf <clifford@clifford.at>
Diffstat (limited to 'ice40/bitstream.cc')
-rw-r--r-- | ice40/bitstream.cc | 31 |
1 files changed, 28 insertions, 3 deletions
diff --git a/ice40/bitstream.cc b/ice40/bitstream.cc index 9b749717..17b1b6cf 100644 --- a/ice40/bitstream.cc +++ b/ice40/bitstream.cc @@ -192,6 +192,8 @@ void write_asc(const Design &design, std::ostream &out) set_config(ti, config.at(iey).at(iex), "IoCtrl.REN_" + std::to_string(iez), !pullup); } + } else if (cell.second->type == "SB_GB") { + // no cell config bits } else { assert(false); } @@ -216,18 +218,41 @@ void write_asc(const Design &design, std::ostream &out) } } - // Set other config bits - currently just disable RAM to stop icebox_vlog - // crashing - // TODO: ColBufCtrl + // Set other config bits for (int y = 0; y < ci.height; y++) { for (int x = 0; x < ci.width; x++) { TileType tile = tile_at(chip, x, y); TileInfoPOD &ti = bi.tiles_nonrouting[tile]; + + // disable RAM to stop icebox_vlog crashing (FIXME) if ((tile == TILE_RAMB) && (chip.args.type == ChipArgs::LP1K || chip.args.type == ChipArgs::HX1K)) { set_config(ti, config.at(y).at(x), "RamConfig.PowerUp", true); } + + // set all ColBufCtrl bits (FIXME) + bool setColBufCtrl = true; + if (chip.args.type == ChipArgs::LP1K || chip.args.type == ChipArgs::HX1K) { + if (tile == TILE_RAMB || tile == TILE_RAMT) { + setColBufCtrl = (y == 3 || y == 5 || y == 11 || y == 13); + } else { + setColBufCtrl = (y == 4 || y == 5 || y == 12 || y == 13); + } + } else if (chip.args.type == ChipArgs::LP8K || chip.args.type == ChipArgs::HX8K) { + setColBufCtrl = (y == 8 || y == 9 || y == 24 || y == 25); + } + if (setColBufCtrl) { + set_config(ti, config.at(y).at(x), "ColBufCtrl.glb_netwk_0", true); + set_config(ti, config.at(y).at(x), "ColBufCtrl.glb_netwk_1", true); + set_config(ti, config.at(y).at(x), "ColBufCtrl.glb_netwk_2", true); + set_config(ti, config.at(y).at(x), "ColBufCtrl.glb_netwk_3", true); + set_config(ti, config.at(y).at(x), "ColBufCtrl.glb_netwk_4", true); + set_config(ti, config.at(y).at(x), "ColBufCtrl.glb_netwk_5", true); + set_config(ti, config.at(y).at(x), "ColBufCtrl.glb_netwk_6", true); + set_config(ti, config.at(y).at(x), "ColBufCtrl.glb_netwk_7", true); + } } } + // Write config out for (int y = 0; y < ci.height; y++) { for (int x = 0; x < ci.width; x++) { |