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;