nexus: Add MULTADDSUB36X36

Signed-off-by: David Shah <dave@ds0.me>
This commit is contained in:
David Shah 2020-11-17 19:49:54 +00:00
parent f795527454
commit 5cf7f01169

View File

@ -1528,6 +1528,7 @@ struct NexusPacker
{id_MULTPREADD9X9, {9, 9, 9, 18, 1, 0, 0, true, false}}, {id_MULTPREADD9X9, {9, 9, 9, 18, 1, 0, 0, true, false}},
{id_MULTPREADD18X18, {18, 18, 18, 36, 2, 1, 0, true, false}}, {id_MULTPREADD18X18, {18, 18, 18, 36, 2, 1, 0, true, false}},
{id_MULTADDSUB18X18, {18, 18, 54, 54, 2, 1, 0, false, true}}, {id_MULTADDSUB18X18, {18, 18, 54, 54, 2, 1, 0, false, true}},
{id_MULTADDSUB36X36, {36, 36, 108, 108, 8, 4, 2, false, true}},
}; };
void pack_dsps() void pack_dsps()
@ -1554,7 +1555,10 @@ struct NexusPacker
for (int i = 0; i < mt.N18x36; i++) for (int i = 0; i < mt.N18x36; i++)
mult18x36[i] = create_dsp_cell(ci->name, id_MULT18X36_CORE, preadd9[0], (i * 4) + 2, 4); mult18x36[i] = create_dsp_cell(ci->name, id_MULT18X36_CORE, preadd9[0], (i * 4) + 2, 4);
for (int i = 0; i < Nreg18; i++) { for (int i = 0; i < Nreg18; i++) {
reg18[i] = create_dsp_cell(ci->name, id_REG18_CORE, preadd9[0], (i / 4) * 4 + 2, i % 4); int idx = i;
if (mt.has_addsub && (i >= 4))
idx += 2;
reg18[i] = create_dsp_cell(ci->name, id_REG18_CORE, preadd9[0], (idx / 4) * 4 + 2, idx % 4);
} }
// Configure the 9x9 preadd+multiply blocks // Configure the 9x9 preadd+multiply blocks
@ -1591,7 +1595,7 @@ struct NexusPacker
preadd9[i]->params[id_PREADDCAS_EN] = std::string("ENABLED"); preadd9[i]->params[id_PREADDCAS_EN] = std::string("ENABLED");
} else if (mt.has_addsub) { } else if (mt.has_addsub) {
// Connect only for routeability reasons // Connect only for routeability reasons
copy_bus(ctx, ci, id_C, 10 * i, true, preadd9[i], id_C, 0, false, 10); copy_bus(ctx, ci, id_C, 10 * i + ((i >= 4) ? 14 : 0), true, preadd9[i], id_C, 0, false, 10);
} }
// Connect up signedness for the most significant nonet // Connect up signedness for the most significant nonet
@ -1648,7 +1652,11 @@ struct NexusPacker
copy_port(ctx, ci, id_RSTOUT, acc54[i], id_RSTO); copy_port(ctx, ci, id_RSTOUT, acc54[i], id_RSTO);
copy_port(ctx, ci, id_CEOUT, acc54[i], id_CEO); copy_port(ctx, ci, id_CEOUT, acc54[i], id_CEO);
// Add/acc control // Add/acc control
if (i == 0)
copy_port(ctx, ci, id_CIN, acc54[i], id_CIN); copy_port(ctx, ci, id_CIN, acc54[i], id_CIN);
else
ctx->set_cell_pinmux(acc54[i], id_CIN, PINMUX_1);
if (i == (Nacc54 - 1))
copy_port(ctx, ci, id_SIGNED, acc54[i], id_SIGNEDI); copy_port(ctx, ci, id_SIGNED, acc54[i], id_SIGNEDI);
copy_port(ctx, ci, id_ADDSUB, acc54[i], id_ADDSUB0); copy_port(ctx, ci, id_ADDSUB, acc54[i], id_ADDSUB0);
copy_port(ctx, ci, id_ADDSUB, acc54[i], id_ADDSUB1); copy_port(ctx, ci, id_ADDSUB, acc54[i], id_ADDSUB1);
@ -1666,6 +1674,15 @@ struct NexusPacker
copy_param(ci, id_REGPIPELINE, acc54[i], id_CINREGBYPS2); copy_param(ci, id_REGPIPELINE, acc54[i], id_CINREGBYPS2);
copy_param(ci, id_REGPIPELINE, acc54[i], id_M9ADDSUBREGBYPS2); copy_param(ci, id_REGPIPELINE, acc54[i], id_M9ADDSUBREGBYPS2);
copy_param(ci, id_REGOUTPUT, acc54[i], id_OUTREGBYPS); copy_param(ci, id_REGOUTPUT, acc54[i], id_OUTREGBYPS);
if (i == 1) {
// Top ACC54 in a 108-bit config
acc54[i]->params[id_ACCUMODE] = std::string("MODE6");
acc54[i]->params[id_ACC108CASCADE] = std::string("CASCADE2ACCU54TOFORMACCU108");
} else if ((i == 0) && (Nacc54 == 2)) {
// Bottom ACC54 in a 108-bit config
acc54[i]->params[id_ACCUMODE] = std::string("MODE2");
}
} }
} }