/************ Defines and types shared by all route files ********************/ struct s_heap { int index; float cost; union { int prev_node; struct s_heap *next; } u; int prev_edge; float backward_path_cost; float R_upstream; }; /* Used by the heap as its fundamental data structure. * * index: Index (ID) of this routing resource node. * * cost: Cost up to and including this node. * * u.prev_node: Index (ID) of the predecessor to this node for * * use in traceback. NO_PREVIOUS if none. * * u.next: pointer to the next s_heap structure in the free * * linked list. Not used when on the heap. * * prev_edge: Index of the edge (between 0 and num_edges-1) used to * * connect the previous node to this one. NO_PREVIOUS if * * there is no previous node. * * backward_path_cost: Used only by the timing-driven router. The "known" * * cost of the path up to and including this node. * * In this case, the .cost member contains not only * * the known backward cost but also an expected cost * * to the target. * * R_upstream: Used only by the timing-driven router. Stores the upstream * * resistance to ground from this node, including the * * resistance of the node itself (rr_node[index].R). */ typedef struct { int prev_node; float pres_cost; float acc_cost; float path_cost; float backward_path_cost; short prev_edge; short target_flag; } t_rr_node_route_inf; /* Extra information about each rr_node needed only during routing (i.e. * * during the maze expansion). * * * * prev_node: Index of the previous node used to reach this one; * * used to generate the traceback. If there is no * * predecessor, prev_node = NO_PREVIOUS. * * pres_cost: Present congestion cost term for this node. * * acc_cost: Accumulated cost term from previous Pathfinder iterations. * * path_cost: Total cost of the path up to and including this node + * * the expected cost to the target if the timing_driven router * * is being used. * * backward_path_cost: Total cost of the path up to and including this * * node. Not used by breadth-first router. * * prev_edge: Index of the edge (from 0 to num_edges-1) that was used * * to reach this node from the previous node. If there is * * no predecessor, prev_edge = NO_PREVIOUS. * * target_flag: Is this node a target (sink) for the current routing? * * Number of times this node must be reached to fully route. */ /**************** Variables shared by all route_files ***********************/ extern t_rr_node_route_inf *rr_node_route_inf; /* [0..num_rr_nodes-1] */ extern struct s_bb *route_bb; /* [0..num_nets-1] */ /******* Subroutines in route_common used only by other router modules ******/ void pathfinder_update_one_cost(struct s_trace *route_segment_start, int add_or_sub, float pres_fac); void pathfinder_update_cost(float pres_fac, float acc_fac); struct s_trace *update_traceback(struct s_heap *hptr, int inet); void reset_path_costs(void); float get_rr_cong_cost(int inode); void mark_ends(int inet); void node_to_heap(int inode, float cost, int prev_node, int prev_edge, float backward_path_cost, float R_upstream); boolean is_empty_heap(void); void free_traceback(int inet); void add_to_mod_list(float *fptr); struct s_heap *get_heap_head(void); void empty_heap(void); void free_heap_data(struct s_heap *hptr); void invalidate_heap_entries(int sink_node, int ipin_node); void init_route_structs(int bb_factor); void free_rr_node_route_structs(void); void alloc_and_load_rr_node_route_structs(void); void reset_rr_node_route_structs(void); void alloc_route_static_structs(void); void free_trace_structs(void); void reserve_locally_used_opins(float pres_fac, boolean rip_up_local_opins, t_ivec ** clb_opins_used_locally); void auto_detect_and_reserve_locally_used_opins(float pres_fac, boolean rip_up_local_opins, t_ivec ** clb_opins_used_locally); void free_chunk_memory_trace(void);