#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
