pysvp64dis: stop interation upon empty suffix
[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 prefix = ifile.read(4)
29 length = len(prefix)
30 if length == 0:
31 return
32 elif length < 4:
33 raise IOError(prefix)
34 prefix = _WordInstruction.integer(value=prefix, byteorder=byteorder)
35
36 suffix = ifile.read(4)
37 length = len(suffix)
38 if length == 0:
39 yield prefix
40 return
41 elif length < 4:
42 raise IOError(suffix)
43 suffix = _WordInstruction.integer(value=suffix, byteorder=byteorder)
44
45 if prefix.po == 0x1:
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 else:
51 yield prefix
52 yield suffix
53
54
55 def dump(insns, **_):
56 db = _Database(_find_wiki_dir())
57 for insn in insns:
58 yield from insn.disassemble(db=db)
59
60
61 def main():
62 parser = _argparse.ArgumentParser()
63 parser.add_argument("ifile", nargs="?",
64 type=_argparse.FileType("rb"), default=_sys.stdin.buffer)
65 parser.add_argument("ofile", nargs="?",
66 type=_argparse.FileType("w"), default=_sys.stdout)
67 parser.add_argument("-b", "--byteorder",
68 type=ByteOrder, default=ByteOrder.LITTLE)
69
70 args = dict(vars(parser.parse_args()))
71 ifile = args["ifile"]
72 ofile = args["ofile"]
73 byteorder = args["byteorder"]
74
75 insns = load(ifile, byteorder)
76 for line in dump(insns):
77 print(line, file=ofile)
78
79
80 if __name__ == "__main__":
81 main()