Better use XLUTs when possible
This commit is contained in:
parent
fe86a1a979
commit
73958db6e5
@ -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();
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user