#ifndef LIBTRELLIS_BITSTREAM_H
#define LIBTRELLIS_BITSTREAM_H

#include <cstdint>
#include <memory>
#include <iostream>
#include <vector>
#include <string>
#include <stdexcept>
#include <map>
using namespace std;

namespace Trellis {
enum class BitstreamCommand : uint8_t {
    SPI_MODE = 0b01111001,
    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);

    // Deserialise a bitstream to a Chip
    Chip deserialise_chip();

    // 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
