diff options
author | David Shah <dave@ds0.me> | 2019-02-13 11:23:12 +0000 |
---|---|---|
committer | David Shah <davey1576@gmail.com> | 2019-02-24 10:28:25 +0100 |
commit | 68abcb365a7e1c426d2ca96e2381892aa53e6192 (patch) | |
tree | f53e92b404e6abfb79519eb93cc31d04f20f898d /ecp5/pack.cc | |
parent | 49e945382038e71f35619bf94a24f0008164e57b (diff) | |
download | nextpnr-68abcb365a7e1c426d2ca96e2381892aa53e6192.tar.gz nextpnr-68abcb365a7e1c426d2ca96e2381892aa53e6192.tar.bz2 nextpnr-68abcb365a7e1c426d2ca96e2381892aa53e6192.zip |
ecp5: Add ECLKSYNCB support
Signed-off-by: David Shah <dave@ds0.me>
Diffstat (limited to 'ecp5/pack.cc')
-rw-r--r-- | ecp5/pack.cc | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/ecp5/pack.cc b/ecp5/pack.cc index 17b0ea3b..b84d4d60 100644 --- a/ecp5/pack.cc +++ b/ecp5/pack.cc @@ -1958,11 +1958,32 @@ class Ecp5Packer continue; ci->attrs[ctx->id("BEL")] = ctx->getBelName(bel).str(ctx); make_eclk(ci->ports.at(id_CLKI), ci, bel, eclk.first.first); - goto done; + goto clkdiv_done; } } } - done: + clkdiv_done: + continue; + } else if (ci->type == id_ECLKSYNCB) { + const NetInfo *eclko = net_or_nullptr(ci, id_ECLKO); + if (eclko == nullptr) + log_error("ECLKSYNCB '%s' has disconnected port ECLKO\n", ci->name.c_str(ctx)); + for (auto user : eclko->users) { + if (user.cell->type == id_TRELLIS_ECLKBUF) { + Loc eckbuf_loc = + ctx->getBelLocation(ctx->getBelByName(ctx->id(user.cell->attrs.at(ctx->id("BEL"))))); + for (auto bel : ctx->getBels()) { + if (ctx->getBelType(bel) != id_ECLKSYNCB) + continue; + Loc loc = ctx->getBelLocation(bel); + if (loc.x == eckbuf_loc.x && loc.y == eckbuf_loc.y && loc.z == eckbuf_loc.z - 2) { + ci->attrs[ctx->id("BEL")] = ctx->getBelName(bel).str(ctx); + goto eclksync_done; + } + } + } + } + eclksync_done: continue; } } |