place FIFO

This commit is contained in:
Miodrag Milanovic 2024-06-23 20:42:55 +02:00
parent 392f100948
commit 120ca6950a
3 changed files with 403 additions and 3 deletions

View File

@ -129,6 +129,70 @@ enum ClusterPlacement
PLACE_CDC_CDRSTI,
PLACE_CDC_DSRSTI,
PLACE_CDC_DDRSTI,
PLACE_FIFO_I1,
PLACE_FIFO_I2,
PLACE_FIFO_I3,
PLACE_FIFO_I4,
PLACE_FIFO_I5,
PLACE_FIFO_I6,
PLACE_FIFO_I7,
PLACE_FIFO_I8,
PLACE_FIFO_I9,
PLACE_FIFO_I10,
PLACE_FIFO_I11,
PLACE_FIFO_I12,
PLACE_FIFO_I13,
PLACE_FIFO_I14,
PLACE_FIFO_I15,
PLACE_FIFO_I16,
PLACE_FIFO_I17,
PLACE_FIFO_I18,
PLACE_FIFO_I19,
PLACE_FIFO_I20,
PLACE_FIFO_I21,
PLACE_FIFO_I22,
PLACE_FIFO_I23,
PLACE_FIFO_I24,
PLACE_FIFO_I25,
PLACE_FIFO_I26,
PLACE_FIFO_I27,
PLACE_FIFO_I28,
PLACE_FIFO_I29,
PLACE_FIFO_I30,
PLACE_FIFO_I31,
PLACE_FIFO_I32,
PLACE_FIFO_I33,
PLACE_FIFO_I34,
PLACE_FIFO_I35,
PLACE_FIFO_I36,
PLACE_FIFO_RAI1,
PLACE_FIFO_RAI2,
PLACE_FIFO_RAI3,
PLACE_FIFO_RAI4,
PLACE_FIFO_RAI5,
PLACE_FIFO_RAI6,
PLACE_FIFO_RAI7,
PLACE_FIFO_WAI1,
PLACE_FIFO_WAI2,
PLACE_FIFO_WAI3,
PLACE_FIFO_WAI4,
PLACE_FIFO_WAI5,
PLACE_FIFO_WAI6,
PLACE_FIFO_WAI7,
PLACE_FIFO_WE,
PLACE_FIFO_WEA,
PLACE_FIFO_WRSTI1,
PLACE_FIFO_RRSTI1,
PLACE_FIFO_WRSTI2,
PLACE_FIFO_RRSTI2,
PLACE_FIFO_WRSTI3,
PLACE_FIFO_RRSTI3,
PLACE_FIFO_WRSTI4,
PLACE_FIFO_RRSTI4,
PLACE_FIFO_WEQ1,
PLACE_FIFO_REQ1,
PLACE_FIFO_WEQ2,
PLACE_FIFO_REQ2,
};
enum PipExtra

View File

@ -514,7 +514,7 @@ Loc getCYFE(Loc root, int pos)
Loc getXRFFE(Loc root, int pos)
{
static const std::vector<Loc> map =
static const std::vector<Loc> map =
{
Loc(-1, 0, 1),// I/O1
Loc(-1, 0, 2),// I/O2
@ -694,6 +694,267 @@ Loc getCDCFE(Loc root, int pos)
return result;
}
Loc getFIFOFE(Loc root, int pos)
{
static const std::vector<Loc> fifo1 =
{
Loc(-1, 0, 1), // I/O1
Loc(-1, 0, 2), // I/O2
Loc(-1, 0, 5), // I/O3
Loc(-1, 0, 6), // I/O4
Loc(-1, 0, 7), // I/O5
Loc(-1, 0, 9), // I/O6
Loc(-1, 0, 10),// I/O7
Loc(-1, 0, 13),// I/O8
Loc(-1, 0, 14),// I/O9
Loc(-1, 0, 15),// I/O10
Loc(-1, 0, 16),// I/O11
Loc(-1, 0, 17),// I/O12
Loc(-1, 0, 18),// I/O13
Loc(-1, 0, 21),// I/O14
Loc(-1, 0, 24),// I/O15
Loc(-1, 0, 25),// I/O16
Loc(-1, 0, 26),// I/O17
Loc(-1, 0, 29),// I/O18
Loc( 0, 0, 0),// I/O19
Loc( 0, 0, 0),// I/O20
Loc( 0, 0, 0),// I/O21
Loc( 0, 0, 0),// I/O22
Loc( 0, 0, 0),// I/O23
Loc( 0, 0, 0),// I/O24
Loc( 0, 0, 0),// I/O25
Loc( 0, 0, 0),// I/O26
Loc( 0, 0, 0),// I/O27
Loc( 0, 0, 0),// I/O28
Loc( 0, 0, 0),// I/O29
Loc( 0, 0, 0),// I/O30
Loc( 0, 0, 0),// I/O31
Loc( 0, 0, 0),// I/O32
Loc( 0, 0, 0),// I/O33
Loc( 0, 0, 0),// I/O34
Loc( 0, 0, 0),// I/O35
Loc( 0, 0, 0),// I/O36
Loc( 0, 0, 3), // RAI1/RAO1
Loc( 0, 0, 10),// RAI2/RAO2
Loc( 0, 0, 11),// RAI3/RAO3
Loc( 0, 0, 19),// RAI4/RAO4
Loc( 0, 0, 26),// RAI5/RAO5
Loc( 0, 0, 27),// RAI6/RAO6
Loc( 0, 0, 0),// RAI7/RAO7
Loc( 0, 0, 1), // WAI1/WAO1
Loc( 0, 0, 2), // WAI2/WAO2
Loc( 0, 0, 9), // WAI3/WAO3
Loc( 0, 0, 17),// WAI4/WAO4
Loc( 0, 0, 18),// WAI5/WAO5
Loc( 0, 0, 25),// WAI6/WAO6
Loc( 0, 0, 0),// WAI7/WAO7
Loc(-1, 0, 0),// WE
Loc(-1, 0, 8),// WEA
Loc(-1, 0, 22),// WRSTI1/WRSTO
Loc(-1, 0, 30),// RRSTI1/RRSTO
Loc( 0, 0, 8), // WRSTI2
Loc( 0, 0, 24),// RRSTI2
Loc( 0, 0, 0), // WRSTI3/WRSTO
Loc( 0, 0, 0), // RRSTI3/RRSTO
Loc( 0, 0, 0), // WRSTI4
Loc( 0, 0, 0), // RRSTI4
Loc(-1, 0, 3),// WEQ
Loc(-1, 0, 4),// REQ
// Loc(-1, 0, 11), WEQ
// Loc(-1, 0, 12), REQ
// Loc(-1, 0, 19), WEQ
// Loc(-1, 0, 20), REQ
// Loc(-1, 0, 27), WEQ
// Loc(-1, 0, 28), REQ
Loc( 0, 0, 0),// WEQ2
Loc( 0, 0, 0),// REQ2
};
static const std::vector<Loc> fifo2 =
{
Loc(+1, 0, 1), // I/O1
Loc(+1, 0, 2), // I/O2
Loc(+1, 0, 5), // I/O3
Loc(+1, 0, 6), // I/O4
Loc(+1, 0, 7), // I/O5
Loc(+1, 0, 9), // I/O6
Loc(+1, 0, 10),// I/O7
Loc(+1, 0, 13),// I/O8
Loc(+1, 0, 14),// I/O9
Loc(+1, 0, 15),// I/O10
Loc(+1, 0, 16),// I/O11
Loc(+1, 0, 17),// I/O12
Loc(+1, 0, 18),// I/O13
Loc(+1, 0, 21),// I/O14
Loc(+1, 0, 24),// I/O15
Loc(+1, 0, 25),// I/O16
Loc(+1, 0, 26),// I/O17
Loc(+1, 0, 29),// I/O18
Loc( 0, 0, 0),// I/O19
Loc( 0, 0, 0),// I/O20
Loc( 0, 0, 0),// I/O21
Loc( 0, 0, 0),// I/O22
Loc( 0, 0, 0),// I/O23
Loc( 0, 0, 0),// I/O24
Loc( 0, 0, 0),// I/O25
Loc( 0, 0, 0),// I/O26
Loc( 0, 0, 0),// I/O27
Loc( 0, 0, 0),// I/O28
Loc( 0, 0, 0),// I/O29
Loc( 0, 0, 0),// I/O30
Loc( 0, 0, 0),// I/O31
Loc( 0, 0, 0),// I/O32
Loc( 0, 0, 0),// I/O33
Loc( 0, 0, 0),// I/O34
Loc( 0, 0, 0),// I/O35
Loc( 0, 0, 0),// I/O36
Loc( 0, 0, 6), // RAI1/RAO1
Loc( 0, 0, 13),// RAI2/RAO2
Loc( 0, 0, 14),// RAI3/RAO3
Loc( 0, 0, 22),// RAI4/RAO4
Loc( 0, 0, 29),// RAI5/RAO5
Loc( 0, 0, 30),// RAI6/RAO6
Loc( 0, 0, 0),// RAI7/RAO7
Loc( 0, 0, 4), // WAI1/WAO1
Loc( 0, 0, 5), // WAI2/WAO2
Loc( 0, 0, 12),// WAI3/WAO3
Loc( 0, 0, 20),// WAI4/WAO4
Loc( 0, 0, 21),// WAI5/WAO5
Loc( 0, 0, 28),// WAI6/WAO6
Loc( 0, 0, 0),// WAI7/WAO7
Loc(+1, 0, 0),// WE
Loc(+1, 0, 8),// WEA
Loc(+1, 0, 22),// WRSTI1/WRSTO
Loc(+1, 0, 30),// RRSTI1/RRSTO
Loc( 0, 0, 7), // WRSTI2
Loc( 0, 0, 23),// RRSTI2
Loc( 0, 0, 0), // WRSTI3/WRSTO
Loc( 0, 0, 0), // RRSTI3/RRSTO
Loc( 0, 0, 0), // WRSTI4
Loc( 0, 0, 0), // RRSTI4
Loc(+1, 0, 3),// WEQ
Loc(+1, 0, 4),// REQ
// Loc(+1, 0, 11), WEQ
// Loc(+1, 0, 12), REQ
// Loc(+1, 0, 19), WEQ
// Loc(+1, 0, 20), REQ
// Loc(+1, 0, 27), WEQ
// Loc(+1, 0, 28), REQ
Loc( 0, 0, 0),// WEQ2
Loc( 0, 0, 0),// REQ2
};
static const std::vector<Loc> xfifo =
{
Loc(-1, 0, 1), // I/O1
Loc(-1, 0, 2), // I/O2
Loc(-1, 0, 5), // I/O3
Loc(-1, 0, 6), // I/O4
Loc(-1, 0, 7), // I/O5
Loc(-1, 0, 9),// I/O6
Loc(-1, 0, 10),// I/O7
Loc(-1, 0, 13),// I/O8
Loc(-1, 0, 14),// I/O9
Loc(-1, 0, 15),// I/O10
Loc(-1, 0, 16),// I/O11
Loc(-1, 0, 17),// I/O12
Loc(-1, 0, 18),// I/O13
Loc(-1, 0, 21),// I/O14
Loc(-1, 0, 24),// I/O15
Loc(-1, 0, 25),// I/O16
Loc(-1, 0, 26),// I/O17
Loc(-1, 0, 29),// I/O18
Loc(+1, 0, 1), // I/O19
Loc(+1, 0, 2), // I/O20
Loc(+1, 0, 5), // I/O21
Loc(+1, 0, 6), // I/O22
Loc(+1, 0, 7), // I/O23
Loc(+1, 0, 9), // I/O24
Loc(+1, 0, 10),// I/O25
Loc(+1, 0, 13),// I/O26
Loc(+1, 0, 14),// I/O27
Loc(+1, 0, 15),// I/O28
Loc(+1, 0, 16),// I/O29
Loc(+1, 0, 17),// I/O30
Loc(+1, 0, 18),// I/O31
Loc(+1, 0, 21),// I/O32
Loc(+1, 0, 24),// I/O33
Loc(+1, 0, 25),// I/O34
Loc(+1, 0, 26),// I/O35
Loc(+1, 0, 29),// I/O36
Loc( 0, 0, 3), // RAI1/RAO1
Loc( 0, 0, 10),// RAI2/RAO2
Loc( 0, 0, 11),// RAI3/RAO3
Loc( 0, 0, 19),// RAI4/RAO4
Loc( 0, 0, 26),// RAI5/RAO5
Loc( 0, 0, 27),// RAI6/RAO6
Loc( 0, 0, 6), // RAI7/RAO7
Loc( 0, 0, 1), // WAI1/WAO1
Loc( 0, 0, 2), // WAI2/WAO2
Loc( 0, 0, 9), // WAI3/WAO3
Loc( 0, 0, 17),// WAI4/WAO4
Loc( 0, 0, 18),// WAI5/WAO5
Loc( 0, 0, 25),// WAI6/WAO6
Loc( 0, 0, 4), // WAI7/WAO7
Loc(-1, 0, 0),// WE
Loc(-1, 0, 8),// WEA
Loc(-1, 0, 22),// WRSTI1/WRSTO
Loc(-1, 0, 30),// RRSTI1/RRSTO
Loc( 0, 0, 8), // WRSTI2
Loc( 0, 0, 24),// RRSTI2
Loc(+1, 0, 22),// WRSTI3/WRSTO
Loc(+1, 0, 30),// RRSTI3/RRSTO
Loc( 0, 0, 7), // WRSTI4
Loc( 0, 0, 23),// RRSTI4
Loc(-1, 0, 3),// WEQ1
Loc(-1, 0, 4),// REQ1
// Loc(-1, 0, 11), WEQ1
// Loc(-1, 0, 12), REQ1
// Loc(-1, 0, 19), WEQ1
// Loc(-1, 0, 20), REQ1
// Loc(-1, 0, 27), WEQ1
// Loc(-1, 0, 28), REQ1
Loc(+1, 0, 3),// WEQ2
Loc(+1, 0, 4),// REQ2
// Loc(+1, 0, 11), WEQ2
// Loc(+1, 0, 12), REQ2
// Loc(+1, 0, 19), WEQ2
// Loc(+1, 0, 20), REQ2
// Loc(+1, 0, 27), WEQ2
// Loc(+1, 0, 28), REQ2
};
Loc result;
if (root.z == BEL_FIFO_Z) {
result = fifo1.at(pos);
} else if (root.z == BEL_FIFO_Z+1) {
result = fifo2.at(pos);
} else if (root.z == BEL_XFIFO_Z) {
result = xfifo.at(pos);
} else {
log_error("Trying to place CDC on wrong location.\n");
}
result.x += root.x;
result.y = root.y;
return result;
}
bool NgUltraImpl::getChildPlacement(const BaseClusterInfo *cluster, Loc root_loc,
std::vector<std::pair<CellInfo *, BelId>> &placement) const
{
@ -710,6 +971,8 @@ bool NgUltraImpl::getChildPlacement(const BaseClusterInfo *cluster, Loc root_loc
return getXRFFE(root_loc, child->constr_z - PLACE_XRF_I1 );
case PLACE_CDC_AI1 ... PLACE_CDC_DDRSTI:
return getCDCFE(root_loc, child->constr_z - PLACE_CDC_AI1 );
case PLACE_FIFO_I1 ... PLACE_FIFO_REQ2:
return getFIFOFE(root_loc, child->constr_z - PLACE_FIFO_I1 );
case PLACE_DSP_CHAIN : { Loc l = getNextLocInDSPChain(this, prev); prev = l; return l; }
default:
Loc result;

View File

@ -1116,9 +1116,82 @@ void NgUltraPacker::pack_fifos(void)
default:
log_error("Unknown mode %d for cell '%s'.\n", mode, ci.name.c_str(ctx));
}
//ci.cluster = ci.name;
ci.cluster = ci.name;
if (mode > 0) {
int rsti = (ci.type == id_FIFO) ? 2 : 4;
for (int i=1;i<=rsti;i++) {
IdString port = ctx->idf("WRSTI%d",i);
ci.ports[port].name = port;
ci.ports[port].type = PORT_IN;
port = ctx->idf("RRSTI%d",i);
ci.ports[port].name = port;
ci.ports[port].type = PORT_IN;
}
NetInfo *wrsti_net = ci.getPort(ctx->id("WRSTI"));
if (wrsti_net) {
ci.disconnectPort(ctx->id("WRSTI"));
for (int i=1;i<=rsti;i++)
ci.connectPort(ctx->idf("WRSTI%d",i), wrsti_net);
}
NetInfo *rrsti_net = ci.getPort(ctx->id("RRSTI"));
if (rrsti_net) {
ci.disconnectPort(ctx->id("RRSTI"));
for (int i=1;i<=rsti;i++)
ci.connectPort(ctx->idf("RRSTI%d",i), rrsti_net);
}
for (int i = 1; i <= 18; i++) {
connect_gnd_if_unconnected(&ci, ctx->idf("I%d",i));
pack_xrf_input_and_output(&ci, ci.name, ctx->idf("I%d",i), ctx->idf("O%d",i), ClusterPlacement(PLACE_FIFO_I1 + i-1), lut_only, lut_and_ff, dff_only);
}
if (mode==0) {
for (int i = 19; i <= 36; i++) {
disconnect_unused(&ci,ctx->idf("I%d",i));
disconnect_unused(&ci,ctx->idf("O%d",i));
}
} else {
for (int i = 19; i <= 36; i++) {
connect_gnd_if_unconnected(&ci, ctx->idf("I%d",i));
pack_xrf_input_and_output(&ci, ci.name, ctx->idf("I%d",i), ctx->idf("O%d",i), ClusterPlacement(PLACE_FIFO_I1 + i-1), lut_only, lut_and_ff, dff_only);
}
}
for (int i = 1; i <= 6; i++) {
connect_gnd_if_unconnected(&ci, ctx->idf("RAI%d",i));
pack_xrf_input_and_output(&ci, ci.name, ctx->idf("RAI%d",i), ctx->idf("RAO%d",i), ClusterPlacement(PLACE_FIFO_RAI1 + i-1), lut_only, lut_and_ff, dff_only);
connect_gnd_if_unconnected(&ci, ctx->idf("WAI%d",i));
pack_xrf_input_and_output(&ci, ci.name, ctx->idf("WAI%d",i), ctx->idf("WAO%d",i), ClusterPlacement(PLACE_FIFO_WAI1 + i-1), lut_only, lut_and_ff, dff_only);
}
if (mode==0) {
disconnect_unused(&ci, id_RAI7);
disconnect_unused(&ci, id_WAI7);
} else {
connect_gnd_if_unconnected(&ci, id_RAI7);
pack_xrf_input_and_output(&ci, ci.name, id_RAI7, id_RAO7, PLACE_FIFO_RAI7, lut_only, lut_and_ff, dff_only);
connect_gnd_if_unconnected(&ci, id_WAI7);
pack_xrf_input_and_output(&ci, ci.name, id_WAI7, id_WAO7, PLACE_FIFO_WAI7, lut_only, lut_and_ff, dff_only);
}
connect_gnd_if_unconnected(&ci, id_WE);
pack_xrf_input_and_output(&ci, ci.name, id_WE, IdString(), PLACE_FIFO_WE, lut_only, lut_and_ff, dff_only);
disconnect_if_gnd(&ci, id_WEA);
pack_xrf_input_and_output(&ci, ci.name, id_WEA, IdString(), PLACE_FIFO_WEA, lut_only, lut_and_ff, dff_only);
if (mode==0) {
// FIFO
ci.renamePort(id_WEQ1, ctx->id("WEQ"));
pack_xrf_input_and_output(&ci, ci.name, IdString(), ctx->id("WEQ"), PLACE_FIFO_WEQ1, lut_only, lut_and_ff, dff_only);
disconnect_unused(&ci, id_WEQ2);
ci.renamePort(id_REQ1, ctx->id("REQ"));
pack_xrf_input_and_output(&ci, ci.name, IdString(), ctx->id("REQ"), PLACE_FIFO_REQ1, lut_only, lut_and_ff, dff_only);
disconnect_unused(&ci, id_REQ2);
} else {
// XFIFO
ci.ports[id_WCK1].name = id_WCK1;
ci.ports[id_WCK1].type = PORT_IN;