pysvp64dis: support verbose mode
[openpower-isa.git] / src / openpower / sv / trans / pysvp64dis.py
1 import argparse as _argparse
2 import enum as _enum
3 import sys as _sys
4
5 from openpower.decoder.power_enums import (
6 find_wiki_dir as _find_wiki_dir,
7 )
8 from openpower.decoder.power_insn import (
9 Database as _Database,
10 WordInstruction as _WordInstruction,
11 PrefixedInstruction as _PrefixedInstruction,
12 SVP64Instruction as _SVP64Instruction,
13 )
14
15
16 class ByteOrder(_enum.Enum):
17 LITTLE = "little"
18 BIG = "big"
19
20 def __str__(self):
21 return self.name.lower()
22
23
24 def load(ifile, byteorder, **_):
25 byteorder = str(byteorder)
26
27 while True:
28 insn = ifile.read(4)
29 length = len(insn)
30 if length == 0:
31 return
32 elif length < 4:
33 raise IOError(insn)
34 insn = _WordInstruction.integer(value=insn, byteorder=byteorder)
35 if insn.po == 0x1:
36 suffix = ifile.read(4)
37 length = len(suffix)
38 if length == 0:
39 yield insn
40 return
41 elif length < 4:
42 raise IOError(suffix)
43
44 prefix = insn
45 suffix = _WordInstruction.integer(value=suffix, byteorder=byteorder)
46 insn = _SVP64Instruction.pair(prefix=prefix, suffix=suffix)
47 if insn.prefix.id != 0b11:
48 insn = _PrefixedInstruction.pair(prefix=prefix, suffix=suffix)
49 yield insn
50
51
52 def dump(insns, verbose, **_):
53 db = _Database(_find_wiki_dir())
54 for insn in insns:
55 yield from insn.disassemble(db=db, verbose=verbose)
56
57
58 def main():
59 parser = _argparse.ArgumentParser()
60 parser.add_argument("ifile", nargs="?",
61 type=_argparse.FileType("rb"), default=_sys.stdin.buffer)
62 parser.add_argument("ofile", nargs="?",
63 type=_argparse.FileType("w"), default=_sys.stdout)
64 parser.add_argument("-b", "--byteorder",
65 type=ByteOrder, default=ByteOrder.LITTLE)
66 parser.add_argument("-v", "--verbose",
67 action="store_true", default=False)
68
69 args = dict(vars(parser.parse_args()))
70 insns = load(**args)
71 for line in dump(insns, **args):
72 print(line, file=args["ofile"])
73
74
75 if __name__ == "__main__":
76 main()