From 23b1fc02fb8e6bde8d9f1c444c8eb357d2301774 Mon Sep 17 00:00:00 2001 From: David Shah Date: Fri, 15 Jun 2018 21:29:15 +0200 Subject: ice40: Bitstream generation for RAM Signed-off-by: David Shah --- ice40/bitstream.cc | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) (limited to 'ice40') diff --git a/ice40/bitstream.cc b/ice40/bitstream.cc index 7952a8a1..152d8eed 100644 --- a/ice40/bitstream.cc +++ b/ice40/bitstream.cc @@ -198,11 +198,37 @@ void write_asc(const Design &design, std::ostream &out) } } else if (cell.second->type == "SB_GB") { // no cell config bits + } else if (cell.second->type == "ICESTORM_RAM") { + const BelInfoPOD &beli = ci.bel_data[bel.index]; + int x = beli.x, y = beli.y; + const TileInfoPOD &ti_ramt = bi.tiles_nonrouting[TILE_RAMT]; + const TileInfoPOD &ti_ramb = bi.tiles_nonrouting[TILE_RAMB]; + if (!(chip.args.type == ChipArgs::LP1K || + chip.args.type == ChipArgs::HX1K)) { + set_config(ti_ramb, config.at(y).at(x), "RamConfig.PowerUp", + true); + } + bool negclk_r = std::stoi(cell.second->params.at("NEG_CLK_R")); + bool negclk_w = std::stoi(cell.second->params.at("NEG_CLK_W")); + int write_mode = std::stoi(cell.second->params.at("WRITE_MODE")); + int read_mode = std::stoi(cell.second->params.at("READ_MODE")); + set_config(ti_ramb, config.at(y).at(x), "NegClk", negclk_w); + set_config(ti_ramt, config.at(y + 1).at(x), "NegClk", negclk_r); + + set_config(ti_ramt, config.at(y + 1).at(x), "RamConfig.CBIT_0", + write_mode & 0x1); + set_config(ti_ramt, config.at(y + 1).at(x), "RamConfig.CBIT_1", + write_mode & 0x2); + set_config(ti_ramt, config.at(y + 1).at(x), "RamConfig.CBIT_2", + read_mode & 0x1); + set_config(ti_ramt, config.at(y + 1).at(x), "RamConfig.CBIT_3", + read_mode & 0x2); + } else { assert(false); } } - // Set config bits in unused IO + // Set config bits in unused IO and RAM for (auto bel : chip.getBels()) { if (chip.bel_to_cell[bel.index] == IdString() && chip.getBelType(bel) == TYPE_SB_IO) { @@ -221,6 +247,15 @@ void write_asc(const Design &design, std::ostream &out) "IoCtrl.REN_" + std::to_string(iez), false); } } + } else if (chip.bel_to_cell[bel.index] == IdString() && + chip.getBelType(bel) == TYPE_ICESTORM_RAM) { + const BelInfoPOD &beli = ci.bel_data[bel.index]; + int x = beli.x, y = beli.y; + TileInfoPOD &ti = bi.tiles_nonrouting[TILE_RAMB]; + if ((chip.args.type == ChipArgs::LP1K || + chip.args.type == ChipArgs::HX1K)) { + set_config(ti, config.at(y).at(x), "RamConfig.PowerUp", true); + } } } -- cgit v1.2.3