11
11
#include " vpr_utils.h"
12
12
#include " re_cluster_util.h"
13
13
14
- LookaheadProfiler lookahead_profiler = LookaheadProfiler();
15
-
16
14
LookaheadProfiler::LookaheadProfiler () {
17
15
lookahead_verifier_csv.open (" lookahead_verifier_info.csv" , std::ios::out);
18
16
@@ -45,136 +43,104 @@ LookaheadProfiler::LookaheadProfiler() {
45
43
<< std::endl;
46
44
}
47
45
48
- void LookaheadProfiler::record (const int iteration,
49
- const int target_net_pin_index,
50
- const RRNodeId source_inode,
51
- const RRNodeId sink_inode,
52
- const RRNodeId curr_inode,
53
- const size_t nodes_from_sink,
46
+ void LookaheadProfiler::record (int iteration,
47
+ int target_net_pin_index,
54
48
const t_conn_cost_params& cost_params,
55
49
const RouterLookahead& router_lookahead,
56
50
const ParentNetId& net_id,
57
- const Netlist<>& net_list) {
51
+ const Netlist<>& net_list,
52
+ std::vector<RRNodeId> branch_inodes) {
58
53
auto & device_ctx = g_vpr_ctx.device ();
59
54
const auto & rr_graph = device_ctx.rr_graph ;
60
55
auto & route_ctx = g_vpr_ctx.routing ();
61
56
62
- float total_backward_cost = route_ctx.rr_node_route_inf [sink_inode].backward_path_cost ;
63
- float total_backward_delay = route_ctx.rr_node_route_inf [sink_inode].backward_path_delay ;
64
- float total_backward_congestion = route_ctx.rr_node_route_inf [sink_inode].backward_path_congestion ;
57
+ if (iteration < 1 )
58
+ return ;
65
59
66
- auto current_node = route_ctx. rr_node_route_inf [curr_inode];
67
- float current_backward_cost = current_node. backward_path_cost ;
68
- float current_backward_delay = current_node. backward_path_delay ;
69
- float current_backward_congestion = current_node. backward_path_congestion ;
60
+ for ( size_t i = 2 ; i < branch_inodes. size (); ++i) { /* Distance one node away is always 0.0 (IPIN->SINK) */
61
+ RRNodeId source_inode = branch_inodes. back () ;
62
+ RRNodeId sink_inode = branch_inodes. front () ;
63
+ RRNodeId curr_inode = branch_inodes[i] ;
70
64
71
- auto [from_x, from_y] = util::get_adjusted_rr_position (curr_inode);
72
- auto [to_x, to_y] = util::get_adjusted_rr_position (sink_inode);
65
+ float total_backward_cost = route_ctx.rr_node_route_inf [sink_inode].backward_path_cost ;
66
+ float total_backward_delay = route_ctx.rr_node_route_inf [sink_inode].backward_path_delay ;
67
+ float total_backward_congestion = route_ctx.rr_node_route_inf [sink_inode].backward_path_congestion ;
73
68
74
- int delta_x = to_x - from_x;
75
- int delta_y = to_y - from_y;
69
+ auto current_node = route_ctx.rr_node_route_inf [curr_inode];
70
+ float current_backward_cost = current_node.backward_path_cost ;
71
+ float current_backward_delay = current_node.backward_path_delay ;
72
+ float current_backward_congestion = current_node.backward_path_congestion ;
76
73
77
- float djikstra_cost = total_backward_cost - current_backward_cost;
78
- float djikstra_delay = total_backward_delay - current_backward_delay;
79
- float djikstra_congestion = total_backward_congestion - current_backward_congestion;
74
+ auto [from_x, from_y] = util::get_adjusted_rr_position (curr_inode);
75
+ auto [to_x, to_y] = util::get_adjusted_rr_position (sink_inode);
80
76
81
- float lookahead_cost = router_lookahead.get_expected_cost (curr_inode, sink_inode, cost_params,
82
- 0.0 );
83
- float lookahead_delay, lookahead_congestion;
84
- std::tie (lookahead_delay, lookahead_congestion) = router_lookahead.get_expected_delay_and_cong (curr_inode, sink_inode, cost_params, 0.0 , true );
77
+ int delta_x = to_x - from_x;
78
+ int delta_y = to_y - from_y;
85
79
86
- std::string block_name = " --" ;
87
- std::string atom_block_model = " --" ;
88
- std::string cluster_block_type = " --" ;
89
- std::string tile_height = " --" ;
90
- std::string tile_width = " --" ;
80
+ float djikstra_cost = total_backward_cost - current_backward_cost;
81
+ float djikstra_delay = total_backward_delay - current_backward_delay;
82
+ float djikstra_congestion = total_backward_congestion - current_backward_congestion;
91
83
92
- if (atom_block_names.find (sink_inode) != atom_block_names.end ()) {
93
- VTR_ASSERT_SAFE (atom_block_models.find (sink_inode) != atom_block_models.end ());
94
- VTR_ASSERT_SAFE (cluster_block_types.find (sink_inode) != cluster_block_types.end ());
95
- VTR_ASSERT_SAFE (tile_dimensions.find (sink_inode) != tile_dimensions.end ());
84
+ float lookahead_cost = router_lookahead.get_expected_cost (curr_inode, sink_inode, cost_params, 0.0 );
85
+ auto [lookahead_delay, lookahead_congestion] = router_lookahead.get_expected_delay_and_cong (curr_inode, sink_inode, cost_params, 0.0 );
96
86
97
- block_name = atom_block_names[sink_inode];
98
- atom_block_model = atom_block_models[sink_inode];
99
- cluster_block_type = cluster_block_types[sink_inode];
100
- std::tie (tile_width, tile_height) = tile_dimensions[sink_inode];
101
- } else {
102
- if (net_id != ParentNetId::INVALID () && target_net_pin_index != OPEN) {
103
- block_name = net_list.block_name (net_list.net_pin_block (net_id, target_net_pin_index));
87
+ if (atom_block_names.find (sink_inode) == atom_block_names.end ()) {
88
+ if (net_id != ParentNetId::INVALID () && target_net_pin_index != OPEN) {
89
+ atom_block_names[sink_inode] = net_list.block_name (net_list.net_pin_block (net_id, target_net_pin_index));
104
90
105
- AtomBlockId atom_block_id = g_vpr_ctx.atom ().nlist .find_block (block_name );
106
- atom_block_model = g_vpr_ctx.atom ().nlist .block_model (atom_block_id)->name ;
91
+ AtomBlockId atom_block_id = g_vpr_ctx.atom ().nlist .find_block (atom_block_names[sink_inode] );
92
+ atom_block_models[sink_inode] = g_vpr_ctx.atom ().nlist .block_model (atom_block_id)->name ;
107
93
108
- ClusterBlockId cluster_block_id = atom_to_cluster (atom_block_id);
94
+ ClusterBlockId cluster_block_id = atom_to_cluster (atom_block_id);
109
95
110
- cluster_block_type = g_vpr_ctx.clustering ().clb_nlist .block_type (cluster_block_id)->name ;
96
+ cluster_block_types[sink_inode] = g_vpr_ctx.clustering ().clb_nlist .block_type (cluster_block_id)->name ;
111
97
112
- auto tile_type = physical_tile_type (cluster_block_id);
113
- tile_height = std::to_string (tile_type->height );
114
- tile_width = std::to_string (tile_type->width );
98
+ auto tile_type = physical_tile_type (cluster_block_id);
99
+ tile_dimensions[sink_inode] = std::pair (std::to_string (tile_type->width ), std::to_string (tile_type->height ));
100
+ } else {
101
+ atom_block_names[sink_inode] = " --" ;
102
+ atom_block_models[sink_inode] = " --" ;
103
+ cluster_block_types[sink_inode] = " --" ;
104
+ tile_dimensions[sink_inode] = {" --" , " --" };
105
+ }
115
106
}
116
107
117
- atom_block_names[sink_inode] = block_name;
118
- atom_block_models[sink_inode] = atom_block_model;
119
- cluster_block_types[sink_inode] = cluster_block_type;
120
- tile_dimensions[sink_inode] = {tile_width, tile_height};
121
- }
108
+ VTR_ASSERT_SAFE (atom_block_names.find (sink_inode) != atom_block_names.end ());
109
+ VTR_ASSERT_SAFE (atom_block_models.find (sink_inode) != atom_block_models.end ());
110
+ VTR_ASSERT_SAFE (cluster_block_types.find (sink_inode) != cluster_block_types.end ());
111
+ VTR_ASSERT_SAFE (tile_dimensions.find (sink_inode) != tile_dimensions.end ());
122
112
123
- auto node_type = rr_graph.node_type (curr_inode);
124
- std::string node_type_str;
125
- std::string node_length;
126
-
127
- switch (node_type) {
128
- case SOURCE:
129
- node_type_str = " SOURCE" ;
130
- node_length = " --" ;
131
- break ;
132
- case SINK:
133
- node_type_str = " SINK" ;
134
- node_length = " --" ;
135
- break ;
136
- case IPIN:
137
- node_type_str = " IPIN" ;
138
- node_length = " --" ;
139
- break ;
140
- case OPIN:
141
- node_type_str = " OPIN" ;
142
- node_length = " --" ;
143
- break ;
144
- case CHANX:
145
- node_type_str = " CHANX" ;
146
- node_length = std::to_string (rr_graph.node_length (curr_inode));
147
- break ;
148
- case CHANY:
149
- node_type_str = " CHANY" ;
150
- node_length = std::to_string (rr_graph.node_length (curr_inode));
151
- break ;
152
- default :
153
- node_type_str = " --" ;
154
- node_length = " --" ;
155
- break ;
113
+ std::string block_name = atom_block_names[sink_inode];
114
+ std::string atom_block_model = atom_block_models[sink_inode];
115
+ std::string cluster_block_type = cluster_block_types[sink_inode];
116
+ auto [tile_width, tile_height] = tile_dimensions[sink_inode];
117
+
118
+ std::string node_type_str = rr_graph.node_type_string (curr_inode);
119
+ std::string node_length = (node_type_str == " CHANX" || node_type_str == " CHANX" )
120
+ ? std::to_string (rr_graph.node_length (curr_inode))
121
+ : " --" ;
122
+
123
+ lookahead_verifier_csv << iteration << " ," ; // iteration no.
124
+ lookahead_verifier_csv << source_inode << " ," ; // source node
125
+ lookahead_verifier_csv << sink_inode << " ," ; // sink node
126
+ lookahead_verifier_csv << block_name << " ," ; // sink block name
127
+ lookahead_verifier_csv << atom_block_model << " ," ; // sink atom block model
128
+ lookahead_verifier_csv << cluster_block_type << " ," ; // sink cluster block type
129
+ lookahead_verifier_csv << tile_height << " ," ; // sink cluster tile height
130
+ lookahead_verifier_csv << tile_width << " ," ; // sink cluster tile width
131
+ lookahead_verifier_csv << curr_inode << " ," ; // current node
132
+ lookahead_verifier_csv << node_type_str << " ," ; // node type
133
+ lookahead_verifier_csv << node_length << " ," ; // node length
134
+ lookahead_verifier_csv << i << " ," ; // num. nodes from sink
135
+ lookahead_verifier_csv << delta_x << " ," ; // delta x
136
+ lookahead_verifier_csv << delta_y << " ," ; // delta y
137
+ lookahead_verifier_csv << djikstra_cost << " ," ; // actual cost
138
+ lookahead_verifier_csv << djikstra_delay << " ," ; // actual delay
139
+ lookahead_verifier_csv << djikstra_congestion << " ," ; // actual congestion
140
+ lookahead_verifier_csv << lookahead_cost << " ," ; // predicted cost
141
+ lookahead_verifier_csv << lookahead_delay << " ," ; // predicted delay
142
+ lookahead_verifier_csv << lookahead_congestion << " ," ; // predicted congestion
143
+ lookahead_verifier_csv << cost_params.criticality ; // criticality
144
+ lookahead_verifier_csv << std::endl;
156
145
}
157
-
158
- lookahead_verifier_csv << iteration << " ," ; // iteration no.
159
- lookahead_verifier_csv << source_inode << " ," ; // source node
160
- lookahead_verifier_csv << sink_inode << " ," ; // sink node
161
- lookahead_verifier_csv << block_name << " ," ; // sink block name
162
- lookahead_verifier_csv << atom_block_model << " ," ; // sink atom block model
163
- lookahead_verifier_csv << cluster_block_type << " ," ; // sink cluster block type
164
- lookahead_verifier_csv << tile_height << " ," ; // sink cluster tile height
165
- lookahead_verifier_csv << tile_width << " ," ; // sink cluster tile width
166
- lookahead_verifier_csv << curr_inode << " ," ; // current node
167
- lookahead_verifier_csv << node_type_str << " ," ; // node type
168
- lookahead_verifier_csv << node_length << " ," ; // node length
169
- lookahead_verifier_csv << nodes_from_sink << " ," ; // num. nodes from sink
170
- lookahead_verifier_csv << delta_x << " ," ; // delta x
171
- lookahead_verifier_csv << delta_y << " ," ; // delta y
172
- lookahead_verifier_csv << djikstra_cost << " ," ; // actual cost
173
- lookahead_verifier_csv << djikstra_delay << " ," ; // actual delay
174
- lookahead_verifier_csv << djikstra_congestion << " ," ; // actual congestion
175
- lookahead_verifier_csv << lookahead_cost << " ," ; // predicted cost
176
- lookahead_verifier_csv << lookahead_delay << " ," ; // predicted delay
177
- lookahead_verifier_csv << lookahead_congestion << " ," ; // predicted congestion
178
- lookahead_verifier_csv << cost_params.criticality ; // criticality
179
- lookahead_verifier_csv << std::endl;
180
146
}
0 commit comments