From 120ca6950a2fad1e6b02d8405ca92ce1819af65d Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sun, 23 Jun 2024 20:42:55 +0200 Subject: [PATCH] place FIFO --- himbaechel/uarch/ng-ultra/extra_data.h | 64 ++++++ himbaechel/uarch/ng-ultra/ng_ultra.cc | 265 ++++++++++++++++++++++++- himbaechel/uarch/ng-ultra/pack.cc | 77 ++++++- 3 files changed, 403 insertions(+), 3 deletions(-) diff --git a/himbaechel/uarch/ng-ultra/extra_data.h b/himbaechel/uarch/ng-ultra/extra_data.h index e1592387..e396624f 100644 --- a/himbaechel/uarch/ng-ultra/extra_data.h +++ b/himbaechel/uarch/ng-ultra/extra_data.h @@ -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 diff --git a/himbaechel/uarch/ng-ultra/ng_ultra.cc b/himbaechel/uarch/ng-ultra/ng_ultra.cc index e70be0c8..a11120b2 100644 --- a/himbaechel/uarch/ng-ultra/ng_ultra.cc +++ b/himbaechel/uarch/ng-ultra/ng_ultra.cc @@ -514,7 +514,7 @@ Loc getCYFE(Loc root, int pos) Loc getXRFFE(Loc root, int pos) { - static const std::vector map = + static const std::vector 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 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 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 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> &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; diff --git a/himbaechel/uarch/ng-ultra/pack.cc b/himbaechel/uarch/ng-ultra/pack.cc index 592deb0e..f59989ff 100644 --- a/himbaechel/uarch/ng-ultra/pack.cc +++ b/himbaechel/uarch/ng-ultra/pack.cc @@ -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;