A simple compression algorithm for iCE40 bit-streams ==================================================== This directory contains tools for compressing and uncompressing iCE40 bit-streams. The motivation is to reduce the bandwidth requirements for bit-stream upload. Note that iCE40 FPGAs can not uncompress this compressed bit-streams! Uncompression must be performed by e.g. a uC on the FPGA board. This compression algorithm uses the fact that most bits in an iCE40 bit-stream are cleared. The bit-stream is encoded as the distances between set bits (i.e. the length of runs of ZERO bits between two ONE bits). This sequence of integers is stored using a simple prefix code to spend fewer bits on smaller (more frequent) numbers. The algorithm includes an escape-mechanism to mix uncompressed binary data with compressed bit-streams. This is useful when the bit-stream contains sections that do not compress well with this algorithm, for example in BRAM initialization data. The compressed bitstream starts with the ASCII string "ICECOMPR", i.e. the hex values 0x49434543 and 0x4f4d5052 (stored as big-endian numbers). After the 8 bytes magic the compressed bitstream is a stream of the following opcodes that must be interpreted by the decompressor. The notation ZERO and ONE is used for zero and one bits. The notation foo[N] is used for an N bit value "foo", transmitted MSB first. ONE count[2] ZERO ONE count[5] ZERO ZERO ONE count[8] ZERO ZERO ZERO ZERO ONE count[23] output count ZERO bits followed by a single ONE bit ZERO ZERO ZERO ONE count[6] data[count] output the count data bits followed by a single ONE bit ZERO ZERO ZERO ZERO ZERO count[23] output count ZERO bits and stop decompressing. (end of file) The program "icecompr" (C++11, ISC license) contains an implementation of a compressor and a decompressor. The decompressor in this program however is only used for integrity checking the compressed bit-stream. The program "iceuncompr" (plain C, public domain) contains an implementation of a stand-alone decompressor. Simply copy&paste this implementation into your uC firmware.