Skip to content

Commit 6ede692

Browse files
committed
added support for fan-out for intermediate nodes in 3D custom switchblocks
1 parent 1309a04 commit 6ede692

File tree

3 files changed

+116
-105
lines changed

3 files changed

+116
-105
lines changed

vpr/src/route/rr_graph.cpp

Lines changed: 51 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,6 @@ static std::function<void(t_chan_width*)> alloc_and_load_rr_graph(RRGraphBuilder
188188
const t_track_to_pin_lookup& track_to_pin_lookup_y,
189189
const t_pin_to_track_lookup& opin_to_track_map,
190190
const vtr::NdMatrix<std::vector<int>, 3>& switch_block_conn,
191-
vtr::NdMatrix<t_inter_die_switchblock_edge, 5>& multi_layer_track_conn,
192191
t_sb_connection_map* sb_conn_map,
193192
const DeviceGrid& grid,
194193
const int Fs,
@@ -469,8 +468,8 @@ static void build_rr_chan(RRGraphBuilder& rr_graph_builder,
469468
const t_rr_type chan_type,
470469
const t_track_to_pin_lookup& track_to_pin_lookup,
471470
t_sb_connection_map* sb_conn_map,
472-
vtr::NdMatrix<t_inter_die_switchblock_edge, 5>& multi_layer_track_conn,
473471
const vtr::NdMatrix<std::vector<int>, 3>& switch_block_conn,
472+
vtr::NdMatrix<int, 2>& num_of_3d_conns_custom_SB,
474473
const int cost_index_offset,
475474
const t_chan_width& nodes_per_chan,
476475
const DeviceGrid& grid,
@@ -479,7 +478,8 @@ static void build_rr_chan(RRGraphBuilder& rr_graph_builder,
479478
const int Fs_per_side,
480479
const t_chan_details& chan_details_x,
481480
const t_chan_details& chan_details_y,
482-
t_rr_edge_info_set& created_rr_edges,
481+
t_rr_edge_info_set& rr_edges_to_create,
482+
t_rr_edge_info_set& des_3d_rr_edges_to_create,
483483
const int wire_to_ipin_switch,
484484
const int wire_to_pin_between_dice_switch,
485485
const int delayless_switch,
@@ -1265,24 +1265,13 @@ static void build_rr_graph(const t_graph_type graph_type,
12651265
}
12661266
/* END SB LOOKUP */
12671267

1268-
/* Add extra nodes to RR graph to support 3D custom switch blocks for multi-layer FPGAs
1269-
* For each connection in 3D custom switch blocks, multiple drivers can drive the same sink in another layer,
1270-
* this matrix keeps the drivers and the offset to extra length-0 node index in RR graph for each destination track
1271-
* based on its coordinate (layer, x, y), track ptc_num, channel type
1272-
* Access pattern: [0..grid.layer-1][0..grid.width-1][0..grid.height-1][0..max_chan_width-1][CHANX or CHANY]
1273-
*/
1274-
vtr::NdMatrix<t_inter_die_switchblock_edge, 5> multi_layer_track_conn;
1275-
auto& grid_ctx = device_ctx.grid;
1276-
12771268
/* check whether RR graph need to allocate new nodes for 3D custom switch blocks.
12781269
* To avoid wasting memory, the data structures are only allocated if a custom switch block
12791270
* is described in the architecture file and we have more than one die in device grid.
12801271
*/
12811272
if (grid.get_num_layers() > 1 && sb_type == CUSTOM) {
1282-
//initialize the multi_layer_track_conn
1283-
multi_layer_track_conn.resize(std::array<size_t, 5>{(size_t)grid_ctx.get_num_layers(), grid.width(), grid.height(), (size_t)max_chan_width, 2});
1284-
//keep how many nodes each switchblock requires
1285-
auto extra_nodes_per_switchblock = get_number_track_to_track_inter_die_conn(multi_layer_track_conn, sb_conn_map, device_ctx.rr_graph_builder);
1273+
//keep how many nodes each switchblock requires for each x,y location
1274+
auto extra_nodes_per_switchblock = get_number_track_to_track_inter_die_conn(sb_conn_map, device_ctx.rr_graph_builder);
12861275
//allocate new nodes in each switchblocks
12871276
alloc_and_load_inter_die_rr_node_indices(device_ctx.rr_graph_builder, &nodes_per_chan, grid, extra_nodes_per_switchblock, &num_rr_nodes);
12881277
device_ctx.rr_graph_builder.resize_nodes(num_rr_nodes);
@@ -1377,7 +1366,7 @@ static void build_rr_graph(const t_graph_type graph_type,
13771366
chan_details_x, chan_details_y,
13781367
track_to_pin_lookup_x, track_to_pin_lookup_y,
13791368
opin_to_track_map,
1380-
switch_block_conn, multi_layer_track_conn, sb_conn_map, grid, Fs, unidir_sb_pattern,
1369+
switch_block_conn, sb_conn_map, grid, Fs, unidir_sb_pattern,
13811370
Fc_out, Fc_xofs, Fc_yofs,
13821371
nodes_per_chan,
13831372
wire_to_arch_ipin_switch,
@@ -1480,8 +1469,6 @@ static void build_rr_graph(const t_graph_type graph_type,
14801469
sb_conn_map = nullptr;
14811470
}
14821471

1483-
multi_layer_track_conn.clear();
1484-
14851472
track_to_pin_lookup_x.clear();
14861473
track_to_pin_lookup_y.clear();
14871474

@@ -2037,7 +2024,6 @@ static std::function<void(t_chan_width*)> alloc_and_load_rr_graph(RRGraphBuilder
20372024
const t_track_to_pin_lookup& track_to_pin_lookup_y,
20382025
const t_pin_to_track_lookup& opin_to_track_map,
20392026
const vtr::NdMatrix<std::vector<int>, 3>& switch_block_conn,
2040-
vtr::NdMatrix<t_inter_die_switchblock_edge, 5>& multi_layer_track_conn,
20412027
t_sb_connection_map* sb_conn_map,
20422028
const DeviceGrid& grid,
20432029
const int Fs,
@@ -2163,31 +2149,41 @@ static std::function<void(t_chan_width*)> alloc_and_load_rr_graph(RRGraphBuilder
21632149
/* Build channels */
21642150
VTR_ASSERT(Fs % 3 == 0);
21652151

2166-
for (int layer = 0; layer < grid.get_num_layers(); ++layer) {
2167-
auto& device_ctx = g_vpr_ctx.device();
2168-
/* Skip the current die if architecture file specifies that it doesn't require inter-cluster programmable resource routing */
2169-
if (!device_ctx.inter_cluster_prog_routing_resources.at(layer)) {
2170-
continue;
2171-
}
2172-
for (size_t i = 0; i < grid.width() - 1; ++i) {
2173-
for (size_t j = 0; j < grid.height() - 1; ++j) {
2152+
/* In case of multi-die FPGA and a custom 3D SB, we keep track of how many 3D connections have been already made for each x,y location */
2153+
vtr::NdMatrix<int, 2> num_of_3d_conns_custom_SB;
2154+
2155+
t_rr_edge_info_set des_3d_rr_edges_to_create;
2156+
if(grid.get_num_layers() > 1 && sb_conn_map != nullptr){
2157+
num_of_3d_conns_custom_SB.resize(std::array<size_t,2>{grid.width(), grid.height()}, 0);
2158+
}
2159+
2160+
for (size_t i = 0; i < grid.width() - 1; ++i) {
2161+
for (size_t j = 0; j < grid.height() - 1; ++j) {
2162+
for (int layer = 0; layer < grid.get_num_layers(); ++layer) {
2163+
auto &device_ctx = g_vpr_ctx.device();
2164+
/* Skip the current die if architecture file specifies that it doesn't require inter-cluster programmable resource routing */
2165+
if (!device_ctx.inter_cluster_prog_routing_resources.at(layer)) {
2166+
continue;
2167+
}
21742168
/* In multi-die FPGAs with track-to-track connections between layers, we need to load newly added length-0 CHANX nodes
21752169
* These extra nodes can be driven from many tracks in the source layer and can drive multiple tracks in the destination layer,
21762170
* since these die-crossing connections have more delays.
21772171
*/
21782172
if (grid.get_num_layers() > 1 && sb_conn_map != nullptr) {
21792173
//custom switch block defined in the architecture
21802174
VTR_ASSERT(sblock_pattern.empty() && switch_block_conn.empty());
2181-
build_inter_die_custom_sb_rr_chan(rr_graph_builder, layer, i, j, CHANX_COST_INDEX_START, chan_width, chan_details_x);
2175+
build_inter_die_custom_sb_rr_chan(rr_graph_builder, layer, i, j, CHANX_COST_INDEX_START, chan_width,
2176+
chan_details_x);
21822177
}
21832178

21842179
if (i > 0) {
21852180
int tracks_per_chan = ((is_global_graph) ? 1 : chan_width.x_list[j]);
2186-
build_rr_chan(rr_graph_builder, layer, i, j, CHANX, track_to_pin_lookup_x, sb_conn_map, multi_layer_track_conn, switch_block_conn,
2187-
CHANX_COST_INDEX_START,
2181+
build_rr_chan(rr_graph_builder, layer, i, j, CHANX, track_to_pin_lookup_x, sb_conn_map,
2182+
switch_block_conn,
2183+
num_of_3d_conns_custom_SB, CHANX_COST_INDEX_START,
21882184
chan_width, grid, tracks_per_chan,
21892185
sblock_pattern, Fs / 3, chan_details_x, chan_details_y,
2190-
rr_edges_to_create,
2186+
rr_edges_to_create, des_3d_rr_edges_to_create,
21912187
wire_to_ipin_switch,
21922188
wire_to_pin_between_dice_switch,
21932189
delayless_switch,
@@ -2202,11 +2198,12 @@ static std::function<void(t_chan_width*)> alloc_and_load_rr_graph(RRGraphBuilder
22022198
}
22032199
if (j > 0) {
22042200
int tracks_per_chan = ((is_global_graph) ? 1 : chan_width.y_list[i]);
2205-
build_rr_chan(rr_graph_builder, layer, i, j, CHANY, track_to_pin_lookup_y, sb_conn_map, multi_layer_track_conn, switch_block_conn,
2206-
CHANX_COST_INDEX_START + num_seg_types_x,
2201+
build_rr_chan(rr_graph_builder, layer, i, j, CHANY, track_to_pin_lookup_y, sb_conn_map,
2202+
switch_block_conn,
2203+
num_of_3d_conns_custom_SB, CHANX_COST_INDEX_START + num_seg_types_x,
22072204
chan_width, grid, tracks_per_chan,
22082205
sblock_pattern, Fs / 3, chan_details_x, chan_details_y,
2209-
rr_edges_to_create,
2206+
rr_edges_to_create, des_3d_rr_edges_to_create,
22102207
wire_to_ipin_switch,
22112208
wire_to_pin_between_dice_switch,
22122209
delayless_switch,
@@ -2223,6 +2220,14 @@ static std::function<void(t_chan_width*)> alloc_and_load_rr_graph(RRGraphBuilder
22232220
}
22242221
}
22252222

2223+
if(grid.get_num_layers() > 1 && sb_conn_map != nullptr){
2224+
uniquify_edges(des_3d_rr_edges_to_create);
2225+
alloc_and_load_edges(rr_graph_builder, des_3d_rr_edges_to_create);
2226+
num_edges += des_3d_rr_edges_to_create.size();
2227+
des_3d_rr_edges_to_create.clear();
2228+
}
2229+
2230+
22262231
VTR_LOG("CHAN->CHAN type edge count:%d\n", num_edges);
22272232
num_edges = 0;
22282233
std::function<void(t_chan_width*)> update_chan_width = [](t_chan_width*) noexcept {};
@@ -3096,8 +3101,8 @@ static void build_rr_chan(RRGraphBuilder& rr_graph_builder,
30963101
const t_rr_type chan_type,
30973102
const t_track_to_pin_lookup& track_to_pin_lookup,
30983103
t_sb_connection_map* sb_conn_map,
3099-
vtr::NdMatrix<t_inter_die_switchblock_edge, 5>& multi_layer_track_conn,
31003104
const vtr::NdMatrix<std::vector<int>, 3>& switch_block_conn,
3105+
vtr::NdMatrix<int, 2>& num_of_3d_conns_custom_SB,
31013106
const int cost_index_offset,
31023107
const t_chan_width& nodes_per_chan,
31033108
const DeviceGrid& grid,
@@ -3107,6 +3112,7 @@ static void build_rr_chan(RRGraphBuilder& rr_graph_builder,
31073112
const t_chan_details& chan_details_x,
31083113
const t_chan_details& chan_details_y,
31093114
t_rr_edge_info_set& rr_edges_to_create,
3115+
t_rr_edge_info_set& des_3d_rr_edges_to_create,
31103116
const int wire_to_ipin_switch,
31113117
const int wire_to_pin_between_dice_switch,
31123118
const int delayless_switch,
@@ -3189,9 +3195,9 @@ static void build_rr_chan(RRGraphBuilder& rr_graph_builder,
31893195
}
31903196
if (to_seg_details->length() > 0) {
31913197
get_track_to_tracks(rr_graph_builder, layer, chan_coord, start, track, chan_type, chan_coord,
3192-
opposite_chan_type, multi_layer_track_conn, seg_dimension, max_opposite_chan_width, grid,
3193-
Fs_per_side, sblock_pattern, node, rr_edges_to_create,
3194-
from_seg_details, to_seg_details, opposite_chan_details,
3198+
opposite_chan_type, seg_dimension, max_opposite_chan_width, grid,
3199+
Fs_per_side, sblock_pattern, num_of_3d_conns_custom_SB, node, rr_edges_to_create,
3200+
des_3d_rr_edges_to_create, from_seg_details, to_seg_details, opposite_chan_details,
31953201
directionality,delayless_switch,
31963202
switch_block_conn, sb_conn_map);
31973203
}
@@ -3209,9 +3215,9 @@ static void build_rr_chan(RRGraphBuilder& rr_graph_builder,
32093215
}
32103216
if (to_seg_details->length() > 0) {
32113217
get_track_to_tracks(rr_graph_builder, layer, chan_coord, start, track, chan_type, chan_coord + 1,
3212-
opposite_chan_type, multi_layer_track_conn, seg_dimension, max_opposite_chan_width, grid,
3213-
Fs_per_side, sblock_pattern, node, rr_edges_to_create,
3214-
from_seg_details, to_seg_details, opposite_chan_details,
3218+
opposite_chan_type, seg_dimension, max_opposite_chan_width, grid,
3219+
Fs_per_side, sblock_pattern, num_of_3d_conns_custom_SB, node, rr_edges_to_create,
3220+
des_3d_rr_edges_to_create, from_seg_details, to_seg_details, opposite_chan_details,
32153221
directionality, delayless_switch, switch_block_conn, sb_conn_map);
32163222
}
32173223
}
@@ -3241,9 +3247,9 @@ static void build_rr_chan(RRGraphBuilder& rr_graph_builder,
32413247
}
32423248
if (to_seg_details->length() > 0) {
32433249
get_track_to_tracks(rr_graph_builder, layer, chan_coord, start, track, chan_type, target_seg,
3244-
chan_type, multi_layer_track_conn, seg_dimension, max_chan_width, grid,
3245-
Fs_per_side, sblock_pattern, node, rr_edges_to_create,
3246-
from_seg_details, to_seg_details, from_chan_details,
3250+
chan_type, seg_dimension, max_chan_width, grid,
3251+
Fs_per_side, sblock_pattern, num_of_3d_conns_custom_SB, node, rr_edges_to_create,
3252+
des_3d_rr_edges_to_create, from_seg_details, to_seg_details, from_chan_details,
32473253
directionality,delayless_switch,
32483254
switch_block_conn, sb_conn_map);
32493255
}

0 commit comments

Comments
 (0)