5 from openpower
.decoder
.power_enums
import (
8 from openpower
.insndb
.core
import (
14 class BaseVisitor(Visitor
):
15 def __init__(self
, **_
):
19 class ListVisitor(BaseVisitor
):
20 @contextlib.contextmanager
21 def record(self
, record
):
26 class ConcreteInstructionVisitor(BaseVisitor
):
27 def __init__(self
, insn
, **_
):
29 return super().__init
__()
31 def handler(self
, record
):
32 raise NotImplementedError
34 @contextlib.contextmanager
35 def record(self
, record
):
36 if record
.name
== self
.__insn
:
37 self
.handler(record
=record
)
41 class OpcodesVisitor(ConcreteInstructionVisitor
):
42 def handler(self
, record
):
43 for opcode
in record
.opcodes
:
47 class OperandsVisitor(ConcreteInstructionVisitor
):
48 def handler(self
, record
):
49 for operand
in record
.dynamic_operands
:
51 for operand
in record
.static_operands
:
52 if operand
.name
not in ("PO", "XO"):
53 print(operand
.name
, operand
.value
, sep
="=")
56 class PCodeVisitor(ConcreteInstructionVisitor
):
57 def handler(self
, record
):
58 for line
in record
.pcode
:
66 "list available instructions",
70 "print instruction opcodes",
74 "print instruction operands",
78 "print instruction pseudocode",
82 main_parser
= argparse
.ArgumentParser()
83 main_parser
.add_argument("-l", "--log",
84 help="activate logging",
87 main_subparser
= main_parser
.add_subparsers(dest
="command", required
=True)
89 for (command
, (visitor
, help)) in commands
.items():
90 parser
= main_subparser
.add_parser(command
, help=help)
91 if issubclass(visitor
, ConcreteInstructionVisitor
):
92 parser
.add_argument("insn", metavar
="INSN", help="instruction")
94 args
= vars(main_parser
.parse_args())
95 command
= args
.pop("command")
98 os
.environ
["SILENCELOG"] = "true"
99 visitor
= commands
[command
][0](**args
)
101 db
= Database(find_wiki_dir())
102 db
.visit(visitor
=visitor
)