Skip to content

Commit 616833e

Browse files
committed
vpr: Cleanup and optimize router heap element struct
Uses a union to shrink the size from 32 to 24 bytes and clarifies comments. Closes #525
1 parent fdda2eb commit 616833e

File tree

5 files changed

+47
-42
lines changed

5 files changed

+47
-42
lines changed

vpr/src/route/route_breadth_first.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -207,8 +207,8 @@ static bool breadth_first_route_net(ClusterNetId net_id, float bend_cost) {
207207
add_to_mod_list(current->index, modified_rr_node_inf);
208208

209209
route_ctx.rr_node_route_inf[current->index].path_cost = new_pcost;
210-
route_ctx.rr_node_route_inf[current->index].prev_node = current->prev_node;
211-
route_ctx.rr_node_route_inf[current->index].prev_edge = current->prev_edge;
210+
route_ctx.rr_node_route_inf[current->index].prev_node = current->u.prev.node;
211+
route_ctx.rr_node_route_inf[current->index].prev_edge = current->u.prev.edge;
212212

213213
#ifdef ROUTER_DEBUG
214214
VTR_LOG(" Expanding node %d neighbours\n", inode);
@@ -242,8 +242,8 @@ static bool breadth_first_route_net(ClusterNetId net_id, float bend_cost) {
242242
add_to_mod_list(current->index, modified_rr_node_inf);
243243

244244
route_ctx.rr_node_route_inf[current->index].path_cost = current->cost;
245-
route_ctx.rr_node_route_inf[current->index].prev_node = current->prev_node;
246-
route_ctx.rr_node_route_inf[current->index].prev_edge = current->prev_edge;
245+
route_ctx.rr_node_route_inf[current->index].prev_node = current->u.prev.node;
246+
route_ctx.rr_node_route_inf[current->index].prev_edge = current->u.prev.edge;
247247
}
248248

249249
route_ctx.rr_node_route_inf[inode].target_flag--; /* Connected to this SINK. */
@@ -405,8 +405,8 @@ static void breadth_first_add_to_heap(const float path_cost, const float bend_co
405405

406406
//Record how we reached this node
407407
next->index = to_node;
408-
next->prev_edge = iconn;
409-
next->prev_node = from_node;
408+
next->u.prev.edge = iconn;
409+
next->u.prev.node = from_node;
410410

411411
add_to_heap(next);
412412
}

vpr/src/route/route_common.cpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -818,10 +818,10 @@ void node_to_heap(int inode, float total_cost, int prev_node, int prev_edge,
818818
t_heap* hptr = alloc_heap_data();
819819
hptr->index = inode;
820820
hptr->cost = total_cost;
821-
VTR_ASSERT_SAFE(hptr->prev_node == NO_PREVIOUS);
822-
VTR_ASSERT_SAFE(hptr->prev_edge == NO_PREVIOUS);
823-
hptr->prev_node = prev_node;
824-
hptr->prev_edge = prev_edge;
821+
VTR_ASSERT_SAFE(hptr->u.prev.node == NO_PREVIOUS);
822+
VTR_ASSERT_SAFE(hptr->u.prev.edge == NO_PREVIOUS);
823+
hptr->u.prev.node = prev_node;
824+
hptr->u.prev.edge = prev_edge;
825825
hptr->backward_path_cost = backward_path_cost;
826826
hptr->R_upstream = R_upstream;
827827
add_to_heap(hptr);
@@ -978,7 +978,7 @@ void free_route_structs() {
978978
t_heap* curr = heap_free_head;
979979
while(curr) {
980980
t_heap* tmp = curr;
981-
curr = curr->next;
981+
curr = curr->u.next;
982982

983983
vtr::chunk_delete(tmp, &heap_ch);
984984
}
@@ -1299,8 +1299,8 @@ namespace heap_ {
12991299
t_heap* hptr = alloc_heap_data();
13001300
hptr->index = inode;
13011301
hptr->cost = total_cost;
1302-
hptr->prev_node = prev_node;
1303-
hptr->prev_edge = prev_edge;
1302+
hptr->u.prev.node = prev_node;
1303+
hptr->u.prev.edge = prev_edge;
13041304
hptr->backward_path_cost = backward_path_cost;
13051305
hptr->R_upstream = R_upstream;
13061306
push_back(hptr);
@@ -1412,23 +1412,23 @@ alloc_heap_data() {
14121412

14131413
//Extract the head
14141414
t_heap* temp_ptr = heap_free_head;
1415-
heap_free_head = heap_free_head->next;
1415+
heap_free_head = heap_free_head->u.next;
14161416

14171417
num_heap_allocated++;
14181418

14191419
//Reset
1420-
temp_ptr->next = nullptr;
1420+
temp_ptr->u.next = nullptr;
14211421
temp_ptr->cost = 0.;
14221422
temp_ptr->backward_path_cost = 0.;
14231423
temp_ptr->R_upstream = 0.;
14241424
temp_ptr->index = OPEN;
1425-
temp_ptr->prev_node = NO_PREVIOUS;
1426-
temp_ptr->prev_edge = NO_PREVIOUS;
1425+
temp_ptr->u.prev.node = NO_PREVIOUS;
1426+
temp_ptr->u.prev.edge = NO_PREVIOUS;
14271427
return (temp_ptr);
14281428
}
14291429

14301430
void free_heap_data(t_heap *hptr) {
1431-
hptr->next = heap_free_head;
1431+
hptr->u.next = heap_free_head;
14321432
heap_free_head = hptr;
14331433
num_heap_allocated--;
14341434
}
@@ -1441,7 +1441,7 @@ void invalidate_heap_entries(int sink_node, int ipin_node) {
14411441

14421442
for (int i = 1; i < heap_tail; i++) {
14431443
if (heap[i]->index == sink_node) {
1444-
if (heap[i]->prev_node == ipin_node) {
1444+
if (heap[i]->u.prev.node == ipin_node) {
14451445
heap[i]->index = OPEN; /* Invalid. */
14461446
break;
14471447
}

vpr/src/route/route_common.h

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,42 +8,47 @@
88
/* Used by the heap as its fundamental data structure.
99
* Each heap element represents a partial route.
1010
*
11-
* next: pointer to the next s_heap structure in the free
12-
* linked list. Not used when on the heap.
13-
*
1411
* cost: The cost used to sort heap.
1512
* For the timing-driven router this is the backward_path_cost +
1613
* expected cost to the target.
1714
* For the breadth-first router it is the node cost to reach this
1815
* point.
16+
*
1917
* backward_path_cost: Used only by the timing-driven router. The "known"
2018
* cost of the path up to and including this node.
2119
* In this case, the .cost member contains not only
2220
* the known backward cost but also an expected cost
2321
* to the target.
22+
*
2423
* R_upstream: Used only by the timing-driven router. Stores the upstream
2524
* resistance to ground from this node, including the
2625
* resistance of the node itself (device_ctx.rr_nodes[index].R).
2726
*
2827
* index: The RR node index associated with the costs/R_upstream values
29-
* nodes: The set of nodes represented by this heap element.
30-
* Usually this contains a single element corresponding to index.
31-
* However in some cases (e.g. non-configurable edges) multiple RR
32-
* nodes may be required to be used together. In such cases each
33-
* node will be inclued in 'nodes' and 'cost', 'backward_path_cost',
34-
* R_upstream will be those associated with the lowest cost node (who's
35-
* index is stored in 'index' for reference).
28+
*
29+
* u.prev.node: The previous node used to reach the current 'index' node
30+
* u.prev.next: The edge from u.prev.node used to reach the current 'index' node
31+
*
32+
* u.next: pointer to the next s_heap structure in the free
33+
* linked list. Not used when on the heap.
34+
*
3635
*/
3736
struct t_heap {
38-
t_heap *next = nullptr;
39-
4037
float cost = 0.;
4138
float backward_path_cost = 0.;
4239
float R_upstream = 0.;
4340

4441
int index = OPEN;
45-
int prev_node = NO_PREVIOUS;
46-
int prev_edge = NO_PREVIOUS;
42+
43+
struct t_prev {
44+
int node;
45+
int edge;
46+
};
47+
48+
union {
49+
t_heap* next;
50+
t_prev prev;
51+
} u;
4752
};
4853

4954
/******* Subroutines in route_common used only by other router modules ******/

vpr/src/route/route_timing.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1073,8 +1073,8 @@ static bool timing_driven_route_sink(ClusterNetId net_id, unsigned itarget, int
10731073
//Record final link to target
10741074
add_to_mod_list(cheapest->index, modified_rr_node_inf);
10751075

1076-
route_ctx.rr_node_route_inf[cheapest->index].prev_node = cheapest->prev_node;
1077-
route_ctx.rr_node_route_inf[cheapest->index].prev_edge = cheapest->prev_edge;
1076+
route_ctx.rr_node_route_inf[cheapest->index].prev_node = cheapest->u.prev.node;
1077+
route_ctx.rr_node_route_inf[cheapest->index].prev_edge = cheapest->u.prev.edge;
10781078
route_ctx.rr_node_route_inf[cheapest->index].path_cost = cheapest->cost;
10791079
route_ctx.rr_node_route_inf[cheapest->index].backward_path_cost = cheapest->backward_path_cost;
10801080
}
@@ -1378,12 +1378,12 @@ static void timing_driven_expand_cheapest(t_heap* cheapest,
13781378
if (old_total_cost > new_total_cost && old_back_cost > new_back_cost) {
13791379

13801380
VTR_LOGV_DEBUG(f_router_debug, " Better cost to %d\n", inode);
1381-
VTR_LOGV_DEBUG(f_router_debug, " Setting path costs for assicated node %d (from %d edge %d)\n", cheapest->index, cheapest->prev_node, cheapest->prev_edge);
1381+
VTR_LOGV_DEBUG(f_router_debug, " Setting path costs for assicated node %d (from %d edge %d)\n", cheapest->index, cheapest->u.prev.node, cheapest->u.prev.edge);
13821382

13831383
add_to_mod_list(cheapest->index, modified_rr_node_inf);
13841384

1385-
route_ctx.rr_node_route_inf[cheapest->index].prev_node = cheapest->prev_node;
1386-
route_ctx.rr_node_route_inf[cheapest->index].prev_edge = cheapest->prev_edge;
1385+
route_ctx.rr_node_route_inf[cheapest->index].prev_node = cheapest->u.prev.node;
1386+
route_ctx.rr_node_route_inf[cheapest->index].prev_edge = cheapest->u.prev.edge;
13871387
route_ctx.rr_node_route_inf[cheapest->index].path_cost = new_total_cost;
13881388
route_ctx.rr_node_route_inf[cheapest->index].backward_path_cost = new_back_cost;
13891389

@@ -1837,8 +1837,8 @@ static void timing_driven_expand_node(const t_conn_cost_params cost_params,
18371837

18381838
//Record how we reached this node
18391839
current->index = to_node;
1840-
current->prev_edge = iconn;
1841-
current->prev_node = from_node;
1840+
current->u.prev.edge = iconn;
1841+
current->u.prev.node = from_node;
18421842
}
18431843

18441844
//Calculates the cost of reaching to_node

vpr/src/route/route_tree_timing.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -305,8 +305,8 @@ add_subtree_to_route_tree(t_heap *hptr, t_rt_node ** sink_rt_node_ptr) {
305305
downstream_rt_node = sink_rt_node;
306306

307307
std::unordered_set<int> main_branch_visited;
308-
inode = hptr->prev_node;
309-
iedge = hptr->prev_edge;
308+
inode = hptr->u.prev.node;
309+
iedge = hptr->u.prev.edge;
310310
iswitch = device_ctx.rr_nodes[inode].edge_switch(iedge);
311311

312312
/* For all "new" nodes in the main path */

0 commit comments

Comments
 (0)