# lib9p_util/nut_gen/__init__.py - Generate NUT file headers # # Copyright (C) 2025 Luke T. Shumaker # SPDX-License-Identifier: AGPL-3.0-or-later import sys import typing from . import app, nut # pylint: disable=unused-variable __all__ = ["main"] def main() -> None: outfile = sys.argv[1] with open(outfile, "w", encoding="utf-8") as fh: fh.write( f"/* {outfile} - Generated by `{' '.join(sys.argv)}`. DO NOT EDIT! */\n" ) fh.write("\n") fh.write(f"#define NUT_FB_W {app.fb_w}\n") fh.write(f"#define NUT_FB_H {app.fb_h}\n") fh.write("\n") buf = bytearray() app.append_intro(buf) fh.write(f"#define NUT_FILE_INTRO_LEN {len(buf)}\n") fh.write("#define NUT_FILE_INTRO ") for i, b in enumerate(buf): if i > 0: fh.write(", ") if i % 8 == 0: fh.write("\\\n\t") fh.write(f"0x{b:02x}") fh.write("\n") fh.write("\n") state = app.State() buf0 = bytearray() state.append_frame_intro(buf0, 0) buf1 = bytearray() state.append_frame_intro(buf1, (1 << 64) - 1) assert len(buf0) == len(buf1) fh.write(f"#define NUT_FRAME_INTRO_LEN {len(buf0)}\n") fh.write("#define NUT_FRAME_INTRO(prev_len, time_ns) ") runs = [ (10, "NUT_VU10(time_ns)"), (2, "NUT_VU2((prev_len)/16)"), (4, "NUT_CHECKSUM"), (10, "NUT_VU10(time_ns)"), (4, "NUT_CHECKSUM"), ] run_idx = 0 run_var = "" run_len = 0 csum_beg = len(nut.StartCode.syncpoint.value) + 1 extra: dict[str, typing.Any] = {} for i, b0 in enumerate(buf0): b1 = buf1[i] if run_len > 0: assert b0 != b1 run_len -= 1 continue if i > 0: fh.write(", ") if i % 8 == 0: fh.write("\\\n\t") if b0 == b1: fh.write(f"0x{b0:02x}") else: run_len, run_expr = runs[run_idx] if run_expr == "NUT_CHECKSUM": n = len(extra) // 2 extra[f"NUT_FRAME_INTRO_CSUM{n}_BEG"] = csum_beg extra[f"NUT_FRAME_INTRO_CSUM{n}_END"] = i csum_beg = i + 4 pseudo_expr = "" for j in range(run_len): if j > 0: pseudo_expr += ", " if (i + j) % 8 == 0: pseudo_expr += "\\\n\t" pseudo_expr += "0x__" if len(run_expr) + 4 < len(pseudo_expr): run_expr += "/*" + pseudo_expr[len(run_expr) + 2 : -2] + "*/" fh.write(run_expr) run_idx += 1 run_len -= 1 fh.write("\n") for k, v in extra.items(): fh.write(f"#define {k} {v}\n") fh.write("\n") fh.write("#define NUT_CRC32_TABLE ") for i, v in enumerate(nut.crc32_table(4)): if i > 0: fh.write(", ") if i % 4 == 0: fh.write("\\\n\t") fh.write(f"0x{v:08x}") fh.write("\n")