| #ifndef LIBTRELLIS_TILECONFIG_HPP |
| #define LIBTRELLIS_TILECONFIG_HPP |
| |
| #include <string> |
| #include <cstdint> |
| #include <vector> |
| #include <map> |
| #include <iostream> |
| |
| using namespace std; |
| |
| namespace Trellis { |
| // This represents configuration at FASM level, in terms of routing arcs and non-routing configuration settings - |
| // either words or enums. |
| |
| // A connection in a tile |
| struct ConfigArc { |
| string sink; |
| string source; |
| inline bool operator==(const ConfigArc &other) const { |
| return other.source == source && other.sink == sink; |
| } |
| }; |
| |
| ostream &operator<<(ostream &out, const ConfigArc &arc); |
| |
| istream &operator>>(istream &in, ConfigArc &arc); |
| |
| // A configuration setting in a tile that takes one or more bits (such as LUT init) |
| struct ConfigWord { |
| string name; |
| vector<bool> value; |
| inline bool operator==(const ConfigWord &other) const { |
| return other.name == name && other.value == value; |
| } |
| }; |
| |
| ostream &operator<<(ostream &out, const ConfigWord &cw); |
| |
| istream &operator>>(istream &in, ConfigWord &cw); |
| |
| // A configuration setting in a tile that takes an enumeration value (such as IO type) |
| struct ConfigEnum { |
| string name; |
| string value; |
| inline bool operator==(const ConfigEnum &other) const { |
| return other.name == name && other.value == value; |
| } |
| }; |
| |
| ostream &operator<<(ostream &out, const ConfigEnum &ce); |
| |
| istream &operator>>(istream &in, ConfigEnum &ce); |
| |
| // An unknown bit, specified by position only |
| struct ConfigUnknown { |
| int frame, bit; |
| inline bool operator==(const ConfigUnknown &other) const { |
| return other.frame == frame && other.bit == bit; |
| } |
| }; |
| |
| ostream &operator<<(ostream &out, const ConfigUnknown &tc); |
| |
| istream &operator>>(istream &in, ConfigUnknown &ce); |
| |
| struct TileConfig { |
| vector<ConfigArc> carcs; |
| vector<ConfigWord> cwords; |
| vector<ConfigEnum> cenums; |
| vector<ConfigUnknown> cunknowns; |
| int total_known_bits = 0; |
| |
| void add_arc(const string &sink, const string &source); |
| void add_word(const string &name, const vector<bool> &value); |
| void add_enum(const string &name, const string &value); |
| void add_unknown(int frame, int bit); |
| |
| string to_string() const; |
| static TileConfig from_string(const string &str); |
| |
| bool empty() const; |
| }; |
| |
| ostream &operator<<(ostream &out, const TileConfig &tc); |
| |
| istream &operator>>(istream &in, TileConfig &ce); |
| |
| } |
| |
| #endif //LIBTRELLIS_TILECONFIG_HPP |