source: proto/Compiler/mkast.py @ 3695

Last change on this file since 3695 was 3452, checked in by cameron, 6 years ago

Clean out mkCall in favor of mkast.call, add C mode framework for mkast.call

File size: 2.3 KB
Line 
1#
2# mkast.py
3#
4# Helpers for making Python AST objects
5#
6# Robert D. Cameron
7# April 13, 2013
8# Licensed under Open Software License 3.0
9#
10import ast
11
12use_C_syntax = False
13
14C_map = {"esimd<%i>::mergeh" : "simd_mergeh_%i",
15         "bitblock::any" : "bitblock_has_bit",
16         "print_register<BitBlock>" : "print_bitblock"}
17
18def map_if_C(str):
19        if not use_C_syntax: return str
20        if not C_map.has_key(str): return str
21        return C_map[str]
22#
23# Helper functions
24#
25def TestHelper_Bitblock_Or(testExpr, bitBlockExpr):
26    if isinstance(testExpr, ast.Call):
27      assert isinstance(testExpr.func, ast.Name)
28      assert testExpr.func.id == 'bitblock::any' or testExpr.func.id == 'bitblock_has_bit' 
29      testExpr.args[0] = call('simd_or', [bitBlockExpr, testExpr.args[0]])
30      return testExpr
31    else:
32      return ast.BinOp(testExpr, ast.BitOr(), call(map_if_C('bitblock::any'), [bitBlockExpr]))
33
34def TestHelper_Integer_Or(testExpr, intExpr):
35    return ast.BinOp(testExpr, ast.BitOr(), intExpr)
36
37def var(v, mode=ast.Load()):
38  if isinstance(v, str): 
39        v = ast.Name(v, mode)
40  return v
41 
42def assign(var, expr):
43   if isinstance(var, str): 
44        var = ast.Name(var, ast.Store())
45   return ast.Assign([var], expr)
46
47def index(var, num, mode=ast.Load()):
48  if isinstance(var, str): 
49        var = ast.Name(var, ast.Load())
50  return ast.Subscript(var, ast.Index(ast.Num(num)), mode)
51
52def index_store(var, num):
53  if isinstance(var, str): 
54        var = ast.Name(var, ast.Load())
55  return ast.Subscript(var, ast.Index(ast.Num(num)), ast.Store())
56
57def att(var, att, mode=ast.Load()):
58  if isinstance(var, str): 
59        var = ast.Name(var, ast.Load())
60  return ast.Attribute(var, att, mode)
61
62def att_store(var, att):
63  if isinstance(var, str): 
64        var = ast.Name(var, ast.Load())
65  return ast.Attribute(var, att, ast.Store())
66
67def call(fn_name, args):
68  if isinstance(fn_name, str): 
69        fn_name = ast.Name(fn_name, ast.Load())
70  return ast.Call(map_if_C(fn_name), args, [], None, None)
71
72def callStmt(fn_name, args):
73  if isinstance(fn_name, str): fn_name = ast.Name(fn_name, ast.Load())
74  return ast.Expr(ast.Call(map_if_C(fn_name), args, [], None, None))
75
76def mergeh(fw, x, y):
77  return call(map_if_C("esimd<%i>::mergeh") % fw, [var(x), var(y)])
78
79def zero(fw):
80  return call(map_if_C("simd<%i>::constant<0>") % fw, [])
81
82def Qname(obj, field):
83  return ast.Attribute(ast.Name(obj, ast.Load()), field, ast.Load())
84
85
Note: See TracBrowser for help on using the repository browser.