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