1COPYRIGHT = """\ 2/* 3 * Copyright (C) 2017 Intel Corporation 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the "Software"), 7 * to deal in the Software without restriction, including without limitation 8 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9 * and/or sell copies of the Software, and to permit persons to whom the 10 * Software is furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice (including the next 13 * paragraph) shall be included in all copies or substantial portions of the 14 * Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22 * DEALINGS IN THE SOFTWARE. 23 */ 24""" 25 26import argparse 27import json 28from sys import stdout 29from mako.template import Template 30 31def collect_data(spirv, kind): 32 for x in spirv["operand_kinds"]: 33 if x["kind"] == kind: 34 operands = x 35 break 36 37 # There are some duplicate values in some of the tables (thanks guys!), so 38 # filter them out. 39 last_value = -1 40 values = [] 41 for x in operands["enumerants"]: 42 if x["value"] != last_value: 43 last_value = x["value"] 44 values.append(x["enumerant"]) 45 46 return (kind, values) 47 48def collect_opcodes(spirv): 49 values = [] 50 for x in spirv["instructions"]: 51 name = x["opname"] 52 assert name.startswith("Op") 53 values.append(name[2:]) 54 55 return ("Op", values) 56 57def parse_args(): 58 p = argparse.ArgumentParser() 59 p.add_argument("json") 60 p.add_argument("out") 61 return p.parse_args() 62 63TEMPLATE = Template("""\ 64/* DO NOT EDIT - This file is generated automatically by spirv_info_c.py script */ 65 66""" + COPYRIGHT + """\ 67#include "spirv_info.h" 68% for kind,values in info: 69 70const char * 71spirv_${kind.lower()}_to_string(Spv${kind} v) 72{ 73 switch (v) { 74 % for name in values: 75 case Spv${kind}${name}: return "Spv${kind}${name}"; 76 % endfor 77 case Spv${kind}Max: break; /* silence warnings about unhandled enums. */ 78 } 79 80 return "unknown"; 81} 82% endfor 83""") 84 85if __name__ == "__main__": 86 pargs = parse_args() 87 88 spirv_info = json.JSONDecoder().decode(open(pargs.json, "r").read()) 89 90 info = [ 91 collect_data(spirv_info, "Capability"), 92 collect_data(spirv_info, "Decoration"), 93 collect_opcodes(spirv_info), 94 ] 95 96 with open(pargs.out, 'w') as f: 97 f.write(TEMPLATE.render(info=info)) 98