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