26
26
***********************************************************************/
27
27
static size_t estimate_num_grid_rr_nodes_by_type (const DeviceGrid& grids,
28
28
const size_t & layer,
29
- const t_rr_type& node_type) {
29
+ const t_rr_type& node_type,
30
+ const bool & perimeter_cb) {
30
31
size_t num_grid_rr_nodes = 0 ;
31
32
32
33
for (size_t ix = 0 ; ix < grids.width (); ++ix) {
@@ -43,13 +44,13 @@ static size_t estimate_num_grid_rr_nodes_by_type(const DeviceGrid& grids,
43
44
continue ;
44
45
}
45
46
46
- enum e_side io_side = NUM_SIDES ;
47
+ std::vector< e_side> io_side = {TOP, RIGHT, BOTTOM, LEFT} ;
47
48
48
49
/* If this is the block on borders, we consider IO side */
49
50
if (true == is_io_type (grids.get_physical_type (tile_loc))) {
50
51
vtr::Point <size_t > io_device_size (grids.width () - 1 , grids.height () - 1 );
51
52
vtr::Point <size_t > grid_coordinate (ix, iy);
52
- io_side = determine_io_grid_pin_side (io_device_size, grid_coordinate);
53
+ io_side = determine_io_grid_pin_side (io_device_size, grid_coordinate, perimeter_cb );
53
54
}
54
55
55
56
switch (node_type) {
@@ -340,10 +341,10 @@ static std::vector<size_t> estimate_num_rr_nodes(const DeviceGrid& grids,
340
341
/* *
341
342
* 1 Find number of rr nodes related to grids
342
343
*/
343
- num_rr_nodes_per_type[OPIN] = estimate_num_grid_rr_nodes_by_type (grids, layer, OPIN);
344
- num_rr_nodes_per_type[IPIN] = estimate_num_grid_rr_nodes_by_type (grids, layer, IPIN);
345
- num_rr_nodes_per_type[SOURCE] = estimate_num_grid_rr_nodes_by_type (grids, layer, SOURCE);
346
- num_rr_nodes_per_type[SINK] = estimate_num_grid_rr_nodes_by_type (grids, layer, SINK);
344
+ num_rr_nodes_per_type[OPIN] = estimate_num_grid_rr_nodes_by_type (grids, layer, OPIN, perimeter_cb );
345
+ num_rr_nodes_per_type[IPIN] = estimate_num_grid_rr_nodes_by_type (grids, layer, IPIN, perimeter_cb );
346
+ num_rr_nodes_per_type[SOURCE] = estimate_num_grid_rr_nodes_by_type (grids, layer, SOURCE, perimeter_cb );
347
+ num_rr_nodes_per_type[SINK] = estimate_num_grid_rr_nodes_by_type (grids, layer, SINK, perimeter_cb );
347
348
348
349
/* *
349
350
* 2. Assign the segments for each routing channel,
@@ -432,24 +433,17 @@ static void load_one_grid_opin_nodes_basic_info(RRGraphBuilder& rr_graph_builder
432
433
const size_t & layer,
433
434
const vtr::Point <size_t >& grid_coordinate,
434
435
const DeviceGrid& grids,
435
- const e_side& io_side ,
436
+ const std::vector< e_side>& wanted_sides ,
436
437
const RRSwitchId& delayless_switch) {
437
- SideManager io_side_manager (io_side);
438
-
439
438
/* Walk through the width height of each grid,
440
439
* get pins and configure the rr_nodes
441
440
*/
442
441
t_physical_tile_type_ptr phy_tile_type = grids.get_physical_type (t_physical_tile_loc (grid_coordinate.x (), grid_coordinate.y (), layer));
443
442
for (int width = 0 ; width < phy_tile_type->width ; ++width) {
444
443
for (int height = 0 ; height < phy_tile_type->height ; ++height) {
445
444
/* Walk through sides */
446
- for (e_side side : SIDES ) {
445
+ for (e_side side : wanted_sides ) {
447
446
SideManager side_manager (side);
448
- /* skip unwanted sides */
449
- if ((true == is_io_type (phy_tile_type))
450
- && (side != io_side_manager.to_size_t ()) && (NUM_SIDES != io_side)) {
451
- continue ;
452
- }
453
447
/* Find OPINs */
454
448
/* Configure pins by pins */
455
449
std::vector<int > opin_list = get_grid_side_pins (grids, layer, grid_coordinate.x (), grid_coordinate.y (), DRIVER, side_manager.get_side (),
@@ -497,7 +491,7 @@ static void load_one_grid_ipin_nodes_basic_info(RRGraphBuilder& rr_graph_builder
497
491
const size_t & layer,
498
492
const vtr::Point <size_t >& grid_coordinate,
499
493
const DeviceGrid& grids,
500
- const e_side& io_side ,
494
+ const std::vector< e_side>& wanted_sides ,
501
495
const RRSwitchId& wire_to_ipin_switch) {
502
496
SideManager io_side_manager (io_side);
503
497
@@ -508,14 +502,8 @@ static void load_one_grid_ipin_nodes_basic_info(RRGraphBuilder& rr_graph_builder
508
502
for (int width = 0 ; width < phy_tile_type->width ; ++width) {
509
503
for (int height = 0 ; height < phy_tile_type->height ; ++height) {
510
504
/* Walk through sides */
511
- for (e_side side : SIDES ) {
505
+ for (e_side side : wanted_sides ) {
512
506
SideManager side_manager (side);
513
- /* skip unwanted sides */
514
- if ((true == is_io_type (phy_tile_type))
515
- && (side != io_side_manager.to_size_t ()) && (NUM_SIDES != io_side)) {
516
- continue ;
517
- }
518
-
519
507
/* Find IPINs */
520
508
/* Configure pins by pins */
521
509
std::vector<int > ipin_list = get_grid_side_pins (grids, layer, grid_coordinate.x (), grid_coordinate.y (), RECEIVER, side_manager.get_side (), width, height);
@@ -562,10 +550,7 @@ static void load_one_grid_source_nodes_basic_info(RRGraphBuilder& rr_graph_build
562
550
const size_t & layer,
563
551
const vtr::Point <size_t >& grid_coordinate,
564
552
const DeviceGrid& grids,
565
- const e_side& io_side,
566
553
const RRSwitchId& delayless_switch) {
567
- SideManager io_side_manager (io_side);
568
-
569
554
/* Set a SOURCE rr_node for each DRIVER class */
570
555
t_physical_tile_loc tile_loc (grid_coordinate.x (), grid_coordinate.y (), layer);
571
556
t_physical_tile_type_ptr phy_tile_type = grids.get_physical_type (tile_loc);
@@ -614,10 +599,7 @@ static void load_one_grid_sink_nodes_basic_info(RRGraphBuilder& rr_graph_builder
614
599
const size_t & layer,
615
600
const vtr::Point <size_t >& grid_coordinate,
616
601
const DeviceGrid& grids,
617
- const e_side& io_side,
618
602
const RRSwitchId& delayless_switch) {
619
- SideManager io_side_manager (io_side);
620
-
621
603
/* Set a SINK rr_node for each RECEIVER class */
622
604
t_physical_tile_loc tile_loc (grid_coordinate.x (), grid_coordinate.y (), layer);
623
605
t_physical_tile_type_ptr phy_tile_type = grids.get_physical_type (tile_loc);
@@ -664,7 +646,8 @@ static void load_grid_nodes_basic_info(RRGraphBuilder& rr_graph_builder,
664
646
const DeviceGrid& grids,
665
647
const size_t & layer,
666
648
const RRSwitchId& wire_to_ipin_switch,
667
- const RRSwitchId& delayless_switch) {
649
+ const RRSwitchId& delayless_switch,
650
+ const bool & perimeter_cb) {
668
651
for (size_t iy = 0 ; iy < grids.height (); ++iy) {
669
652
for (size_t ix = 0 ; ix < grids.width (); ++ix) {
670
653
t_physical_tile_loc tile_loc (ix, iy, layer);
@@ -687,9 +670,7 @@ static void load_grid_nodes_basic_info(RRGraphBuilder& rr_graph_builder,
687
670
/* If this is the block on borders, we consider IO side */
688
671
if (true == is_io_type (grids.get_physical_type (tile_loc))) {
689
672
vtr::Point <size_t > io_device_size (grids.width () - 1 , grids.height () - 1 );
690
- io_side = determine_io_grid_pin_side (io_device_size, grid_coordinate);
691
- wanted_sides.clear ();
692
- wanted_sides.push_back (io_side);
673
+ wanted_sides = determine_io_grid_pin_side (io_device_size, grid_coordinate, perimeter_cb);
693
674
}
694
675
695
676
for (e_side side : wanted_sides) {
@@ -709,7 +690,6 @@ static void load_grid_nodes_basic_info(RRGraphBuilder& rr_graph_builder,
709
690
rr_rc_data,
710
691
layer, grid_coordinate,
711
692
grids,
712
- io_side,
713
693
delayless_switch);
714
694
715
695
/* Configure sink rr_nodes for this grid */
@@ -718,7 +698,6 @@ static void load_grid_nodes_basic_info(RRGraphBuilder& rr_graph_builder,
718
698
rr_rc_data,
719
699
layer, grid_coordinate,
720
700
grids,
721
- io_side,
722
701
delayless_switch);
723
702
724
703
/* Configure opin rr_nodes for this grid */
@@ -727,7 +706,7 @@ static void load_grid_nodes_basic_info(RRGraphBuilder& rr_graph_builder,
727
706
rr_rc_data,
728
707
layer, grid_coordinate,
729
708
grids,
730
- io_side ,
709
+ wanted_sides ,
731
710
delayless_switch);
732
711
733
712
/* Configure ipin rr_nodes for this grid */
@@ -736,7 +715,7 @@ static void load_grid_nodes_basic_info(RRGraphBuilder& rr_graph_builder,
736
715
rr_rc_data,
737
716
layer, grid_coordinate,
738
717
grids,
739
- io_side ,
718
+ wanted_sides ,
740
719
wire_to_ipin_switch);
741
720
}
742
721
}
@@ -1231,7 +1210,7 @@ void create_tileable_rr_graph_nodes(const RRGraphView& rr_graph,
1231
1210
rr_rc_data,
1232
1211
grids, layer,
1233
1212
wire_to_ipin_switch,
1234
- delayless_switch);
1213
+ delayless_switch, perimeter_cb );
1235
1214
1236
1215
load_chanx_rr_nodes_basic_info (rr_graph,
1237
1216
rr_graph_builder,
0 commit comments