@@ -82,7 +82,8 @@ static bool timing_driven_route_sink(
8282 t_rt_node* rt_root,
8383 t_rt_node** rt_node_of_sink,
8484 SpatialRouteTreeLookup& spatial_rt_lookup,
85- RouterStats& router_stats);
85+ RouterStats& router_stats,
86+ const RoutingPredictor& routing_predictor);
8687
8788template <typename ConnectionRouter>
8889static bool timing_driven_pre_route_to_clock_root (
@@ -414,7 +415,8 @@ bool try_timing_driven_route_tmpl(const t_router_opts& router_opts,
414415 route_timing_info,
415416 pin_timing_invalidator.get (),
416417 budgeting_inf,
417- was_rerouted);
418+ was_rerouted,
419+ routing_predictor);
418420 if (!is_routable) {
419421 return (false ); // Impossible to route
420422 }
@@ -756,7 +758,8 @@ bool try_timing_driven_route_net(ConnectionRouter& router,
756758 std::shared_ptr<SetupTimingInfo> timing_info,
757759 ClusteredPinTimingInvalidator* pin_timing_invalidator,
758760 route_budgets& budgeting_inf,
759- bool & was_rerouted) {
761+ bool & was_rerouted,
762+ const RoutingPredictor& routing_predictor) {
760763 auto & cluster_ctx = g_vpr_ctx.clustering ();
761764 auto & route_ctx = g_vpr_ctx.mutable_routing ();
762765
@@ -787,7 +790,8 @@ bool try_timing_driven_route_net(ConnectionRouter& router,
787790 netlist_pin_lookup,
788791 timing_info,
789792 pin_timing_invalidator,
790- budgeting_inf);
793+ budgeting_inf,
794+ routing_predictor);
791795
792796 profiling::net_fanout_end (cluster_ctx.clb_nlist .net_sinks (net_id).size ());
793797
@@ -911,7 +915,8 @@ bool timing_driven_route_net(ConnectionRouter& router,
911915 const ClusteredPinAtomPinsLookup& netlist_pin_lookup,
912916 std::shared_ptr<SetupTimingInfo> timing_info,
913917 ClusteredPinTimingInvalidator* pin_timing_invalidator,
914- route_budgets& budgeting_inf) {
918+ route_budgets& budgeting_inf,
919+ const RoutingPredictor& routing_predictor) {
915920 /* Returns true as long as found some way to hook up this net, even if that *
916921 * way resulted in overuse of resources (congestion). If there is no way *
917922 * to route this net, even ignoring congestion, it returns false. In this *
@@ -1047,7 +1052,8 @@ bool timing_driven_route_net(ConnectionRouter& router,
10471052 router_opts.high_fanout_threshold ,
10481053 rt_root, rt_node_of_sink,
10491054 spatial_route_tree_lookup,
1050- router_stats))
1055+ router_stats,
1056+ routing_predictor))
10511057 return false ;
10521058
10531059 profiling::conn_finish (route_ctx.net_rr_terminals [net_id][0 ],
@@ -1187,7 +1193,8 @@ static bool timing_driven_route_sink(
11871193 t_rt_node* rt_root,
11881194 t_rt_node** rt_node_of_sink,
11891195 SpatialRouteTreeLookup& spatial_rt_lookup,
1190- RouterStats& router_stats) {
1196+ RouterStats& router_stats,
1197+ const RoutingPredictor& routing_predictor) {
11911198 /* Build a path from the existing route tree rooted at rt_root to the target_node
11921199 * add this branch to the existing route tree and update pathfinder costs and rr_node_route_inf to reflect this */
11931200 auto & route_ctx = g_vpr_ctx.mutable_routing ();
@@ -1216,7 +1223,7 @@ static bool timing_driven_route_sink(
12161223 // We normally route high fanout nets by only adding spatially close-by routing to the heap (reduces run-time).
12171224 // However, if the current sink is 'critical' from a timing perspective, we put the entire route tree back onto
12181225 // the heap to ensure it has more flexibility to find the best path.
1219- if (high_fanout && !sink_critical && !net_is_global && !net_is_clock) {
1226+ if (high_fanout && !sink_critical && !net_is_global && !net_is_clock && !(routing_predictor. get_slope () > - 0.5 ) ) {
12201227 std::tie (found_path, cheapest) = router.timing_driven_route_connection_from_route_tree_high_fanout (rt_root,
12211228 sink_node,
12221229 cost_params,
0 commit comments