| #ifndef LIBTRELLIS_TILE_HPP |
| #define LIBTRELLIS_TILE_HPP |
| |
| #include <string> |
| #include <iostream> |
| #include <cstdint> |
| #include <utility> |
| #include <regex> |
| #include <cassert> |
| #include "CRAM.hpp" |
| |
| namespace Trellis { |
| pair<int, int> get_row_col_pair_from_chipsize(string name, pair<int, int> chip_size, int bias); |
| |
| // Basic information about a site |
| struct SiteInfo { |
| string type; |
| int row; |
| int col; |
| // Needed for Python binding |
| bool operator==(const SiteInfo &b) const { |
| return (this->row == b.row) && (this->col == b.col) && (this->type == b.type); |
| } |
| }; |
| |
| // Basic information about a tile |
| struct TileInfo { |
| string family; |
| string device; |
| size_t max_col; |
| size_t max_row; |
| int col_bias; |
| |
| string name; |
| string type; |
| size_t num_frames; |
| size_t bits_per_frame; |
| size_t frame_offset; |
| size_t bit_offset; |
| vector<SiteInfo> sites; |
| |
| inline pair<int, int> get_row_col() const { |
| auto chip_size = make_pair(int(max_row), int(max_col)); |
| auto row_col = get_row_col_pair_from_chipsize(name, chip_size, col_bias); |
| assert(row_col <= chip_size); |
| return row_col; |
| }; |
| |
| // Get the Lattice name |
| // Tiles are identified internally as "lattice_name:type" |
| // This is because the Lattice name is NOT unique, and we need tiles to have a unique identifier |
| inline string get_lattice_name() const { |
| return name.substr(0, name.find(':')); |
| } |
| |
| |
| }; |
| |
| class Chip; |
| // Represents an actual tile |
| class Tile { |
| public: |
| Tile(TileInfo info, Chip &parent); |
| TileInfo info; |
| CRAMView cram; |
| |
| // Dump the tile textual config as a string |
| string dump_config() const; |
| // Configure the tile from a string config |
| void read_config(string config); |
| // Set by dump_config |
| mutable int known_bits = 0; |
| mutable int unknown_bits = 0; |
| }; |
| |
| } |
| |
| |
| #endif //LIBTRELLIS_TILE_HPP |