blob: 9247aac1e2dde3c9aacd75f26817beb78abbc8e2 [file] [log] [blame]
#ifndef DEVICE_GRID
#define DEVICE_GRID
#include "vtr_ndmatrix.h"
#include "vpr_types.h"
class DeviceGrid {
public:
DeviceGrid() = default;
DeviceGrid(std::string grid_name, vtr::Matrix<t_grid_tile> grid);
DeviceGrid(std::string grid_name, vtr::Matrix<t_grid_tile> grid, std::vector<t_physical_tile_type_ptr> limiting_res);
const std::string& name() const { return name_; }
size_t width() const { return grid_.dim_size(0); }
size_t height() const { return grid_.dim_size(1); }
//Note: supports 2-d indexing [0..width()-1][0..height()-1] yielding a t_grid_tile
auto operator[](size_t index) const { return grid_[index]; }
auto operator[](size_t index) { return grid_[index]; }
void clear();
size_t num_instances(t_physical_tile_type_ptr type) const;
//Returns the block types which limits the device size (may be empty if
//resource limits were not considered when selecting the device).
std::vector<t_physical_tile_type_ptr> limiting_resources() const { return limiting_resources_; }
private:
void count_instances();
std::string name_;
//Note that vtr::Matrix operator[] returns and intermediate type
//which can be used or indexing in the second dimension, allowing
//traditional 2-d indexing to be used
vtr::Matrix<t_grid_tile> grid_;
std::map<t_logical_block_type_ptr, size_t> instance_counts_;
std::vector<t_physical_tile_type_ptr> limiting_resources_;
};
#endif