libtrellis: Allow overriding idcode on deserialise Signed-off-by: Jens Andersen <jens.andersen@gmail.com>
diff --git a/libtrellis/include/Bitstream.hpp b/libtrellis/include/Bitstream.hpp index 08b2d82..ab20abd 100644 --- a/libtrellis/include/Bitstream.hpp +++ b/libtrellis/include/Bitstream.hpp
@@ -8,6 +8,8 @@ #include <string> #include <stdexcept> #include <map> +#include <boost/optional.hpp> + using namespace std; namespace Trellis { @@ -47,7 +49,7 @@ static Bitstream serialise_chip(const Chip &chip, const map<string, string> options); // Deserialise a bitstream to a Chip - Chip deserialise_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);
diff --git a/libtrellis/src/Bitstream.cpp b/libtrellis/src/Bitstream.cpp index d87186a..0bc5bcf 100644 --- a/libtrellis/src/Bitstream.cpp +++ b/libtrellis/src/Bitstream.cpp
@@ -234,7 +234,7 @@ static const vector<uint8_t> preamble = {0xFF, 0xFF, 0xBD, 0xB3}; -Chip Bitstream::deserialise_chip() { +Chip Bitstream::deserialise_chip(boost::optional<uint32_t> idcode) { cerr << "bitstream size: " << data.size() * 8 << " bits" << endl; BitstreamReadWriter rd(data); boost::optional<Chip> chip; @@ -256,6 +256,11 @@ case BitstreamCommand::VERIFY_ID: { rd.skip_bytes(3); uint32_t id = rd.get_uint32(); + if (idcode) { + BITSTREAM_NOTE("Overriding device ID from 0x" << hex << setw(8) << setfill('0') << id << " to 0x" << *idcode); + id = *idcode; + } + BITSTREAM_NOTE("device ID: 0x" << hex << setw(8) << setfill('0') << id); chip = boost::make_optional(Chip(id)); chip->metadata = metadata;