Skip to content

Commit d735a46

Browse files
authored
Merge pull request #1908 from ethanroj23/rr_graph_node_ptc_num
RRGraphView node_ptc_num(), node_pin_num(), node_class_num(), node_track_num() Implementation
2 parents de3914c + 331d0af commit d735a46

19 files changed

+124
-110
lines changed

utils/fasm/test/test_fasm.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ static std::string get_pin_feature (size_t inode) {
193193
int ilow = rr_graph.node_xlow(RRNodeId(inode));
194194
int jlow = rr_graph.node_ylow(RRNodeId(inode));
195195
auto physical_tile = device_ctx.grid[ilow][jlow].type;
196-
int pin_num = device_ctx.rr_nodes[inode].ptc_num();
196+
int pin_num = rr_graph.node_pin_num(RRNodeId(inode));
197197

198198
// Get the sub tile (type, not instance) and index of its pin that matches
199199
// the node index.

vpr/src/base/read_route.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,6 @@ static void process_nodes(std::ifstream& fp, ClusterNetId inet, const char* file
249249
} else if (tokens[0] == "Node:") {
250250
/*An actual line, go through each node and add it to the route tree*/
251251
inode = atoi(tokens[1].c_str());
252-
auto node = device_ctx.rr_nodes[inode];
253252

254253
/*First node needs to be source. It is isolated to correctly set heap head.*/
255254
if (node_count == 0 && tokens[2] != "SOURCE") {
@@ -309,7 +308,7 @@ static void process_nodes(std::ifstream& fp, ClusterNetId inet, const char* file
309308
}
310309

311310
ptc = atoi(tokens[5 + offset].c_str());
312-
if (node.ptc_num() != ptc) {
311+
if (rr_graph.node_ptc_num(RRNodeId(inode)) != ptc) {
313312
vpr_throw(VPR_ERROR_ROUTE, filename, lineno,
314313
"The ptc num of node %d does not match the rr graph", inode);
315314
}
@@ -318,7 +317,7 @@ static void process_nodes(std::ifstream& fp, ClusterNetId inet, const char* file
318317
if (tokens[6 + offset] != "Switch:") {
319318
/*This is an opin or ipin, process its pin nums*/
320319
if (!is_io_type(device_ctx.grid[x][y].type) && (tokens[2] == "IPIN" || tokens[2] == "OPIN")) {
321-
int pin_num = device_ctx.rr_nodes[inode].ptc_num();
320+
int pin_num = rr_graph.node_pin_num(RRNodeId(inode));
322321

323322
auto type = device_ctx.grid[x][y].type;
324323
int height_offset = device_ctx.grid[x][y].height_offset;

vpr/src/device/rr_graph_view.h

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,38 @@ class RRGraphView {
249249
return node_storage_.node_side_string(node);
250250
}
251251

252+
/** @brief The ptc_num carries different meanings for different node types
253+
* (true in VPR RRG that is currently supported, may not be true in customized RRG)
254+
* CHANX or CHANY: the track id in routing channels
255+
* OPIN or IPIN: the index of pins in the logic block data structure
256+
* SOURCE and SINK: the class id of a pin (indicating logic equivalence of pins) in the logic block data structure
257+
* @note
258+
* This API is very powerful and developers should not use it unless it is necessary,
259+
* e.g the node type is unknown. If the node type is known, the more specific routines, `node_pin_num()`,
260+
* `node_track_num()`and `node_class_num()`, for different types of nodes should be used.*/
261+
262+
inline short node_ptc_num(RRNodeId node) const {
263+
return node_storage_.node_ptc_num(node);
264+
}
265+
266+
/** @brief Get the pin num of a routing resource node. This is designed for logic blocks,
267+
* which are IPIN and OPIN nodes. This function is inlined for runtime optimization. */
268+
inline short node_pin_num(RRNodeId node) const {
269+
return node_storage_.node_pin_num(node);
270+
}
271+
272+
/** @brief Get the track num of a routing resource node. This is designed for routing tracks,
273+
* which are CHANX and CHANY nodes. This function is inlined for runtime optimization. */
274+
inline short node_track_num(RRNodeId node) const {
275+
return node_storage_.node_track_num(node);
276+
}
277+
278+
/** @brief Get the class num of a routing resource node. This is designed for routing source and sinks,
279+
* which are SOURCE and SINK nodes. This function is inlined for runtime optimization. */
280+
inline short node_class_num(RRNodeId node) const {
281+
return node_storage_.node_class_num(node);
282+
}
283+
252284
/** @brief Get the cost index of a routing resource node. This function is inlined for runtime optimization. */
253285
RRIndexedDataId node_cost_index(RRNodeId node) const {
254286
return node_storage_.node_cost_index(node);

vpr/src/draw/draw.cpp

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1686,12 +1686,12 @@ static void draw_rr_edges(int inode, ezgl::renderer* g) {
16861686
return; /* Nothing to draw. */
16871687
}
16881688

1689-
from_ptc_num = device_ctx.rr_nodes[inode].ptc_num();
1689+
from_ptc_num = rr_graph.node_ptc_num(RRNodeId(inode));
16901690

16911691
for (t_edge_size iedge = 0, l = device_ctx.rr_nodes[inode].num_edges(); 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));
1694-
to_ptc_num = device_ctx.rr_nodes[to_node].ptc_num();
1694+
to_ptc_num = rr_graph.node_ptc_num(RRNodeId(to_node));
16951695
bool edge_configurable = device_ctx.rr_nodes[inode].edge_is_configurable(iedge);
16961696

16971697
switch (from_type) {
@@ -2193,18 +2193,18 @@ ezgl::rectangle draw_get_rr_chan_bbox(int inode) {
21932193
+ draw_coords->get_tile_width();
21942194
bottom = draw_coords->tile_y[rr_graph.node_ylow(rr_node)]
21952195
+ draw_coords->get_tile_width()
2196-
+ (1. + device_ctx.rr_nodes[inode].ptc_num());
2196+
+ (1. + rr_graph.node_track_num(rr_node));
21972197
top = draw_coords->tile_y[rr_graph.node_ylow(rr_node)]
21982198
+ draw_coords->get_tile_width()
2199-
+ (1. + device_ctx.rr_nodes[inode].ptc_num());
2199+
+ (1. + rr_graph.node_track_num(rr_node));
22002200
break;
22012201
case CHANY:
22022202
left = draw_coords->tile_x[rr_graph.node_xlow(rr_node)]
22032203
+ draw_coords->get_tile_width()
2204-
+ (1. + device_ctx.rr_nodes[inode].ptc_num());
2204+
+ (1. + rr_graph.node_track_num(rr_node));
22052205
right = draw_coords->tile_x[rr_graph.node_xlow(rr_node)]
22062206
+ draw_coords->get_tile_width()
2207-
+ (1. + device_ctx.rr_nodes[inode].ptc_num());
2207+
+ (1. + rr_graph.node_track_num(rr_node));
22082208
bottom = draw_coords->tile_y[rr_graph.node_ylow(rr_node)];
22092209
top = draw_coords->tile_y[rr_graph.node_yhigh(rr_node)]
22102210
+ draw_coords->get_tile_width();
@@ -2257,7 +2257,7 @@ static void draw_rr_pin(int inode, const ezgl::color& color, ezgl::renderer* g)
22572257
auto& device_ctx = g_vpr_ctx.device();
22582258
const auto& rr_graph = device_ctx.rr_graph;
22592259

2260-
int ipin = device_ctx.rr_nodes[inode].ptc_num();
2260+
int ipin = rr_graph.node_pin_num(RRNodeId(inode));
22612261

22622262
g->set_color(color);
22632263

@@ -2305,7 +2305,7 @@ void draw_get_rr_pin_coords(const t_rr_node& node, float* xcen, float* ycen, con
23052305
xc = draw_coords->tile_x[i];
23062306
yc = draw_coords->tile_y[j];
23072307

2308-
ipin = node.ptc_num();
2308+
ipin = rr_graph.node_pin_num(rr_node);
23092309
type = device_ctx.grid[i][j].type;
23102310
pins_per_sub_tile = type->num_pins / type->capacity;
23112311
k = ipin / pins_per_sub_tile;
@@ -2352,6 +2352,7 @@ static void draw_rr_src_sink(int inode, ezgl::color color, ezgl::renderer* g) {
23522352
t_draw_coords* draw_coords = get_draw_coords_vars();
23532353

23542354
auto& device_ctx = g_vpr_ctx.device();
2355+
const auto& rr_graph = device_ctx.rr_graph;
23552356

23562357
float xcen, ycen;
23572358
draw_get_rr_src_sink_coords(device_ctx.rr_nodes[inode], &xcen, &ycen);
@@ -2363,7 +2364,7 @@ static void draw_rr_src_sink(int inode, ezgl::color color, ezgl::renderer* g) {
23632364
{xcen + draw_coords->pin_size, ycen + draw_coords->pin_size});
23642365

23652366
std::string str = vtr::string_fmt("%d",
2366-
device_ctx.rr_nodes[inode].ptc_num());
2367+
rr_graph.node_class_num(RRNodeId(inode)));
23672368
g->set_color(ezgl::BLACK);
23682369
g->draw_text({xcen, ycen}, str.c_str(), 2 * draw_coords->pin_size,
23692370
2 * draw_coords->pin_size);
@@ -2389,8 +2390,8 @@ static void draw_get_rr_src_sink_coords(const t_rr_node& node, float* xcen, floa
23892390
class_per_height = num_class / (height - 1);
23902391
}
23912392

2392-
int class_height_offset = node.class_num() / class_per_height; //Offset wrt block height
2393-
int class_height_shift = node.class_num() % class_per_height; //Offset within unit block
2393+
int class_height_offset = rr_graph.node_class_num(rr_node) / class_per_height; //Offset wrt block height
2394+
int class_height_shift = rr_graph.node_class_num(rr_node) % class_per_height; //Offset within unit block
23942395

23952396
float xc = draw_coords->tile_x[rr_graph.node_xlow(rr_node)];
23962397
float yc = draw_coords->tile_y[rr_graph.node_ylow(rr_node) + class_height_offset];
@@ -2619,7 +2620,7 @@ static int get_track_num(int inode, const vtr::OffsetMatrix<int>& chanx_track, c
26192620
RRNodeId rr_node = RRNodeId(inode);
26202621

26212622
if (get_draw_state_vars()->draw_route_type == DETAILED)
2622-
return (device_ctx.rr_nodes[inode].ptc_num());
2623+
return (rr_graph.node_track_num(rr_node));
26232624

26242625
/* GLOBAL route stuff below. */
26252626

@@ -2765,7 +2766,7 @@ static int draw_check_rr_node_hit(float click_x, float click_y) {
27652766
t_physical_tile_type_ptr type = device_ctx.grid[i][j].type;
27662767
int width_offset = device_ctx.grid[i][j].width_offset;
27672768
int height_offset = device_ctx.grid[i][j].height_offset;
2768-
int ipin = device_ctx.rr_nodes[inode].ptc_num();
2769+
int ipin = rr_graph.node_pin_num(rr_node);
27692770
float xcen, ycen;
27702771
for (const e_side& iside : SIDES) {
27712772
// If pin exists on this side of the block, then get pin coordinates
@@ -3141,10 +3142,11 @@ static void draw_pin_to_chan_edge(int pin_node, int chan_node, ezgl::renderer* g
31413142
auto& device_ctx = g_vpr_ctx.device();
31423143
const auto& rr_graph = device_ctx.rr_graph;
31433144

3144-
const t_rr_node& pin_rr = device_ctx.rr_nodes[pin_node];
3145-
const t_rr_node& chan_rr = device_ctx.rr_nodes[chan_node];
3145+
//const t_rr_node& pin_rr = device_ctx.rr_nodes[pin_node];
3146+
auto pin_rr = RRNodeId(pin_node);
3147+
auto chan_rr = RRNodeId(chan_node);
31463148

3147-
const t_grid_tile& grid_tile = device_ctx.grid[rr_graph.node_xlow(pin_rr.id())][rr_graph.node_ylow(pin_rr.id())];
3149+
const t_grid_tile& grid_tile = device_ctx.grid[rr_graph.node_xlow(pin_rr)][rr_graph.node_ylow(pin_rr)];
31483150
t_physical_tile_type_ptr grid_type = grid_tile.type;
31493151

31503152
float x1 = 0, y1 = 0;
@@ -3186,8 +3188,8 @@ static void draw_pin_to_chan_edge(int pin_node, int chan_node, ezgl::renderer* g
31863188
*/
31873189
std::vector<e_side> pin_candidate_sides;
31883190
for (const e_side& pin_candidate_side : SIDES) {
3189-
if ((rr_graph.is_node_on_specific_side(pin_rr.id(), pin_candidate_side))
3190-
&& (grid_type->pinloc[grid_tile.width_offset][grid_tile.height_offset][pin_candidate_side][pin_rr.pin_num()])) {
3191+
if ((rr_graph.is_node_on_specific_side(pin_rr, pin_candidate_side))
3192+
&& (grid_type->pinloc[grid_tile.width_offset][grid_tile.height_offset][pin_candidate_side][rr_graph.node_pin_num(pin_rr)])) {
31913193
pin_candidate_sides.push_back(pin_candidate_side);
31923194
}
31933195
}
@@ -3200,13 +3202,13 @@ static void draw_pin_to_chan_edge(int pin_node, int chan_node, ezgl::renderer* g
32003202
pin_side = pin_candidate_sides[0];
32013203
} else {
32023204
VTR_ASSERT(1 < pin_candidate_sides.size());
3203-
if (CHANX == channel_type && rr_graph.node_ylow(pin_rr.id()) <= rr_graph.node_ylow(chan_rr.id())) {
3205+
if (CHANX == channel_type && rr_graph.node_ylow(pin_rr) <= rr_graph.node_ylow(chan_rr)) {
32043206
pin_side = TOP;
3205-
} else if (CHANX == channel_type && rr_graph.node_ylow(pin_rr.id()) - 1 >= rr_graph.node_ylow(chan_rr.id())) {
3207+
} else if (CHANX == channel_type && rr_graph.node_ylow(pin_rr) - 1 >= rr_graph.node_ylow(chan_rr)) {
32063208
pin_side = BOTTOM;
3207-
} else if (CHANY == channel_type && rr_graph.node_xlow(pin_rr.id()) <= rr_graph.node_xlow(chan_rr.id())) {
3209+
} else if (CHANY == channel_type && rr_graph.node_xlow(pin_rr) <= rr_graph.node_xlow(chan_rr)) {
32083210
pin_side = RIGHT;
3209-
} else if (CHANY == channel_type && rr_graph.node_xlow(pin_rr.id()) - 1 >= rr_graph.node_xlow(chan_rr.id())) {
3211+
} else if (CHANY == channel_type && rr_graph.node_xlow(pin_rr) - 1 >= rr_graph.node_xlow(chan_rr)) {
32103212
pin_side = LEFT;
32113213
}
32123214
/* The inferred side must be in the list of sides of the pin rr_node!!! */
@@ -3259,7 +3261,7 @@ static void draw_pin_to_chan_edge(int pin_node, int chan_node, ezgl::renderer* g
32593261
y1 += draw_pin_offset;
32603262
y2 = chan_bbox.bottom();
32613263
x2 = x1;
3262-
if (is_opin(pin_rr.pin_num(), grid_type)) {
3264+
if (is_opin(rr_graph.node_pin_num(pin_rr), grid_type)) {
32633265
if (chan_rr_direction == Direction::INC) {
32643266
x2 = chan_bbox.left();
32653267
} else if (chan_rr_direction == Direction::DEC) {
@@ -3272,7 +3274,7 @@ static void draw_pin_to_chan_edge(int pin_node, int chan_node, ezgl::renderer* g
32723274
x1 += draw_pin_offset;
32733275
x2 = chan_bbox.left();
32743276
y2 = y1;
3275-
if (is_opin(pin_rr.pin_num(), grid_type)) {
3277+
if (is_opin(rr_graph.node_pin_num(pin_rr), grid_type)) {
32763278
if (chan_rr_direction == Direction::INC) {
32773279
y2 = chan_bbox.bottom();
32783280
} else if (chan_rr_direction == Direction::DEC) {
@@ -3289,7 +3291,7 @@ static void draw_pin_to_chan_edge(int pin_node, int chan_node, ezgl::renderer* g
32893291
g->draw_line({x1, y1}, {x2, y2});
32903292

32913293
//don't draw the ex, or triangle unless zoomed in really far
3292-
if (chan_rr_direction == Direction::BIDIR || !is_opin(pin_rr.pin_num(), grid_type)) {
3294+
if (chan_rr_direction == Direction::BIDIR || !is_opin(rr_graph.node_pin_num(pin_rr), grid_type)) {
32933295
draw_x(x2, y2, 0.7 * draw_coords->pin_size, g);
32943296
} else {
32953297
float xend = x2 + (x1 - x2) / 10.;

vpr/src/draw/search_bar.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ void auto_zoom_rr_node(int rr_node_id) {
192192
t_physical_tile_type_ptr type = device_ctx.grid[i][j].type;
193193
int width_offset = device_ctx.grid[i][j].width_offset;
194194
int height_offset = device_ctx.grid[i][j].height_offset;
195-
int ipin = device_ctx.rr_nodes[rr_node_id].ptc_num();
195+
int ipin = rr_graph.node_ptc_num(RRNodeId(rr_node_id));
196196
float xcen, ycen;
197197

198198
for (const e_side& iside : SIDES) {

vpr/src/route/check_route.cpp

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ static void check_source(RRNodeId inode, ClusterNetId net_id) {
214214
int i = rr_graph.node_xlow(inode);
215215
int j = rr_graph.node_ylow(inode);
216216
/* for sinks and sources, ptc_num is class */
217-
int ptc_num = device_ctx.rr_nodes[size_t(inode)].ptc_num();
217+
int ptc_num = rr_graph.node_class_num(inode);
218218
/* First node_block for net is the source */
219219
ClusterBlockId blk_id = cluster_ctx.clb_nlist.net_driver_block(net_id);
220220
auto type = device_ctx.grid[i][j].type;
@@ -325,18 +325,20 @@ static bool check_adjacent(int from_node, int to_node) {
325325

326326
num_adj = 0;
327327

328-
from_type = rr_graph.node_type(RRNodeId(from_node));
329-
from_xlow = rr_graph.node_xlow(RRNodeId(from_node));
330-
from_ylow = rr_graph.node_ylow(RRNodeId(from_node));
331-
from_xhigh = rr_graph.node_xhigh(RRNodeId(from_node));
332-
from_yhigh = rr_graph.node_yhigh(RRNodeId(from_node));
333-
from_ptc = device_ctx.rr_nodes[from_node].ptc_num();
334-
to_type = rr_graph.node_type(RRNodeId(to_node));
335-
to_xlow = rr_graph.node_xlow(RRNodeId(to_node));
336-
to_ylow = rr_graph.node_ylow(RRNodeId(to_node));
337-
to_xhigh = rr_graph.node_xhigh(RRNodeId(to_node));
338-
to_yhigh = rr_graph.node_yhigh(RRNodeId(to_node));
339-
to_ptc = device_ctx.rr_nodes[to_node].ptc_num();
328+
auto from_rr = RRNodeId(from_node);
329+
auto to_rr = RRNodeId(to_node);
330+
from_type = rr_graph.node_type(from_rr);
331+
from_xlow = rr_graph.node_xlow(from_rr);
332+
from_ylow = rr_graph.node_ylow(from_rr);
333+
from_xhigh = rr_graph.node_xhigh(from_rr);
334+
from_yhigh = rr_graph.node_yhigh(from_rr);
335+
from_ptc = rr_graph.node_ptc_num(from_rr);
336+
to_type = rr_graph.node_type(to_rr);
337+
to_xlow = rr_graph.node_xlow(to_rr);
338+
to_ylow = rr_graph.node_ylow(to_rr);
339+
to_xhigh = rr_graph.node_xhigh(to_rr);
340+
to_yhigh = rr_graph.node_yhigh(to_rr);
341+
to_ptc = rr_graph.node_ptc_num(to_rr);
340342

341343
switch (from_type) {
342344
case SOURCE:
@@ -393,8 +395,8 @@ static bool check_adjacent(int from_node, int to_node) {
393395
if (to_type == IPIN) {
394396
num_adj += 1; //adjacent
395397
} else if (to_type == CHANX) {
396-
from_xhigh = rr_graph.node_xhigh(RRNodeId(from_node));
397-
to_xhigh = rr_graph.node_xhigh(RRNodeId(to_node));
398+
from_xhigh = rr_graph.node_xhigh(from_rr);
399+
to_xhigh = rr_graph.node_xhigh(to_rr);
398400
if (from_ylow == to_ylow) {
399401
/* UDSD Modification by WMF Begin */
400402
/*For Fs > 3, can connect to overlapping wire segment */
@@ -426,8 +428,8 @@ static bool check_adjacent(int from_node, int to_node) {
426428
if (to_type == IPIN) {
427429
num_adj += 1; //adjacent
428430
} else if (to_type == CHANY) {
429-
from_yhigh = rr_graph.node_yhigh(RRNodeId(from_node));
430-
to_yhigh = rr_graph.node_yhigh(RRNodeId(to_node));
431+
from_yhigh = rr_graph.node_yhigh(from_rr);
432+
to_yhigh = rr_graph.node_yhigh(to_rr);
431433
if (from_xlow == to_xlow) {
432434
/* UDSD Modification by WMF Begin */
433435
if (to_yhigh == from_ylow - 1 || from_yhigh == to_ylow - 1) {
@@ -572,7 +574,7 @@ static void check_locally_used_clb_opins(const t_clb_opins_used& clb_opins_used_
572574
size_t(blk_id), cluster_ctx.clb_nlist.block_name(blk_id).c_str(), iclass, inode, rr_type);
573575
}
574576

575-
ipin = device_ctx.rr_nodes[inode].ptc_num();
577+
ipin = rr_graph.node_pin_num(RRNodeId(inode));
576578
if (physical_tile_type(blk_id)->pin_class[ipin] != iclass) {
577579
VPR_FATAL_ERROR(VPR_ERROR_ROUTE,
578580
"in check_locally_used_opins: block #%lu (%s):\n"

vpr/src/route/check_rr_graph.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ void check_rr_graph(const t_graph_type graph_type,
237237
if (rr_graph.node_type(rr_node) == IPIN || rr_graph.node_type(rr_node) == OPIN) {
238238
if (has_adjacent_channel(node, device_ctx.grid)) {
239239
auto block_type = device_ctx.grid[rr_graph.node_xlow(rr_node)][rr_graph.node_ylow(rr_node)].type;
240-
std::string pin_name = block_type_pin_index_to_name(block_type, node.pin_num());
240+
std::string pin_name = block_type_pin_index_to_name(block_type, rr_graph.node_pin_num(rr_node));
241241
/* Print error messages for all the sides that a node may appear */
242242
for (const e_side& node_side : SIDES) {
243243
if (!rr_graph.is_node_on_specific_side(rr_node, node_side)) {
@@ -282,7 +282,7 @@ static bool rr_node_is_global_clb_ipin(RRNodeId inode) {
282282
if (rr_graph.node_type(inode) != IPIN)
283283
return (false);
284284

285-
ipin = device_ctx.rr_nodes[size_t(inode)].ptc_num();
285+
ipin = rr_graph.node_pin_num(inode);
286286

287287
return type->is_ignored_pin[ipin];
288288
}
@@ -306,7 +306,7 @@ void check_rr_node(int inode, enum e_route_type route_type, const DeviceContext&
306306
xhigh = rr_graph.node_xhigh(rr_node);
307307
ylow = rr_graph.node_ylow(rr_node);
308308
yhigh = rr_graph.node_yhigh(rr_node);
309-
ptc_num = device_ctx.rr_nodes[inode].ptc_num();
309+
ptc_num = rr_graph.node_ptc_num(rr_node);
310310
capacity = rr_graph.node_capacity(rr_node);
311311
cost_index = rr_graph.node_cost_index(rr_node);
312312
type = nullptr;

0 commit comments

Comments
 (0)