Skip to content

Commit 8445e1f

Browse files
committed
mode selection: check modes while committing rt nets
Signed-off-by: Alessandro Comodi <[email protected]>
1 parent a661f72 commit 8445e1f

File tree

1 file changed

+30
-58
lines changed

1 file changed

+30
-58
lines changed

vpr/src/pack/cluster_router.cpp

Lines changed: 30 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,9 @@ static void remove_pin_from_rt_terminals(t_lb_router_data *router_data, const At
7878

7979
static void fix_duplicate_equivalent_pins(t_lb_router_data *router_data);
8080

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);
8284
static bool is_skip_route_net(t_lb_trace *rt, t_lb_router_data *router_data);
8385
static void add_source_to_rt(t_lb_router_data *router_data, int inet);
8486
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(
216218
return false;
217219
}
218220

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-
262221
/*****************************************************************************************
263222
* Routing Functions
264223
******************************************************************************************/
@@ -384,6 +343,8 @@ bool try_intra_lb_route(t_lb_router_data *router_data,
384343
router_data->lb_rr_node_stats[inode].occ = 0;
385344
}
386345

346+
std::unordered_map<const t_pb_graph_node *, const t_mode *> mode_map;
347+
387348
/* Iteratively remove congestion until a successful route is found.
388349
Cap the total number of iterations tried so that if a solution does not exist, then the router won't run indefinitely */
389350
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,
395356
if (is_skip_route_net(lb_nets[idx].rt_tree, router_data)) {
396357
continue;
397358
}
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);
399360
free_lb_net_rt(lb_nets[idx].rt_tree);
400361
lb_nets[idx].rt_tree = nullptr;
401362
add_source_to_rt(router_data, idx);
@@ -478,17 +439,10 @@ bool try_intra_lb_route(t_lb_router_data *router_data,
478439
}
479440
}
480441

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+
}
492446
}
493447

494448
if(!is_impossible) {
@@ -979,7 +933,9 @@ static void fix_duplicate_equivalent_pins(t_lb_router_data *router_data) {
979933
}
980934

981935
/* 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) {
983939
t_lb_rr_node_stats *lb_rr_node_stats;
984940
t_explored_node_tb *explored_node_tb;
985941
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
995951

996952
inode = rt->current_node;
997953

954+
998955
/* Determine if node is being used or removed */
999956
if (op == RT_COMMIT) {
1000957
incr = 1;
@@ -1009,9 +966,24 @@ static void commit_remove_rt(t_lb_trace *rt, t_lb_router_data *router_data, e_co
1009966
lb_rr_node_stats[inode].occ += incr;
1010967
VTR_ASSERT(lb_rr_node_stats[inode].occ >= 0);
1011968

969+
auto &driver_node = lb_type_graph[inode];
970+
auto *driver_pin = driver_node.pb_graph_pin;
971+
1012972
/* Recursively update route tree */
1013973
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);
1015987
}
1016988
}
1017989

0 commit comments

Comments
 (0)