Skip to content

Commit 34a680a

Browse files
replace accesses to global block_locs and grid_blocks with a reference to place location vars
1 parent 0fa2cfd commit 34a680a

File tree

4 files changed

+41
-36
lines changed

4 files changed

+41
-36
lines changed

vpr/src/place/analytic_placer.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,9 @@ constexpr int HEAP_STALLED_ITERATIONS_STOP = 15;
128128
* Currently only initializing AP configuration parameters
129129
* Placement & device info is accessed via g_vpr_ctx
130130
*/
131-
AnalyticPlacer::AnalyticPlacer() {
131+
132+
AnalyticPlacer::AnalyticPlacer(const PlaceLocVars& place_loc_vars)
133+
: placer_loc_vars_ref_(place_loc_vars) {
132134
//Eigen::initParallel();
133135

134136
// TODO: PlacerHeapCfg should be externally configured & supplied
@@ -301,7 +303,7 @@ void AnalyticPlacer::build_legal_locations() {
301303
// initialize other data members
302304
void AnalyticPlacer::init() {
303305
const ClusteredNetlist& clb_nlist = g_vpr_ctx.clustering().clb_nlist;
304-
auto& block_locs = g_vpr_ctx.placement().block_locs();
306+
auto& block_locs = placer_loc_vars_ref_.block_locs();
305307

306308
for (auto blk_id : clb_nlist.blocks()) {
307309
blk_locs.insert(blk_id, BlockLocation{});
@@ -741,7 +743,7 @@ std::string AnalyticPlacer::print_overlap(vtr::Matrix<int>& overlap, FILE* fp) {
741743
void AnalyticPlacer::print_place(const char* place_file) {
742744
const DeviceContext& device_ctx = g_vpr_ctx.device();
743745
const ClusteredNetlist& clb_nlist = g_vpr_ctx.clustering().clb_nlist;
744-
auto& block_locs = g_vpr_ctx.placement().block_locs();
746+
auto& block_locs = placer_loc_vars_ref_.block_locs();
745747

746748
FILE* fp;
747749

vpr/src/place/analytic_placer.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,8 @@ class AnalyticPlacer {
122122
* @brief Constructor of AnalyticPlacer, currently initializes AnalyticPlacerCfg for the analytic placer
123123
* To tune these parameters, change directly in constructor
124124
*/
125-
AnalyticPlacer();
125+
AnalyticPlacer() = delete;
126+
explicit AnalyticPlacer(const PlaceLocVars& place_loc_vars);
126127

127128
/*
128129
* @brief main function of analytic placement
@@ -180,6 +181,9 @@ class AnalyticPlacer {
180181
// Lookup from blockID to block location
181182
vtr::vector_map<ClusterBlockId, BlockLocation> blk_locs;
182183

184+
// reference to the placement location variables
185+
PlaceLocVars& placer_loc_vars_ref_;
186+
183187
/*
184188
* The set of blks of different types to be placed by AnalyticPlacement process,
185189
* i.e. the free variable blocks.

vpr/src/place/cut_spreader.cpp

Lines changed: 28 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -405,7 +405,7 @@ void CutSpreader::expand_regions() {
405405
std::pair<int, int> CutSpreader::cut_region(SpreaderRegion& r, bool dir) {
406406
const DeviceContext& device_ctx = g_vpr_ctx.device();
407407
const ClusteredNetlist& clb_nlist = g_vpr_ctx.clustering().clb_nlist;
408-
PlacementContext& place_ctx = g_vpr_ctx.mutable_placement();
408+
const auto& pl_macros = g_vpr_ctx.placement().pl_macros;
409409

410410
// TODO: CutSpreader is not compatible with 3D FPGA
411411
VTR_ASSERT(device_ctx.grid.get_num_layers() == 1);
@@ -503,15 +503,15 @@ std::pair<int, int> CutSpreader::cut_region(SpreaderRegion& r, bool dir) {
503503
// while left subarea is over-utilized, move logic blocks to the right subarea one at a time
504504
while (pivot > 0 && rl.overused(ap->ap_cfg.beta)) {
505505
auto& move_blk = cut_blks.at(pivot);
506-
int size = (imacro(move_blk) != NO_MACRO) ? place_ctx.pl_macros[imacro(move_blk)].members.size() : 1;
506+
int size = (imacro(move_blk) != NO_MACRO) ? pl_macros[imacro(move_blk)].members.size() : 1;
507507
rl.n_blks -= size;
508508
rr.n_blks += size;
509509
pivot--;
510510
}
511511
// while right subarea is over-utilized, move logic blocks to the left subarea one at a time
512512
while (pivot < int(cut_blks.size()) - 1 && rr.overused(ap->ap_cfg.beta)) {
513513
auto& move_blk = cut_blks.at(pivot + 1);
514-
int size = (imacro(move_blk) != NO_MACRO) ? place_ctx.pl_macros[imacro(move_blk)].members.size() : 1;
514+
int size = (imacro(move_blk) != NO_MACRO) ? pl_macros[imacro(move_blk)].members.size() : 1;
515515
rl.n_blks += size;
516516
rr.n_blks -= size;
517517
pivot++;
@@ -617,15 +617,15 @@ int CutSpreader::initial_source_cut(SpreaderRegion& r,
617617
bool dir,
618618
int& clearance_l,
619619
int& clearance_r) {
620-
PlacementContext& place_ctx = g_vpr_ctx.mutable_placement();
620+
const auto& pl_macros = g_vpr_ctx.placement().pl_macros;
621621

622622
// pivot is the midpoint of cut_blks in terms of total block size (counting macro members)
623623
// this ensures the initial partitions have similar number of blocks
624624
int pivot_blks = 0; // midpoint in terms of total number of blocks
625625
int pivot = 0; // midpoint in terms of index of cut_blks
626626
for (auto& blk : cut_blks) {
627627
// if blk is part of macro (only macro heads in cut_blks, no macro members), add that macro's size
628-
pivot_blks += (imacro(blk) != NO_MACRO) ? place_ctx.pl_macros[imacro(blk)].members.size() : 1;
628+
pivot_blks += (imacro(blk) != NO_MACRO) ? pl_macros[imacro(blk)].members.size() : 1;
629629
if (pivot_blks >= r.n_blks / 2)
630630
break;
631631
pivot++;
@@ -670,16 +670,16 @@ int CutSpreader::initial_target_cut(SpreaderRegion& r,
670670
int& right_blks_n,
671671
int& left_tiles_n,
672672
int& right_tiles_n) {
673-
PlacementContext& place_ctx = g_vpr_ctx.mutable_placement();
673+
const auto& pl_macros = g_vpr_ctx.mutable_placement().pl_macros;
674674

675675
// To achieve smallest difference in utilization, first move all tiles to right partition
676676
left_blks_n = 0, right_blks_n = 0;
677677
left_tiles_n = 0, right_tiles_n = r.n_tiles;
678678
// count number of blks in each partition, from initial source cut
679679
for (int i = 0; i <= init_source_cut; i++)
680-
left_blks_n += (imacro(cut_blks.at(i)) != NO_MACRO) ? place_ctx.pl_macros[imacro(cut_blks.at(i))].members.size() : 1;
680+
left_blks_n += (imacro(cut_blks.at(i)) != NO_MACRO) ? pl_macros[imacro(cut_blks.at(i))].members.size() : 1;
681681
for (int i = init_source_cut + 1; i < int(cut_blks.size()); i++)
682-
right_blks_n += (imacro(cut_blks.at(i)) != NO_MACRO) ? place_ctx.pl_macros[imacro(cut_blks.at(i))].members.size() : 1;
682+
right_blks_n += (imacro(cut_blks.at(i)) != NO_MACRO) ? pl_macros[imacro(cut_blks.at(i))].members.size() : 1;
683683

684684
int best_tgt_cut = -1;
685685
double best_deltaU = std::numeric_limits<double>::max();
@@ -805,8 +805,8 @@ void CutSpreader::linear_spread_subarea(std::vector<ClusterBlockId>& cut_blks,
805805
*/
806806
void CutSpreader::strict_legalize() {
807807
auto& clb_nlist = g_vpr_ctx.clustering().clb_nlist;
808-
auto& place_ctx = g_vpr_ctx.placement();
809-
auto& block_locs = place_ctx.block_locs();
808+
const auto& block_locs = ap->placer_loc_vars_ref_.block_locs();
809+
const auto& pl_macros = g_vpr_ctx.placement().pl_macros;
810810
int max_x = g_vpr_ctx.device().grid.width();
811811
int max_y = g_vpr_ctx.device().grid.height();
812812

@@ -824,7 +824,7 @@ void CutSpreader::strict_legalize() {
824824
std::priority_queue<std::pair<int, ClusterBlockId>> remaining;
825825
for (ClusterBlockId blk : ap->solve_blks) {
826826
if (imacro(blk) != NO_MACRO) // blk is head block of a macro (only head blks are solved)
827-
remaining.emplace(place_ctx.pl_macros[imacro(blk)].members.size(), blk);
827+
remaining.emplace(pl_macros[imacro(blk)].members.size(), blk);
828828
else
829829
remaining.emplace(1, blk);
830830
}
@@ -962,16 +962,15 @@ void CutSpreader::strict_legalize() {
962962
* Place blk on sub_tile location by modifying place_ctx.grid_blocks, place_ctx.block_locs, and ap->blk_locs[blk].loc
963963
*/
964964
void CutSpreader::bind_tile(t_pl_loc sub_tile, ClusterBlockId blk) {
965-
auto& place_ctx = g_vpr_ctx.mutable_placement();
966-
auto& grid_blocks = place_ctx.get_mutable_grid_blocks();
967-
auto& block_locs = place_ctx.mutable_block_locs();
965+
auto& grid_blocks = ap->placer_loc_vars_ref_.mutable_grid_blocks();
966+
auto& block_locs = ap->placer_loc_vars_ref_.mutable_block_locs();
968967

969968
VTR_ASSERT(grid_blocks.block_at_location(sub_tile) == EMPTY_BLOCK_ID);
970969
VTR_ASSERT(block_locs[blk].is_fixed == false);
971970
grid_blocks.set_block_at_location(sub_tile, blk);
972971
block_locs[blk].loc = sub_tile;
973972
grid_blocks.set_usage({sub_tile.x, sub_tile.y, sub_tile.layer},
974-
place_ctx.get_grid_blocks().get_usage({sub_tile.x, sub_tile.y, sub_tile.layer}) + 1);
973+
grid_blocks.get_usage({sub_tile.x, sub_tile.y, sub_tile.layer}) + 1);
975974
ap->blk_locs[blk].loc = sub_tile;
976975
}
977976

@@ -980,17 +979,16 @@ void CutSpreader::bind_tile(t_pl_loc sub_tile, ClusterBlockId blk) {
980979
* Remove placement at sub_tile location by clearing place_ctx.block_locs and place_Ctx.grid_blocks
981980
*/
982981
void CutSpreader::unbind_tile(t_pl_loc sub_tile) {
983-
auto& place_ctx = g_vpr_ctx.mutable_placement();
984-
auto& grid_blocks = place_ctx.get_mutable_grid_blocks();
985-
auto& block_locs = place_ctx.mutable_block_locs();
982+
auto& grid_blocks = ap->placer_loc_vars_ref_.mutable_grid_blocks();
983+
auto& block_locs = ap->placer_loc_vars_ref_.mutable_block_locs();
986984

987985
VTR_ASSERT(grid_blocks.block_at_location(sub_tile) != EMPTY_BLOCK_ID);
988986
ClusterBlockId blk = grid_blocks.block_at_location(sub_tile);
989987
VTR_ASSERT(block_locs[blk].is_fixed == false);
990988
block_locs[blk].loc = t_pl_loc{};
991989
grid_blocks.set_block_at_location(sub_tile, EMPTY_BLOCK_ID);
992990
grid_blocks.set_usage({sub_tile.x, sub_tile.y, sub_tile.layer},
993-
place_ctx.get_grid_blocks().get_usage({sub_tile.x, sub_tile.y, sub_tile.layer}) - 1);
991+
grid_blocks.get_usage({sub_tile.x, sub_tile.y, sub_tile.layer}) - 1);
994992
}
995993

996994
/*
@@ -999,9 +997,8 @@ void CutSpreader::unbind_tile(t_pl_loc sub_tile) {
999997
* the block in place_ctx.grid_blocks)
1000998
*/
1001999
bool CutSpreader::is_placed(ClusterBlockId blk) {
1002-
auto& place_ctx = g_vpr_ctx.placement();
1003-
auto& grid_blocks = place_ctx.get_grid_blocks();
1004-
auto& block_locs = place_ctx.block_locs();
1000+
const auto& grid_blocks = ap->placer_loc_vars_ref_.grid_blocks();
1001+
const auto& block_locs = ap->placer_loc_vars_ref_.block_locs();
10051002

10061003
if (block_locs[blk].loc != t_pl_loc{}) {
10071004
auto loc = block_locs[blk].loc;
@@ -1035,14 +1032,14 @@ bool CutSpreader::try_place_blk(ClusterBlockId blk,
10351032
int& best_inp_len,
10361033
t_pl_loc& best_subtile,
10371034
std::priority_queue<std::pair<int, ClusterBlockId>>& remaining) {
1038-
auto& place_ctx = g_vpr_ctx.mutable_placement();
1035+
const auto& grid_blocks = ap->placer_loc_vars_ref_.grid_blocks();
10391036
const ClusteredNetlist& clb_nlist = g_vpr_ctx.clustering().clb_nlist;
10401037

1041-
// iteration at current radius has exceed exploration limit, and a candidate sub_tile (best_subtile) is found
1038+
// iteration at current radius has exceeded exploration limit, and a candidate sub_tile (best_subtile) is found
10421039
// then blk is placed in best_subtile
10431040
if (exceeds_explore_limit && best_subtile != t_pl_loc{}) {
10441041
// find the logic block bound to (placed on) best_subtile
1045-
ClusterBlockId bound_blk = place_ctx.get_grid_blocks().block_at_location(best_subtile);
1042+
ClusterBlockId bound_blk = grid_blocks.block_at_location(best_subtile);
10461043
if (bound_blk != EMPTY_BLOCK_ID) { // if best_subtile has a logic block
10471044
unbind_tile(best_subtile); // clear bound_block and best_subtile's placement info
10481045
remaining.emplace(1, bound_blk); // put bound_blk back into remaining blocks to place
@@ -1053,7 +1050,7 @@ bool CutSpreader::try_place_blk(ClusterBlockId blk,
10531050

10541051
// if exploration limit is not met or a candidate sub_tile is not found yet
10551052
for (auto sub_t : subtiles_at_location[nx][ny]) { // for each available sub_tile at random location
1056-
ClusterBlockId bound_blk = place_ctx.get_grid_blocks().block_at_location(sub_t); // logic blk at [nx, ny]
1053+
ClusterBlockId bound_blk = grid_blocks.block_at_location(sub_t); // logic blk at [nx, ny]
10571054
if (bound_blk == EMPTY_BLOCK_ID
10581055
|| ripup_radius_met
10591056
|| rand() % (20000) < 10) {
@@ -1113,7 +1110,8 @@ bool CutSpreader::try_place_macro(ClusterBlockId blk,
11131110
int nx,
11141111
int ny,
11151112
std::priority_queue<std::pair<int, ClusterBlockId>>& remaining) {
1116-
auto& place_ctx = g_vpr_ctx.mutable_placement();
1113+
const auto& pl_macros = g_vpr_ctx.placement().pl_macros;
1114+
const auto& grid_blocks = ap->placer_loc_vars_ref_.grid_blocks();
11171115
const ClusteredNetlist& clb_nlist = g_vpr_ctx.clustering().clb_nlist;
11181116

11191117
for (auto sub_t : subtiles_at_location[nx][ny]) {
@@ -1137,7 +1135,7 @@ bool CutSpreader::try_place_macro(ClusterBlockId blk,
11371135

11381136
// if the target location has a logic block, ensure it's not part of a macro
11391137
// because a macro placed before the current one has higher priority (longer chain)
1140-
ClusterBlockId bound = place_ctx.get_grid_blocks().block_at_location(target);
1138+
ClusterBlockId bound = grid_blocks.block_at_location(target);
11411139
if (bound != EMPTY_BLOCK_ID && imacro(bound) != NO_MACRO) {
11421140
placement_impossible = true;
11431141
break;
@@ -1146,7 +1144,7 @@ bool CutSpreader::try_place_macro(ClusterBlockId blk,
11461144
targets.emplace_back(visit_blk, target);
11471145
if (macro_head(visit_blk) == visit_blk) { // if visit_blk is the head block of the macro
11481146
// push all macro members to visit queue along with their calculated positions
1149-
const std::vector<t_pl_macro_member>& members = place_ctx.pl_macros[imacro(blk)].members;
1147+
const std::vector<t_pl_macro_member>& members = pl_macros[imacro(blk)].members;
11501148
for (auto member = members.begin() + 1; member != members.end(); ++member) {
11511149
t_pl_loc mloc = target + member->offset; // calculate member_loc using (head blk location + offset)
11521150
visit.emplace(member->blk_index, mloc);
@@ -1156,7 +1154,7 @@ bool CutSpreader::try_place_macro(ClusterBlockId blk,
11561154

11571155
if (!placement_impossible) { // if placement is possible, apply this placement
11581156
for (auto& target : targets) {
1159-
ClusterBlockId bound = place_ctx.get_grid_blocks().block_at_location(target.second);
1157+
ClusterBlockId bound = grid_blocks.block_at_location(target.second);
11601158
if (bound != EMPTY_BLOCK_ID) {
11611159
// if target location has a logic block, displace it and put it in remaining queue to be placed later
11621160
unbind_tile(target.second);

vpr/src/place/place.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -722,8 +722,9 @@ void try_place(const Netlist<>& net_list,
722722
#ifdef ENABLE_ANALYTIC_PLACE
723723
// Analytic placer: When enabled, skip most of the annealing and go straight to quench
724724
// TODO: refactor goto label.
725-
if (placer_opts.enable_analytic_placer)
725+
if (placer_opts.enable_analytic_placer) {
726726
skip_anneal = true;
727+
}
727728
#endif /* ENABLE_ANALYTIC_PLACE */
728729

729730
//RL agent state definition
@@ -2142,7 +2143,7 @@ static int check_block_placement_consistency(const PlaceLocVars& place_loc_vars)
21422143
int check_macro_placement_consistency(const PlaceLocVars& place_loc_vars) {
21432144
const auto& pl_macros = g_vpr_ctx.placement().pl_macros;
21442145
const auto& block_locs = place_loc_vars.block_locs();
2145-
const GridBlock grid_blocks = place_loc_vars.grid_blocks();
2146+
const auto& grid_blocks = place_loc_vars.grid_blocks();
21462147

21472148
int error = 0;
21482149

0 commit comments

Comments
 (0)