65 lines
2.3 KiB
Python
65 lines
2.3 KiB
Python
#!/usr/bin/env python
|
|
|
|
# Gererate a C function that contains a pre-calculated static table where each
|
|
# 8bit offset into that table encodes the required additional space for what is
|
|
# described.
|
|
|
|
# The 2 bit patters are:
|
|
# 00 -> 0 additional sm_bitvec_t (ZEROS)
|
|
# 11 -> 0 additional sm_bitvec_t (ONES)
|
|
# 10 -> 1 additional sm_bitvec_t (MIXED)
|
|
# 01 -> 0 additional sm_bitvec_t (NONE)
|
|
|
|
# The goal is to output this:
|
|
|
|
# /**
|
|
# * Calculates the number of sm_bitvec_ts required by a single byte with flags
|
|
# * (in m_data[0]).
|
|
# */
|
|
# static size_t
|
|
# __sm_chunk_calc_vector_size(uint8_t b)
|
|
# {
|
|
# // clang-format off
|
|
# static int lookup[] = {
|
|
# 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 2, 1, 0, 0, 1, 0,
|
|
# 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 2, 1, 0, 0, 1, 0,
|
|
# 1, 1, 2, 1, 1, 1, 2, 1, 2, 2, 3, 2, 1, 1, 2, 1,
|
|
# 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 2, 1, 0, 0, 1, 0,
|
|
# 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 2, 1, 0, 0, 1, 0,
|
|
# 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 2, 1, 0, 0, 1, 0,
|
|
# 1, 1, 2, 1, 1, 1, 2, 1, 2, 2, 3, 2, 1, 1, 2, 1,
|
|
# 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 2, 1, 0, 0, 1, 0,
|
|
# 1, 1, 2, 1, 1, 1, 2, 1, 2, 2, 3, 2, 1, 1, 2, 1,
|
|
# 1, 1, 2, 1, 1, 1, 2, 1, 2, 2, 3, 2, 1, 1, 2, 1,
|
|
# 2, 2, 3, 2, 2, 2, 3, 2, 3, 3, 4, 3, 2, 2, 3, 2,
|
|
# 1, 1, 2, 1, 1, 1, 2, 1, 2, 2, 3, 2, 1, 1, 2, 1,
|
|
# 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 2, 1, 0, 0, 1, 0,
|
|
# 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 2, 1, 0, 0, 1, 0,
|
|
# 1, 1, 2, 1, 1, 1, 2, 1, 2, 2, 3, 2, 1, 1, 2, 1,
|
|
# 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 2, 1, 0, 0, 1, 0
|
|
# };
|
|
# // clang-format on
|
|
# return (size_t)lookup[b];
|
|
# }
|
|
|
|
def create_lookup_table_c_format():
|
|
"""Creates a lookup table in C-style format."""
|
|
lookup_table = []
|
|
for byte in range(256):
|
|
count = 0
|
|
for i in range(3):
|
|
if (byte >> (i * 2)) & 3 == 2:
|
|
count += 1
|
|
lookup_table.append(count)
|
|
|
|
# Format the output as a C array
|
|
output = "static int lookup[] = {\n"
|
|
for i in range(0, 256, 16):
|
|
line = " " + ", ".join(str(x) for x in lookup_table[i:i+16]) + ",\n"
|
|
output += line
|
|
output += "};"
|
|
|
|
print(output)
|
|
|
|
if __name__ == "__main__":
|
|
create_lookup_table_c_format()
|