aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormyrtle <gatecat@ds0.me>2023-01-30 22:06:58 +0000
committerGitHub <noreply@github.com>2023-01-30 22:06:58 +0000
commitbfa3e047cee0f941ac58ba7dd2907fdfe2e90fc0 (patch)
treedeaf661d7c07a89534ed3f817714925a6a32bd44
parentf80b871dd54b5215480a8eb00313a7ac16d9e883 (diff)
parentf50d4c1ed13142471505e0233e7985052d868ac2 (diff)
downloadnextpnr-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.cc29
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)