namespace compression

// namespaces

namespace xf::compression::details

// typedefs

typedef ap_uint <48> bitBufferType
typedef ap_uint <12> Histogram
typedef ap_uint <MAX_FREQ_DWIDTH> Frequency
typedef struct xf::compression::lz4BlockInfo dt_lz4BlockInfo
typedef ap_uint <32> compressd_dt
typedef ap_uint <kGMemDWidth> uintMemWidth_t
typedef struct xf::compression::BlockInfo dt_blockInfo

// enums

enum eHuffmanType

// structs

struct BlockInfo
struct Codeword

template <int MAX_FREQ_DWIDTH>
struct Symbol

struct lz4BlockInfo

// global variables

static const uint8_t c_tgnSymbolBits
static const uint8_t c_tgnBitlengthBits
static const uint8_t c_lengthHistogram
static const uint16_t c_tgnSymbolSize
static const uint16_t c_tgnTreeDepth
static const uint16_t c_tgnMaxBits
const auto BSIZE_STD_64KB
const auto BSIZE_STD_256KB
const auto BSIZE_STD_1024KB
const auto BSIZE_STD_4096KB
const auto MAX_BSIZE_64KB
const auto MAX_BSIZE_256KB
const auto MAX_BSIZE_1024KB
const auto MAX_BSIZE_4096KB
const auto MAGIC_HEADER_SIZE
const auto MAGIC_BYTE_1
const auto MAGIC_BYTE_2
const auto MAGIC_BYTE_3
const auto MAGIC_BYTE_4
const auto FLG_BYTE
const auto NO_COMPRESS_BIT
const auto BSIZE_NCOMP_64
const auto BSIZE_NCOMP_256
const auto BSIZE_NCOMP_1024
const auto BSIZE_NCOMP_4096
const int kGMemDWidth
const int c_lTreeSize
const int c_dTreeSize
const int c_bLTreeSize
const int c_maxCodeSize

Global Variables

const auto BSIZE_STD_64KB

Below are the codes as per LZ4 standard for various maximum block sizes supported.

const auto MAX_BSIZE_64KB

Maximum block sizes supported by LZ4

const auto NO_COMPRESS_BIT

This value is used to set uncompressed block size value. 4th byte is always set to below and placed as uncompressed byte

const auto BSIZE_NCOMP_64

In case of uncompressed block Values below are used to set 3rd byte to following values w.r.t various maximum block sizes supported by standard

blockPacker

#include "block_packer.hpp"
template <int DATAWIDTH = 512>
void blockPacker (
    hls::stream <ap_uint <DATAWIDTH>>& inStream,
    hls::stream <uint32_t>& inStreamSize,
    hls::stream <ap_uint <DATAWIDTH>>& outStream,
    hls::stream <bool>& outStreamEos,
    hls::stream <uint32_t>& outCompressedSize
    )

Compression Packer module packs the compressed data.

Parameters:

DATAWIDTH input data width
inStream input data
outStream output data
inStreamSize size of the data in input stream
outStreamEos output end of stream
outCompressedSize total compressed packed data size

huffmanDecoder

#include "huffman_decoder.hpp"
template <eHuffmanType DECODER = FULL>
void huffmanDecoder (
    hls::stream <ap_uint <16>>& inStream,
    hls::stream <bool>& inEos,
    hls::stream <ap_uint <17>>& outStream
    )

This module is ZLIB/GZIP Fixed, Dynamic and Stored block supported decoder. It takes ZLIB/GZIP Huffman encoded data as input and generates decoded data in LZ77 format (Literal, Length, Offset).

Parameters:

DECODER Fixed, Full, Dynamic huffman block support
ByteGenLoopII core bytegenerator loop initiation interval
USE_GZIP switch that controls GZIP/ZLIB header processing
inStream input bit packed data
outStream output lz77 compressed output in the form of 32bit packets (Literals, Match Length, Distances)
input_size input data size

huffmanEncoderStream

huffmanEncoderStream overload (1)

#include "huffman_encoder.hpp"
void huffmanEncoderStream (
    hls::stream <ap_uint <32>>& inStream,
    hls::stream <uint16_t>& outStream,
    hls::stream <uint8_t>& outStreamSize,
    hls::stream <uint32_t>& inputSize,
    hls::stream <uint16_t>& inStreamCodes,
    hls::stream <uint8_t>& inStreamCodeSize
    )

This module does zlib/gzip dynamic huffman encoding.

Parameters:

inStream input packet of 32bit size which contains either literal or match length and distance information. Example: [Literal (1 Byte) | ML (1 Byte) | DIST (2 Bytes)]
outStream output bit encoded LZ77 compressed data
outStreamSize output Stream Size
inputSize input size stream
inStreamCodes Huffman Codes
inStreamCodeSize HuffmanCode Lengths

huffmanEncoderStream overload (2)

#include "huffman_encoder.hpp"
void huffmanEncoderStream (
    hls::stream <IntVectorStream_dt <32, 1>>& inStream,
    hls::stream <DSVectorStream_dt <HuffmanCode_dt <c_maxBits>, 1>>& hufCodeInStream,
    hls::stream <DSVectorStream_dt <HuffmanCode_dt <c_maxBits>, 1>>& hufCodeOutStream
    )

This module does zlib/gzip dynamic huffman encoding.

Parameters:

inStream input packet of 32bit size which contains either literal or match length and distance information. Example: [Literal (1 Byte) | ML (1 Byte) | DIST (2 Bytes)]
outStream output bit encoded LZ77 compressed data
hufCodeInStream Huffman Codes input
hufCodeOutStream HuffmanCodes output

huffmanEncoder

#include "huffman_encoder.hpp"
void huffmanEncoder (
    hls::stream <ap_uint <32>>& inStream,
    hls::stream <uint16_t>& outStream,
    hls::stream <uint8_t>& outStreamSize,
    uint32_t input_size,
    hls::stream <uint16_t>& inStreamCodes,
    hls::stream <uint8_t>& inStreamCodeSize
    )

This module does zlib/gzip dynamic huffman encoding.

Parameters:

inStream input packet of 32bit size which contains either literal or match length and distance information. Example: [Literal (1 Byte) | ML (1 Byte) | DIST (2 Bytes)]
outStream output bit encoded LZ77 compressed data
outStreamSize output Stream Size
input_size uncompressed data input size
inStreamCodes Huffman Codes
inStreamCodeSize HuffmanCode Lengths

lz4Compress

#include "lz4_compress.hpp"
template <
    int MAX_LIT_COUNT,
    int PARALLEL_UNITS
    >
static void lz4Compress (
    hls::stream <ap_uint <32>>& inStream,
    hls::stream <ap_uint <8>>& outStream,
    uint32_t max_lit_limit [PARALLEL_UNITS],
    uint32_t input_size,
    hls::stream <bool>& endOfStream,
    hls::stream <uint32_t>& compressdSizeStream,
    uint32_t index
    )

This is the core compression module which seperates the input stream into two output streams, one literal stream and other offset stream, then lz4 encoding is done.

Parameters:

inStream Input data stream
outStream Output data stream
max_lit_limit Size for compressed stream
input_size Size of input data
endOfStream Stream indicating that all data is processed or not
compressdSizeStream Gives the compressed size for each 64K block

lz4Decompress

#include "lz4_decompress.hpp"
void lz4Decompress (
    hls::stream <ap_uint <8>>& inStream,
    hls::stream <ap_uint <32>>& outStream,
    uint32_t input_size
    )

This module reads the compressed data from input stream and decodes the offset, match length and literals by processing in various decompress states.

Parameters:

inStream Input stream 8bit
outStream Output stream 32bit
input_size Input size

lzDecompress

#include "lz_decompress.hpp"
template <
    int HISTORY_SIZE,
    int LOW_OFFSET = 8
    >
void lzDecompress (
    hls::stream <ap_uint <32>>& inStream,
    hls::stream <ap_uint <8>>& outStream,
    uint32_t original_size
    )

This module writes the literals to the output stream as it is and when match length and offset are read, the literals will be read from the local dictionary based on offset until match length.

Parameters:

LOW_OFFSET low offset
HISTORY_SIZE history size
inStream input stream
outStream output stream
original_size original size

lzMultiByteDecompress

#include "lz_decompress.hpp"
template <
    int PARALLEL_BYTES,
    int HISTORY_SIZE,
    class SIZE_DT = uint8_t,
    class SIZE_OFFSET = ap_uint<16>
    >
void lzMultiByteDecompress (
    hls::stream <SIZE_DT>& litlenStream,
    hls::stream <ap_uint <PARALLEL_BYTES*8>>& litStream,
    hls::stream <SIZE_OFFSET>& offsetStream,
    hls::stream <SIZE_DT>& matchlenStream,
    hls::stream <ap_uint < (PARALLEL_BYTES*8)+PARALLEL_BYTES>>& outStream
    )

This module writes the literals to the output stream as it is and when match length and offset are read, the literals will be read from the local dictionary based on offset until match length. This module can process data in parallel defined by PARALLEL_BYTES template argument.

Parameters:

PARALLEL_BYTES number of bytes processed in parallel (4, 8)
HISTORY_SIZE history size
SIZE_DT input data type
SIZE_OFFSET offset data type
litlenStream literal length stream
litStream literals only stream
offsetStream offset only stream
matchlenStream match length only stream
outStream output stream
endOfStream end of stream
sizeOutStream output size stream

lzBestMatchFilter

#include "lz_optional.hpp"
template <
    int MATCH_LEN,
    int OFFSET_WINDOW
    >
void lzBestMatchFilter (
    hls::stream <compressd_dt>& inStream,
    hls::stream <compressd_dt>& outStream,
    uint32_t input_size
    )

Objective of this module is to pick character with higher match length in the offset window range.

Parameters:

inStream input stream
outStream output stream
input_size input stream size

lzBooster

lzBooster overload (1)

#include "lz_optional.hpp"
template <
    int MAX_MATCH_LEN,
    int BOOSTER_OFFSET_WINDOW = 16 * 1024,
    int LEFT_BYTES = 64
    >
void lzBooster (
    hls::stream <compressd_dt>& inStream,
    hls::stream <compressd_dt>& outStream,
    hls::stream <uint32_t>& inSize
    )

This module helps in improving the compression ratio. Finds a better match length by performing more character matches with supported max match, while maintaining an offset window. Booster offset Window template argument (default value is 16K) internally consume BRAM memory to implement history window. Higher the booster value can give better compression ratio but will consume more BRAM resources.

Parameters:

MAX_MATCH_LEN maximum length allowed for character match
BOOSTER_OFFSET_WINDOW offset window to store/match the character
inStream input stream 32bit per read
outStream output stream 32bit per write
inSize input size stream
outSize output size stream
left_bytes last 64 left over bytes

lzBooster overload (2)

#include "lz_optional.hpp"
template <
    int MAX_MATCH_LEN,
    int BOOSTER_OFFSET_WINDOW = 16 * 1024,
    int LEFT_BYTES = 64
    >
void lzBooster (
    hls::stream <IntVectorStream_dt <32, 1>>& inStream,
    hls::stream <IntVectorStream_dt <32, 1>>& outStream
    )

This module helps in improving the compression ratio. Finds a better match length by performing more character matches with supported max match, while maintaining an offset window. Booster offset Window template argument (default value is 16K) internally consume BRAM memory to implement history window. Higher the booster value can give better compression ratio but will consume more BRAM resources.

Parameters:

MAX_MATCH_LEN maximum length allowed for character match
BOOSTER_OFFSET_WINDOW offset window to store/match the character
LEFT_BYTES last 64 left over bytes
inStream input stream 32bit per read
outStream output stream 32bit per write

lzBooster overload (3)

#include "lz_optional.hpp"
template <
    int MAX_MATCH_LEN,
    int BOOSTER_OFFSET_WINDOW = 16 * 1024,
    int LEFT_BYTES = 64
    >
void lzBooster (
    hls::stream <compressd_dt>& inStream,
    hls::stream <compressd_dt>& outStream,
    uint32_t input_size
    )

This module helps in improving the compression ratio. Finds a better match length by performing more character matches with supported max match, while maintaining an offset window. Booster offset Window template argument (default value is 16K) internally consume BRAM memory to implement history window. Higher the booster value can give better compression ratio but will consume more BRAM resources.

Parameters:

MAX_MATCH_LEN maximum length allowed for character match
BOOSTER_OFFSET_WINDOW offset window to store/match the character
inStream input stream 32bit per read
outStream output stream 32bit per write
input_size input size
left_bytes last 64 left over bytes

lzFilter

#include "lz_optional.hpp"
template <int LEFT_BYTES = 64>
static void lzFilter (
    hls::stream <compressd_dt>& inStream,
    hls::stream <compressd_dt>& outStream,
    uint32_t input_size
    )

This module checks if match length exists, and if match length exists it filters the match length -1 characters writing to output stream.

Parameters:

MATCH_LEN length of matched segment
OFFSET_WINDOW output window
inStream input stream
outStream output stream
input_size input stream size
left_bytes bytes left in block

snappyCompress

#include "snappy_compress.hpp"
template <
    int MAX_LIT_COUNT,
    int MAX_LIT_STREAM_SIZE,
    int PARALLEL_UNITS
    >
static void snappyCompress (
    hls::stream <ap_uint <32>>& inStream,
    hls::stream <ap_uint <8>>& outStream,
    uint32_t max_lit_limit [PARALLEL_UNITS],
    uint32_t input_size,
    hls::stream <bool>& endOfStream,
    hls::stream <uint32_t>& compressdSizeStream,
    uint32_t index
    )

This is the core compression module which seperates the input stream into two output streams, one literal stream and other offset stream, then encoding is done based on the snappy algorithm.

Parameters:

inStream Input data stream
outStream Output data stream
max_lit_limit Size for compressed stream
input_size Size of input data
endOfStream Stream indicating that all data is processed or not
compressdSizeStream Gives the compressed size for each 64K block

snappyDecompress

#include "snappy_decompress.hpp"
static void snappyDecompress (
    hls::stream <ap_uint <8>>& inStream,
    hls::stream <ap_uint <32>>& outStream,
    uint32_t input_size
    )

This module decodes the compressed data based on the snappy decompression format.

Parameters:

inStream input stream
outStream output stream
input_size input data size

zstdCompressCore

#include "zstd_compress.hpp"
template <
    int BLOCK_SIZE,
    int LZWINDOW_SIZE,
    int PARALLEL_HUFFMAN = 8,
    int PARALLEL_LIT_STREAMS = 4,
    int MIN_MATCH = 3
    >
void zstdCompressCore (
    hls::stream <IntVectorStream_dt <8, 1>>& inStream,
    hls::stream <IntVectorStream_dt <8, 4>>& outStream
    )

This module compresses the input file read from input stream. It produces the ZSTD compressed data at the output stream.

Parameters:

BLOCK_SIZE ZStd block size
WINDOW_SIZE LZ77 history size or Window size
PARALLEL_HUFFMAN Number of Huffman encoding units used
inStream input stream
outStream output stream

zstdCompressStreaming

#include "zstd_compress.hpp"
template <
    int IN_DWIDTH,
    int OUT_DWIDTH,
    int BLOCK_SIZE,
    int LZWINDOW_SIZE,
    int MIN_BLCK_SIZE = 1024
    >
void zstdCompressStreaming (
    hls::stream <ap_axiu <IN_DWIDTH, 0, 0, 0>>& inStream,
    hls::stream <ap_axiu <OUT_DWIDTH, 0, 0, 0>>& outStream
    )

This module is top level wrapper for zstd compression core module It compresses the input file read from input axi stream. It produces the ZSTD compressed data at the output axi stream.

Parameters:

IN_DWIDTH Input stream data bit-width
OUT_DWIDTH Output stream data bit-width
BLOCK_SIZE ZStd block size
LZWINDOW_SIZE LZ77 history size or Window size
MIN_BLCK_SIZE Minimum block size, less than that will be considered stored block
inStream input stream
outStream output stream

zstdDecompressStream

#include "zstd_decompress.hpp"
template <
    int PARALLEL_BYTE,
    int BLOCK_SIZE_KB,
    int LZ_MAX_OFFSET,
    int LMO_WIDTH
    >
void zstdDecompressStream (
    hls::stream <ap_uint <8*PARALLEL_BYTE>>& inStream,
    hls::stream <ap_uint <4>>& inStrobe,
    hls::stream <ap_uint < (8*PARALLEL_BYTE)+PARALLEL_BYTE>>& outStream
    )

This module decompresses the ZStd compressed file read from input stream. It reads the input stream till valid strobe input is provided. It produces the decompressed data at the output stream.

Parameters:

PARALLEL_BYTE Data stream width in bytes
BLOCK_SIZE_KB ZStd block size
LZ_MAX_OFFSET LZ history size or Window size
LMO_WIDTH data width for offset data
inStream input stream
inStrobe valid input strobe stream
outStream output stream

zstdDecompressCore

#include "zstd_decompress.hpp"
template <
    int PARALLEL_BYTE,
    int BLOCK_SIZE_KB,
    int LZ_MAX_OFFSET,
    int LMO_WIDTH = 15
    >
void zstdDecompressCore (
    hls::stream <ap_axiu <8*PARALLEL_BYTE, 0, 0, 0>>& inStream,
    hls::stream <ap_axiu <8*PARALLEL_BYTE, 0, 0, 0>>& outStream
    )

This module decompresses the ZStd compressed file read from input stream. It reads the input stream till the given input size. It produces the decompressed data at the output stream.

Parameters:

PARALLEL_BYTE Data stream width in bytes
BLOCK_SIZE_KB ZStd block size
LZ_MAX_OFFSET LZ history size or Window size
LMO_WIDTH data width for offset data
inStream input stream
outStream output stream
outSizeStream output data size
inputSize size of input data