blob: 7e17eca9cc5e8823b4ac1186d96fffca235cb7ea [file] [log] [blame] [edit]
#pragma once
#include <vector>
#include "route_tree_type.h"
#include "connection_based_routing.h"
#include "route_common.h"
#include "spatial_route_tree_lookup.h"
/**************** Subroutines exported by route_tree_timing.c ***************/
//Returns true if allocated
bool alloc_route_tree_timing_structs(bool exists_ok = false);
void free_route_tree_timing_structs();
t_rt_node* init_route_tree_to_source(ClusterNetId inet);
void free_route_tree(t_rt_node* rt_node);
void print_route_tree(const t_rt_node* rt_node, int depth = 0);
t_rt_node* update_route_tree(t_heap* hptr, SpatialRouteTreeLookup* spatial_rt_lookup);
void update_net_delays_from_route_tree(float* net_delay,
const t_rt_node* const* rt_node_of_sink,
ClusterNetId inet);
void update_remaining_net_delays_from_route_tree(float* net_delay,
const t_rt_node* const* rt_node_of_sink,
const std::vector<int>& remaining_sinks);
void load_route_tree_Tdel(t_rt_node* rt_root, float Tarrival);
void load_route_tree_rr_route_inf(t_rt_node* root);
t_rt_node* init_route_tree_to_source_no_net(int inode);
void add_route_tree_to_rr_node_lookup(t_rt_node* node);
bool verify_route_tree(t_rt_node* root);
bool verify_traceback_route_tree_equivalent(const t_trace* trace_head, const t_rt_node* rt_root);
void clear_rr_node_to_rt_node();
/********** Incremental reroute ***********/
// instead of ripping up a net that has some congestion, cut the branches
// that don't legally lead to a sink and start routing with that partial route tree
void print_edge(const t_linked_rt_edge* edge);
void print_route_tree(const t_rt_node* rt_root);
void print_route_tree_inf(const t_rt_node* rt_root);
void print_route_tree_congestion(const t_rt_node* rt_root);
t_rt_node* traceback_to_route_tree(t_trace* head);
t_rt_node* traceback_to_route_tree(ClusterNetId inet);
t_trace* traceback_from_route_tree(ClusterNetId inet, const t_rt_node* root, int num_remaining_sinks);
t_rt_node* prune_route_tree(t_rt_node* rt_root, CBRR& connections_inf);
void pathfinder_update_cost_from_route_tree(const t_rt_node* rt_root, int add_or_sub, float pres_fac);
bool is_equivalent_route_tree(const t_rt_node* rt_root, const t_rt_node* cloned_rt_root);
bool is_valid_skeleton_tree(const t_rt_node* rt_root);
bool is_valid_route_tree(const t_rt_node* rt_root);
bool is_uncongested_route_tree(const t_rt_node* root);
float load_new_subtree_C_downstream(t_rt_node* rt_node);
void load_new_subtree_R_upstream(t_rt_node* rt_node);