Better use XLUTs when possible

This commit is contained in:
Miodrag Milanovic 2024-08-08 14:56:26 +02:00
parent fe86a1a979
commit 73958db6e5

View File

@ -337,7 +337,7 @@ void NgUltraPacker::bind_attr_loc(CellInfo *cell, dict<IdString, Property> *attr
void NgUltraPacker::pack_xluts(void)
{
log_info("Pack XLUTs...\n");
int xlut_used = 0, lut_only = 0;
int xlut_used = 0, lut_only = 0, lut_and_ff = 0;
for (auto &cell : ctx->cells) {
CellInfo &ci = *cell.second;
if (!ci.type.in(id_NX_LUT))
@ -349,17 +349,22 @@ void NgUltraPacker::pack_xluts(void)
continue;
CellInfo *lut[4];
int inputs_used = 0;
int dff_parts_used = 0;
for(int i=0;i<4;i++) {
NetInfo *net = ci.getPort(ctx->idf("I%d",i+1));
if (!net)
continue;
lut[i] = net_driven_by(ctx, net, is_lut, id_O);
if (lut[i] && net->users.entries()==1)
if (lut[i]) {
if (net->users.entries()>1) dff_parts_used++;
inputs_used++;
}
}
if (inputs_used!=4)
continue;
// we must have a route out for xlut output signal
if (dff_parts_used > 3)
continue;
ci.type = id_XLUT;
bind_attr_loc(&ci, &ci.attrs);
ci.cluster = ci.name;
@ -371,14 +376,33 @@ void NgUltraPacker::pack_xluts(void)
lut[i]->constr_z = PLACE_XLUT_FE1 + i;
lut[i]->renamePort(id_O, id_LO);
lut[i]->params[id_lut_used] = Property(1,1);
lut[i]->timing_index = ctx->get_cell_timing_idx(ctx->id("BEYOND_FE_LUT"));
lut_only++;
NetInfo *net = lut[i]->getPort(id_LO);
if (net->users.entries()!=2) {
lut[i]->timing_index = ctx->get_cell_timing_idx(ctx->id("BEYOND_FE_LUT"));
lut_only++;
} else {
CellInfo *dff = (*net->users.begin()).cell;
if (dff->type!=id_NX_DFF)
dff = (*net->users.begin()++).cell;
if (dff->type==id_NX_DFF) {
dff_to_fe(dff, lut[i], false);
packed_cells.insert(dff->name);
lut_and_ff++;
} else {
lut[i]->timing_index = ctx->get_cell_timing_idx(ctx->id("BEYOND_FE_LUT"));
lut_only++;
}
}
}
}
if (xlut_used)
log_info(" %6d XLUTs used\n", xlut_used);
if (lut_only)
log_info(" %6d FEs used as LUT only\n", lut_only);
if (lut_and_ff)
log_info(" %6d FEs used as LUT and DFF\n", lut_and_ff);
flush_cells();
}