Proper count for IO resources

This commit is contained in:
Miodrag Milanovic 2024-09-12 09:29:13 +02:00
parent b384ce3205
commit 400bc09151
3 changed files with 16 additions and 7 deletions

View File

@ -585,12 +585,10 @@ bool NgUltraImpl::isBelLocationValid(BelId bel, bool explain_invalid) const
// Bel bucket functions // Bel bucket functions
IdString NgUltraImpl::getBelBucketForCellType(IdString cell_type) const IdString NgUltraImpl::getBelBucketForCellType(IdString cell_type) const
{ {
if (cell_type.in(id_IOP,id_IP,id_OP)) if (cell_type.in(id_IOP,id_IP,id_OP,id_IOTP,id_ITP,id_OTP))
return id_IOP; return ctx->idf("IOP/IOTP");
else if (cell_type.in(id_IOTP,id_ITP,id_OTP)) else if (cell_type.in(id_BFR, id_DFR, id_DDFR))
return id_IOTP; return ctx->idf("DFR/DDFR");
else if (cell_type.in(id_BFR))
return id_DFR;
else if (cell_type.in(id_RF, id_RFSP)) else if (cell_type.in(id_RF, id_RFSP))
return id_RF; return id_RF;
else if (cell_type.in(id_XHRF, id_XWRF, id_XPRF)) else if (cell_type.in(id_XHRF, id_XWRF, id_XPRF))
@ -609,6 +607,16 @@ IdString NgUltraImpl::getBelBucketForCellType(IdString cell_type) const
return cell_type; return cell_type;
} }
BelBucketId NgUltraImpl::getBelBucketForBel(BelId bel) const
{
IdString bel_type = ctx->getBelType(bel);
if (bel_type.in(id_IOP, id_IOTP))
return ctx->idf("IOP/IOTP");
else if (bel_type.in(id_DFR, id_DDFR))
return ctx->idf("DFR/DDFR");
return bel_type;
}
bool NgUltraImpl::isValidBelForCellType(IdString cell_type, BelId bel) const bool NgUltraImpl::isValidBelForCellType(IdString cell_type, BelId bel) const
{ {
IdString bel_type = ctx->getBelType(bel); IdString bel_type = ctx->getBelType(bel);

View File

@ -48,6 +48,7 @@ struct NgUltraImpl : HimbaechelAPI
bool isBelLocationValid(BelId bel, bool explain_invalid = false) const override; bool isBelLocationValid(BelId bel, bool explain_invalid = false) const override;
IdString getBelBucketForCellType(IdString cell_type) const override; IdString getBelBucketForCellType(IdString cell_type) const override;
bool isValidBelForCellType(IdString cell_type, BelId bel) const override; bool isValidBelForCellType(IdString cell_type, BelId bel) const override;
BelBucketId getBelBucketForBel(BelId bel) const override;
// Flow management // Flow management
void pack() override; void pack() override;

View File

@ -738,7 +738,7 @@ void NgUltraPacker::pack_iobs(void)
} }
ci.type = new_type; ci.type = new_type;
ctx->bindBel(bel, &ci, PlaceStrength::STRENGTH_LOCKED); ctx->bindBel(bel, &ci, PlaceStrength::STRENGTH_LOCKED);
if (!ctx->isValidBelForCellType(ctx->getBelBucketForCellType(new_type),bel)) if (!ctx->isValidBelForCellType(new_type,bel))
log_error("Invalid type of IO for specified location %s %s.\n", new_type.c_str(ctx), ctx->getBelType(bel).c_str(ctx)); log_error("Invalid type of IO for specified location %s %s.\n", new_type.c_str(ctx), ctx->getBelType(bel).c_str(ctx));
to_update.push_back(&ci); to_update.push_back(&ci);
} }