@@ -78,7 +78,9 @@ static void remove_pin_from_rt_terminals(t_lb_router_data *router_data, const At
78
78
79
79
static void fix_duplicate_equivalent_pins (t_lb_router_data *router_data);
80
80
81
- static void commit_remove_rt (t_lb_trace *rt, t_lb_router_data *router_data, e_commit_remove op);
81
+ static void commit_remove_rt (t_lb_trace *rt, t_lb_router_data *router_data, e_commit_remove op,
82
+ std::unordered_map<const t_pb_graph_node *, const t_mode *> *mode_map,
83
+ bool *is_mode_conflict);
82
84
static bool is_skip_route_net (t_lb_trace *rt, t_lb_router_data *router_data);
83
85
static void add_source_to_rt (t_lb_router_data *router_data, int inet);
84
86
static void expand_rt (t_lb_router_data *router_data, int inet, reservable_pq<t_expansion_node, vector <t_expansion_node>, compare_expansion_node> &pq, int irt_net);
@@ -216,49 +218,6 @@ static bool check_edge_for_route_conflicts(
216
218
return false ;
217
219
}
218
220
219
- // Walk one net and either add the pb_type modes to mode_map, or if they already
220
- // exist, ensure that the edges in the net are not in conflict.
221
- static bool check_net_for_route_conflicts (
222
- std::unordered_map<const t_pb_graph_node *, const t_mode *> *mode_map,
223
- const t_lb_trace *driver, const t_lb_router_data *router_data) {
224
- VTR_ASSERT (driver != nullptr );
225
-
226
- vector <t_lb_type_rr_node> & lb_type_graph = *router_data->lb_type_graph ;
227
- auto &driver_node = lb_type_graph[driver->current_node ];
228
- auto *driver_pin = driver_node.pb_graph_pin ;
229
-
230
- // Check each driver_pin -> pin edge.
231
- if (driver_pin != nullptr ) {
232
- for (const auto &next_node : driver->next_nodes ) {
233
- auto &node = lb_type_graph[next_node.current_node ];
234
- if (check_edge_for_route_conflicts (mode_map, driver_pin, node.pb_graph_pin )) {
235
- return true ;
236
- }
237
- }
238
- }
239
-
240
- // Walk the rest of the net.
241
- for (const auto &next_node : driver->next_nodes ) {
242
- if (check_net_for_route_conflicts (mode_map, &next_node, router_data)) {
243
- return true ;
244
- }
245
- }
246
-
247
- return false ;
248
- }
249
-
250
- // Walk nets and check if each pb_type has the same mode.
251
- static bool check_for_route_conflicts (const vector <t_intra_lb_net> &lb_nets, const t_lb_router_data *router_data) {
252
- std::unordered_map<const t_pb_graph_node *, const t_mode *> mode_map;
253
- for (const auto &net : lb_nets) {
254
- if (check_net_for_route_conflicts (&mode_map, net.rt_tree , router_data)) {
255
- return true ;
256
- }
257
- }
258
-
259
- return false ;
260
- }
261
-
262
221
/* ****************************************************************************************
263
222
* Routing Functions
264
223
******************************************************************************************/
@@ -384,6 +343,8 @@ bool try_intra_lb_route(t_lb_router_data *router_data,
384
343
router_data->lb_rr_node_stats [inode].occ = 0 ;
385
344
}
386
345
346
+ std::unordered_map<const t_pb_graph_node *, const t_mode *> mode_map;
347
+
387
348
/* Iteratively remove congestion until a successful route is found.
388
349
Cap the total number of iterations tried so that if a solution does not exist, then the router won't run indefinitely */
389
350
router_data->pres_con_fac = router_data->params .pres_fac ;
@@ -395,7 +356,7 @@ bool try_intra_lb_route(t_lb_router_data *router_data,
395
356
if (is_skip_route_net (lb_nets[idx].rt_tree , router_data)) {
396
357
continue ;
397
358
}
398
- commit_remove_rt (lb_nets[idx].rt_tree , router_data, RT_REMOVE);
359
+ commit_remove_rt (lb_nets[idx].rt_tree , router_data, RT_REMOVE, &mode_map, is_mode_conflict );
399
360
free_lb_net_rt (lb_nets[idx].rt_tree );
400
361
lb_nets[idx].rt_tree = nullptr ;
401
362
add_source_to_rt (router_data, idx);
@@ -478,17 +439,10 @@ bool try_intra_lb_route(t_lb_router_data *router_data,
478
439
}
479
440
}
480
441
481
- commit_remove_rt (lb_nets[idx].rt_tree , router_data, RT_COMMIT);
482
- }
483
-
484
- if (!is_impossible) {
485
- // We've checked that each net has no mode conflicts within the
486
- // net via route_has_conflict, however this is in insufficient.
487
- //
488
- // All nets from each pb_type must not have a mode conflict between
489
- // the nets.
490
- is_impossible = check_for_route_conflicts (lb_nets, router_data);
491
- *is_mode_conflict = is_impossible;
442
+ commit_remove_rt (lb_nets[idx].rt_tree , router_data, RT_COMMIT, &mode_map, is_mode_conflict);
443
+ if (*is_mode_conflict) {
444
+ is_impossible = true ;
445
+ }
492
446
}
493
447
494
448
if (!is_impossible) {
@@ -979,7 +933,9 @@ static void fix_duplicate_equivalent_pins(t_lb_router_data *router_data) {
979
933
}
980
934
981
935
/* Commit or remove route tree from currently routed solution */
982
- static void commit_remove_rt (t_lb_trace *rt, t_lb_router_data *router_data, e_commit_remove op) {
936
+ static void commit_remove_rt (t_lb_trace *rt, t_lb_router_data *router_data, e_commit_remove op,
937
+ std::unordered_map<const t_pb_graph_node *, const t_mode *> *mode_map,
938
+ bool *is_mode_conflict) {
983
939
t_lb_rr_node_stats *lb_rr_node_stats;
984
940
t_explored_node_tb *explored_node_tb;
985
941
vector <t_lb_type_rr_node> & lb_type_graph = *router_data->lb_type_graph ;
@@ -995,6 +951,7 @@ static void commit_remove_rt(t_lb_trace *rt, t_lb_router_data *router_data, e_co
995
951
996
952
inode = rt->current_node ;
997
953
954
+
998
955
/* Determine if node is being used or removed */
999
956
if (op == RT_COMMIT) {
1000
957
incr = 1 ;
@@ -1009,9 +966,24 @@ static void commit_remove_rt(t_lb_trace *rt, t_lb_router_data *router_data, e_co
1009
966
lb_rr_node_stats[inode].occ += incr;
1010
967
VTR_ASSERT (lb_rr_node_stats[inode].occ >= 0 );
1011
968
969
+ auto &driver_node = lb_type_graph[inode];
970
+ auto *driver_pin = driver_node.pb_graph_pin ;
971
+
1012
972
/* Recursively update route tree */
1013
973
for (unsigned int i = 0 ; i < rt->next_nodes .size (); i++) {
1014
- commit_remove_rt (&rt->next_nodes [i], router_data, op);
974
+ // Check to see if there is no mode conflict between previous nets.
975
+ // A conflict is present if there are differing modes between a pb_graph_node
976
+ // and its children.
977
+ if (op == RT_COMMIT) {
978
+ auto &node = lb_type_graph[rt->next_nodes [i].current_node ];
979
+ auto *pin = node.pb_graph_pin ;
980
+
981
+ if (check_edge_for_route_conflicts (mode_map, driver_pin, pin)) {
982
+ *is_mode_conflict = true ;
983
+ }
984
+ }
985
+
986
+ commit_remove_rt (&rt->next_nodes [i], router_data, op, mode_map, is_mode_conflict);
1015
987
}
1016
988
}
1017
989
0 commit comments