|  |  | 
|  | 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. | 
|  |  |