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;