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