blob: 4c5059f39803c401515c313f9b93be99e1b7326c [file] [log] [blame]
#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