diff --git a/himbaechel/uarch/ng-ultra/pack.cc b/himbaechel/uarch/ng-ultra/pack.cc index 8769f1bb..45dcc0e6 100644 --- a/himbaechel/uarch/ng-ultra/pack.cc +++ b/himbaechel/uarch/ng-ultra/pack.cc @@ -475,38 +475,40 @@ void NgUltraPacker::pack_iobs(void) NetInfo *o_net = cell->getPort(id_O); if (o_net) { CellInfo *iod = net_only_drives(ctx, o_net, is_dfr, id_I, true); - bool bfr_mode = false; - if (!iod) { - if (cell->type==id_IOTP) ddrf_as_bfr++; else dfr_as_bfr++; - iod = create_cell_ptr((cell->type==id_IOTP) ? id_DDFR : id_DFR, ctx->id(cell->name.str(ctx) + "$iod_id")); - NetInfo *new_in = ctx->createNet(ctx->id(iod->name.str(ctx) + "$I")); - iod->setParam(ctx->id("iobname"),str_or_default(cell->params, ctx->id("iobname"), "")); - iod->setParam(ctx->id("type"), Property("BFR")); - cell->disconnectPort(id_O); - iod->connectPort(id_O, o_net); - iod->setParam(ctx->id("mode"), Property(2, 2)); - iod->setParam(ctx->id("data_inv"), Property(0, 1)); - iod->connectPort(id_I, new_in); - cell->connectPort(id_O,new_in); - bfr_mode = true; - } else log_error("TODO handle DFR"); - Loc cd_loc = cell->getLocation(); - cd_loc.z += 1; - BelId bel = ctx->getBelByLocation(cd_loc); - ctx->bindBel(bel, iod, PlaceStrength::STRENGTH_LOCKED); + if (!(o_net->users.entries()==1 && (*o_net->users.begin()).cell->type == id_NX_IOM_U)) { + bool bfr_mode = false; + if (!iod) { + if (cell->type==id_IOTP) ddrf_as_bfr++; else dfr_as_bfr++; + iod = create_cell_ptr((cell->type==id_IOTP) ? id_DDFR : id_DFR, ctx->id(cell->name.str(ctx) + "$iod_id")); + NetInfo *new_in = ctx->createNet(ctx->id(iod->name.str(ctx) + "$I")); + iod->setParam(ctx->id("iobname"),str_or_default(cell->params, ctx->id("iobname"), "")); + iod->setParam(ctx->id("type"), Property("BFR")); + cell->disconnectPort(id_O); + iod->connectPort(id_O, o_net); + iod->setParam(ctx->id("mode"), Property(2, 2)); + iod->setParam(ctx->id("data_inv"), Property(0, 1)); + iod->connectPort(id_I, new_in); + cell->connectPort(id_O,new_in); + bfr_mode = true; + } else log_error("TODO handle DFR"); + Loc cd_loc = cell->getLocation(); + cd_loc.z += 1; + BelId bel = ctx->getBelByLocation(cd_loc); + ctx->bindBel(bel, iod, PlaceStrength::STRENGTH_LOCKED); - // Depending of DDFR mode we must use one of dedicated routes (ITCs) - if (iod->type==id_DDFR) { - WireId dwire = ctx->getBelPinWire(bel, id_O); - for (PipId pip : ctx->getPipsDownhill(dwire)) { - const auto &pip_data = chip_pip_info(ctx->chip_info, pip); - const auto &extra_data = *reinterpret_cast(pip_data.extra_data.get()); - if (!extra_data.name) continue; - if (extra_data.type != PipExtra::PIP_EXTRA_MUX) continue; - if (bfr_mode && extra_data.input == 2) { - uarch->blocked_pips.emplace(pip); - } else if (!bfr_mode && extra_data.input == 1) { - uarch->blocked_pips.emplace(pip); + // Depending of DDFR mode we must use one of dedicated routes (ITCs) + if (iod->type==id_DDFR) { + WireId dwire = ctx->getBelPinWire(bel, id_O); + for (PipId pip : ctx->getPipsDownhill(dwire)) { + const auto &pip_data = chip_pip_info(ctx->chip_info, pip); + const auto &extra_data = *reinterpret_cast(pip_data.extra_data.get()); + if (!extra_data.name) continue; + if (extra_data.type != PipExtra::PIP_EXTRA_MUX) continue; + if (bfr_mode && extra_data.input == 2) { + uarch->blocked_pips.emplace(pip); + } else if (!bfr_mode && extra_data.input == 1) { + uarch->blocked_pips.emplace(pip); + } } } }