libtrellis: Add Jump command and generate_jump Bitstream function

Needed for Golden image support.

Signed-off-by: Jens Andersen <jens.andersen@gmail.com>
diff --git a/libtrellis/include/Bitstream.hpp b/libtrellis/include/Bitstream.hpp
index ab20abd..72c475b 100644
--- a/libtrellis/include/Bitstream.hpp
+++ b/libtrellis/include/Bitstream.hpp
@@ -15,6 +15,7 @@
 namespace Trellis {
 enum class BitstreamCommand : uint8_t {
     SPI_MODE = 0b01111001,
+    JUMP = 0b01111110,
     LSC_RESET_CRC = 0b00111011,
     VERIFY_ID = 0b11100010,
     LSC_WRITE_COMP_DIC = 0b00000010,
@@ -47,6 +48,7 @@
 
     // 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>());
diff --git a/libtrellis/src/Bitstream.cpp b/libtrellis/src/Bitstream.cpp
index 6bcf450..b0a4275 100644
--- a/libtrellis/src/Bitstream.cpp
+++ b/libtrellis/src/Bitstream.cpp
@@ -382,6 +382,11 @@
 
                 BITSTREAM_NOTE("SPI Mode " <<  spimode->first);
             }
+            case BitstreamCommand::JUMP:
+                rd.skip_bytes(3);
+                BITSTREAM_DEBUG("Jump command");
+                /* TODO: Parse address and SPI Flash read speed */
+                rd.skip_bytes(4);
                 break;
             case BitstreamCommand::DUMMY:
                 break;
@@ -396,6 +401,36 @@
     }
 }
 
+Bitstream Bitstream::generate_jump(uint32_t address) {
+    BitstreamReadWriter wr;
+
+    // Dummy bytes
+    wr.insert_dummy(16);
+    // Preamble
+    wr.write_bytes(preamble.begin(), preamble.size());
+
+    // Padding
+    wr.insert_dummy(4);
+
+    // Dummy control register
+    wr.write_byte(uint8_t(BitstreamCommand::LSC_PROG_CNTRL0));
+    wr.insert_zeros(3);
+    wr.insert_zeros(4);
+
+    // Jump command
+    wr.write_byte(uint8_t(BitstreamCommand::JUMP));
+    wr.insert_zeros(3);
+    wr.write_byte(0x03); // TODO: Allow specifying SPI Flash read speed
+
+    wr.write_byte(uint8_t((address >> 16UL) & 0xFF));
+    wr.write_byte(uint8_t((address >> 8UL) & 0xFF));
+    wr.write_byte(uint8_t(address & 0xFF));
+
+    wr.insert_dummy(18);
+
+    return Bitstream(wr.get(), std::vector<string>());
+}
+
 Bitstream Bitstream::serialise_chip(const Chip &chip, const map<string, string> options) {
     BitstreamReadWriter wr;
     // Preamble