pysvp64dis: refactor instruction loading
[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, **_):
53 db = _Database(_find_wiki_dir())
54 for insn in insns:
55 yield from insn.disassemble(db=db)
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
67 args = dict(vars(parser.parse_args()))
68 ifile = args["ifile"]
69 ofile = args["ofile"]
70 byteorder = args["byteorder"]
71
72 insns = load(ifile, byteorder)
73 for line in dump(insns):
74 print(line, file=ofile)
75
76
77 if __name__ == "__main__":
78 main()