a75dc3fa7e4a127e273d1fa981d6967f6a693c8c
[soc.git] / src / soc / decoder / isa / caller.py
1 from functools import wraps
2 from soc.decoder.orderedset import OrderedSet
3 from soc.decoder.selectable_int import SelectableInt, selectconcat
4
5 def create_args(reglist, extra=None):
6 args = OrderedSet()
7 for reg in reglist:
8 args.add(reg)
9 args = list(args)
10 if extra:
11 args = [extra] + args
12 return args
13
14 class Mem:
15
16 def __init__(self):
17 self.mem = []
18 for i in range(128):
19 self.mem.append(i)
20
21 def __call__(self, addr, sz):
22 res = []
23 for s in range(sz): # TODO: big/little-end
24 res.append(SelectableInt(self.mem[addr.value + s], 8))
25 print ("memread", addr, sz, res)
26 return selectconcat(*res)
27
28 def memassign(self, addr, sz, val):
29 print ("memassign", addr, sz, val)
30 for s in range(sz):
31 byte = (val.value) >> (s*8) & 0xff # TODO: big/little-end
32 self.mem[addr.value + s] = byte
33
34
35 class GPR(dict):
36 def __init__(self, decoder, regfile):
37 dict.__init__(self)
38 self.sd = decoder
39 for i in range(32):
40 self[i] = SelectableInt(regfile[i], 64)
41
42 def __call__(self, ridx):
43 return self[ridx]
44
45 def set_form(self, form):
46 self.form = form
47
48 def getz(self, rnum):
49 #rnum = rnum.value # only SelectableInt allowed
50 print("GPR getzero", rnum)
51 if rnum == 0:
52 return SelectableInt(0, 64)
53 return self[rnum]
54
55 def _get_regnum(self, attr):
56 getform = self.sd.sigforms[self.form]
57 rnum = getattr(getform, attr)
58 return rnum
59
60 def ___getitem__(self, attr):
61 print("GPR getitem", attr)
62 rnum = self._get_regnum(attr)
63 return self.regfile[rnum]
64
65
66 class ISACaller:
67 # decoder2 - an instance of power_decoder2
68 # regfile - a list of initial values for the registers
69 def __init__(self, decoder2, regfile):
70 self.gpr = GPR(decoder2, regfile)
71 self.mem = Mem()
72 self.namespace = {'GPR': self.gpr,
73 'MEM': self.mem,
74 'memassign': self.memassign
75 }
76 self.decoder = decoder2
77
78 def memassign(self, ea, sz, val):
79 self.mem.memassign(ea, sz, val)
80
81 def call(self, name):
82 function, read_regs, uninit_regs, write_regs = self.instrs[name]
83 input_names = create_args(read_regs | uninit_regs)
84 print(input_names)
85
86 inputs = []
87 for name in input_names:
88 regnum = yield getattr(self.decoder, name)
89 print(regnum)
90 inputs.append(self.gpr(regnum))
91 print(inputs)
92 results = function(self, *inputs)
93 print(results)
94
95
96
97 def inject():
98 """ Decorator factory. """
99 def variable_injector(func):
100 @wraps(func)
101 def decorator(*args, **kwargs):
102 try:
103 func_globals = func.__globals__ # Python 2.6+
104 except AttributeError:
105 func_globals = func.func_globals # Earlier versions.
106
107 context = args[0].namespace
108 saved_values = func_globals.copy() # Shallow copy of dict.
109 func_globals.update(context)
110
111 result = func(*args, **kwargs)
112 #exec (func.__code__, func_globals)
113
114 #finally:
115 # func_globals = saved_values # Undo changes.
116
117 return result
118
119 return decorator
120
121 return variable_injector
122