Ignore high fanout bounding box if routing a global net - high fanout bounding box is too small (used for run-time optimization) however since clock sources are at the center of the chip the small bounding box will cause an unroutable design.
diff --git a/vpr/src/place/timing_place_lookup.cpp b/vpr/src/place/timing_place_lookup.cpp index d3ee52c..81855ff 100755 --- a/vpr/src/place/timing_place_lookup.cpp +++ b/vpr/src/place/timing_place_lookup.cpp
@@ -663,8 +663,10 @@ std::vector<int> modified_rr_node_inf; RouterStats router_stats; + + bool is_global_net = false; //TODO: how can we get the net id to determine if net is global t_heap* cheapest = timing_driven_route_connection(source_node, sink_node, target_criticality, - astar_fac, bend_cost, rt_root, bounding_box, 1, budgeting_inf, 0, 0, 0, 0, modified_rr_node_inf, router_stats); + astar_fac, bend_cost, rt_root, bounding_box, 1, budgeting_inf, 0, 0, 0, 0, modified_rr_node_inf, router_stats, is_global_net); if (cheapest == nullptr) { return false;
diff --git a/vpr/src/route/route_timing.cpp b/vpr/src/route/route_timing.cpp index 880dffa..a093bad 100644 --- a/vpr/src/route/route_timing.cpp +++ b/vpr/src/route/route_timing.cpp
@@ -149,7 +149,7 @@ t_bb bounding_box, float bend_cost, float criticality_fac, int num_sinks, int target_node, float astar_fac, int highfanout_rlim, route_budgets &budgeting_inf, float max_delay, float min_delay, - float target_delay, float short_path_crit, RouterStats& router_stats); + float target_delay, float short_path_crit, RouterStats& router_stats, bool is_global_net); static void timing_driven_add_to_heap(const float criticality_fac, const float bend_cost, const float astar_fac, const route_budgets& budgeting_inf, const float max_delay, const float min_delay, const float target_delay, const float short_path_crit, @@ -899,7 +899,7 @@ t_heap * cheapest = timing_driven_route_connection(source_node, sink_node, target_criticality, astar_fac, bend_cost, rt_root, bounding_box, (int)cluster_ctx.clb_nlist.net_sinks(net_id).size(), budgeting_inf, - max_delay, min_delay, target_delay, short_path_crit, modified_rr_node_inf, router_stats); + max_delay, min_delay, target_delay, short_path_crit, modified_rr_node_inf, router_stats, cluster_ctx.clb_nlist.is_global_net(net_id)); if (cheapest == nullptr) { ClusterBlockId src_block = cluster_ctx.clb_nlist.net_driver_block(net_id); @@ -940,7 +940,7 @@ t_heap * timing_driven_route_connection(int source_node, int sink_node, float target_criticality, float astar_fac, float bend_cost, t_rt_node* rt_root, t_bb bounding_box, int num_sinks, route_budgets &budgeting_inf, float max_delay, float min_delay, float target_delay, float short_path_crit, std::vector<int>& modified_rr_node_inf, - RouterStats& router_stats) { + RouterStats& router_stats, bool is_global_net) { auto& route_ctx = g_vpr_ctx.mutable_routing(); int highfanout_rlim = mark_node_expansion_by_bin(source_node, sink_node, rt_root, bounding_box, num_sinks); @@ -1005,7 +1005,7 @@ timing_driven_expand_neighbours(cheapest, bounding_box, bend_cost, target_criticality, num_sinks, sink_node, astar_fac, highfanout_rlim, budgeting_inf, max_delay, min_delay, - target_delay, short_path_crit, router_stats); + target_delay, short_path_crit, router_stats, is_global_net); } free_heap_data(cheapest); @@ -1219,7 +1219,7 @@ t_bb bounding_box, float bend_cost, float criticality_fac, int num_sinks, int target_node, float astar_fac, int highfanout_rlim, route_budgets& budgeting_inf, float max_delay, float min_delay, - float target_delay, float short_path_crit, RouterStats& router_stats) { + float target_delay, float short_path_crit, RouterStats& router_stats, bool is_global_net) { /* Puts all the rr_nodes adjacent to current on the heap. rr_nodes outside * * the expanded bounding box specified in bounding_box are not added to the * @@ -1234,7 +1234,7 @@ int target_xhigh = device_ctx.rr_nodes[target_node].xhigh(); int target_yhigh = device_ctx.rr_nodes[target_node].yhigh(); - bool high_fanout = is_high_fanout(num_sinks); + bool high_fanout = is_high_fanout(num_sinks) && !is_global_net; int num_edges = device_ctx.rr_nodes[inode].num_edges(); for (int iconn = 0; iconn < num_edges; iconn++) {
diff --git a/vpr/src/route/route_timing.h b/vpr/src/route/route_timing.h index 0350147..dcb58b6 100644 --- a/vpr/src/route/route_timing.h +++ b/vpr/src/route/route_timing.h
@@ -49,7 +49,7 @@ t_heap * timing_driven_route_connection(int source_node, int sink_node, float target_criticality, float astar_fac, float bend_cost, t_rt_node* rt_root, t_bb bounding_box, int num_sinks, route_budgets &budgeting_inf, float max_delay, float min_delay, float target_delay, float short_path_crit, - std::vector<int>& modified_rr_node_inf, RouterStats& router_stats); + std::vector<int>& modified_rr_node_inf, RouterStats& router_stats, bool is_global_net); struct timing_driven_route_structs { // data while timing driven route is active