@@ -2826,8 +2826,8 @@ static void get_bb_from_scratch(ClusterNetId net_id,
2826
2826
t_bb& coords,
2827
2827
t_bb& num_on_edges,
2828
2828
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 ;
2831
2831
2832
2832
auto & cluster_ctx = g_vpr_ctx.clustering ();
2833
2833
auto & place_ctx = g_vpr_ctx.placement ();
@@ -2841,9 +2841,11 @@ static void get_bb_from_scratch(ClusterNetId net_id,
2841
2841
+ physical_tile_type (bnum)->pin_width_offset [pnum];
2842
2842
y = place_ctx.block_locs [bnum].loc .y
2843
2843
+ physical_tile_type (bnum)->pin_height_offset [pnum];
2844
+ pin_layer = place_ctx.block_locs [bnum].loc .layer ;
2844
2845
2845
2846
x = max (min<int >(x, grid.width () - 2 ), 1 );
2846
2847
y = max (min<int >(y, grid.height () - 2 ), 1 );
2848
+ pin_layer = max (min<int >(pin_layer, grid.get_num_layers ()), 0 );
2847
2849
2848
2850
xmin = x;
2849
2851
ymin = y;
@@ -2854,6 +2856,11 @@ static void get_bb_from_scratch(ClusterNetId net_id,
2854
2856
xmax_edge = 1 ;
2855
2857
ymax_edge = 1 ;
2856
2858
2859
+ layer_min = pin_layer;
2860
+ layer_max = pin_layer;
2861
+ layer_min_edge = 1 ;
2862
+ layer_max_edge = 1 ;
2863
+
2857
2864
for (int layer_num = 0 ; layer_num < grid.get_num_layers (); layer_num++) {
2858
2865
num_sink_pin_layer[layer_num] = 0 ;
2859
2866
}
@@ -2876,6 +2883,7 @@ static void get_bb_from_scratch(ClusterNetId net_id,
2876
2883
2877
2884
x = max (min<int >(x, grid.width () - 2 ), 1 ); // -2 for no perim channels
2878
2885
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 );
2879
2887
2880
2888
if (x == xmin) {
2881
2889
xmin_edge++;
@@ -2903,6 +2911,19 @@ static void get_bb_from_scratch(ClusterNetId net_id,
2903
2911
ymax_edge = 1 ;
2904
2912
}
2905
2913
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
+
2906
2927
num_sink_pin_layer[pin_layer]++;
2907
2928
}
2908
2929
@@ -2912,11 +2933,15 @@ static void get_bb_from_scratch(ClusterNetId net_id,
2912
2933
coords.xmax = xmax;
2913
2934
coords.ymin = ymin;
2914
2935
coords.ymax = ymax;
2936
+ coords.layer_min = layer_min;
2937
+ coords.layer_max = layer_max;
2915
2938
2916
2939
num_on_edges.xmin = xmin_edge;
2917
2940
num_on_edges.xmax = xmax_edge;
2918
2941
num_on_edges.ymin = ymin_edge;
2919
2942
num_on_edges.ymax = ymax_edge;
2943
+ num_on_edges.layer_min = layer_min_edge;
2944
+ num_on_edges.layer_max = layer_max_edge;
2920
2945
}
2921
2946
2922
2947
/* 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,
3127
3152
* chany_place_cost_fac[bbptr.xmax ][bbptr.xmin - 1 ];
3128
3153
3129
3154
if (is_multi_layer) {
3130
- const auto & move_ctx = g_placer_ctx. move ();
3131
- int src_layer = 0 ;
3155
+
3156
+
3132
3157
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 ];
3135
3160
} 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 ];
3137
3162
}
3138
3163
VTR_ASSERT_DEBUG (num_cross_layer_sink >= 0 );
3139
3164
@@ -3190,7 +3215,7 @@ static void get_non_updateable_bb(ClusterNetId net_id,
3190
3215
vtr::NdMatrixProxy<int , 1 > num_sink_pin_layer) {
3191
3216
// TODO: account for multiple physical pin instances per logical pin
3192
3217
3193
- int xmax, ymax, xmin, ymin, x, y, layer;
3218
+ int xmax, ymax, xmin, ymin, layer_max, layer_min, x, y, layer;
3194
3219
int pnum;
3195
3220
3196
3221
auto & cluster_ctx = g_vpr_ctx.clustering ();
@@ -3204,11 +3229,14 @@ static void get_non_updateable_bb(ClusterNetId net_id,
3204
3229
+ physical_tile_type (bnum)->pin_width_offset [pnum];
3205
3230
y = place_ctx.block_locs [bnum].loc .y
3206
3231
+ physical_tile_type (bnum)->pin_height_offset [pnum];
3232
+ layer = place_ctx.block_locs [bnum].loc .layer ;
3207
3233
3208
3234
xmin = x;
3209
3235
ymin = y;
3210
3236
xmax = x;
3211
3237
ymax = y;
3238
+ layer_min = layer;
3239
+ layer_max = layer;
3212
3240
3213
3241
for (int layer_num = 0 ; layer_num < device_ctx.grid .get_num_layers (); layer_num++) {
3214
3242
num_sink_pin_layer[layer_num] = 0 ;
@@ -3235,6 +3263,12 @@ static void get_non_updateable_bb(ClusterNetId net_id,
3235
3263
ymax = y;
3236
3264
}
3237
3265
3266
+ if (layer < layer_min) {
3267
+ layer_min = layer;
3268
+ } else if (layer > layer_max) {
3269
+ layer_max = layer;
3270
+ }
3271
+
3238
3272
num_sink_pin_layer[layer]++;
3239
3273
}
3240
3274
@@ -3250,6 +3284,8 @@ static void get_non_updateable_bb(ClusterNetId net_id,
3250
3284
bb_coord_new.ymin = max (min<int >(ymin, device_ctx.grid .height () - 2 ), 1 ); // -2 for no perim channels
3251
3285
bb_coord_new.xmax = max (min<int >(xmax, device_ctx.grid .width () - 2 ), 1 ); // -2 for no perim channels
3252
3286
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 );
3253
3289
}
3254
3290
3255
3291
static void get_non_updateable_layer_bb (ClusterNetId net_id,
@@ -3349,8 +3385,11 @@ static void update_bb(ClusterNetId net_id,
3349
3385
3350
3386
pin_new_loc.x = max (min<int >(pin_new_loc.x , device_ctx.grid .width () - 2 ), 1 ); // -2 for no perim channels
3351
3387
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
+
3352
3390
pin_old_loc.x = max (min<int >(pin_old_loc.x , device_ctx.grid .width () - 2 ), 1 ); // -2 for no perim channels
3353
3391
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 );
3354
3393
3355
3394
/* Check if the net had been updated before. */
3356
3395
if (bb_updated_before[net_id] == GOT_FROM_SCRATCH) {
@@ -3519,6 +3558,66 @@ static void update_bb(ClusterNetId net_id,
3519
3558
3520
3559
/* Now account for the layer motion. */
3521
3560
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
+
3522
3621
/* We need to update it only if multiple layers are available */
3523
3622
for (int layer_num = 0 ; layer_num < num_layers; layer_num++) {
3524
3623
num_sink_pin_layer_new[layer_num] = curr_num_sink_pin_layer[layer_num];
0 commit comments