#!/usr/bin/env python3 import argparse import filecmp import os import struct import subprocess import tempfile import sys p = argparse.ArgumentParser(usage="%(prog)s SOURCE [-- [EXTRA_FLAGS ...]]") p.add_argument('SOURCE', help='SPIR-V assembly source filename') p.add_argument('EXTRA_FLAGS', help='extra flags passed to spirv-as, e.g. --target-env spv1.0', nargs=argparse.REMAINDER) args = p.parse_args() source = args.SOURCE fd, generated = tempfile.mkstemp(prefix="spirv-to-c-array.", suffix=".spv") os.close(fd) assembler_cmd = ['spirv-as'] + args.EXTRA_FLAGS ret = subprocess.run(assembler_cmd + ['-o', generated, source]) if ret.returncode != 0: print(f'Failed to assemble {source}, see error above.') sys.exit(1) if os.path.getsize(generated) == 0: print(f'Failed to assemble {source}. Output {generated} is empty.') sys.exit(1) if (os.path.getsize(generated) % 4) != 0: print(f'Failed to assemble {source}. Output {generated} size is not multiple of 4 bytes.') sys.exit(1) ret = subprocess.run(['spirv-dis', '--raw-id', generated], capture_output=True) if ret.returncode != 0: print(ret.stderr.decode('ascii')) print(f'Something is wrong: assembled binary {generated} ') print('failed to disassemble for checking.') sys.exit(1) disassembled_source = ret.stdout generated_check = os.path.splitext(generated)[0] + '.check.spv' ret = subprocess.run(assembler_cmd + ['-o', generated_check], input=disassembled_source, capture_output=True) if ret.returncode != 0: print(ret.stderr.decode('ascii')) print(f'Something is wrong: assembled binary {generated} ') print('failed to reassemble for checking.') sys.exit(1) if not filecmp.cmp(generated, generated_check, shallow=False): print('Something is wrong: assembled binary generated ') print('does not match after round trip of using disassembler ') print('and assembler again. See files:') print() print(f' {generated}') print(f' {generated_check}') print() print(f'Extra arguments for spirv-as {" ".join(args.EXTRA_FLAGS)}') sys.exit(1) with open(source, 'r') as f: source_lines = f.readlines() words = [] with open(generated, 'rb') as f: while True: w = f.read(4) if not w: break v = struct.unpack('