whoops. mode-bits need to be put in MSB0 order. sigh
[openpower-isa.git] / src / openpower / sv / trans / pysvp64dis.py
index 98848c66787ed5dd39fc7a37d57bd28241c74b5a..d5ddba91042557f3423d5093e085ea9809f2512f 100644 (file)
@@ -1,11 +1,14 @@
 import argparse as _argparse
 import enum as _enum
 import sys as _sys
+import os
+from io import BytesIO
 
 from openpower.decoder.power_enums import (
     find_wiki_dir as _find_wiki_dir,
 )
 from openpower.decoder.power_insn import (
+    Verbosity as _Verbosity,
     Database as _Database,
     WordInstruction as _WordInstruction,
     PrefixedInstruction as _PrefixedInstruction,
@@ -21,11 +24,16 @@ class ByteOrder(_enum.Enum):
         return self.name.lower()
 
 
-def load(ifile, byteorder, **_):
+def load(ifile, byteorder=ByteOrder.LITTLE, **_):
     byteorder = str(byteorder)
 
+    # copy over to persistent binfile (BytesIO)
+    cpfile = BytesIO()
+    cpfile.write(ifile.read())
+    cpfile.seek(0)
+
     while True:
-        insn = ifile.read(4)
+        insn = cpfile.read(4)
         length = len(insn)
         if length == 0:
             return
@@ -33,7 +41,7 @@ def load(ifile, byteorder, **_):
             raise IOError(insn)
         insn = _WordInstruction.integer(value=insn, byteorder=byteorder)
         if insn.po == 0x1:
-            suffix = ifile.read(4)
+            suffix = cpfile.read(4)
             length = len(suffix)
             if length == 0:
                 yield insn
@@ -48,13 +56,16 @@ def load(ifile, byteorder, **_):
                 insn = _PrefixedInstruction.pair(prefix=prefix, suffix=suffix)
         yield insn
 
+    cpfile.seek(0) # restore position so that generator can be reused
+
 
-def dump(insns, **_):
+def dump(insns, verbosity, **_):
     db = _Database(_find_wiki_dir())
     for insn in insns:
-        yield from insn.disassemble(db=db)
+        yield from insn.disassemble(db=db, verbosity=verbosity)
 
 
+# this is the entry-point for the console-script pysvp64dis
 def main():
     parser = _argparse.ArgumentParser()
     parser.add_argument("ifile", nargs="?",
@@ -63,16 +74,28 @@ def main():
         type=_argparse.FileType("w"), default=_sys.stdout)
     parser.add_argument("-b", "--byteorder",
         type=ByteOrder, default=ByteOrder.LITTLE)
+    parser.add_argument("-s", "--short",
+        dest="verbosity", default=_Verbosity.NORMAL,
+        action="store_const", const=_Verbosity.SHORT)
+    parser.add_argument("-v", "--verbose",
+        dest="verbosity", default=_Verbosity.NORMAL,
+        action="store_const", const=_Verbosity.VERBOSE)
+    parser.add_argument("-l", "--log",
+        action="store_true", default=False)
 
     args = dict(vars(parser.parse_args()))
-    ifile = args["ifile"]
-    ofile = args["ofile"]
-    byteorder = args["byteorder"]
 
-    insns = load(ifile, byteorder)
-    for line in dump(insns):
-        print(line, file=ofile)
+    # if logging requested do not disable it.
+    if not args['log']:
+        os.environ['SILENCELOG'] = '1'
+
+    # load instructions and dump them
+    insns = load(**args)
+    for line in dump(insns, **args):
+        print(line, file=args["ofile"])
 
 
+# still here but use "python3 setup.py develop" then run the
+# command "pysvp64dis" instead of "python3 src/openpower/sv/trans/pysvp64dis.py"
 if __name__ == "__main__":
     main()