@@ -28,7 +28,7 @@ static float get_delay_normalization_fac();
28
28
29
29
static void load_rr_indexed_data_T_values ();
30
30
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 );
32
32
33
33
static void fixup_rr_indexed_data_T_values (size_t num_segment);
34
34
@@ -303,6 +303,8 @@ static void load_rr_indexed_data_T_values() {
303
303
auto & rr_nodes = device_ctx.rr_nodes ;
304
304
auto & rr_indexed_data = device_ctx.rr_indexed_data ;
305
305
306
+ auto fan_in_list = get_fan_in_list ();
307
+
306
308
std::vector<int > num_nodes_of_index (rr_indexed_data.size (), 0 );
307
309
std::vector<std::vector<float >> C_total (rr_indexed_data.size ());
308
310
std::vector<std::vector<float >> R_total (rr_indexed_data.size ());
@@ -336,7 +338,7 @@ static void load_rr_indexed_data_T_values() {
336
338
double avg_switch_Cinternal = 0 ;
337
339
int num_switches = 0 ;
338
340
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 );
340
342
341
343
if (num_switches == 0 ) {
342
344
VTR_LOG_WARN (" Node %d had no out-going switches\n " , inode);
@@ -372,8 +374,6 @@ static void load_rr_indexed_data_T_values() {
372
374
}
373
375
}
374
376
375
- auto & segment_inf = device_ctx.rr_segments ;
376
-
377
377
for (size_t cost_index = CHANX_COST_INDEX_START;
378
378
cost_index < rr_indexed_data.size (); cost_index++) {
379
379
if (num_nodes_of_index[cost_index] == 0 ) { /* Segments don't exist. */
@@ -420,19 +420,21 @@ static void load_rr_indexed_data_T_values() {
420
420
}
421
421
}
422
422
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 ) {
424
424
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
+
426
429
avg_switch_R = 0 ;
427
430
avg_switch_T = 0 ;
428
431
avg_switch_Cinternal = 0 ;
429
432
num_switches = 0 ;
430
433
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]) {
433
435
/* 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 );
436
438
437
439
if (device_ctx.rr_switch_inf [switch_index].type () == SwitchType::SHORT) continue ;
438
440
0 commit comments