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)
|
void NgUltraPacker::pack_xluts(void)
|
||||||
{
|
{
|
||||||
log_info("Pack XLUTs...\n");
|
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) {
|
for (auto &cell : ctx->cells) {
|
||||||
CellInfo &ci = *cell.second;
|
CellInfo &ci = *cell.second;
|
||||||
if (!ci.type.in(id_NX_LUT))
|
if (!ci.type.in(id_NX_LUT))
|
||||||
@ -349,17 +349,22 @@ void NgUltraPacker::pack_xluts(void)
|
|||||||
continue;
|
continue;
|
||||||
CellInfo *lut[4];
|
CellInfo *lut[4];
|
||||||
int inputs_used = 0;
|
int inputs_used = 0;
|
||||||
|
int dff_parts_used = 0;
|
||||||
for(int i=0;i<4;i++) {
|
for(int i=0;i<4;i++) {
|
||||||
NetInfo *net = ci.getPort(ctx->idf("I%d",i+1));
|
NetInfo *net = ci.getPort(ctx->idf("I%d",i+1));
|
||||||
if (!net)
|
if (!net)
|
||||||
continue;
|
continue;
|
||||||
lut[i] = net_driven_by(ctx, net, is_lut, id_O);
|
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++;
|
inputs_used++;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (inputs_used!=4)
|
if (inputs_used!=4)
|
||||||
continue;
|
continue;
|
||||||
|
// we must have a route out for xlut output signal
|
||||||
|
if (dff_parts_used > 3)
|
||||||
|
continue;
|
||||||
ci.type = id_XLUT;
|
ci.type = id_XLUT;
|
||||||
bind_attr_loc(&ci, &ci.attrs);
|
bind_attr_loc(&ci, &ci.attrs);
|
||||||
ci.cluster = ci.name;
|
ci.cluster = ci.name;
|
||||||
@ -371,14 +376,33 @@ void NgUltraPacker::pack_xluts(void)
|
|||||||
lut[i]->constr_z = PLACE_XLUT_FE1 + i;
|
lut[i]->constr_z = PLACE_XLUT_FE1 + i;
|
||||||
lut[i]->renamePort(id_O, id_LO);
|
lut[i]->renamePort(id_O, id_LO);
|
||||||
lut[i]->params[id_lut_used] = Property(1,1);
|
lut[i]->params[id_lut_used] = Property(1,1);
|
||||||
|
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[i]->timing_index = ctx->get_cell_timing_idx(ctx->id("BEYOND_FE_LUT"));
|
||||||
lut_only++;
|
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)
|
if (xlut_used)
|
||||||
log_info(" %6d XLUTs used\n", xlut_used);
|
log_info(" %6d XLUTs used\n", xlut_used);
|
||||||
if (lut_only)
|
if (lut_only)
|
||||||
log_info(" %6d FEs used as LUT only\n", 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();
|
flush_cells();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user