diff options
author | myrtle <gatecat@ds0.me> | 2023-01-30 22:06:58 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-01-30 22:06:58 +0000 |
commit | bfa3e047cee0f941ac58ba7dd2907fdfe2e90fc0 (patch) | |
tree | deaf661d7c07a89534ed3f817714925a6a32bd44 | |
parent | f80b871dd54b5215480a8eb00313a7ac16d9e883 (diff) | |
parent | f50d4c1ed13142471505e0233e7985052d868ac2 (diff) | |
download | nextpnr-bfa3e047cee0f941ac58ba7dd2907fdfe2e90fc0.tar.gz nextpnr-bfa3e047cee0f941ac58ba7dd2907fdfe2e90fc0.tar.bz2 nextpnr-bfa3e047cee0f941ac58ba7dd2907fdfe2e90fc0.zip |
Merge pull request #1086 from smunaut/out_z
ice40: Improve `output` handling vs pull-ups and undriven
-rw-r--r-- | ice40/cells.cc | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/ice40/cells.cc b/ice40/cells.cc index fc24caaf..10964f3c 100644 --- a/ice40/cells.cc +++ b/ice40/cells.cc @@ -404,25 +404,28 @@ void dff_to_lc(const Context *ctx, CellInfo *dff, CellInfo *lc, bool pass_thru_l void nxio_to_sb(Context *ctx, CellInfo *nxio, CellInfo *sbio, pool<IdString> &todelete_cells) { + bool pull_up_attr = false; + if (nxio->type == ctx->id("$nextpnr_ibuf")) { sbio->params[id_PIN_TYPE] = 1; - auto pu_attr = nxio->attrs.find(id_PULLUP); - if (pu_attr != nxio->attrs.end()) - sbio->params[id_PULLUP] = pu_attr->second; nxio->movePortTo(id_O, sbio, id_D_IN_0); + pull_up_attr = true; } else if (nxio->type == ctx->id("$nextpnr_obuf")) { - sbio->params[id_PIN_TYPE] = 25; + NetInfo *i = nxio->getPort(id_I); + if (i == nullptr || i->driver.cell == nullptr) { + sbio->params[id_PIN_TYPE] = 1; + pull_up_attr = true; + } else + sbio->params[id_PIN_TYPE] = 25; nxio->movePortTo(id_I, sbio, id_D_OUT_0); } else if (nxio->type == ctx->id("$nextpnr_iobuf")) { // N.B. tristate will be dealt with below NetInfo *i = nxio->getPort(id_I); - if (i == nullptr || i->driver.cell == nullptr) + if (i == nullptr || i->driver.cell == nullptr) { sbio->params[id_PIN_TYPE] = 1; - else + pull_up_attr = true; + } else sbio->params[id_PIN_TYPE] = 25; - auto pu_attr = nxio->attrs.find(id_PULLUP); - if (pu_attr != nxio->attrs.end()) - sbio->params[id_PULLUP] = pu_attr->second; nxio->movePortTo(id_I, sbio, id_D_OUT_0); nxio->movePortTo(id_O, sbio, id_D_IN_0); } else { @@ -465,6 +468,7 @@ void nxio_to_sb(Context *ctx, CellInfo *nxio, CellInfo *sbio, pool<IdString> &to sbio->params[id_PIN_TYPE] = 41; tbuf->movePortTo(id_A, sbio, id_D_OUT_0); tbuf->movePortTo(id_E, sbio, id_OUTPUT_ENABLE); + pull_up_attr = true; if (donet->users.entries() > 1) { for (auto user : donet->users) @@ -476,6 +480,13 @@ void nxio_to_sb(Context *ctx, CellInfo *nxio, CellInfo *sbio, pool<IdString> &to ctx->nets.erase(donet->name); todelete_cells.insert(tbuf->name); } + + // Copy pull-up attribute if there's any chance output driver isn't active + if (pull_up_attr) { + auto pu_attr = nxio->attrs.find(id_PULLUP); + if (pu_attr != nxio->attrs.end()) + sbio->params[id_PULLUP] = pu_attr->second; + } } uint8_t sb_pll40_type(const BaseCtx *ctx, const CellInfo *cell) |