diff options
author | gatecat <gatecat@ds0.me> | 2022-03-09 18:03:59 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-03-09 18:03:59 +0000 |
commit | 1911a9523c86fdcb7b5542cd5fa5bfcbd23dc6fd (patch) | |
tree | a5b8fe410100bcc87712b076001ff72da5fd4ad0 /mistral/bitstream.cc | |
parent | df7e26c1aa9b8727bacf56ab0d592df5cef63bb5 (diff) | |
parent | 3e688a3ac9ae35a894d5c2c19f2d9591b746d8da (diff) | |
download | nextpnr-1911a9523c86fdcb7b5542cd5fa5bfcbd23dc6fd.tar.gz nextpnr-1911a9523c86fdcb7b5542cd5fa5bfcbd23dc6fd.tar.bz2 nextpnr-1911a9523c86fdcb7b5542cd5fa5bfcbd23dc6fd.zip |
Merge pull request #886 from Ravenslofty/mistral-m10k
mistral: M10K support
Diffstat (limited to 'mistral/bitstream.cc')
-rw-r--r-- | mistral/bitstream.cc | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/mistral/bitstream.cc b/mistral/bitstream.cc index 35c1303a..6a2c3825 100644 --- a/mistral/bitstream.cc +++ b/mistral/bitstream.cc @@ -118,6 +118,46 @@ struct MistralBitgen cv->bmux_m_set(CycloneV::CMUXHG, pos, CycloneV::TESTSYN_ENOUT_SELECT, bi, CycloneV::PRE_SYNENB); } + void write_m10k_cell(CellInfo *ci, int x, int y, int bi) + { + auto pos = CycloneV::xy2pos(x, y); + + // Notes: + // DATA_FLOW_THRU is probably transparent reads. + + cv->bmux_b_set(CycloneV::M10K, pos, CycloneV::A_DATA_FLOW_THRU, bi, 1); + cv->bmux_n_set(CycloneV::M10K, pos, CycloneV::A_DATA_WIDTH, bi, ci->params.at(id_CFG_DBITS).as_int64()); + cv->bmux_m_set(CycloneV::M10K, pos, CycloneV::A_FAST_WRITE, bi, CycloneV::FAST); + cv->bmux_m_set(CycloneV::M10K, pos, CycloneV::A_OUTPUT_SEL, bi, CycloneV::ASYNC); + cv->bmux_r_set(CycloneV::M10K, pos, CycloneV::A_SA_WREN_DELAY, bi, 1); + cv->bmux_r_set(CycloneV::M10K, pos, CycloneV::A_SAEN_DELAY, bi, 2); + cv->bmux_r_set(CycloneV::M10K, pos, CycloneV::A_WL_DELAY, bi, 2); + cv->bmux_r_set(CycloneV::M10K, pos, CycloneV::A_WR_TIMER_PULSE, bi, 0x0b); + + cv->bmux_b_set(CycloneV::M10K, pos, CycloneV::B_DATA_FLOW_THRU, bi, 1); + cv->bmux_n_set(CycloneV::M10K, pos, CycloneV::B_DATA_WIDTH, bi, ci->params.at(id_CFG_DBITS).as_int64()); + cv->bmux_m_set(CycloneV::M10K, pos, CycloneV::B_FAST_WRITE, bi, CycloneV::FAST); + cv->bmux_m_set(CycloneV::M10K, pos, CycloneV::B_OUTPUT_SEL, bi, CycloneV::ASYNC); + cv->bmux_r_set(CycloneV::M10K, pos, CycloneV::B_SA_WREN_DELAY, bi, 1); + cv->bmux_r_set(CycloneV::M10K, pos, CycloneV::B_SAEN_DELAY, bi, 2); + cv->bmux_r_set(CycloneV::M10K, pos, CycloneV::B_WL_DELAY, bi, 2); + cv->bmux_r_set(CycloneV::M10K, pos, CycloneV::B_WR_TIMER_PULSE, bi, 0x0b); + + cv->bmux_n_set(CycloneV::M10K, pos, CycloneV::TOP_CLK_SEL, bi, 1); + cv->bmux_b_set(CycloneV::M10K, pos, CycloneV::TOP_W_INV, bi, 1); + cv->bmux_n_set(CycloneV::M10K, pos, CycloneV::TOP_W_SEL, bi, 1); + cv->bmux_b_set(CycloneV::M10K, pos, CycloneV::BOT_CLK_INV, bi, 1); + cv->bmux_n_set(CycloneV::M10K, pos, CycloneV::BOT_W_SEL, bi, 1); + + cv->bmux_b_set(CycloneV::M10K, pos, CycloneV::TRUE_DUAL_PORT, bi, 0); + + cv->bmux_b_set(CycloneV::M10K, pos, CycloneV::DISABLE_UNUSED, bi, 0); + + // Note for future us: the RAM init contents are inverted. + for (int bi = 0; bi < 256; bi++) + cv->bmux_r_set(CycloneV::M10K, pos, CycloneV::RAM, bi, 0xffffffffff); + } + void write_cells() { for (auto &cell : ctx->cells) { @@ -128,6 +168,8 @@ struct MistralBitgen write_io_cell(ci, loc.x, loc.y, bi); else if (ctx->is_clkbuf_cell(ci->type)) write_clkbuf_cell(ci, loc.x, loc.y, bi); + else if (ci->type == id_MISTRAL_M10K) + write_m10k_cell(ci, loc.x, loc.y, bi); } } |