oppc/code: rename oppc_int to oppc_value
[openpower-isa.git] / src / openpower / oppc / pc_util.py
1 import contextlib
2 import functools
3
4
5 import mdis.visitor
6 import mdis.walker
7 import mdis.dispatcher
8
9
10 class Hook(mdis.dispatcher.Hook):
11 def __call__(self, call):
12 hook = super().__call__(call)
13
14 class ConcreteHook(hook.__class__):
15 @functools.wraps(hook.__call__)
16 @contextlib.contextmanager
17 def __call__(self, dispatcher, node, *args, **kwargs):
18 return hook(dispatcher, node, *args, **kwargs)
19
20 return ConcreteHook(*tuple(self))
21
22
23 class Code(list):
24 def __init__(self):
25 self.__level = 0
26 return super().__init__()
27
28 def __enter__(self):
29 self.__level += 1
30 return self
31
32 def __exit__(self, exc_type, exc_value, exc_traceback):
33 self.__level -= 1
34
35 def __str__(self):
36 if len(self) == 0:
37 raise ValueError("empty code")
38
39 lines = []
40 for (level, stmt) in self:
41 line = ((" " * level * 4) + stmt)
42 lines.append(line)
43
44 return "\n".join(lines)
45
46 def emit(self, stmt="", level=0):
47 item = ((level + self.__level), stmt)
48 self.append(item)
49
50
51 class Visitor(mdis.visitor.ContextVisitor):
52 def __init__(self, root):
53 self.__walker = mdis.walker.Walker()
54
55 self.traverse(root=root)
56
57 return super().__init__()
58
59 def traverse(self, root):
60 with self(root):
61 for node in self.__walker(root):
62 self.traverse(root=node)