| #ifndef LIBTRELLIS_BITSTREAM_H | |
| #define LIBTRELLIS_BITSTREAM_H | |
| #include <cstdint> | |
| #include <memory> | |
| #include <iostream> | |
| #include <vector> | |
| #include <string> | |
| #include <stdexcept> | |
| #include <map> | |
| #include <boost/optional.hpp> | |
| using namespace std; | |
| namespace Trellis { | |
| enum class BitstreamCommand : uint8_t { | |
| SPI_MODE = 0b01111001, | |
| JUMP = 0b01111110, | |
| LSC_RESET_CRC = 0b00111011, | |
| VERIFY_ID = 0b11100010, | |
| LSC_WRITE_COMP_DIC = 0b00000010, | |
| LSC_PROG_CNTRL0 = 0b00100010, | |
| LSC_INIT_ADDRESS = 0b01000110, | |
| LSC_PROG_INCR_CMP = 0b10111000, | |
| LSC_PROG_INCR_RTI = 0b10000010, | |
| LSC_PROG_SED_CRC = 0b10100010, | |
| ISC_PROGRAM_SECURITY = 0b11001110, | |
| ISC_PROGRAM_USERCODE = 0b11000010, | |
| LSC_EBR_ADDRESS = 0b11110110, | |
| LSC_EBR_WRITE = 0b10110010, | |
| ISC_PROGRAM_DONE = 0b01011110, | |
| DUMMY = 0b11111111, | |
| }; | |
| class Chip; | |
| // This represents a low level bitstream, as nothing more than an | |
| // array of bytes and helper functions for common tasks | |
| class Bitstream { | |
| public: | |
| // Read a Lattice .bit file (metadata + bitstream) | |
| // Note that string variants take a filename, for ease of Python binding | |
| static Bitstream read_bit(istream &in); | |
| // Python variant of the above, takes filename instead of istream | |
| static Bitstream read_bit_py(string file); | |
| // Serialise a Chip back to a bitstream | |
| static Bitstream serialise_chip(const Chip &chip, const map<string, string> options); | |
| static Bitstream generate_jump(uint32_t address); | |
| // Deserialise a bitstream to a Chip | |
| Chip deserialise_chip(boost::optional<uint32_t> idcode = boost::optional<uint32_t>()); | |
| // Write a Lattice .bit file (metadata + bitstream) | |
| void write_bit(ostream &out); | |
| // Python variant of the above, takes filename instead of ostream | |
| void write_bit_py(string file); | |
| // Write bitstream as a vector of bytes | |
| vector<uint8_t> get_bytes(); | |
| // Write a Lattice .bin file (bitstream only, for flash prog.) | |
| void write_bin(ostream &out); | |
| // Raw bitstream data | |
| vector<uint8_t> data; | |
| // Lattice BIT file metadata | |
| vector<string> metadata; | |
| private: | |
| // Private constructor | |
| Bitstream(const vector<uint8_t> &data, const vector<string> &metadata); | |
| }; | |
| // Represents an error that occurs while parsing the bitstream | |
| class BitstreamParseError : runtime_error { | |
| public: | |
| explicit BitstreamParseError(const string &desc); | |
| BitstreamParseError(const string &desc, size_t offset); | |
| const char *what() const noexcept override; | |
| private: | |
| string desc; | |
| int offset; | |
| }; | |
| } | |
| #endif //LIBTRELLIS_BITSTREAM_H |