add dump function for regs
[soc.git] / src / soc / decoder / isa / caller.py
index b46310beeb4983aa210f5ba68503e8bff90dd848..d83d3354d8575821d20f50a67fafa10a28e026f7 100644 (file)
@@ -1,6 +1,15 @@
 from functools import wraps
+from soc.decoder.orderedset import OrderedSet
 from soc.decoder.selectable_int import SelectableInt, selectconcat
 
+def create_args(reglist, extra=None):
+    args = OrderedSet()
+    for reg in reglist:
+        args.add(reg)
+    args = list(args)
+    if extra:
+        args = [extra] + args
+    return args
 
 class Mem:
 
@@ -24,9 +33,9 @@ class Mem:
 
 
 class GPR(dict):
-    def __init__(self, sd, regfile):
+    def __init__(self, decoder, regfile):
         dict.__init__(self)
-        self.sd = sd
+        self.sd = decoder
         for i in range(32):
             self[i] = SelectableInt(regfile[i], 64)
 
@@ -53,21 +62,53 @@ class GPR(dict):
         rnum = self._get_regnum(attr)
         return self.regfile[rnum]
 
+    def dump(self):
+        for i in range(len(self)):
+            print("reg", i, hex(self[i].value))
+
+
 
 class ISACaller:
-    def __init__(self):
-        self.gpr = GPR()
+    # decoder2 - an instance of power_decoder2
+    # regfile - a list of initial values for the registers
+    def __init__(self, decoder2, regfile):
+        self.gpr = GPR(decoder2, regfile)
         self.mem = Mem()
         self.namespace = {'GPR': self.gpr,
                           'MEM': self.mem,
                           'memassign': self.memassign
-                         }
+                          }
+        self.decoder = decoder2
 
     def memassign(self, ea, sz, val):
         self.mem.memassign(ea, sz, val)
 
+    def prep_namespace(self):
+        si = yield self.decoder.SI
+        self.namespace.SI = SelectableInt(si, bits=16)
+
+    def call(self, name):
+        function, read_regs, uninit_regs, write_regs = self.instrs[name]
+        input_names = create_args(read_regs | uninit_regs)
+        print(input_names)
+
+        inputs = []
+        for name in input_names:
+            regnum = yield getattr(self.decoder, name)
+            print('reading reg %d' % regnum)
+            inputs.append(self.gpr(regnum))
+        print(inputs)
+        results = function(self, *inputs)
+        print(results)
 
-def inject(context):
+        output_names = create_args(write_regs)
+        for name, output in zip(output_names, results):
+            regnum = yield getattr(self.decoder, name)
+            print('writing reg %d' % regnum)
+            self.gpr[regnum] = output
+
+
+def inject():
     """ Decorator factory. """
     def variable_injector(func):
         @wraps(func)
@@ -77,6 +118,7 @@ def inject(context):
             except AttributeError:
                 func_globals = func.func_globals  # Earlier versions.
 
+            context = args[0].namespace
             saved_values = func_globals.copy()  # Shallow copy of dict.
             func_globals.update(context)
 
@@ -92,20 +134,3 @@ def inject(context):
 
     return variable_injector
 
-if __name__ == '__main__':
-    d = {'1': 1}
-    namespace = {'a': 5, 'b': 3, 'd': d}
-
-    @inject(namespace)
-    def test():
-        print (globals())
-        print('a:', a)
-        print('b:', b)
-        print('d1:', d['1'])
-        d[2] = 5
-        
-        return locals()
-
-    test()
-
-    print (namespace)