Skip to content

Commit 6aa5209

Browse files
authored
Merge pull request #1917 from RapidSilicon/api_num_configurable_edges
RRGraphView edges(), num_edges(), configurable_edges(), non_configurable_edges(), num_configurable_edges(), num_non_configurable_edges() Implementation
2 parents 4c4808a + a4a5abf commit 6aa5209

19 files changed

+89
-57
lines changed

utils/fasm/test/test_fasm.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ TEST_CASE("fasm_integration_test", "[fasm]") {
255255
auto &device_ctx = g_vpr_ctx.mutable_device();
256256
const auto& rr_graph = device_ctx.rr_graph;
257257
for(size_t inode = 0; inode < device_ctx.rr_nodes.size(); ++inode) {
258-
for(t_edge_size iedge = 0; iedge < device_ctx.rr_nodes[inode].num_edges(); ++iedge) {
258+
for(t_edge_size iedge = 0; iedge < rr_graph.num_edges(RRNodeId(inode)); ++iedge) {
259259
auto sink_inode = device_ctx.rr_nodes[inode].edge_sink_node(iedge);
260260
auto switch_id = device_ctx.rr_nodes[inode].edge_switch(iedge);
261261
auto value = vtr::string_fmt("%d_%d_%zu",

vpr/src/device/rr_graph_view.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,36 @@ class RRGraphView {
259259
return node_storage_.node_side_string(node);
260260
}
261261

262+
/** @brief Get the number of configurable edges. This function is inlined for runtime optimization. */
263+
inline t_edge_size num_configurable_edges(RRNodeId node) const {
264+
return node_storage_.num_configurable_edges(node);
265+
}
266+
267+
/** @brief Get the number of non-configurable edges. This function is inlined for runtime optimization. */
268+
inline t_edge_size num_non_configurable_edges(RRNodeId node) const {
269+
return node_storage_.num_non_configurable_edges(node);
270+
}
271+
272+
/** @brief Get ID range for configurable edges. This function is inlined for runtime optimization. */
273+
inline edge_idx_range configurable_edges(RRNodeId node) const {
274+
return node_storage_.configurable_edges(node);
275+
}
276+
277+
/** @brief Get ID range for non-configurable edges. This function is inlined for runtime optimization. */
278+
inline edge_idx_range non_configurable_edges(RRNodeId node) const {
279+
return node_storage_.non_configurable_edges(node);
280+
}
281+
282+
/** @brief Get ID range for edges. This function is inlined for runtime optimization. */
283+
inline edge_idx_range edges(RRNodeId node) const {
284+
return node_storage_.edges(node);
285+
}
286+
287+
/** @brief Get the number of edges. This function is inlined for runtime optimization. */
288+
inline t_edge_size num_edges(RRNodeId node) const {
289+
return node_storage_.num_edges(node);
290+
}
291+
262292
/** @brief The ptc_num carries different meanings for different node types
263293
* (true in VPR RRG that is currently supported, may not be true in customized RRG)
264294
* CHANX or CHANY: the track id in routing channels

vpr/src/draw/draw.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1688,7 +1688,7 @@ static void draw_rr_edges(int inode, ezgl::renderer* g) {
16881688

16891689
from_ptc_num = rr_graph.node_ptc_num(RRNodeId(inode));
16901690

1691-
for (t_edge_size iedge = 0, l = device_ctx.rr_nodes[inode].num_edges(); iedge < l; iedge++) {
1691+
for (t_edge_size iedge = 0, l = rr_graph.num_edges(RRNodeId(inode)); iedge < l; iedge++) {
16921692
to_node = device_ctx.rr_nodes[inode].edge_sink_node(iedge);
16931693
to_type = rr_graph.node_type(RRNodeId(to_node));
16941694
to_ptc_num = rr_graph.node_ptc_num(RRNodeId(to_node));
@@ -2697,10 +2697,11 @@ void highlight_nets(char* message, int hit_node) {
26972697
void draw_highlight_fan_in_fan_out(const std::set<int>& nodes) {
26982698
t_draw_state* draw_state = get_draw_state_vars();
26992699
auto& device_ctx = g_vpr_ctx.device();
2700+
const auto& rr_graph = device_ctx.rr_graph;
27002701

27012702
for (auto node : nodes) {
27022703
/* Highlight the fanout nodes in red. */
2703-
for (t_edge_size iedge = 0, l = device_ctx.rr_nodes[node].num_edges();
2704+
for (t_edge_size iedge = 0, l = rr_graph.num_edges(RRNodeId(node));
27042705
iedge < l; iedge++) {
27052706
int fanout_node = device_ctx.rr_nodes[node].edge_sink_node(iedge);
27062707

@@ -2719,7 +2720,7 @@ void draw_highlight_fan_in_fan_out(const std::set<int>& nodes) {
27192720

27202721
/* Highlight the nodes that can fanin to this node in blue. */
27212722
for (size_t inode = 0; inode < device_ctx.rr_nodes.size(); inode++) {
2722-
for (t_edge_size iedge = 0, l = device_ctx.rr_nodes[inode].num_edges(); iedge < l;
2723+
for (t_edge_size iedge = 0, l = rr_graph.num_edges(RRNodeId(inode)); iedge < l;
27232724
iedge++) {
27242725
int fanout_node = device_ctx.rr_nodes[inode].edge_sink_node(
27252726
iedge);
@@ -2823,11 +2824,12 @@ std::set<int> draw_expand_non_configurable_rr_nodes(int from_node) {
28232824
void draw_expand_non_configurable_rr_nodes_recurr(int from_node,
28242825
std::set<int>& expanded_nodes) {
28252826
auto& device_ctx = g_vpr_ctx.device();
2827+
const auto& rr_graph = device_ctx.rr_graph;
28262828

28272829
expanded_nodes.insert(from_node);
28282830

28292831
for (t_edge_size iedge = 0;
2830-
iedge < device_ctx.rr_nodes[from_node].num_edges(); ++iedge) {
2832+
iedge < rr_graph.num_edges(RRNodeId(from_node)); ++iedge) {
28312833
bool edge_configurable = device_ctx.rr_nodes[from_node].edge_is_configurable(iedge);
28322834
int to_node = device_ctx.rr_nodes[from_node].edge_sink_node(iedge);
28332835

@@ -3783,8 +3785,9 @@ bool trace_routed_connection_rr_nodes_recurr(const t_rt_node* rt_node,
37833785
//Find the edge between two rr nodes
37843786
static t_edge_size find_edge(int prev_inode, int inode) {
37853787
auto& device_ctx = g_vpr_ctx.device();
3788+
const auto& rr_graph = device_ctx.rr_graph;
37863789
for (t_edge_size iedge = 0;
3787-
iedge < device_ctx.rr_nodes[prev_inode].num_edges(); ++iedge) {
3790+
iedge < rr_graph.num_edges(RRNodeId(prev_inode)); ++iedge) {
37883791
if (device_ctx.rr_nodes[prev_inode].edge_sink_node(iedge) == inode) {
37893792
return iedge;
37903793
}

vpr/src/place/timing_place_lookup.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1166,16 +1166,16 @@ bool directconnect_exists(int src_rr_node, int sink_rr_node) {
11661166
VTR_ASSERT(rr_graph.node_type(RRNodeId(src_rr_node)) == SOURCE && rr_graph.node_type(RRNodeId(sink_rr_node)) == SINK);
11671167

11681168
//TODO: This is a constant depth search, but still may be too slow
1169-
for (t_edge_size i_src_edge = 0; i_src_edge < rr_nodes[src_rr_node].num_edges(); ++i_src_edge) {
1169+
for (t_edge_size i_src_edge = 0; i_src_edge < rr_graph.num_edges(RRNodeId(src_rr_node)); ++i_src_edge) {
11701170
int opin_rr_node = rr_nodes[src_rr_node].edge_sink_node(i_src_edge);
11711171

11721172
if (rr_graph.node_type(RRNodeId(opin_rr_node)) != OPIN) continue;
11731173

1174-
for (t_edge_size i_opin_edge = 0; i_opin_edge < rr_nodes[opin_rr_node].num_edges(); ++i_opin_edge) {
1174+
for (t_edge_size i_opin_edge = 0; i_opin_edge < rr_graph.num_edges(RRNodeId(opin_rr_node)); ++i_opin_edge) {
11751175
int ipin_rr_node = rr_nodes[opin_rr_node].edge_sink_node(i_opin_edge);
11761176
if (rr_graph.node_type(RRNodeId(ipin_rr_node)) != IPIN) continue;
11771177

1178-
for (t_edge_size i_ipin_edge = 0; i_ipin_edge < rr_nodes[ipin_rr_node].num_edges(); ++i_ipin_edge) {
1178+
for (t_edge_size i_ipin_edge = 0; i_ipin_edge < rr_graph.num_edges(RRNodeId(ipin_rr_node)); ++i_ipin_edge) {
11791179
if (sink_rr_node == rr_nodes[ipin_rr_node].edge_sink_node(i_ipin_edge)) {
11801180
return true;
11811181
}

vpr/src/power/power.cpp

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -821,7 +821,7 @@ static void power_usage_routing(t_power_usage* power_usage,
821821
continue;
822822
}
823823

824-
for (t_edge_size edge_idx = 0; edge_idx < node.num_edges(); edge_idx++) {
824+
for (t_edge_size edge_idx = 0; edge_idx < rr_graph.num_edges(RRNodeId(trace->index)); edge_idx++) {
825825
const auto& next_node_id = node.edge_sink_node(edge_idx);
826826
if (next_node_id != OPEN) {
827827
t_rr_node_power* next_node_power = &rr_node_power[next_node_id];
@@ -981,7 +981,7 @@ static void power_usage_routing(t_power_usage* power_usage,
981981
/* Determine types of switches that this wire drives */
982982
connectionbox_fanout = 0;
983983
switchbox_fanout = 0;
984-
for (t_edge_size iedge = 0; iedge < node.num_edges(); iedge++) {
984+
for (t_edge_size iedge = 0; iedge < rr_graph.num_edges(rr_node); iedge++) {
985985
if (node.edge_switch(iedge) == routing_arch->wire_to_rr_ipin_switch) {
986986
connectionbox_fanout++;
987987
} else if (node.edge_switch(iedge) == routing_arch->delayless_switch) {
@@ -1225,7 +1225,7 @@ void power_routing_init(const t_det_routing_arch* routing_arch) {
12251225
break;
12261226
case CHANX:
12271227
case CHANY:
1228-
for (t_edge_size iedge = 0; iedge < node.num_edges(); iedge++) {
1228+
for (t_edge_size iedge = 0; iedge < rr_graph.num_edges(RRNodeId(rr_node_idx)); iedge++) {
12291229
if (node.edge_switch(iedge) == routing_arch->wire_to_rr_ipin_switch) {
12301230
fanout_to_IPIN++;
12311231
} else if (node.edge_switch(iedge) != routing_arch->delayless_switch) {
@@ -1260,7 +1260,7 @@ void power_routing_init(const t_det_routing_arch* routing_arch) {
12601260
for (size_t rr_node_idx = 0; rr_node_idx < device_ctx.rr_nodes.size(); rr_node_idx++) {
12611261
auto node = device_ctx.rr_nodes[rr_node_idx];
12621262

1263-
for (t_edge_size edge_idx = 0; edge_idx < node.num_edges(); edge_idx++) {
1263+
for (t_edge_size edge_idx = 0; edge_idx < rr_graph.num_edges(RRNodeId(rr_node_idx)); edge_idx++) {
12641264
if (node.edge_sink_node(edge_idx) != OPEN) {
12651265
if (rr_node_power[node.edge_sink_node(edge_idx)].driver_switch_type == OPEN) {
12661266
rr_node_power[node.edge_sink_node(edge_idx)].driver_switch_type = node.edge_switch(edge_idx);
@@ -1274,13 +1274,11 @@ void power_routing_init(const t_det_routing_arch* routing_arch) {
12741274
/* Find Max Fanout of Routing Buffer */
12751275
t_edge_size max_seg_fanout = 0;
12761276
for (size_t rr_node_idx = 0; rr_node_idx < device_ctx.rr_nodes.size(); rr_node_idx++) {
1277-
auto node = device_ctx.rr_nodes[rr_node_idx];
1278-
12791277
switch (rr_graph.node_type(RRNodeId(rr_node_idx))) {
12801278
case CHANX:
12811279
case CHANY:
1282-
if (node.num_edges() > max_seg_fanout) {
1283-
max_seg_fanout = node.num_edges();
1280+
if (rr_graph.num_edges(RRNodeId(rr_node_idx)) > max_seg_fanout) {
1281+
max_seg_fanout = rr_graph.num_edges(RRNodeId(rr_node_idx));
12841282
}
12851283
break;
12861284
default:

vpr/src/route/check_route.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ static bool check_adjacent(int from_node, int to_node) {
309309

310310
reached = false;
311311

312-
for (t_edge_size iconn = 0; iconn < device_ctx.rr_nodes[from_node].num_edges(); iconn++) {
312+
for (t_edge_size iconn = 0; iconn < rr_graph.num_edges(RRNodeId(from_node)); iconn++) {
313313
if (device_ctx.rr_nodes[from_node].edge_sink_node(iconn) == to_node) {
314314
reached = true;
315315
break;

vpr/src/route/check_rr_graph.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ void check_rr_graph(const t_graph_type graph_type,
7171
}
7272

7373
t_rr_type rr_type = rr_graph.node_type(rr_node);
74-
int num_edges = device_ctx.rr_nodes[inode].num_edges();
74+
int num_edges = rr_graph.num_edges(RRNodeId(inode));
7575

7676
check_rr_node(inode, route_type, device_ctx);
7777

@@ -184,14 +184,14 @@ void check_rr_graph(const t_graph_type graph_type,
184184
check_unbuffered_edges(inode);
185185

186186
//Check that all config/non-config edges are appropriately organized
187-
for (auto edge : device_ctx.rr_nodes[inode].configurable_edges()) {
187+
for (auto edge : rr_graph.configurable_edges(RRNodeId(inode))) {
188188
if (!device_ctx.rr_nodes[inode].edge_is_configurable(edge)) {
189189
VPR_FATAL_ERROR(VPR_ERROR_ROUTE, "in check_rr_graph: node %d edge %d is non-configurable, but in configurable edges",
190190
inode, edge);
191191
}
192192
}
193193

194-
for (auto edge : device_ctx.rr_nodes[inode].non_configurable_edges()) {
194+
for (auto edge : rr_graph.non_configurable_edges(RRNodeId(inode))) {
195195
if (device_ctx.rr_nodes[inode].edge_is_configurable(edge)) {
196196
VPR_FATAL_ERROR(VPR_ERROR_ROUTE, "in check_rr_graph: node %d edge %d is configurable, but in non-configurable edges",
197197
inode, edge);
@@ -483,7 +483,7 @@ void check_rr_node(int inode, enum e_route_type route_type, const DeviceContext&
483483
}
484484

485485
/* Check that the number of (out) edges is reasonable. */
486-
num_edges = device_ctx.rr_nodes[inode].num_edges();
486+
num_edges = rr_graph.num_edges(RRNodeId(inode));
487487

488488
if (rr_type != SINK && rr_type != IPIN) {
489489
if (num_edges <= 0) {
@@ -544,7 +544,7 @@ static void check_unbuffered_edges(int from_node) {
544544
if (from_rr_type != CHANX && from_rr_type != CHANY)
545545
return;
546546

547-
from_num_edges = device_ctx.rr_nodes[from_node].num_edges();
547+
from_num_edges = rr_graph.num_edges(RRNodeId(from_node));
548548

549549
for (from_edge = 0; from_edge < from_num_edges; from_edge++) {
550550
to_node = device_ctx.rr_nodes[from_node].edge_sink_node(from_edge);
@@ -562,7 +562,7 @@ static void check_unbuffered_edges(int from_node) {
562562
* check that there is a corresponding edge from to_node back to *
563563
* from_node. */
564564

565-
to_num_edges = device_ctx.rr_nodes[to_node].num_edges();
565+
to_num_edges = rr_graph.num_edges(RRNodeId(to_node));
566566
trans_matched = false;
567567

568568
for (to_edge = 0; to_edge < to_num_edges; to_edge++) {

vpr/src/route/route_common.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -627,7 +627,8 @@ static std::pair<t_trace*, t_trace*> add_trace_non_configurable_recurr(int node,
627627
//Record the non-configurable out-going edges
628628
std::vector<t_edge_size> unvisited_non_configurable_edges;
629629
auto& device_ctx = g_vpr_ctx.device();
630-
for (auto iedge : device_ctx.rr_nodes[node].non_configurable_edges()) {
630+
const auto& rr_graph = device_ctx.rr_graph;
631+
for (auto iedge : rr_graph.non_configurable_edges(RRNodeId(node))) {
631632
VTR_ASSERT_SAFE(!device_ctx.rr_nodes[node].edge_is_configurable(iedge));
632633

633634
int to_node = device_ctx.rr_nodes[node].edge_sink_node(iedge);
@@ -1424,7 +1425,7 @@ void reserve_locally_used_opins(HeapInterface* heap, float pres_fac, float acc_f
14241425
//the reserved OPINs to move out of the way of congestion, by preferring
14251426
//to reserve OPINs with lower congestion costs).
14261427
from_node = route_ctx.rr_blk_source[blk_id][iclass];
1427-
num_edges = device_ctx.rr_nodes[from_node].num_edges();
1428+
num_edges = rr_graph.num_edges(RRNodeId(from_node));
14281429
for (iconn = 0; iconn < num_edges; iconn++) {
14291430
to_node = device_ctx.rr_nodes[from_node].edge_sink_node(iconn);
14301431

@@ -1561,9 +1562,10 @@ bool validate_traceback_recurr(t_trace* trace, std::set<int>& seen_rr_nodes) {
15611562
//Check there is an edge connecting trace and next
15621563

15631564
auto& device_ctx = g_vpr_ctx.device();
1565+
const auto& rr_graph = device_ctx.rr_graph;
15641566

15651567
bool found = false;
1566-
for (t_edge_size iedge = 0; iedge < device_ctx.rr_nodes[trace->index].num_edges(); ++iedge) {
1568+
for (t_edge_size iedge = 0; iedge < rr_graph.num_edges(RRNodeId(trace->index)); ++iedge) {
15671569
int to_node = device_ctx.rr_nodes[trace->index].edge_sink_node(iedge);
15681570

15691571
if (to_node == next->index) {

vpr/src/route/route_tree_timing.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ static t_rt_node* add_non_configurable_to_route_tree(const int rr_node, const bo
418418
VTR_ASSERT(rt_node->inode == rr_node);
419419
}
420420
}
421-
for (int iedge : device_ctx.rr_nodes[rr_node].non_configurable_edges()) {
421+
for (int iedge : rr_graph.non_configurable_edges(RRNodeId(rr_node))) {
422422
//Recursive case: expand children
423423
VTR_ASSERT(!device_ctx.rr_nodes[rr_node].edge_is_configurable(iedge));
424424

vpr/src/route/router_lookahead_map_utils.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,11 +259,13 @@ void expand_dijkstra_neighbours(const t_rr_graph_storage& rr_nodes,
259259
std::priority_queue<Entry,
260260
std::vector<Entry>,
261261
std::greater<Entry>>* pq) {
262+
auto& device_ctx = g_vpr_ctx.device();
263+
const auto& rr_graph = device_ctx.rr_graph;
262264
RRNodeId parent = parent_entry.rr_node;
263265

264266
auto& parent_node = rr_nodes[size_t(parent)];
265267

266-
for (int iedge = 0; iedge < parent_node.num_edges(); iedge++) {
268+
for (int iedge = 0; iedge < rr_graph.num_edges(RRNodeId(parent)); iedge++) {
267269
int child_node_ind = parent_node.edge_sink_node(iedge);
268270
int switch_ind = parent_node.edge_switch(iedge);
269271

vpr/src/route/router_lookahead_sampling.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ static std::tuple<int, int, int> get_node_info(const t_rr_node& node, int num_se
134134
return std::tuple<int, int, int>(OPEN, OPEN, OPEN);
135135
}
136136

137-
if (rr_graph.node_capacity(rr_node) == 0 || node.num_edges() == 0) {
137+
if (rr_graph.node_capacity(rr_node) == 0 || rr_graph.num_edges(rr_node) == 0) {
138138
return std::tuple<int, int, int>(OPEN, OPEN, OPEN);
139139
}
140140

@@ -205,7 +205,7 @@ std::vector<SampleRegion> find_sample_regions(int num_segments) {
205205
std::vector<vtr::Rect<int>> bounding_box_for_segment(num_segments, vtr::Rect<int>());
206206
for (auto& node : rr_nodes) {
207207
if (rr_graph.node_type(node.id()) != CHANX && rr_graph.node_type(node.id()) != CHANY) continue;
208-
if (rr_graph.node_capacity(node.id()) == 0 || node.num_edges() == 0) continue;
208+
if (rr_graph.node_capacity(node.id()) == 0 || rr_graph.num_edges(node.id()) == 0) continue;
209209
int seg_index = device_ctx.rr_indexed_data[rr_graph.node_cost_index(node.id())].seg_index;
210210

211211
VTR_ASSERT(seg_index != OPEN);

vpr/src/route/rr_graph.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -375,9 +375,11 @@ void create_rr_graph(const t_graph_type graph_type,
375375
void print_rr_graph_stats() {
376376
auto& device_ctx = g_vpr_ctx.device();
377377

378+
const auto& rr_graph = device_ctx.rr_graph;
379+
378380
size_t num_rr_edges = 0;
379381
for (auto& rr_node : device_ctx.rr_nodes) {
380-
num_rr_edges += rr_node.edges().size();
382+
num_rr_edges += rr_graph.edges(rr_node.id()).size();
381383
}
382384

383385
VTR_LOG(" RR Graph Nodes: %zu\n", device_ctx.rr_nodes.size());
@@ -2466,7 +2468,7 @@ std::string describe_rr_node(int inode) {
24662468

24672469
msg += vtr::string_fmt(" capacity: %d", rr_graph.node_capacity(RRNodeId(inode)));
24682470
msg += vtr::string_fmt(" fan-in: %d", rr_graph.node_fan_in(RRNodeId(inode)));
2469-
msg += vtr::string_fmt(" fan-out: %d", rr_node.num_edges());
2471+
msg += vtr::string_fmt(" fan-out: %d", rr_graph.num_edges(RRNodeId(inode)));
24702472

24712473
msg += " " + rr_graph.node_coordinate_to_string(RRNodeId(inode));
24722474

vpr/src/route/rr_graph_area.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ void count_bidir_routing_transistors(int num_switch, int wire_to_ipin_switch, fl
164164
switch (from_rr_type) {
165165
case CHANX:
166166
case CHANY:
167-
num_edges = device_ctx.rr_nodes[from_node].num_edges();
167+
num_edges = rr_graph.num_edges(RRNodeId(from_node));
168168

169169
for (iedge = 0; iedge < num_edges; iedge++) {
170170
RRNodeId to_node = RRNodeId(device_ctx.rr_nodes[from_node].edge_sink_node(iedge));
@@ -249,7 +249,7 @@ void count_bidir_routing_transistors(int num_switch, int wire_to_ipin_switch, fl
249249
break;
250250

251251
case OPIN:
252-
num_edges = device_ctx.rr_nodes[from_node].num_edges();
252+
num_edges = rr_graph.num_edges(RRNodeId(from_node));
253253
shared_opin_buffer_trans = 0.;
254254

255255
for (iedge = 0; iedge < num_edges; iedge++) {
@@ -361,7 +361,7 @@ void count_unidir_routing_transistors(std::vector<t_segment_inf>& /*segment_inf*
361361
switch (from_rr_type) {
362362
case CHANX:
363363
case CHANY:
364-
num_edges = device_ctx.rr_nodes[from_node].num_edges();
364+
num_edges = rr_graph.num_edges(RRNodeId(from_node));
365365

366366
/* Increment number of inputs per cblock if IPIN */
367367
for (iedge = 0; iedge < num_edges; iedge++) {

0 commit comments

Comments
 (0)