annotate python/ppci/ir2tree.py @ 357:818be710e13d

Added acceptance function to burg
author Windel Bouwman
date Fri, 14 Mar 2014 15:14:29 +0100
parents 52492b304adf
children c49459768aaa
rev   line source
322
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
1 from tree import Tree
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
2 from . import ir
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
3
323
e9fe6988497c Used burg for generating expressions
Windel Bouwman
parents: 322
diff changeset
4 """ Create a tree from ir code. """
e9fe6988497c Used burg for generating expressions
Windel Bouwman
parents: 322
diff changeset
5
322
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
6 f_map = {} # Mapping from types to tree creation functions
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
7
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
8 def register(tp):
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
9 """ Register a function for type tp """
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
10 def reg_f(f):
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
11 f_map[tp] = f
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
12 return f
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
13 return reg_f
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
14
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
15 @register(ir.Binop)
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
16 def binop_to_tree(e):
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
17 names = {'+':'ADDI32', '-':'SUBI32', '|':'ORI32', '<<':'SHLI32',
356
52492b304adf Added newline to print
Windel Bouwman
parents: 355
diff changeset
18 '*':'MULI32', '&':'ANDI32', '>>':'SHRI32'}
322
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
19 op = names[e.operation]
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
20 return Tree(op, makeTree(e.a), makeTree(e.b))
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
21
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
22 @register(ir.Temp)
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
23 def temp_to_tree(e):
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
24 t = Tree('REGI32')
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
25 t.value = e
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
26 return t
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
27
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
28 @register(ir.Const)
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
29 def const_to_tree(e):
354
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 323
diff changeset
30 if type(e.value) is bytes:
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 323
diff changeset
31 t = Tree('CONSTDATA')
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 323
diff changeset
32 t.value = e.value
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 323
diff changeset
33 return t
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 323
diff changeset
34 elif type(e.value) is int:
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 323
diff changeset
35 t = Tree('CONSTI32')
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 323
diff changeset
36 t.value = e.value
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 323
diff changeset
37 return t
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 323
diff changeset
38 else:
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 323
diff changeset
39 raise Exception('{} not implemented'.format(type(e.value)))
322
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
40
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
41 @register(ir.Mem)
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
42 def mem_to_tree(e):
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
43 return Tree('MEMI32', makeTree(e.e))
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
44
354
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 323
diff changeset
45 @register(ir.Addr)
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 323
diff changeset
46 def mem_to_tree(e):
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 323
diff changeset
47 return Tree('ADR', makeTree(e.e))
5477e499b039 Added some sort of string functionality
Windel Bouwman
parents: 323
diff changeset
48
322
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
49 @register(ir.Call)
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
50 def call_to_tree(e):
323
e9fe6988497c Used burg for generating expressions
Windel Bouwman
parents: 322
diff changeset
51 t = Tree('CALL')
e9fe6988497c Used burg for generating expressions
Windel Bouwman
parents: 322
diff changeset
52 t.value = e
e9fe6988497c Used burg for generating expressions
Windel Bouwman
parents: 322
diff changeset
53 return t
322
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
54
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
55 def makeTree(ir_node):
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
56 """ Transform an ir node into a tree usable for matching """
44f336460c2a Half of use of burg spec for arm
Windel Bouwman
parents:
diff changeset
57 return f_map[type(ir_node)](ir_node)