Skip to content

Commit 2c51ae7

Browse files
committed
Move call location of ClockRRGraphBuilder and use alloc_and_load_edges.
By moving ClockRRGraphBuilder earlier in the rr graph flow, several parts of ClockRRGraphBuilder::create_and_append_clock_rr_graph can be avoided, as they were duplicating work that the original build_rr_graph flow was already doing (init_fan, mapping arch switch to rr switch, partition_edges). This new code should also fully preallocate the rr_node array, though this is not required by the code. Signed-off-by: Keith Rothman <[email protected]>
1 parent 2780988 commit 2c51ae7

9 files changed

+276
-197
lines changed

vpr/src/route/clock_connection_builders.cpp

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -39,18 +39,24 @@ void RoutingToClockConnection::set_fc_val(float fc_val) {
3939
* RoutingToClockConnection (member functions)
4040
*/
4141

42-
void RoutingToClockConnection::create_switches(const ClockRRGraphBuilder& clock_graph) {
42+
size_t RoutingToClockConnection::estimate_additional_nodes() {
43+
return 1;
44+
}
45+
46+
void RoutingToClockConnection::create_switches(const ClockRRGraphBuilder& clock_graph, t_rr_edge_info_set* rr_edges_to_create) {
4347
// Initialize random seed
4448
// Must be done durring every call inorder for restored rr_graphs after a binary
4549
// search to be consistant
4650
std::srand(seed);
4751

48-
auto& device_ctx = g_vpr_ctx.mutable_device();
49-
auto& rr_nodes = device_ctx.rr_nodes;
52+
auto& device_ctx = g_vpr_ctx.device();
5053
auto& rr_node_indices = device_ctx.rr_node_indices;
5154

5255
int virtual_clock_network_root_idx = create_virtual_clock_network_sink_node(switch_location.x, switch_location.y);
53-
device_ctx.virtual_clock_network_root_idx = virtual_clock_network_root_idx;
56+
{
57+
auto& mut_device_ctx = g_vpr_ctx.mutable_device();
58+
mut_device_ctx.virtual_clock_network_root_idx = virtual_clock_network_root_idx;
59+
}
5460

5561
// rr_node indices for x and y channel routing wires and clock wires to connect to
5662
auto x_wire_indices = get_rr_node_chan_wires_at_location(
@@ -68,18 +74,18 @@ void RoutingToClockConnection::create_switches(const ClockRRGraphBuilder& clock_
6874
// Connect to x-channel wires
6975
unsigned num_wires_x = x_wire_indices.size() * fc;
7076
for (size_t i = 0; i < num_wires_x; i++) {
71-
rr_nodes[x_wire_indices[i]].add_edge(clock_index, rr_switch_idx);
77+
rr_edges_to_create->emplace_back(x_wire_indices[i], clock_index, rr_switch_idx);
7278
}
7379

7480
// Connect to y-channel wires
7581
unsigned num_wires_y = y_wire_indices.size() * fc;
7682
for (size_t i = 0; i < num_wires_y; i++) {
77-
rr_nodes[y_wire_indices[i]].add_edge(clock_index, rr_switch_idx);
83+
rr_edges_to_create->emplace_back(y_wire_indices[i], clock_index, rr_switch_idx);
7884
}
7985

8086
// Connect to virtual clock sink node
8187
// used by the two stage router
82-
rr_nodes[clock_index].add_edge(virtual_clock_network_root_idx, rr_switch_idx);
88+
rr_edges_to_create->emplace_back(clock_index, virtual_clock_network_root_idx, rr_switch_idx);
8389
}
8490
}
8591

@@ -134,10 +140,13 @@ void ClockToClockConneciton::set_fc_val(float fc_val) {
134140
* ClockToClockConneciton (member functions)
135141
*/
136142

137-
void ClockToClockConneciton::create_switches(const ClockRRGraphBuilder& clock_graph) {
138-
auto& device_ctx = g_vpr_ctx.mutable_device();
143+
size_t ClockToClockConneciton::estimate_additional_nodes() {
144+
return 0;
145+
}
146+
147+
void ClockToClockConneciton::create_switches(const ClockRRGraphBuilder& clock_graph, t_rr_edge_info_set* rr_edges_to_create) {
148+
auto& device_ctx = g_vpr_ctx.device();
139149
auto& grid = device_ctx.grid;
140-
auto& rr_nodes = device_ctx.rr_nodes;
141150

142151
auto to_locations = clock_graph.get_switch_locations(to_clock, to_switch);
143152

@@ -179,7 +188,7 @@ void ClockToClockConneciton::create_switches(const ClockRRGraphBuilder& clock_gr
179188
if (from_itter == from_rr_node_indices.end()) {
180189
from_itter = from_rr_node_indices.begin();
181190
}
182-
rr_nodes[*from_itter].add_edge(to_index, rr_switch_idx);
191+
rr_edges_to_create->emplace_back(*from_itter, to_index, rr_switch_idx);
183192
from_itter++;
184193
}
185194
}
@@ -211,9 +220,12 @@ void ClockToPinsConnection::set_fc_val(float fc_val) {
211220
* ClockToPinsConnection (member functions)
212221
*/
213222

214-
void ClockToPinsConnection::create_switches(const ClockRRGraphBuilder& clock_graph) {
215-
auto& device_ctx = g_vpr_ctx.mutable_device();
216-
auto& rr_nodes = device_ctx.rr_nodes;
223+
size_t ClockToPinsConnection::estimate_additional_nodes() {
224+
return 0;
225+
}
226+
227+
void ClockToPinsConnection::create_switches(const ClockRRGraphBuilder& clock_graph, t_rr_edge_info_set* rr_edges_to_create) {
228+
auto& device_ctx = g_vpr_ctx.device();
217229
auto& rr_node_indices = device_ctx.rr_node_indices;
218230
auto& grid = device_ctx.grid;
219231

@@ -290,7 +302,7 @@ void ClockToPinsConnection::create_switches(const ClockRRGraphBuilder& clock_gra
290302

291303
//Create edges depending on Fc
292304
for (size_t i = 0; i < clock_network_indices.size() * fc; i++) {
293-
rr_nodes[clock_network_indices[i]].add_edge(clock_pin_node_idx, rr_switch_idx);
305+
rr_edges_to_create->emplace_back(clock_network_indices[i], clock_pin_node_idx, rr_switch_idx);
294306
}
295307
}
296308
}

vpr/src/route/clock_connection_builders.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
#include "clock_fwd.h"
77

8+
#include "rr_graph2.h"
89
#include "rr_graph_clock.h"
910

1011
class ClockRRGraphBuilder;
@@ -26,7 +27,8 @@ class ClockConnection {
2627
/*
2728
* Member functions
2829
*/
29-
virtual void create_switches(const ClockRRGraphBuilder& clock_graph) = 0;
30+
virtual void create_switches(const ClockRRGraphBuilder& clock_graph, t_rr_edge_info_set* rr_edges_to_create) = 0;
31+
virtual size_t estimate_additional_nodes() = 0;
3032
};
3133

3234
class RoutingToClockConnection : public ClockConnection {
@@ -53,7 +55,8 @@ class RoutingToClockConnection : public ClockConnection {
5355
* Member functions
5456
*/
5557
/* Connects the inter-block routing to the clock source at the specified coordinates */
56-
void create_switches(const ClockRRGraphBuilder& clock_graph);
58+
void create_switches(const ClockRRGraphBuilder& clock_graph, t_rr_edge_info_set* rr_edges_to_create) override;
59+
size_t estimate_additional_nodes() override;
5760
int create_virtual_clock_network_sink_node(int x, int y);
5861
};
5962

@@ -81,7 +84,8 @@ class ClockToClockConneciton : public ClockConnection {
8184
* Member functions
8285
*/
8386
/* Connects a clock tap to a clock source */
84-
void create_switches(const ClockRRGraphBuilder& clock_graph);
87+
void create_switches(const ClockRRGraphBuilder& clock_graph, t_rr_edge_info_set* rr_edges_to_create) override;
88+
size_t estimate_additional_nodes() override;
8589
};
8690

8791
/* This class currently only supports Clock Network to clock pin connection.
@@ -106,7 +110,8 @@ class ClockToPinsConnection : public ClockConnection {
106110
* Member functions
107111
*/
108112
/* Connects the clock tap to block pins */
109-
void create_switches(const ClockRRGraphBuilder& clock_graph);
113+
void create_switches(const ClockRRGraphBuilder& clock_graph, t_rr_edge_info_set* rr_edges_to_create) override;
114+
size_t estimate_additional_nodes() override;
110115
};
111116

112117
#endif

0 commit comments

Comments
 (0)