mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 07:43:54 -06:00
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:
parent
f0db9f5759
commit
e295796726
13 changed files with 109 additions and 47 deletions
|
@ -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")
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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]:
|
||||
|
|
|
@ -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]:
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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("
|
||||
|
|
|
@ -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")
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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")
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue