ddb24a158959afc2b0886da72446bf2698c5a66e
1 import argparse
as _argparse
3 import functools
as _functools
6 from openpower
.decoder
.selectable_int
import SelectableInt
as _SelectableInt
9 class ByteOrder(_enum
.Enum
):
14 return self
.name
.lower()
17 class Instruction(_SelectableInt
):
18 def __init__(self
, value
, bits
=32, byteorder
=ByteOrder
.LITTLE
):
19 if isinstance(value
, bytes
):
20 value
= int.from_bytes(value
, byteorder
=str(byteorder
))
21 if not isinstance(value
, (int, _SelectableInt
)) or (value
< 0):
22 raise ValueError(value
)
23 return super().__init
__(value
=value
, bits
=bits
)
26 return f
"{self.__class__.__name__}({str(self)})"
29 return f
".long 0x{self.value:08x}"
36 class PrefixedInstruction(Instruction
):
37 def __init__(self
, prefix
, suffix
, byteorder
=ByteOrder
.LITTLE
):
38 insn
= _functools
.partial(Instruction
, bits
=64)
39 (prefix
, suffix
) = map(insn
, (prefix
, suffix
))
40 value
= ((prefix
.value
<< 32) | suffix
.value
)
41 return super().__init
__(value
=value
, bits
=64)
44 return f
".llong 0x{self.value:016x}"
55 def load(ifile
, byteorder
, **_
):
57 prefix
= ifile
.read(4)
63 prefix
= Instruction(prefix
, byteorder
=byteorder
)
64 if prefix
.major
!= 0x1:
67 suffix
= ifile
.read(4)
74 return PrefixedInstruction(prefix
, suffix
, byteorder
=byteorder
)
83 def dump(insns
, ofile
, **_
):
89 parser
= _argparse
.ArgumentParser()
90 parser
.add_argument("ifile", nargs
="?",
91 type=_argparse
.FileType("rb"), default
=_sys
.stdin
.buffer)
92 parser
.add_argument("ofile", nargs
="?",
93 type=_argparse
.FileType("w"), default
=_sys
.stdout
)
94 parser
.add_argument("-b", "--byteorder",
95 type=ByteOrder
, default
=ByteOrder
.LITTLE
)
96 args
= dict(vars(parser
.parse_args()))
99 for line
in dump(insns
, **args
):
103 if __name__
== "__main__":