@@ -221,15 +221,33 @@ static DeviceGrid auto_size_device_grid(const std::vector<t_grid_def>& grid_layo
221
221
}
222
222
223
223
static std::vector<t_physical_tile_type_ptr> grid_overused_resources (const DeviceGrid& grid, std::map<t_logical_block_type_ptr, size_t > instance_counts) {
224
+ auto & device_ctx = g_vpr_ctx.device ();
225
+
224
226
std::vector<t_physical_tile_type_ptr> overused_resources;
225
227
228
+ std::unordered_map<t_physical_tile_type_ptr, size_t > min_count_map;
229
+ // Initialize min_count_map
230
+ for (const auto & physical_tile : device_ctx.physical_tile_types ) {
231
+ min_count_map.insert (std::make_pair (&physical_tile, size_t (0 )));
232
+ }
233
+
226
234
// Are the resources satisified?
227
235
for (auto kv : instance_counts) {
228
- t_physical_tile_type_ptr type;
229
- size_t min_count;
230
- std::tie (type, min_count) = std::make_pair (kv.first ->equivalent_tiles [0 ], kv.second );
236
+ t_physical_tile_type_ptr type = nullptr ;
237
+
238
+ size_t inst_cnt = 0 ;
239
+ for (auto & physical_tile : kv.first ->equivalent_tiles ) {
240
+ size_t tmp_inst_cnt = grid.num_instances (physical_tile);
241
+
242
+ if (inst_cnt <= tmp_inst_cnt) {
243
+ type = physical_tile;
244
+ inst_cnt = tmp_inst_cnt;
245
+ }
246
+ }
231
247
232
- size_t inst_cnt = grid.num_instances (type);
248
+ VTR_ASSERT (type);
249
+ size_t min_count = min_count_map.at (type) + kv.second ;
250
+ min_count_map.at (type) = min_count;
233
251
234
252
if (inst_cnt < min_count) {
235
253
overused_resources.push_back (type);
0 commit comments