target/hexagon: Use argparse in all python scripts

QOL commit, all the various gen_* python scripts take a large set
arguments where order is implicit.  Using argparse we also get decent
error messages if a field is missing or too many are added.

Signed-off-by: Anton Johansson <anjo@rev.ng>
Reviewed-by: Brian Cain <brian.cain@oss.qualcomm.com>
Signed-off-by: Brian Cain <brian.cain@oss.qualcomm.com>
This commit is contained in:
Anton Johansson 2024-12-06 17:01:02 +01:00 committed by Brian Cain
parent f0db9f5759
commit e295796726
13 changed files with 109 additions and 47 deletions

View file

@ -78,11 +78,13 @@ def gen_analyze_func(f, tag, regs, imms):
def main():
hex_common.read_common_files()
args = hex_common.parse_common_args(
"Emit functions analyzing register accesses"
)
tagregs = hex_common.get_tagregs()
tagimms = hex_common.get_tagimms()
with open(sys.argv[-1], "w") as f:
with open(args.out, "w") as f:
f.write("#ifndef HEXAGON_ANALYZE_FUNCS_C_INC\n")
f.write("#define HEXAGON_ANALYZE_FUNCS_C_INC\n\n")

View file

@ -24,6 +24,7 @@ import sys
import textwrap
import iset
import hex_common
import argparse
encs = {
tag: "".join(reversed(iset.iset[tag]["enc"].replace(" ", "")))
@ -191,8 +192,18 @@ def gen_decodetree_file(f, class_to_decode):
f.write(f"{tag}\t{enc_str} @{tag}\n")
def main():
parser = argparse.ArgumentParser(
description="Emit opaque macro calls with instruction semantics"
)
parser.add_argument("semantics", help="semantics file")
parser.add_argument("class_to_decode", help="instruction class to decode")
parser.add_argument("out", help="output file")
args = parser.parse_args()
hex_common.read_semantics_file(args.semantics)
with open(args.out, "w") as f:
gen_decodetree_file(f, args.class_to_decode)
if __name__ == "__main__":
hex_common.read_semantics_file(sys.argv[1])
class_to_decode = sys.argv[2]
with open(sys.argv[3], "w") as f:
gen_decodetree_file(f, class_to_decode)
main()

View file

@ -102,12 +102,13 @@ def gen_helper_function(f, tag, tagregs, tagimms):
def main():
hex_common.read_common_files()
args = hex_common.parse_common_args(
"Emit helper function definitions for each instruction"
)
tagregs = hex_common.get_tagregs()
tagimms = hex_common.get_tagimms()
output_file = sys.argv[-1]
with open(output_file, "w") as f:
with open(args.out, "w") as f:
for tag in hex_common.tags:
## Skip the priv instructions
if "A_PRIV" in hex_common.attribdict[tag]:

View file

@ -52,12 +52,13 @@ def gen_helper_prototype(f, tag, tagregs, tagimms):
def main():
hex_common.read_common_files()
args = hex_common.parse_common_args(
"Emit helper function prototypes for each instruction"
)
tagregs = hex_common.get_tagregs()
tagimms = hex_common.get_tagimms()
output_file = sys.argv[-1]
with open(output_file, "w") as f:
with open(args.out, "w") as f:
for tag in hex_common.tags:
## Skip the priv instructions
if "A_PRIV" in hex_common.attribdict[tag]:

View file

@ -20,6 +20,7 @@
import sys
import re
import string
import argparse
from io import StringIO
import hex_common
@ -43,13 +44,19 @@ import hex_common
## them are inputs ("in" prefix), while some others are outputs.
##
def main():
hex_common.read_semantics_file(sys.argv[1])
parser = argparse.ArgumentParser(
"Emit instruction implementations that can be fed to idef-parser"
)
parser.add_argument("semantics", help="semantics file")
parser.add_argument("out", help="output file")
args = parser.parse_args()
hex_common.read_semantics_file(args.semantics)
hex_common.calculate_attribs()
hex_common.init_registers()
tagregs = hex_common.get_tagregs()
tagimms = hex_common.get_tagimms()
with open(sys.argv[-1], "w") as f:
with open(args.out, "w") as f:
f.write('#include "macros.h.inc"\n\n')
for tag in hex_common.tags:

View file

@ -21,16 +21,23 @@ import sys
import re
import string
import hex_common
import argparse
def main():
hex_common.read_semantics_file(sys.argv[1])
parser = argparse.ArgumentParser(
"Emit opaque macro calls containing instruction attributes"
)
parser.add_argument("semantics", help="semantics file")
parser.add_argument("out", help="output file")
args = parser.parse_args()
hex_common.read_semantics_file(args.semantics)
hex_common.calculate_attribs()
##
## Generate all the attributes associated with each instruction
##
with open(sys.argv[-1], "w") as f:
with open(args.out, "w") as f:
for tag in hex_common.tags:
f.write(
f"OP_ATTRIB({tag},ATTRIBS("

View file

@ -21,15 +21,22 @@ import sys
import re
import string
import hex_common
import argparse
def main():
hex_common.read_semantics_file(sys.argv[1])
parser = argparse.ArgumentParser(
description="Emit opaque macro calls with instruction names"
)
parser.add_argument("semantics", help="semantics file")
parser.add_argument("out", help="output file")
args = parser.parse_args()
hex_common.read_semantics_file(args.semantics)
##
## Generate a list of all the opcodes
##
with open(sys.argv[-1], "w") as f:
with open(args.out, "w") as f:
for tag in hex_common.tags:
f.write(f"OPCODE({tag}),\n")

View file

@ -21,6 +21,7 @@ import sys
import re
import string
import hex_common
import argparse
##
@ -96,11 +97,17 @@ def spacify(s):
def main():
hex_common.read_semantics_file(sys.argv[1])
parser = argparse.ArgumentParser(
"Emit opaque macro calls with information for printing string representations of instrucions"
)
parser.add_argument("semantics", help="semantics file")
parser.add_argument("out", help="output file")
args = parser.parse_args()
hex_common.read_semantics_file(args.semantics)
immext_casere = re.compile(r"IMMEXT\(([A-Za-z])")
with open(sys.argv[-1], "w") as f:
with open(args.out, "w") as f:
for tag in hex_common.tags:
if not hex_common.behdict[tag]:
continue

View file

@ -21,15 +21,22 @@ import sys
import re
import string
import hex_common
import argparse
def main():
hex_common.read_semantics_file(sys.argv[1])
parser = argparse.ArgumentParser(
"Emit opaque macro calls with instruction semantics"
)
parser.add_argument("semantics", help="semantics file")
parser.add_argument("out", help="output file")
args = parser.parse_args()
hex_common.read_semantics_file(args.semantics)
hex_common.calculate_attribs()
tagregs = hex_common.get_tagregs()
tagimms = hex_common.get_tagimms()
with open(sys.argv[-1], "w") as f:
with open(args.out, "w") as f:
f.write("#ifndef HEXAGON_FUNC_TABLE_H\n")
f.write("#define HEXAGON_FUNC_TABLE_H\n\n")

View file

@ -108,15 +108,16 @@ def gen_def_tcg_func(f, tag, tagregs, tagimms):
def main():
is_idef_parser_enabled = hex_common.read_common_files()
args = hex_common.parse_common_args(
"Emit functions calling generated code implementing instruction semantics (helpers, idef-parser)"
)
tagregs = hex_common.get_tagregs()
tagimms = hex_common.get_tagimms()
output_file = sys.argv[-1]
with open(output_file, "w") as f:
with open(args.out, "w") as f:
f.write("#ifndef HEXAGON_TCG_FUNCS_H\n")
f.write("#define HEXAGON_TCG_FUNCS_H\n\n")
if is_idef_parser_enabled:
if args.idef_parser:
f.write('#include "idef-generated-emitter.h.inc"\n\n')
for tag in hex_common.tags:

View file

@ -24,6 +24,7 @@ import sys
import textwrap
import iset
import hex_common
import argparse
encs = {
tag: "".join(reversed(iset.iset[tag]["enc"].replace(" ", "")))
@ -136,8 +137,19 @@ def gen_trans_funcs(f):
"""))
if __name__ == "__main__":
hex_common.read_semantics_file(sys.argv[1])
def main():
parser = argparse.ArgumentParser(
description="Emit trans_*() functions to be called by " \
"instruction decoder"
)
parser.add_argument("semantics", help="semantics file")
parser.add_argument("out", help="output file")
args = parser.parse_args()
hex_common.read_semantics_file(args.semantics)
hex_common.init_registers()
with open(sys.argv[2], "w") as f:
with open(args.out, "w") as f:
gen_trans_funcs(f)
if __name__ == "__main__":
main()

View file

@ -21,6 +21,7 @@ import sys
import re
import string
import textwrap
import argparse
behdict = {} # tag ->behavior
semdict = {} # tag -> semantics
@ -1181,22 +1182,20 @@ def helper_args(tag, regs, imms):
return args
def read_common_files():
read_semantics_file(sys.argv[1])
read_overrides_file(sys.argv[2])
read_overrides_file(sys.argv[3])
## Whether or not idef-parser is enabled is
## determined by the number of arguments to
## this script:
##
## 4 args. -> not enabled,
## 5 args. -> idef-parser enabled.
##
## The 5:th arg. then holds a list of the successfully
## parsed instructions.
is_idef_parser_enabled = len(sys.argv) > 5
if is_idef_parser_enabled:
read_idef_parser_enabled_file(sys.argv[4])
def parse_common_args(desc):
parser = argparse.ArgumentParser(desc)
parser.add_argument("semantics", help="semantics file")
parser.add_argument("overrides", help="overrides file")
parser.add_argument("overrides_vec", help="vector overrides file")
parser.add_argument("out", help="output file")
parser.add_argument("--idef-parser",
help="file of instructions translated by idef-parser")
args = parser.parse_args()
read_semantics_file(args.semantics)
read_overrides_file(args.overrides)
read_overrides_file(args.overrides_vec)
if args.idef_parser:
read_idef_parser_enabled_file(args.idef_parser)
calculate_attribs()
init_registers()
return is_idef_parser_enabled
return args

View file

@ -346,7 +346,7 @@ if idef_parser_enabled and 'hexagon-linux-user' in target_dirs
# Setup input and dependencies for the next step, this depends on whether or
# not idef-parser is enabled
helper_dep = [semantics_generated, idef_generated_tcg_c, idef_generated_tcg]
helper_in = [semantics_generated, gen_tcg_h, gen_tcg_hvx_h, idef_generated_list]
helper_in = [semantics_generated, gen_tcg_h, gen_tcg_hvx_h, '--idef-parser', idef_generated_list]
else
# Setup input and dependencies for the next step, this depends on whether or
# not idef-parser is enabled