Skip to content

Commit fb085bd

Browse files
committed
vpr: Allow multiple block types to contain primary inputs/outputs
1 parent 7b59537 commit fb085bd

14 files changed

+82
-64
lines changed

vpr/src/base/SetupVPR.cpp

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -107,29 +107,31 @@ void SetupVPR(t_options *Options,
107107

108108
/* TODO: this is inelegant, I should be populating this information in XmlReadArch */
109109
device_ctx.EMPTY_TYPE = NULL;
110-
device_ctx.IO_TYPE = NULL;
111110
for (i = 0; i < device_ctx.num_block_types; i++) {
112111
t_type_ptr type = &device_ctx.block_types[i];
113112
if (strcmp(device_ctx.block_types[i].name, EMPTY_BLOCK_NAME) == 0) {
113+
VTR_ASSERT(device_ctx.EMPTY_TYPE == nullptr);
114114
device_ctx.EMPTY_TYPE = type;
115-
} else if (block_type_contains_blif_model(type, ".input") && block_type_contains_blif_model(type, ".output")) {
116-
if (device_ctx.IO_TYPE != nullptr) {
117-
//Already set
118-
VPR_THROW(VPR_ERROR_ARCH,
119-
"Architecture contains multiple top-level block types containing both"
120-
" '.input' and '.output' BLIF models (expected one block type)");
115+
} else {
116+
if (block_type_contains_blif_model(type, ".input")) {
117+
device_ctx.input_types.insert(type);
121118
}
122-
device_ctx.IO_TYPE = type;
123-
}
119+
if (block_type_contains_blif_model(type, ".output")) {
120+
device_ctx.output_types.insert(type);
121+
}
122+
}
124123
}
125124

126125
VTR_ASSERT(device_ctx.EMPTY_TYPE != NULL);
127126

128-
if (device_ctx.IO_TYPE == nullptr) {
129-
//Already set
127+
if (device_ctx.input_types.empty()) {
128+
VPR_THROW(VPR_ERROR_ARCH,
129+
"Architecture contains no top-level block type containing '.input' models");
130+
}
131+
132+
if (device_ctx.output_types.empty()) {
130133
VPR_THROW(VPR_ERROR_ARCH,
131-
"Architecture contains no top-level block type containing both"
132-
" '.input' and '.output' BLIF models (expected one block type)");
134+
"Architecture contains no top-level block type containing '.output' models");
133135
}
134136

135137
*Segments = Arch->Segments;

vpr/src/base/ShowSetup.cpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -82,13 +82,14 @@ void printClusteredNetlistStats() {
8282

8383
for (auto blk_id : cluster_ctx.clb_nlist.blocks()) {
8484
num_blocks_type[cluster_ctx.clb_nlist.block_type(blk_id)->index]++;
85-
if (cluster_ctx.clb_nlist.block_type(blk_id) == device_ctx.IO_TYPE) {
86-
for (j = 0; j < device_ctx.IO_TYPE->num_pins; j++) {
85+
auto type = cluster_ctx.clb_nlist.block_type(blk_id);
86+
if (is_io_type(type)) {
87+
for (j = 0; j < type->num_pins; j++) {
8788
if (cluster_ctx.clb_nlist.block_net(blk_id, j) != ClusterNetId::INVALID()) {
88-
if (device_ctx.IO_TYPE->class_inf[device_ctx.IO_TYPE->pin_class[j]].type == DRIVER) {
89+
if (type->class_inf[type->pin_class[j]].type == DRIVER) {
8990
L_num_p_inputs++;
9091
} else {
91-
VTR_ASSERT(device_ctx.IO_TYPE->class_inf[device_ctx.IO_TYPE-> pin_class[j]]. type == RECEIVER);
92+
VTR_ASSERT(type->class_inf[type-> pin_class[j]]. type == RECEIVER);
9293
L_num_p_outputs++;
9394
}
9495
}
@@ -97,9 +98,7 @@ void printClusteredNetlistStats() {
9798
}
9899

99100
for (i = 0; i < device_ctx.num_block_types; i++) {
100-
if (device_ctx.IO_TYPE != &device_ctx.block_types[i]) {
101-
vtr::printf_info("Netlist %s blocks: %d.\n", device_ctx.block_types[i].name, num_blocks_type[i]);
102-
}
101+
vtr::printf_info("Netlist %s blocks: %d.\n", device_ctx.block_types[i].name, num_blocks_type[i]);
103102
}
104103

105104
/* Print out each block separately instead */

vpr/src/base/check_netlist.cpp

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,6 @@ void check_netlist() {
105105
* global or non-global nets are allowed to connect to pads. */
106106
static int check_connections_to_global_clb_pins(ClusterNetId net_id) {
107107
auto& cluster_ctx = g_vpr_ctx.clustering();
108-
auto& device_ctx = g_vpr_ctx.device();
109108

110109
unsigned int error = 0;
111110
bool is_global_net = cluster_ctx.clb_nlist.net_is_global(net_id);
@@ -119,7 +118,7 @@ static int check_connections_to_global_clb_pins(ClusterNetId net_id) {
119118
int pin_index = cluster_ctx.clb_nlist.pin_physical_index(pin_id);
120119

121120
if (cluster_ctx.clb_nlist.block_type(blk_id)->is_global_pin[pin_index] != is_global_net
122-
&& cluster_ctx.clb_nlist.block_type(blk_id) != device_ctx.IO_TYPE) {
121+
&& !is_io_type(cluster_ctx.clb_nlist.block_type(blk_id))) {
123122

124123
//Allow a CLB output pin to drive a global net (warning only).
125124
if (pin_id == cluster_ctx.clb_nlist.net_driver(net_id) && is_global_net) {
@@ -155,22 +154,11 @@ static int check_clb_conn(ClusterBlockId iblk, int num_conn) {
155154
t_type_ptr type;
156155

157156
auto& cluster_ctx = g_vpr_ctx.clustering();
158-
auto& device_ctx = g_vpr_ctx.device();
159157

160158
error = 0;
161159
type = cluster_ctx.clb_nlist.block_type(iblk);
162160

163-
if (type == device_ctx.IO_TYPE) {
164-
/*
165-
//This triggers incorrectly if other blocks (e.g. I/O buffers) are included in the iopads
166-
if (num_conn != 1) {
167-
vtr::printf_error(__FILE__, __LINE__,
168-
"IO blk #%d (%s) has %d pins.\n", iblk, cluster_ctx.clb_nlist.block_name(iblk).c_str(), num_conn);
169-
error++;
170-
}
171-
*/
172-
}
173-
else if (num_conn < 2) {
161+
if (num_conn < 2) {
174162
vtr::printf_warning(__FILE__, __LINE__,
175163
"Logic block #%d (%s) has only %d pin.\n", iblk, cluster_ctx.clb_nlist.block_name(iblk).c_str(), num_conn);
176164

vpr/src/base/read_place.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -160,16 +160,17 @@ void read_user_pad_loc(const char *pad_loc_file) {
160160

161161
hash_table = alloc_hash_table();
162162
for (auto blk_id : cluster_ctx.clb_nlist.blocks()) {
163-
if (cluster_ctx.clb_nlist.block_type(blk_id) == device_ctx.IO_TYPE) {
163+
if (is_io_type(cluster_ctx.clb_nlist.block_type(blk_id))) {
164164
insert_in_hash_table(hash_table, cluster_ctx.clb_nlist.block_name(blk_id).c_str(), size_t(blk_id));
165165
place_ctx.block_locs[blk_id].x = OPEN; /* Mark as not seen yet. */
166166
}
167167
}
168168

169169
for (size_t i = 0; i < device_ctx.grid.width(); i++) {
170170
for (size_t j = 0; j < device_ctx.grid.height(); j++) {
171-
if (device_ctx.grid[i][j].type == device_ctx.IO_TYPE) {
172-
for (int k = 0; k < device_ctx.IO_TYPE->capacity; k++) {
171+
auto type = device_ctx.grid[i][j].type;
172+
if (is_io_type(type)) {
173+
for (int k = 0; k < type->capacity; k++) {
173174
if (place_ctx.grid_blocks[i][j].blocks[k] != INVALID_BLOCK_ID) {
174175
place_ctx.grid_blocks[i][j].blocks[k] = EMPTY_BLOCK_ID; /* Flag for err. check */
175176
}
@@ -248,12 +249,13 @@ void read_user_pad_loc(const char *pad_loc_file) {
248249
place_ctx.block_locs[bnum].z = k;
249250
place_ctx.block_locs[bnum].is_fixed = true;
250251

251-
if (device_ctx.grid[i][j].type != device_ctx.IO_TYPE) {
252+
auto type = device_ctx.grid[i][j].type;
253+
if (!is_io_type(type)) {
252254
vpr_throw(VPR_ERROR_PLACE_F, pad_loc_file, 0,
253255
"Attempt to place IO block %s at illegal location (%d, %d).\n", bname, i, j);
254256
}
255257

256-
if (k >= device_ctx.IO_TYPE->capacity || k < 0) {
258+
if (k >= type->capacity || k < 0) {
257259
vpr_throw(VPR_ERROR_PLACE_F, pad_loc_file, vtr::get_file_line_number_of_last_opened_file(),
258260
"Block %s subblock number (%d) is out of range.\n", bname, k);
259261
}
@@ -264,7 +266,8 @@ void read_user_pad_loc(const char *pad_loc_file) {
264266
}
265267

266268
for (auto blk_id : cluster_ctx.clb_nlist.blocks()) {
267-
if (cluster_ctx.clb_nlist.block_type(blk_id) == device_ctx.IO_TYPE && place_ctx.block_locs[blk_id].x == OPEN) {
269+
auto type = cluster_ctx.clb_nlist.block_type(blk_id);
270+
if (is_io_type(type) && place_ctx.block_locs[blk_id].x == OPEN) {
268271
vpr_throw(VPR_ERROR_PLACE_F, pad_loc_file, 0,
269272
"IO block %s location was not specified in the pad file.\n", cluster_ctx.clb_nlist.block_name(blk_id).c_str());
270273
}

vpr/src/base/read_route.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ static void process_nodes(ifstream & fp, ClusterNetId inet, const char* filename
265265

266266
/* Verify types and ptc*/
267267
if (tokens[2] == "SOURCE" || tokens[2] == "SINK" || tokens[2] == "OPIN" || tokens[2] == "IPIN") {
268-
if (tokens[4 + offset] == "Pad:" && device_ctx.grid[x][y].type != device_ctx.IO_TYPE) {
268+
if (tokens[4 + offset] == "Pad:" && !is_io_type(device_ctx.grid[x][y].type)) {
269269
vpr_throw(VPR_ERROR_ROUTE, filename, lineno,
270270
"Node %d is of the wrong type", inode);
271271
}
@@ -285,7 +285,7 @@ static void process_nodes(ifstream & fp, ClusterNetId inet, const char* filename
285285
/*Process switches and pb pin info if it is ipin or opin type*/
286286
if (tokens[6 + offset] != "Switch:") {
287287
/*This is an opin or ipin, process its pin nums*/
288-
if (device_ctx.grid[x][y].type != device_ctx.IO_TYPE && (tokens[2] == "IPIN" || tokens[2] == "OPIN")) {
288+
if (!is_io_type(device_ctx.grid[x][y].type) && (tokens[2] == "IPIN" || tokens[2] == "OPIN")) {
289289
int pin_num = device_ctx.rr_nodes[inode].ptc_num();
290290
int height_offset = device_ctx.grid[x][y].height_offset;
291291
ClusterBlockId iblock = place_ctx.grid_blocks[x][y - height_offset].blocks[0];

vpr/src/base/stats.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ void routing_stats(bool full_stats, enum e_route_type route_type,
7373
auto type = device_ctx.grid[i][j].type;
7474
if ( device_ctx.grid[i][j].width_offset == 0
7575
&& device_ctx.grid[i][j].height_offset == 0
76-
&& type != device_ctx.IO_TYPE
76+
&& !is_io_type(type)
7777
&& type != device_ctx.EMPTY_TYPE) {
7878
if (type->area == UNDEFINED) {
7979
area += grid_logic_tile_area * type->width * type->height;
@@ -88,7 +88,7 @@ void routing_stats(bool full_stats, enum e_route_type route_type,
8888

8989
used_area = 0;
9090
for (auto blk_id : cluster_ctx.clb_nlist.blocks()) {
91-
if (cluster_ctx.clb_nlist.block_type(blk_id) != device_ctx.IO_TYPE) {
91+
if (!is_io_type(cluster_ctx.clb_nlist.block_type(blk_id))) {
9292
if (cluster_ctx.clb_nlist.block_type(blk_id)->area == UNDEFINED) {
9393
used_area += grid_logic_tile_area * cluster_ctx.clb_nlist.block_type(blk_id)->width * cluster_ctx.clb_nlist.block_type(blk_id)->height;
9494
} else {
@@ -464,12 +464,11 @@ void print_lambda(void) {
464464
t_type_ptr type;
465465

466466
auto& cluster_ctx = g_vpr_ctx.clustering();
467-
auto& device_ctx = g_vpr_ctx.device();
468467

469468
for (auto blk_id : cluster_ctx.clb_nlist.blocks()) {
470469
type = cluster_ctx.clb_nlist.block_type(blk_id);
471470
VTR_ASSERT(type != NULL);
472-
if (type != device_ctx.IO_TYPE) {
471+
if (!is_io_type(type)) {
473472
for (ipin = 0; ipin < type->num_pins; ipin++) {
474473
iclass = type->pin_class[ipin];
475474
if (type->class_inf[iclass].type == RECEIVER) {

vpr/src/base/vpr_context.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,8 @@ struct DeviceContext : public Context {
109109
DeviceGrid grid; /* FPGA complex block grid [0 .. grid.width()-1][0 .. grid.height()-1] */
110110

111111
/* Special pointers to identify special blocks on an FPGA: I/Os, unused, and default */
112-
t_type_ptr IO_TYPE;
112+
std::set<t_type_ptr> input_types;
113+
std::set<t_type_ptr> output_types;
113114
t_type_ptr EMPTY_TYPE;
114115

115116
/* block_types are blocks that can be moved by the placer

vpr/src/base/vpr_types.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -523,7 +523,7 @@ struct t_net_power {
523523
};
524524

525525
/* s_grid_tile is the minimum tile of the fpga
526-
* type: Pointer to type descriptor, NULL for illegal, IO_TYPE for io
526+
* type: Pointer to type descriptor, NULL for illegal
527527
* width_offset: Number of grid tiles reserved based on width (right) of a block
528528
* height_offset: Number of grid tiles reserved based on height (top) of a block */
529529
struct t_grid_tile {

vpr/src/place/place.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2854,7 +2854,7 @@ static void initial_placement_blocks(int * free_locations, enum e_pad_loc_type p
28542854
}
28552855

28562856
/* Don't do IOs if the user specifies IOs; we'll read those locations later. */
2857-
if (!(cluster_ctx.clb_nlist.block_type(blk_id) == device_ctx.IO_TYPE && pad_loc_type == USER)) {
2857+
if (!(is_io_type(cluster_ctx.clb_nlist.block_type(blk_id)) && pad_loc_type == USER)) {
28582858

28592859
/* Randomly select a free location of the appropriate type for blk_id.
28602860
* We have a linearized list of all the free locations that can
@@ -2883,7 +2883,7 @@ static void initial_placement_blocks(int * free_locations, enum e_pad_loc_type p
28832883
place_ctx.block_locs[blk_id].z = z;
28842884

28852885
//Mark IOs as fixed if specifying a (fixed) random placement
2886-
if(cluster_ctx.clb_nlist.block_type(blk_id) == device_ctx.IO_TYPE && pad_loc_type == RANDOM) {
2886+
if(is_io_type(cluster_ctx.clb_nlist.block_type(blk_id)) && pad_loc_type == RANDOM) {
28872887
place_ctx.block_locs[blk_id].is_fixed = true;
28882888
}
28892889

vpr/src/route/check_route.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ static void check_sink(int inode, ClusterNetId net_id, bool * pin_done) {
229229
}
230230
}
231231

232-
if (ifound > 1 && type == device_ctx.IO_TYPE) {
232+
if (ifound > 1 && is_io_type(type)) {
233233
vpr_throw(VPR_ERROR_ROUTE, __FILE__, __LINE__,
234234
"in check_sink: found %d terminals of net %d of pad %d at location (%d, %d).\n", ifound, size_t(net_id), ptc_num, i, j);
235235
}

vpr/src/route/route_common.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -863,7 +863,6 @@ static t_clb_opins_used alloc_and_load_clb_opins_used_locally(void) {
863863
t_type_ptr type;
864864

865865
auto& cluster_ctx = g_vpr_ctx.clustering();
866-
auto& device_ctx = g_vpr_ctx.device();
867866

868867
clb_opins_used_locally.resize(cluster_ctx.clb_nlist.blocks().size());
869868

@@ -878,7 +877,7 @@ static t_clb_opins_used alloc_and_load_clb_opins_used_locally(void) {
878877

879878
for (clb_pin = pin_low; clb_pin <= pin_high; clb_pin++) {
880879
// another hack to avoid I/Os, whole function needs a rethink
881-
if(type == device_ctx.IO_TYPE)
880+
if(is_io_type(type))
882881
continue;
883882

884883
if ((cluster_ctx.clb_nlist.block_net(blk_id, clb_pin) != ClusterNetId::INVALID()
@@ -1506,7 +1505,7 @@ void print_route(const char* placement_file, const char* route_file) {
15061505

15071506
case IPIN:
15081507
case OPIN:
1509-
if (device_ctx.grid[ilow][jlow].type == device_ctx.IO_TYPE) {
1508+
if (is_io_type(device_ctx.grid[ilow][jlow].type)) {
15101509
fprintf(fp, " Pad: ");
15111510
} else { /* IO Pad. */
15121511
fprintf(fp, " Pin: ");
@@ -1520,7 +1519,7 @@ void print_route(const char* placement_file, const char* route_file) {
15201519

15211520
case SOURCE:
15221521
case SINK:
1523-
if (device_ctx.grid[ilow][jlow].type == device_ctx.IO_TYPE) {
1522+
if (is_io_type(device_ctx.grid[ilow][jlow].type)) {
15241523
fprintf(fp, " Pad: ");
15251524
} else { /* IO Pad. */
15261525
fprintf(fp, " Class: ");
@@ -1536,7 +1535,7 @@ void print_route(const char* placement_file, const char* route_file) {
15361535

15371536
fprintf(fp, "%d ", device_ctx.rr_nodes[inode].ptc_num());
15381537

1539-
if (device_ctx.grid[ilow][jlow].type != device_ctx.IO_TYPE && (rr_type == IPIN || rr_type == OPIN)) {
1538+
if (!is_io_type(device_ctx.grid[ilow][jlow].type) && (rr_type == IPIN || rr_type == OPIN)) {
15401539
int pin_num = device_ctx.rr_nodes[inode].ptc_num();
15411540
int xoffset = device_ctx.grid[ilow][jlow].width_offset;
15421541
int yoffset = device_ctx.grid[ilow][jlow].height_offset;

vpr/src/route/rr_graph2.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -504,26 +504,26 @@ void obstruct_chan_details(
504504
if (!trim_empty_channels)
505505
continue;
506506

507-
if (grid[x][y].type == device_ctx.IO_TYPE) {
507+
if (is_io_type(grid[x][y].type)) {
508508
if ((x == 0) || (y == 0))
509509
continue;
510510
}
511511
if (grid[x][y].type == device_ctx.EMPTY_TYPE) {
512-
if ((x == grid.width() - 2) && (grid[x + 1][y].type == device_ctx.IO_TYPE)) //-2 for no perim channels
512+
if ((x == grid.width() - 2) && is_io_type(grid[x + 1][y].type)) //-2 for no perim channels
513513
continue;
514-
if ((y == grid.height() - 2) && (grid[x][y + 1].type == device_ctx.IO_TYPE)) //-2 for no perim channels
514+
if ((y == grid.height() - 2) && is_io_type(grid[x][y + 1].type)) //-2 for no perim channels
515515
continue;
516516
}
517517

518-
if ((grid[x][y].type == device_ctx.IO_TYPE) || (grid[x][y].type == device_ctx.EMPTY_TYPE)) {
519-
if ((grid[x][y + 1].type == device_ctx.IO_TYPE) || (grid[x][y + 1].type == device_ctx.EMPTY_TYPE)) {
518+
if (is_io_type(grid[x][y].type) || (grid[x][y].type == device_ctx.EMPTY_TYPE)) {
519+
if (is_io_type(grid[x][y + 1].type) || (grid[x][y + 1].type == device_ctx.EMPTY_TYPE)) {
520520
for (int track = 0; track < nodes_per_chan->max; ++track) {
521521
chan_details_x[x][y][track].length = 0;
522522
}
523523
}
524524
}
525-
if ((grid[x][y].type == device_ctx.IO_TYPE) || (grid[x][y].type == device_ctx.EMPTY_TYPE)) {
526-
if ((grid[x + 1][y].type == device_ctx.IO_TYPE) || (grid[x + 1][y].type == device_ctx.EMPTY_TYPE)) {
525+
if (is_io_type(grid[x][y].type) || (grid[x][y].type == device_ctx.EMPTY_TYPE)) {
526+
if (is_io_type(grid[x + 1][y].type) || (grid[x + 1][y].type == device_ctx.EMPTY_TYPE)) {
527527
for (int track = 0; track < nodes_per_chan->max; ++track) {
528528
chan_details_y[x][y][track].length = 0;
529529
}
@@ -1426,7 +1426,7 @@ int find_average_rr_node_index(
14261426

14271427
if (device_ctx.grid[x][y].type == device_ctx.EMPTY_TYPE)
14281428
continue;
1429-
if (device_ctx.grid[x][y].type == device_ctx.IO_TYPE)
1429+
if (is_io_type(device_ctx.grid[x][y].type))
14301430
continue;
14311431

14321432
inode = get_rr_node_index(L_rr_node_indices, x, y, rr_type, ptc);

vpr/src/util/vpr_utils.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -566,6 +566,28 @@ bool is_opin(int ipin, t_type_ptr type) {
566566
return false;
567567
}
568568

569+
bool is_input_type(t_type_ptr type) {
570+
auto& device_ctx = g_vpr_ctx.device();
571+
572+
return device_ctx.input_types.count(type);
573+
}
574+
575+
bool is_output_type(t_type_ptr type) {
576+
auto& device_ctx = g_vpr_ctx.device();
577+
578+
return device_ctx.output_types.count(type);
579+
}
580+
581+
bool is_io_type(t_type_ptr type) {
582+
return is_input_type(type)
583+
|| is_output_type(type);
584+
}
585+
586+
bool is_empty_type(t_type_ptr type) {
587+
auto& device_ctx = g_vpr_ctx.device();
588+
589+
return type == device_ctx.EMPTY_TYPE;
590+
}
569591

570592
/* Each node in the pb_graph for a top-level pb_type can be uniquely identified
571593
* by its pins. Since the pins in a cluster of a certain type are densely indexed,

vpr/src/util/vpr_utils.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ bool is_clb_external_pin(ClusterBlockId blk_id, int pb_pin_id);
1717

1818
bool is_opin(int ipin, t_type_ptr type);
1919

20+
bool is_input_type(t_type_ptr type);
21+
bool is_output_type(t_type_ptr type);
22+
bool is_io_type(t_type_ptr type);
23+
bool is_empty_type(t_type_ptr type);
24+
2025
int get_unique_pb_graph_node_id(const t_pb_graph_node *pb_graph_node);
2126

2227
void get_class_range_for_block(const ClusterBlockId blk_id, int *class_low,

0 commit comments

Comments
 (0)