1*61046927SAndroid Build Coastguard Worker#!/usr/bin/env python3 2*61046927SAndroid Build Coastguard Worker# 3*61046927SAndroid Build Coastguard Worker# Copyright © 2024 Igalia S.L. 4*61046927SAndroid Build Coastguard Worker# SPDX-License-Identifier: MIT 5*61046927SAndroid Build Coastguard Worker 6*61046927SAndroid Build Coastguard Workertemplate = """/* 7*61046927SAndroid Build Coastguard Worker * Copyright © 2024 Igalia S.L. 8*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT 9*61046927SAndroid Build Coastguard Worker */ 10*61046927SAndroid Build Coastguard Worker 11*61046927SAndroid Build Coastguard Worker#pragma once 12*61046927SAndroid Build Coastguard Worker 13*61046927SAndroid Build Coastguard Worker#include "util/macros.h" 14*61046927SAndroid Build Coastguard Worker 15*61046927SAndroid Build Coastguard Worker#ifdef __cplusplus 16*61046927SAndroid Build Coastguard Workerextern "C" { 17*61046927SAndroid Build Coastguard Worker#endif 18*61046927SAndroid Build Coastguard Worker 19*61046927SAndroid Build Coastguard Worker% for name, enum in enums.items(): 20*61046927SAndroid Build Coastguard Workerenum PACKED ${prefix}_${name} { 21*61046927SAndroid Build Coastguard Worker% for k, v in enum.items(): 22*61046927SAndroid Build Coastguard Worker % if v: 23*61046927SAndroid Build Coastguard Worker ${k} = ${v}, 24*61046927SAndroid Build Coastguard Worker % else: 25*61046927SAndroid Build Coastguard Worker ${k}, 26*61046927SAndroid Build Coastguard Worker %endif 27*61046927SAndroid Build Coastguard Worker% endfor 28*61046927SAndroid Build Coastguard Worker}; 29*61046927SAndroid Build Coastguard Worker 30*61046927SAndroid Build Coastguard Worker% endfor 31*61046927SAndroid Build Coastguard Worker 32*61046927SAndroid Build Coastguard Worker#ifdef __cplusplus 33*61046927SAndroid Build Coastguard Worker} /* extern C */ 34*61046927SAndroid Build Coastguard Worker#endif 35*61046927SAndroid Build Coastguard Worker""" 36*61046927SAndroid Build Coastguard Worker 37*61046927SAndroid Build Coastguard Workerimport argparse 38*61046927SAndroid Build Coastguard Workerimport sys, os 39*61046927SAndroid Build Coastguard Workersys.path.append(os.path.dirname(os.path.abspath(__file__)) + "/../../compiler/isaspec") 40*61046927SAndroid Build Coastguard Worker 41*61046927SAndroid Build Coastguard Workerfrom mako.template import Template 42*61046927SAndroid Build Coastguard Workerfrom isa import ISA 43*61046927SAndroid Build Coastguard Worker 44*61046927SAndroid Build Coastguard Workerdef main(): 45*61046927SAndroid Build Coastguard Worker parser = argparse.ArgumentParser() 46*61046927SAndroid Build Coastguard Worker parser.add_argument('--xml', required=True, type=str, action="store", 47*61046927SAndroid Build Coastguard Worker help='source isaspec xml file') 48*61046927SAndroid Build Coastguard Worker parser.add_argument('--output', required=True, type=str, action="store", 49*61046927SAndroid Build Coastguard Worker help='output C header file') 50*61046927SAndroid Build Coastguard Worker args = parser.parse_args() 51*61046927SAndroid Build Coastguard Worker 52*61046927SAndroid Build Coastguard Worker isa = ISA(args.xml) 53*61046927SAndroid Build Coastguard Worker prefix = 'isa' 54*61046927SAndroid Build Coastguard Worker enums = {} 55*61046927SAndroid Build Coastguard Worker 56*61046927SAndroid Build Coastguard Worker for name, enum in isa.enums.items(): 57*61046927SAndroid Build Coastguard Worker name = name.replace('#', '') 58*61046927SAndroid Build Coastguard Worker e = {} 59*61046927SAndroid Build Coastguard Worker 60*61046927SAndroid Build Coastguard Worker for k, v in enum.values.items(): 61*61046927SAndroid Build Coastguard Worker v = v.get_name().replace('.', '').replace('[', '').replace(']', '').upper() 62*61046927SAndroid Build Coastguard Worker item = prefix.upper() + '_' + name.upper() + '_' + v 63*61046927SAndroid Build Coastguard Worker e[item] = k 64*61046927SAndroid Build Coastguard Worker 65*61046927SAndroid Build Coastguard Worker enums[name] = e 66*61046927SAndroid Build Coastguard Worker 67*61046927SAndroid Build Coastguard Worker opc = {} 68*61046927SAndroid Build Coastguard Worker 69*61046927SAndroid Build Coastguard Worker for instr in isa.instructions(): 70*61046927SAndroid Build Coastguard Worker opc[prefix.upper() + '_OPC_' + instr.name.upper()] = None 71*61046927SAndroid Build Coastguard Worker 72*61046927SAndroid Build Coastguard Worker enums['opc'] = opc 73*61046927SAndroid Build Coastguard Worker 74*61046927SAndroid Build Coastguard Worker with open(args.output, "w", encoding="UTF-8") as fh: 75*61046927SAndroid Build Coastguard Worker fh.write(Template(template).render(prefix=prefix, enums=enums)) 76*61046927SAndroid Build Coastguard Worker 77*61046927SAndroid Build Coastguard Workerif __name__ == '__main__': 78*61046927SAndroid Build Coastguard Worker main() 79