Fix Bitstream writing/reading based on new information re: compression. Signed-off-by: William D. Jones <thor0505@comcast.net>
diff --git a/libtrellis/src/Bitstream.cpp b/libtrellis/src/Bitstream.cpp index fb0aa38..1a35e94 100644 --- a/libtrellis/src/Bitstream.cpp +++ b/libtrellis/src/Bitstream.cpp
@@ -39,8 +39,6 @@ BitstreamOptions(const Chip &chip) { if (chip.info.family == "MachXO2") { // Write frames out in order 0 => max or reverse (max => 0). - // This apparently does NOT apply to compressed bitstreams, which - // uses reversed_frames = true unconditionally. reversed_frames = false; dummy_bytes_after_preamble = 2; crc_meta = 0xE0; // CRC check (0x80), once at end (0x40), dummy bits @@ -600,9 +598,7 @@ bytes_per_frame += (7 - ((bytes_per_frame - 1) % 8)); unique_ptr<uint8_t[]> frame_bytes = make_unique<uint8_t[]>(bytes_per_frame); for (size_t i = 0; i < frame_count; i++) { - // Apparently when a bitstream is compressed, even on - // MachXO2, frames are written in reverse order! - const size_t idx = (chip->info.num_frames - 1) - i; + size_t idx = ops.reversed_frames ? (chip->info.num_frames - 1) - i : i; if (cmd == BitstreamCommand::LSC_PROG_INCR_CMP) rd.get_compressed_bytes(frame_bytes.get(), bytes_per_frame, compression_dict.get()); else @@ -798,6 +794,7 @@ size_t bytes_per_frame = (chip.info.bits_per_frame + chip.info.pad_bits_after_frame + chip.info.pad_bits_before_frame) / 8U; for (size_t i = 0; i < frames; i++) { + const size_t idx = ops.reversed_frames? (chip.info.num_frames - 1) - i : i; frames_data.emplace_back(); auto &frame_bytes = frames_data.back(); frame_bytes.resize(bytes_per_frame); @@ -805,7 +802,7 @@ size_t ofs = j + chip.info.pad_bits_after_frame; assert(((bytes_per_frame - 1) - (ofs / 8)) < bytes_per_frame); frame_bytes[(bytes_per_frame - 1) - (ofs / 8)] |= - (chip.cram.bit((chip.info.num_frames - 1) - i, j) & 0x01) << (ofs % 8); + (chip.cram.bit(idx, j) & 0x01) << (ofs % 8); } } // Then compress and write