@@ -1192,7 +1192,8 @@ void initial_placement(const t_placer_opts& placer_opts,
11921192 propagate_place_constraints ();
11931193
11941194 /* Mark the blocks that have already been locked to one spot via floorplan constraints
1195- * as fixed, so they do not get moved during initial placement or later during the simulated annealing stage of placement*/
1195+ * as fixed, so they do not get moved during initial placement or later during the simulated annealing stage of placement
1196+ */
11961197 mark_fixed_blocks ();
11971198
11981199 // Compute and store compressed floorplanning constraints
@@ -1204,17 +1205,22 @@ void initial_placement(const t_placer_opts& placer_opts,
12041205 read_constraints (constraints_file);
12051206 }
12061207
1207- if (noc_opts.noc ) {
1208- // NoC routers are placed before other blocks
1209- initial_noc_placement (noc_opts, placer_opts);
1210- propagate_place_constraints ();
1211- }
1208+ if (!placer_opts.read_initial_place_file .empty ()) {
1209+ const auto & grid = g_vpr_ctx.device ().grid ;
1210+ read_place (nullptr , placer_opts.read_initial_place_file .c_str (), false , grid);
1211+ } else {
1212+ if (noc_opts.noc ) {
1213+ // NoC routers are placed before other blocks
1214+ initial_noc_placement (noc_opts, placer_opts);
1215+ propagate_place_constraints ();
1216+ }
12121217
1213- // Assign scores to blocks and placement macros according to how difficult they are to place
1214- vtr::vector<ClusterBlockId, t_block_score> block_scores = assign_block_scores ();
1218+ // Assign scores to blocks and placement macros according to how difficult they are to place
1219+ vtr::vector<ClusterBlockId, t_block_score> block_scores = assign_block_scores ();
12151220
1216- // Place all blocks
1217- place_all_blocks (placer_opts, block_scores, placer_opts.pad_loc_type , constraints_file);
1221+ // Place all blocks
1222+ place_all_blocks (placer_opts, block_scores, placer_opts.pad_loc_type , constraints_file);
1223+ }
12181224
12191225 alloc_and_load_movable_blocks ();
12201226
0 commit comments