blob: c356b096c3bddc962d6c115b977394910256b235 [file] [log] [blame]
#pragma once
#include <unordered_map>
#include <vector>
#include "connection_based_routing.h"
#include "vpr_types.h"
#include "vpr_utils.h"
#include "timing_info_fwd.h"
#include "route_budgets.h"
#include "route_common.h"
#include "router_stats.h"
#include "router_lookahead.h"
int get_max_pins_per_net();
bool try_timing_driven_route(const t_router_opts& router_opts,
const t_analysis_opts& analysis_opts,
const std::vector<t_segment_inf>& segment_inf,
vtr::vector<ClusterNetId, float*>& net_delay,
const ClusteredPinAtomPinsLookup& netlist_pin_lookup,
std::shared_ptr<SetupHoldTimingInfo> timing_info,
std::shared_ptr<RoutingDelayCalculator> delay_calc,
ScreenUpdatePriority first_iteration_priority);
bool try_timing_driven_route_net(ClusterNetId net_id,
int itry,
float pres_fac,
const t_router_opts& router_opts,
CBRR& connections_inf,
RouterStats& connections_routed,
float* pin_criticality,
t_rt_node** rt_node_of_sink,
vtr::vector<ClusterNetId, float*>& net_delay,
const RouterLookahead& router_lookahead,
const ClusteredPinAtomPinsLookup& netlist_pin_lookup,
std::shared_ptr<SetupTimingInfo> timing_info,
route_budgets& budgeting_inf,
bool& was_rerouted);
bool timing_driven_route_net(ClusterNetId net_id,
int itry,
float pres_fac,
const t_router_opts& router_opts,
CBRR& connections_inf,
RouterStats& connections_routed,
float* pin_criticality,
t_rt_node** rt_node_of_sink,
float* net_delay,
const RouterLookahead& router_lookahead,
const ClusteredPinAtomPinsLookup& netlist_pin_lookup,
std::shared_ptr<const SetupTimingInfo> timing_info,
route_budgets& budgeting_inf);
void alloc_timing_driven_route_structs(float** pin_criticality_ptr,
int** sink_order_ptr,
t_rt_node*** rt_node_of_sink_ptr);
void free_timing_driven_route_structs(float* pin_criticality, int* sink_order, t_rt_node** rt_node_of_sink);
void enable_router_debug(const t_router_opts& router_opts, ClusterNetId net, int sink_rr);
//Delay budget information for a specific connection
struct t_conn_delay_budget {
float short_path_criticality; //Hold criticality
float min_delay; //Minimum legal connection delay
float target_delay; //Target/goal connection delay
float max_delay; //Maximum legal connection delay
};
struct t_conn_cost_params {
float criticality = 1.;
float astar_fac = 1.2;
float bend_cost = 1.;
const t_conn_delay_budget* delay_budget = nullptr;
//TODO: Eventually once delay budgets are working, t_conn_delay_budget
//should be factoured out, and the delay budget parameters integrated
//into this struct instead. For now left as a pointer to control whether
//budgets are enabled.
};
t_heap* timing_driven_route_connection_from_route_tree(t_rt_node* rt_root,
int sink_node,
const t_conn_cost_params cost_params,
t_bb bounding_box,
const RouterLookahead& router_lookahead,
std::vector<int>& modified_rr_node_inf,
RouterStats& router_stats);
std::vector<t_heap> timing_driven_find_all_shortest_paths_from_route_tree(t_rt_node* rt_root,
const t_conn_cost_params cost_params,
t_bb bounding_box,
std::vector<int>& modified_rr_node_inf,
RouterStats& router_stats);
struct timing_driven_route_structs {
// data while timing driven route is active
float* pin_criticality; /* [1..max_pins_per_net-1] */
int* sink_order; /* [1..max_pins_per_net-1] */
t_rt_node** rt_node_of_sink; /* [1..max_pins_per_net-1] */
timing_driven_route_structs();
~timing_driven_route_structs();
};
void update_rr_base_costs(int fanout);