add memory get/set
[soc.git] / src / soc / decoder / isa / caller.py
1 from functools import wraps
2
3 class ISACaller:
4 def __init__(self):
5 self.gpr = {} # TODO
6 self.mem = {} # TODO
7 self.namespace = {'GPR': self.gpr,
8 'MEM': self.mem,
9 'memassign': self.memassign
10 }
11
12 def memassign(self, ea, sz, val):
13 pass
14
15 def inject(context):
16 """ Decorator factory. """
17 def variable_injector(func):
18 @wraps(func)
19 def decorator(*args, **kwargs):
20 try:
21 func_globals = func.__globals__ # Python 2.6+
22 except AttributeError:
23 func_globals = func.func_globals # Earlier versions.
24
25 saved_values = func_globals.copy() # Shallow copy of dict.
26 func_globals.update(context)
27
28 result = func(*args, **kwargs)
29 #exec (func.__code__, func_globals)
30
31 #finally:
32 # func_globals = saved_values # Undo changes.
33
34 return result
35
36 return decorator
37
38 return variable_injector
39
40 if __name__ == '__main__':
41 d = {'1': 1}
42 namespace = {'a': 5, 'b': 3, 'd': d}
43
44 @inject(namespace)
45 def test():
46 print (globals())
47 print('a:', a)
48 print('b:', b)
49 print('d1:', d['1'])
50 d[2] = 5
51
52 return locals()
53
54 test()
55
56 print (namespace)