Skip to content

Commit d338cb6

Browse files
committed
rr_graph: use fan-in instead of fan-out when getting avg switches data
Signed-off-by: Alessandro Comodi <[email protected]>
1 parent 0449dc1 commit d338cb6

File tree

1 file changed

+12
-10
lines changed

1 file changed

+12
-10
lines changed

vpr/src/route/rr_graph_indexed_data.cpp

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ static float get_delay_normalization_fac();
2828

2929
static void load_rr_indexed_data_T_values();
3030

31-
static void calculate_average_switch(int inode, double& avg_switch_R, double& avg_switch_T, double& avg_switch_Cinternal, int& num_switches, short& buffered);
31+
static void calculate_average_switch(int inode, double& avg_switch_R, double& avg_switch_T, double& avg_switch_Cinternal, int& num_switches, short& buffered, vtr::vector<RRNodeId, std::vector<RREdgeId>>& fan_in_list);
3232

3333
static void fixup_rr_indexed_data_T_values(size_t num_segment);
3434

@@ -303,6 +303,8 @@ static void load_rr_indexed_data_T_values() {
303303
auto& rr_nodes = device_ctx.rr_nodes;
304304
auto& rr_indexed_data = device_ctx.rr_indexed_data;
305305

306+
auto fan_in_list = get_fan_in_list();
307+
306308
std::vector<int> num_nodes_of_index(rr_indexed_data.size(), 0);
307309
std::vector<std::vector<float>> C_total(rr_indexed_data.size());
308310
std::vector<std::vector<float>> R_total(rr_indexed_data.size());
@@ -336,7 +338,7 @@ static void load_rr_indexed_data_T_values() {
336338
double avg_switch_Cinternal = 0;
337339
int num_switches = 0;
338340
short buffered = UNDEFINED;
339-
calculate_average_switch(inode, avg_switch_R, avg_switch_T, avg_switch_Cinternal, num_switches, buffered);
341+
calculate_average_switch(inode, avg_switch_R, avg_switch_T, avg_switch_Cinternal, num_switches, buffered, fan_in_list);
340342

341343
if (num_switches == 0) {
342344
VTR_LOG_WARN("Node %d had no out-going switches\n", inode);
@@ -372,8 +374,6 @@ static void load_rr_indexed_data_T_values() {
372374
}
373375
}
374376

375-
auto& segment_inf = device_ctx.rr_segments;
376-
377377
for (size_t cost_index = CHANX_COST_INDEX_START;
378378
cost_index < rr_indexed_data.size(); cost_index++) {
379379
if (num_nodes_of_index[cost_index] == 0) { /* Segments don't exist. */
@@ -420,19 +420,21 @@ static void load_rr_indexed_data_T_values() {
420420
}
421421
}
422422

423-
static void calculate_average_switch(int inode, double& avg_switch_R, double& avg_switch_T, double& avg_switch_Cinternal, int& num_switches, short& buffered) {
423+
static void calculate_average_switch(int inode, double& avg_switch_R, double& avg_switch_T, double& avg_switch_Cinternal, int& num_switches, short& buffered, vtr::vector<RRNodeId, std::vector<RREdgeId>>& fan_in_list) {
424424
auto& device_ctx = g_vpr_ctx.device();
425-
int num_edges = device_ctx.rr_nodes[inode].num_edges();
425+
const auto& rr_nodes = device_ctx.rr_nodes.view();
426+
427+
auto node = RRNodeId(inode);
428+
426429
avg_switch_R = 0;
427430
avg_switch_T = 0;
428431
avg_switch_Cinternal = 0;
429432
num_switches = 0;
430433
buffered = UNDEFINED;
431-
for (int iedge = 0; iedge < num_edges; iedge++) {
432-
int to_node_index = device_ctx.rr_nodes[inode].edge_sink_node(iedge);
434+
for (const auto& edge : fan_in_list[node]) {
433435
/* want to get C/R/Tdel/Cinternal of switches that connect this track segment to other track segments */
434-
if (device_ctx.rr_nodes[to_node_index].type() == CHANX || device_ctx.rr_nodes[to_node_index].type() == CHANY) {
435-
int switch_index = device_ctx.rr_nodes[inode].edge_switch(iedge);
436+
if (rr_nodes.node_type(node) == CHANX || rr_nodes.node_type(node) == CHANY) {
437+
int switch_index = rr_nodes.edge_switch(edge);
436438

437439
if (device_ctx.rr_switch_inf[switch_index].type() == SwitchType::SHORT) continue;
438440

0 commit comments

Comments
 (0)