From b9c834dc27958dfb651db436cb1cfbc603a5ce2b Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Thu, 8 Aug 2024 16:24:26 +0200 Subject: [PATCH] pack output DFF together with XLUT --- himbaechel/uarch/ng-ultra/pack.cc | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/himbaechel/uarch/ng-ultra/pack.cc b/himbaechel/uarch/ng-ultra/pack.cc index 67052f9e..f54aaf43 100644 --- a/himbaechel/uarch/ng-ultra/pack.cc +++ b/himbaechel/uarch/ng-ultra/pack.cc @@ -369,6 +369,10 @@ void NgUltraPacker::pack_xluts(void) bind_attr_loc(&ci, &ci.attrs); ci.cluster = ci.name; xlut_used++; + + NetInfo *o = ci.getPort(id_O); + CellInfo *orig_dff = o ? net_only_drives(ctx, o, is_dff, id_I, true) : nullptr; + for (int i=0;i<4;i++) { ci.constr_children.push_back(lut[i]); lut[i]->cluster = ci.cluster; @@ -378,8 +382,16 @@ void NgUltraPacker::pack_xluts(void) 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_only++; + if (orig_dff && net->users.entries()==1) { + // we place DFF on XLUT output on unused DFF + dff_to_fe(orig_dff, lut[i], false); + packed_cells.insert(orig_dff->name); + lut_and_ff++; + orig_dff = nullptr; + } else { + 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) @@ -392,9 +404,7 @@ void NgUltraPacker::pack_xluts(void) lut[i]->timing_index = ctx->get_cell_timing_idx(ctx->id("BEYOND_FE_LUT")); lut_only++; } - } - - + } } } if (xlut_used)