1+ #include " move_transactions.h"
12#include " move_utils.h"
23
34#include " globals.h"
67
78t_pl_blocks_to_be_moved::t_pl_blocks_to_be_moved (size_t max_blocks){
89 moved_blocks.reserve (max_blocks);
9- moved_blocks.resize (0 );
1010}
1111
1212size_t t_pl_blocks_to_be_moved::get_size_and_increment () {
@@ -16,9 +16,9 @@ size_t t_pl_blocks_to_be_moved::get_size_and_increment() {
1616}
1717
1818// Records that block 'blk' should be moved to the specified 'to' location
19- e_block_move_result record_block_move (t_pl_blocks_to_be_moved& blocks_affected, ClusterBlockId blk, t_pl_loc to) {
20- auto res = blocks_affected. moved_to .emplace (to);
21- if (!res. second ) {
19+ e_block_move_result t_pl_blocks_to_be_moved:: record_block_move (ClusterBlockId blk, t_pl_loc to) {
20+ auto [to_it, to_success] = moved_to.emplace (to);
21+ if (!to_success ) {
2222 log_move_abort (" duplicate block move to location" );
2323 return e_block_move_result::ABORT;
2424 }
@@ -27,35 +27,57 @@ e_block_move_result record_block_move(t_pl_blocks_to_be_moved& blocks_affected,
2727
2828 t_pl_loc from = place_ctx.block_locs [blk].loc ;
2929
30- auto res2 = blocks_affected.moved_from .emplace (from);
31- if (!res2.second ) {
30+ auto [_, from_success] = moved_from.emplace (from);
31+ if (!from_success) {
32+ moved_to.erase (to_it);
3233 log_move_abort (" duplicate block move from location" );
3334 return e_block_move_result::ABORT;
3435 }
3536
3637 VTR_ASSERT_SAFE (to.sub_tile < int (place_ctx.grid_blocks .num_blocks_at_location ({to.x , to.y , to.layer })));
3738
3839 // Sets up the blocks moved
39- size_t imoved_blk = blocks_affected. get_size_and_increment ();
40- blocks_affected. moved_blocks [imoved_blk].block_num = blk;
41- blocks_affected. moved_blocks [imoved_blk].old_loc = from;
42- blocks_affected. moved_blocks [imoved_blk].new_loc = to;
40+ size_t imoved_blk = get_size_and_increment ();
41+ moved_blocks[imoved_blk].block_num = blk;
42+ moved_blocks[imoved_blk].old_loc = from;
43+ moved_blocks[imoved_blk].new_loc = to;
4344
4445 return e_block_move_result::VALID;
4546}
4647
48+ // Examines the currently proposed move and determine any empty locations
49+ std::set<t_pl_loc> t_pl_blocks_to_be_moved::t_pl_blocks_to_be_moved::determine_locations_emptied_by_move () {
50+ std::set<t_pl_loc> moved_from_set;
51+ std::set<t_pl_loc> moved_to_set;
52+
53+ for (const t_pl_moved_block& moved_block : moved_blocks) {
54+ // When a block is moved its old location becomes free
55+ moved_from_set.emplace (moved_block.old_loc );
56+
57+ // But any block later moved to a position fills it
58+ moved_to_set.emplace (moved_block.new_loc );
59+ }
60+
61+ std::set<t_pl_loc> empty_locs;
62+ std::set_difference (moved_from_set.begin (), moved_from_set.end (),
63+ moved_to_set.begin (), moved_to_set.end (),
64+ std::inserter (empty_locs, empty_locs.begin ()));
65+
66+ return empty_locs;
67+ }
68+
4769// Moves the blocks in blocks_affected to their new locations
4870void apply_move_blocks (const t_pl_blocks_to_be_moved& blocks_affected) {
4971 auto & place_ctx = g_vpr_ctx.mutable_placement ();
5072 auto & device_ctx = g_vpr_ctx.device ();
5173
5274 // Swap the blocks, but don't swap the nets or update place_ctx.grid_blocks
5375 // yet since we don't know whether the swap will be accepted
54- for (const auto & block : blocks_affected.moved_blocks ) {
55- ClusterBlockId blk = block .block_num ;
76+ for (const t_pl_moved_block& moved_block : blocks_affected.moved_blocks ) {
77+ ClusterBlockId blk = moved_block .block_num ;
5678
57- const t_pl_loc& old_loc = block .old_loc ;
58- const t_pl_loc& new_loc = block .new_loc ;
79+ const t_pl_loc& old_loc = moved_block .old_loc ;
80+ const t_pl_loc& new_loc = moved_block .new_loc ;
5981
6082 // move the block to its new location
6183 place_ctx.block_locs [blk].loc = new_loc;
@@ -78,11 +100,11 @@ void commit_move_blocks(const t_pl_blocks_to_be_moved& blocks_affected) {
78100 auto & place_ctx = g_vpr_ctx.mutable_placement ();
79101
80102 /* Swap physical location */
81- for (const auto & block : blocks_affected.moved_blocks ) {
82- ClusterBlockId blk = block .block_num ;
103+ for (const t_pl_moved_block& moved_block : blocks_affected.moved_blocks ) {
104+ ClusterBlockId blk = moved_block .block_num ;
83105
84- const t_pl_loc& to = block .new_loc ;
85- const t_pl_loc& from = block .old_loc ;
106+ const t_pl_loc& to = moved_block .new_loc ;
107+ const t_pl_loc& from = moved_block .old_loc ;
86108
87109 // Remove from old location only if it hasn't already been updated by a previous block update
88110 if (place_ctx.grid_blocks .block_at_location (from) == blk) {
@@ -108,11 +130,11 @@ void revert_move_blocks(const t_pl_blocks_to_be_moved& blocks_affected) {
108130 auto & device_ctx = g_vpr_ctx.device ();
109131
110132 // Swap the blocks back, nets not yet swapped they don't need to be changed
111- for (const auto & block : blocks_affected.moved_blocks ) {
112- ClusterBlockId blk = block .block_num ;
133+ for (const t_pl_moved_block& moved_block : blocks_affected.moved_blocks ) {
134+ ClusterBlockId blk = moved_block .block_num ;
113135
114- const t_pl_loc& old_loc = block .old_loc ;
115- const t_pl_loc& new_loc = block .new_loc ;
136+ const t_pl_loc& old_loc = moved_block .old_loc ;
137+ const t_pl_loc& new_loc = moved_block .new_loc ;
116138
117139 // return the block to where it was before the swap
118140 place_ctx.block_locs [blk].loc = old_loc;
@@ -132,15 +154,15 @@ void revert_move_blocks(const t_pl_blocks_to_be_moved& blocks_affected) {
132154}
133155
134156// Clears the current move so a new move can be proposed
135- void clear_move_blocks (t_pl_blocks_to_be_moved& blocks_affected ) {
157+ void t_pl_blocks_to_be_moved:: clear_move_blocks () {
136158 // Reset moved flags
137- blocks_affected. moved_to .clear ();
138- blocks_affected. moved_from .clear ();
159+ moved_to.clear ();
160+ moved_from.clear ();
139161
140162 // For run-time, we just reset size of blocks_affected.moved_blocks to zero, but do not free the blocks_affected
141163 // array to avoid memory allocation
142164
143- blocks_affected. moved_blocks .resize (0 );
165+ moved_blocks.resize (0 );
144166
145- blocks_affected. affected_pins .clear ();
167+ affected_pins.clear ();
146168}
0 commit comments