oppc/code: support simple constant assignments
[openpower-isa.git] / src / openpower / oppc / __main__.py
1 import glob
2 import io
3 import re
4
5 from openpower.decoder.power_enums import (
6 find_wiki_dir,
7 )
8
9 import openpower.oppc.pc_code as pc_code
10 import openpower.oppc.pc_lexer as pc_lexer
11 import openpower.oppc.pc_parser as pc_parser
12 import openpower.oppc.pc_pseudocode as pc_pseudocode
13
14
15 def dedent(line):
16 if line.startswith(" "):
17 return line[4:].rstrip()
18 return line.rstrip()
19
20
21 def parse(parser, origin):
22 origin = tuple(origin)
23 tree = parser.parse(code="\n".join(origin))
24 stream = io.StringIO()
25 for (level, line) in pc_pseudocode.pseudocode(tree):
26 print(f"{' ' * 4 * level}{line}", file=stream)
27 stream.seek(0)
28 target = tuple(stream)
29 return (origin, target)
30
31
32 lexer = pc_lexer.IndentLexer(debug=False)
33 parser = pc_parser.Parser(lexer=lexer)
34 pattern = re.compile(r"Pseudo-code:(.*?)(?:Special Registers Altered|Description):", re.DOTALL)
35 for path in []: # glob.glob(f"{find_wiki_dir()}/../isa/*.mdwn"):
36 with open(path, "r", encoding="UTF-8") as stream:
37 data = stream.read()
38 for origin in pattern.findall(data):
39 try:
40 (stage0, stage1) = parse(parser, map(dedent, origin.split("\n")))
41 (stage2, stage3) = parse(parser, map(dedent, stage1))
42 stage1 = tuple(map(dedent, stage1))
43 stage3 = tuple(map(dedent, stage3))
44 assert stage1 == stage2 and stage2 == stage3
45 except AssertionError as exc:
46 print(stage0)
47 print(stage1)
48 print(stage3)
49 raise exc
50 except Exception as exc:
51 print(path)
52 print(origin)
53 raise exc
54
55 code = """
56 a <- 0b0
57 """
58 tree = parser.parse(code=code)
59 print(tree)
60 for (level, line) in pc_pseudocode.pseudocode(tree):
61 print(f"{' ' * 4 * level}{line}")
62
63 for (level, line) in pc_code.code(name="cdtbcd", root=tree):
64 print(f"{' ' * 4 * level}{line}")