Skip to content

Commit 445e6d0

Browse files
committed
vpr: place: update layer min/max when cube bounding box is used
1 parent 36ceeca commit 445e6d0

File tree

1 file changed

+107
-8
lines changed

1 file changed

+107
-8
lines changed

vpr/src/place/place.cpp

Lines changed: 107 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2826,8 +2826,8 @@ static void get_bb_from_scratch(ClusterNetId net_id,
28262826
t_bb& coords,
28272827
t_bb& num_on_edges,
28282828
vtr::NdMatrixProxy<int, 1> num_sink_pin_layer) {
2829-
int pnum, x, y, pin_layer, xmin, xmax, ymin, ymax;
2830-
int xmin_edge, xmax_edge, ymin_edge, ymax_edge;
2829+
int pnum, x, y, pin_layer, xmin, xmax, ymin, ymax, layer_min, layer_max;
2830+
int xmin_edge, xmax_edge, ymin_edge, ymax_edge, layer_min_edge, layer_max_edge;
28312831

28322832
auto& cluster_ctx = g_vpr_ctx.clustering();
28332833
auto& place_ctx = g_vpr_ctx.placement();
@@ -2841,9 +2841,11 @@ static void get_bb_from_scratch(ClusterNetId net_id,
28412841
+ physical_tile_type(bnum)->pin_width_offset[pnum];
28422842
y = place_ctx.block_locs[bnum].loc.y
28432843
+ physical_tile_type(bnum)->pin_height_offset[pnum];
2844+
pin_layer = place_ctx.block_locs[bnum].loc.layer;
28442845

28452846
x = max(min<int>(x, grid.width() - 2), 1);
28462847
y = max(min<int>(y, grid.height() - 2), 1);
2848+
pin_layer = max(min<int>(pin_layer, grid.get_num_layers()), 0);
28472849

28482850
xmin = x;
28492851
ymin = y;
@@ -2854,6 +2856,11 @@ static void get_bb_from_scratch(ClusterNetId net_id,
28542856
xmax_edge = 1;
28552857
ymax_edge = 1;
28562858

2859+
layer_min = pin_layer;
2860+
layer_max = pin_layer;
2861+
layer_min_edge = 1;
2862+
layer_max_edge = 1;
2863+
28572864
for (int layer_num = 0; layer_num < grid.get_num_layers(); layer_num++) {
28582865
num_sink_pin_layer[layer_num] = 0;
28592866
}
@@ -2876,6 +2883,7 @@ static void get_bb_from_scratch(ClusterNetId net_id,
28762883

28772884
x = max(min<int>(x, grid.width() - 2), 1); //-2 for no perim channels
28782885
y = max(min<int>(y, grid.height() - 2), 1); //-2 for no perim channels
2886+
pin_layer = max(min<int>(pin_layer, grid.get_num_layers()), 0);
28792887

28802888
if (x == xmin) {
28812889
xmin_edge++;
@@ -2903,6 +2911,19 @@ static void get_bb_from_scratch(ClusterNetId net_id,
29032911
ymax_edge = 1;
29042912
}
29052913

2914+
if (pin_layer == layer_min) {
2915+
layer_min_edge++;
2916+
}
2917+
if (pin_layer == layer_max) {
2918+
layer_max_edge++;
2919+
} else if (pin_layer < layer_min) {
2920+
layer_min = pin_layer;
2921+
layer_min_edge = 1;
2922+
} else if (pin_layer > layer_max) {
2923+
layer_max = pin_layer;
2924+
layer_max_edge++;
2925+
}
2926+
29062927
num_sink_pin_layer[pin_layer]++;
29072928
}
29082929

@@ -2912,11 +2933,15 @@ static void get_bb_from_scratch(ClusterNetId net_id,
29122933
coords.xmax = xmax;
29132934
coords.ymin = ymin;
29142935
coords.ymax = ymax;
2936+
coords.layer_min = layer_min;
2937+
coords.layer_max = layer_max;
29152938

29162939
num_on_edges.xmin = xmin_edge;
29172940
num_on_edges.xmax = xmax_edge;
29182941
num_on_edges.ymin = ymin_edge;
29192942
num_on_edges.ymax = ymax_edge;
2943+
num_on_edges.layer_min = layer_min_edge;
2944+
num_on_edges.layer_max = layer_max_edge;
29202945
}
29212946

29222947
/* This routine finds the bounding box of each net from scratch when the bounding box is of type per-layer (i.e. *
@@ -3127,13 +3152,13 @@ static double get_net_cost(ClusterNetId net_id,
31273152
* chany_place_cost_fac[bbptr.xmax][bbptr.xmin - 1];
31283153

31293154
if (is_multi_layer) {
3130-
const auto& move_ctx = g_placer_ctx.move();
3131-
int src_layer = 0;
3155+
3156+
31323157
int num_cross_layer_sink = OPEN;
3133-
if (num_sink_per_layer[(size_t)net_id][0] > num_sink_per_layer[(size_t)net_id][1]) {
3134-
num_cross_layer_sink = num_sink_per_layer[(size_t)net_id][1];
3158+
if (num_sink_per_layer[size_t(net_id)][0] > num_sink_per_layer[size_t(net_id)][1]) {
3159+
num_cross_layer_sink = num_sink_per_layer[size_t(net_id)][1];
31353160
} else {
3136-
num_cross_layer_sink = num_sink_per_layer[(size_t)net_id][0];
3161+
num_cross_layer_sink = num_sink_per_layer[size_t(net_id)][0];
31373162
}
31383163
VTR_ASSERT_DEBUG(num_cross_layer_sink >= 0);
31393164

@@ -3190,7 +3215,7 @@ static void get_non_updateable_bb(ClusterNetId net_id,
31903215
vtr::NdMatrixProxy<int, 1> num_sink_pin_layer) {
31913216
//TODO: account for multiple physical pin instances per logical pin
31923217

3193-
int xmax, ymax, xmin, ymin, x, y, layer;
3218+
int xmax, ymax, xmin, ymin, layer_max, layer_min, x, y, layer;
31943219
int pnum;
31953220

31963221
auto& cluster_ctx = g_vpr_ctx.clustering();
@@ -3204,11 +3229,14 @@ static void get_non_updateable_bb(ClusterNetId net_id,
32043229
+ physical_tile_type(bnum)->pin_width_offset[pnum];
32053230
y = place_ctx.block_locs[bnum].loc.y
32063231
+ physical_tile_type(bnum)->pin_height_offset[pnum];
3232+
layer = place_ctx.block_locs[bnum].loc.layer;
32073233

32083234
xmin = x;
32093235
ymin = y;
32103236
xmax = x;
32113237
ymax = y;
3238+
layer_min = layer;
3239+
layer_max = layer;
32123240

32133241
for (int layer_num = 0; layer_num < device_ctx.grid.get_num_layers(); layer_num++) {
32143242
num_sink_pin_layer[layer_num] = 0;
@@ -3235,6 +3263,12 @@ static void get_non_updateable_bb(ClusterNetId net_id,
32353263
ymax = y;
32363264
}
32373265

3266+
if (layer < layer_min) {
3267+
layer_min = layer;
3268+
} else if (layer > layer_max) {
3269+
layer_max = layer;
3270+
}
3271+
32383272
num_sink_pin_layer[layer]++;
32393273
}
32403274

@@ -3250,6 +3284,8 @@ static void get_non_updateable_bb(ClusterNetId net_id,
32503284
bb_coord_new.ymin = max(min<int>(ymin, device_ctx.grid.height() - 2), 1); //-2 for no perim channels
32513285
bb_coord_new.xmax = max(min<int>(xmax, device_ctx.grid.width() - 2), 1); //-2 for no perim channels
32523286
bb_coord_new.ymax = max(min<int>(ymax, device_ctx.grid.height() - 2), 1); //-2 for no perim channels
3287+
bb_coord_new.layer_min = max(min<int>(layer_min, device_ctx.grid.get_num_layers()), 0);
3288+
bb_coord_new.layer_max = max(min<int>(layer_max, device_ctx.grid.get_num_layers()), 0);
32533289
}
32543290

32553291
static void get_non_updateable_layer_bb(ClusterNetId net_id,
@@ -3349,8 +3385,11 @@ static void update_bb(ClusterNetId net_id,
33493385

33503386
pin_new_loc.x = max(min<int>(pin_new_loc.x, device_ctx.grid.width() - 2), 1); //-2 for no perim channels
33513387
pin_new_loc.y = max(min<int>(pin_new_loc.y, device_ctx.grid.height() - 2), 1); //-2 for no perim channels
3388+
pin_new_loc.layer_num = max(min<int>(pin_new_loc.layer_num, device_ctx.grid.get_num_layers()), 0);
3389+
33523390
pin_old_loc.x = max(min<int>(pin_old_loc.x, device_ctx.grid.width() - 2), 1); //-2 for no perim channels
33533391
pin_old_loc.y = max(min<int>(pin_old_loc.y, device_ctx.grid.height() - 2), 1); //-2 for no perim channels
3392+
pin_old_loc.layer_num = max(min<int>(pin_old_loc.layer_num, device_ctx.grid.get_num_layers()), 0);
33543393

33553394
/* Check if the net had been updated before. */
33563395
if (bb_updated_before[net_id] == GOT_FROM_SCRATCH) {
@@ -3519,6 +3558,66 @@ static void update_bb(ClusterNetId net_id,
35193558

35203559
/* Now account for the layer motion. */
35213560
if (num_layers > 1) {
3561+
3562+
if (pin_new_loc.layer_num < pin_old_loc.layer_num) {
3563+
if(pin_new_loc.layer_num == curr_bb_coord->layer_max) {
3564+
if (curr_bb_edge->layer_max == 1) {
3565+
bb_edge_new.layer_max = 0;
3566+
bb_coord_new.layer_max = 0;
3567+
} else {
3568+
bb_edge_new.layer_max = curr_bb_edge->layer_max - 1;
3569+
bb_coord_new.layer_max = curr_bb_coord->layer_max;
3570+
}
3571+
} else {
3572+
bb_edge_new.layer_max = curr_bb_edge->layer_max;
3573+
bb_coord_new.layer_max = curr_bb_coord->layer_max;
3574+
}
3575+
3576+
if (pin_new_loc.layer_num < curr_bb_coord->layer_min) { /* Moved past xmin */
3577+
bb_coord_new.layer_min = pin_new_loc.layer_num;
3578+
bb_edge_new.layer_min = 1;
3579+
} else if (pin_new_loc.layer_num == curr_bb_coord->layer_min) { /* Moved to xmin */
3580+
bb_coord_new.layer_min = pin_new_loc.layer_num;
3581+
bb_edge_new.layer_min = curr_bb_edge->layer_min + 1;
3582+
} else { /* Xmin unchanged. */
3583+
bb_coord_new.layer_min = curr_bb_coord->layer_min;
3584+
bb_edge_new.layer_min = curr_bb_edge->layer_min;
3585+
}
3586+
3587+
} else if (pin_new_loc.layer_num > pin_old_loc.layer_num) {
3588+
if (pin_old_loc.layer_num == curr_bb_coord->layer_min) {
3589+
if (curr_bb_edge->layer_min == 1) {
3590+
bb_edge_new.layer_min = 0;
3591+
bb_coord_new.layer_min = 0;
3592+
} else {
3593+
bb_edge_new.layer_min = curr_bb_edge->layer_min - 1;
3594+
bb_coord_new.layer_min = curr_bb_coord->layer_min;
3595+
}
3596+
} else {
3597+
bb_edge_new.layer_min = curr_bb_edge->layer_min;
3598+
bb_coord_new.layer_min = curr_bb_coord->layer_min;
3599+
}
3600+
3601+
if (pin_new_loc.layer_num > curr_bb_coord->layer_max) { /* Moved past xmax. */
3602+
bb_coord_new.layer_max = pin_new_loc.layer_num;
3603+
bb_edge_new.layer_max = 1;
3604+
} else if (pin_new_loc.layer_num == curr_bb_coord->layer_max) { /* Moved to xmax */
3605+
bb_coord_new.layer_max = pin_new_loc.layer_num;
3606+
bb_edge_new.layer_max = curr_bb_edge->layer_max + 1;
3607+
} else { /* Xmax unchanged. */
3608+
bb_coord_new.layer_max = curr_bb_coord->layer_max;
3609+
bb_edge_new.layer_max = curr_bb_edge->layer_max;
3610+
}
3611+
3612+
} else {
3613+
bb_coord_new.layer_min = curr_bb_coord->layer_min;
3614+
bb_coord_new.layer_max = curr_bb_coord->layer_max;
3615+
bb_edge_new.layer_min = curr_bb_coord->layer_min;
3616+
bb_edge_new.layer_max = curr_bb_coord->layer_max;
3617+
}
3618+
3619+
VTR_ASSERT(bb_coord_new.layer_min >= 0 && bb_coord_new.layer_max >= 0);
3620+
35223621
/* We need to update it only if multiple layers are available */
35233622
for (int layer_num = 0; layer_num < num_layers; layer_num++) {
35243623
num_sink_pin_layer_new[layer_num] = curr_num_sink_pin_layer[layer_num];

0 commit comments

Comments
 (0)