qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [RFC PATCH v1 35/43] target/hexagon: Use argparse in all python scri


From: Brian Cain
Subject: Re: [RFC PATCH v1 35/43] target/hexagon: Use argparse in all python scripts
Date: Thu, 5 Dec 2024 09:23:09 -0600
User-agent: Mozilla Thunderbird

On 11/20/2024 7:49 PM, Anton Johansson via wrote:
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>
  target/hexagon/gen_analyze_funcs.py     |  6 +++--
  target/hexagon/gen_decodetree.py        | 19 +++++++++++----
  target/hexagon/gen_helper_funcs.py      |  7 +++---
  target/hexagon/gen_helper_protos.py     |  7 +++---
  target/hexagon/gen_idef_parser_funcs.py | 11 +++++++--
  target/hexagon/gen_op_attribs.py        | 11 +++++++--
  target/hexagon/gen_opcodes_def.py       | 11 +++++++--
  target/hexagon/gen_printinsn.py         | 11 +++++++--
  target/hexagon/gen_tcg_func_table.py    | 11 +++++++--
  target/hexagon/gen_tcg_funcs.py         |  9 +++----
  target/hexagon/gen_trans_funcs.py       | 17 ++++++++++---
  target/hexagon/hex_common.py            | 32 ++++++++++++-------------
  target/hexagon/meson.build              |  2 +-
  13 files changed, 107 insertions(+), 47 deletions(-)

diff --git a/target/hexagon/gen_analyze_funcs.py 
b/target/hexagon/gen_analyze_funcs.py
index 54bac19724..3ac7cc2cfe 100755
--- a/target/hexagon/gen_analyze_funcs.py
+++ b/target/hexagon/gen_analyze_funcs.py
@@ -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")
diff --git a/target/hexagon/gen_decodetree.py b/target/hexagon/gen_decodetree.py
index a4fcd622c5..ce703af41d 100755
--- a/target/hexagon/gen_decodetree.py
+++ b/target/hexagon/gen_decodetree.py
@@ -24,6 +24,7 @@
  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()
diff --git a/target/hexagon/gen_helper_funcs.py 
b/target/hexagon/gen_helper_funcs.py
index e9685bff2f..c1f806ac4b 100755
--- a/target/hexagon/gen_helper_funcs.py
+++ b/target/hexagon/gen_helper_funcs.py
@@ -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]:
diff --git a/target/hexagon/gen_helper_protos.py 
b/target/hexagon/gen_helper_protos.py
index fd2bfd0f36..77f8e0a6a3 100755
--- a/target/hexagon/gen_helper_protos.py
+++ b/target/hexagon/gen_helper_protos.py
@@ -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]:
diff --git a/target/hexagon/gen_idef_parser_funcs.py 
b/target/hexagon/gen_idef_parser_funcs.py
index 72f11c68ca..2f6e826f76 100644
--- a/target/hexagon/gen_idef_parser_funcs.py
+++ b/target/hexagon/gen_idef_parser_funcs.py
@@ -20,6 +20,7 @@
  import sys
  import re
  import string
+import argparse
  from io import StringIO
import hex_common
@@ -43,13 +44,19 @@
  ## 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:
diff --git a/target/hexagon/gen_op_attribs.py b/target/hexagon/gen_op_attribs.py
index 99448220da..bbbb02df3a 100755
--- a/target/hexagon/gen_op_attribs.py
+++ b/target/hexagon/gen_op_attribs.py
@@ -21,16 +21,23 @@
  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("
diff --git a/target/hexagon/gen_opcodes_def.py 
b/target/hexagon/gen_opcodes_def.py
index 536f0eb68a..94a19ff412 100755
--- a/target/hexagon/gen_opcodes_def.py
+++ b/target/hexagon/gen_opcodes_def.py
@@ -21,15 +21,22 @@
  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")
diff --git a/target/hexagon/gen_printinsn.py b/target/hexagon/gen_printinsn.py
index 8bf4d0985c..d5f969960a 100755
--- a/target/hexagon/gen_printinsn.py
+++ b/target/hexagon/gen_printinsn.py
@@ -21,6 +21,7 @@
  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
diff --git a/target/hexagon/gen_tcg_func_table.py 
b/target/hexagon/gen_tcg_func_table.py
index 978ac1819b..299a39b1aa 100755
--- a/target/hexagon/gen_tcg_func_table.py
+++ b/target/hexagon/gen_tcg_func_table.py
@@ -21,15 +21,22 @@
  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")
diff --git a/target/hexagon/gen_tcg_funcs.py b/target/hexagon/gen_tcg_funcs.py
index 05aa0a7855..c2ba91ddc0 100755
--- a/target/hexagon/gen_tcg_funcs.py
+++ b/target/hexagon/gen_tcg_funcs.py
@@ -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:
diff --git a/target/hexagon/gen_trans_funcs.py 
b/target/hexagon/gen_trans_funcs.py
index 30f0c73e0c..aea1c36f7d 100755
--- a/target/hexagon/gen_trans_funcs.py
+++ b/target/hexagon/gen_trans_funcs.py
@@ -24,6 +24,7 @@
  import textwrap
  import iset
  import hex_common
+import argparse
encs = {
      tag: "".join(reversed(iset.iset[tag]["enc"].replace(" ", "")))
@@ -136,8 +137,18 @@ 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()
diff --git a/target/hexagon/hex_common.py b/target/hexagon/hex_common.py
index 15ed4980e4..bb20711a2e 100755
--- a/target/hexagon/hex_common.py
+++ b/target/hexagon/hex_common.py
@@ -21,6 +21,7 @@
  import re
  import string
  import textwrap
+import argparse
behdict = {} # tag ->behavior
  semdict = {}  # tag -> semantics
@@ -1181,22 +1182,19 @@ 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
diff --git a/target/hexagon/meson.build b/target/hexagon/meson.build
index f1723778a6..bb4ebaae81 100644
--- a/target/hexagon/meson.build
+++ b/target/hexagon/meson.build
@@ -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


reply via email to

[Prev in Thread] Current Thread [Next in Thread]