oppc/pseudocode: always use keywords for emit calls
[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 from openpower.insndb.core import Database
9
10 import openpower.oppc.pc_code as pc_code
11 import openpower.oppc.pc_lexer as pc_lexer
12 import openpower.oppc.pc_parser as pc_parser
13 import openpower.oppc.pc_pseudocode as pc_pseudocode
14
15
16 lexer = pc_lexer.IndentLexer(debug=False)
17 parser = pc_parser.Parser(lexer=lexer)
18 db = Database(find_wiki_dir())
19 for insn in db:
20 try:
21 tree = parser.parse(code="\n".join(insn.pcode))
22 for (level, line) in pc_pseudocode.pseudocode(tree):
23 pass
24 except Exception as exc:
25 print(insn.name)
26 print(insn.pcode)
27 raise exc
28
29 code = """
30 src <- [0]*64
31 src[64-XLEN:63] <- (RS)
32 result <- [0]*64
33 do i = 0 to 1
34 n <- i * 32
35 result[n+0:n+7] <- 0
36 result[n+8:n+19] <- DPD_TO_BCD(src[n+12:n+21])
37 result[n+20:n+31] <- DPD_TO_BCD(src[n+22:n+31])
38 RA <- result[64-XLEN:63]
39 RA <- (C ? A : B)
40 if a < b then RT <- (RA)
41 else RT <- (RB)
42 """
43 tree = parser.parse(code=code)
44 print(tree)
45 for (level, line) in pc_pseudocode.pseudocode(tree):
46 print(f"{' ' * 4 * level}{line}")
47
48 for (level, line) in pc_code.code(name="cdtbcd", root=tree):
49 print(f"{' ' * 4 * level}{line}")