blob: d329e08c8f81559769b9fcbb96527334182fc4f8 [file] [log] [blame]
#!/usr/bin/env python3
# Copyright 2023 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import json
import sys
def usage():
print(
'Usage:\n'
' regen.py INPUT OUT.in OUT.attrib\n'
' INPUT json file containing the magma interface definition\n'
' OUT.in destination path for the magma interface file to generate\n'
' OUT.attrib destination path for the magma interface file to generate\n'
' Example: ./regen.py ./magma.json ./magma.in ./magma.attrib\n'
' Generates magma interface and attrib files based on a provided json definition.')
# returns a string that will block presubmit
def dnsstr():
return (
'DO '
'NOT '
'SUBMIT'
)
def format_export(export):
args = [f'{arg["type"]} {arg["name"]}' for arg in export["arguments"]]
return f'MAGMA({export["type"]}, {export["name"]}, {", ".join(args)})'
def if_header():
return (
f'# !!!! {dnsstr()} !!!!\n'
'# This interface file was generated using the magma\n'
'# definition file. Some methods with nested structs must\n'
'# be manually serialized/deserialized and so modifications\n'
'# must be made to those method signatures prior to running\n'
'# emugen!\n'
f'# !!!! {dnsstr()} !!!!\n'
'\n'
)
def attrib_header():
return (
f'# !!!! {dnsstr()} !!!!\n'
'# This attrib file was generated using HEURISTICS based on\n'
'# the magma definition file. It must be manually verified\n'
'# prior to submission!\n'
f'# !!!! {dnsstr()} !!!!\n'
'\n'
'# For documentation on the .attrib file format, see:\n'
'# android/android-emugl/host/tools/emugen/README\n'
'\n'
'GLOBAL\n'
'\tbase_opcode 100000\n'
'\tencoder_headers <stdint.h>\n'
)
def format_attribs(export):
out_args = [arg for arg in export["arguments"] if arg["name"].endswith('_out')]
if len(out_args) == 0:
return None
ret = f'{export["name"]}\n'
for arg in out_args:
ret += f'\tdir {arg["name"]} out\n'
ret += f'\tlen {arg["name"]} sizeof({arg["type"][:-1]})\n'
return ret
def main():
if (len(sys.argv) != 4):
usage()
return 2
try:
with open(sys.argv[1], 'r') as file:
with open(sys.argv[2], 'w') as dest_in:
with open(sys.argv[3], 'w') as dest_attrib:
magma = json.load(file)['magma-interface']
lines = [format_export(e) for e in magma['exports']]
dest_in.write(if_header())
dest_in.write('\n'.join(lines))
dest_attrib.write(attrib_header())
for export in magma['exports']:
attribs = format_attribs(export)
if (attribs):
dest_attrib.write('\n' + attribs)
except Exception as e:
print(f'Error accessing files: {e}')
usage()
return 1
if __name__ == '__main__':
sys.exit(main())