insndb: rename types into core
[openpower-isa.git] / src / openpower / insndb / db.py
1 import argparse
2 import contextlib
3 import sys
4
5 from openpower.decoder.power_enums import (
6 find_wiki_dir,
7 )
8 from openpower.insndb.core import (
9 Database,
10 Visitor,
11 )
12
13
14 def main():
15 class GenericVisitor(Visitor):
16 def __init__(self, **_):
17 pass
18
19 class ListVisitor(GenericVisitor):
20 @contextlib.contextmanager
21 def record(self, record):
22 print(record.name)
23 yield record
24
25 class OpcodesVisitor(GenericVisitor):
26 def __init__(self, insn, **_):
27 self.__insn = insn
28 return super().__init__()
29
30 @contextlib.contextmanager
31 def record(self, record):
32 if record.name == self.__insn:
33 for opcode in record.opcodes:
34 print(opcode)
35 yield record
36
37 visitors = {
38 "list": ListVisitor,
39 "opcodes": OpcodesVisitor,
40 }
41 parser = argparse.ArgumentParser()
42 subparser = parser.add_subparsers(dest="command", required=True)
43 parser_list = subparser.add_parser("list",
44 help="list all instructions")
45 parser_opcodes = subparser.add_parser("opcodes",
46 help="print instruction opcodes")
47 parser_opcodes.add_argument("insn",
48 metavar="INSN",
49 help="instruction")
50
51 args = vars(parser.parse_args())
52 command = args.pop("command")
53 visitor = visitors[command](**args)
54
55 db = Database(find_wiki_dir())
56 db.visit(visitor=visitor)