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