move GPR and Mem to isa caller
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sat, 4 Apr 2020 19:39:54 +0000 (20:39 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Sat, 4 Apr 2020 19:39:54 +0000 (20:39 +0100)
src/soc/decoder/isa/caller.py
src/soc/decoder/power_pseudo.py

index 89917d9c715265c92878a61aa63ddc72bcdea920..b46310beeb4983aa210f5ba68503e8bff90dd848 100644 (file)
@@ -1,16 +1,71 @@
 from functools import wraps
+from soc.decoder.selectable_int import SelectableInt, selectconcat
+
+
+class Mem:
+
+    def __init__(self):
+        self.mem = []
+        for i in range(128):
+            self.mem.append(i)
+
+    def __call__(self, addr, sz):
+        res = []
+        for s in range(sz): # TODO: big/little-end
+            res.append(SelectableInt(self.mem[addr.value + s], 8))
+        print ("memread", addr, sz, res)
+        return selectconcat(*res)
+
+    def memassign(self, addr, sz, val):
+        print ("memassign", addr, sz, val)
+        for s in range(sz):
+            byte = (val.value) >> (s*8) & 0xff # TODO: big/little-end
+            self.mem[addr.value + s] = byte
+
+
+class GPR(dict):
+    def __init__(self, sd, regfile):
+        dict.__init__(self)
+        self.sd = sd
+        for i in range(32):
+            self[i] = SelectableInt(regfile[i], 64)
+
+    def __call__(self, ridx):
+        return self[ridx]
+
+    def set_form(self, form):
+        self.form = form
+
+    def getz(self, rnum):
+        #rnum = rnum.value # only SelectableInt allowed
+        print("GPR getzero", rnum)
+        if rnum == 0:
+            return SelectableInt(0, 64)
+        return self[rnum]
+
+    def _get_regnum(self, attr):
+        getform = self.sd.sigforms[self.form]
+        rnum = getattr(getform, attr)
+        return rnum
+
+    def ___getitem__(self, attr):
+        print("GPR getitem", attr)
+        rnum = self._get_regnum(attr)
+        return self.regfile[rnum]
+
 
 class ISACaller:
     def __init__(self):
-        self.gpr = {} # TODO
-        self.mem = {} # TODO
+        self.gpr = GPR()
+        self.mem = Mem()
         self.namespace = {'GPR': self.gpr,
                           'MEM': self.mem,
                           'memassign': self.memassign
                          }
 
     def memassign(self, ea, sz, val):
-        pass
+        self.mem.memassign(ea, sz, val)
+
 
 def inject(context):
     """ Decorator factory. """
index 37aa56fc4dc601b25e55e8cff82916207a00eaa6..fc3f54103e67c8c782c8260611feb4fce53743ba 100644 (file)
@@ -21,6 +21,8 @@ from nmigen import Module, Signal
 
 from soc.decoder.pseudo.parser import GardenSnakeCompiler
 from soc.decoder.selectable_int import SelectableInt, selectconcat
+from soc.decoder.isa.caller import GPR, Mem
+
 
 ####### Test code #######
 
@@ -157,58 +159,6 @@ def tolist(num):
 def get_reg_hex(reg):
     return hex(reg.value)
 
-class Mem:
-
-    def __init__(self):
-        self.mem = []
-        for i in range(128):
-            self.mem.append(i)
-
-    def __call__(self, addr, sz):
-        res = []
-        for s in range(sz): # TODO: big/little-end
-            res.append(SelectableInt(self.mem[addr.value + s], 8))
-        print ("memread", addr, sz, res)
-        return selectconcat(*res)
-
-    def memassign(self, addr, sz, val):
-        print ("memassign", addr, sz, val)
-        for s in range(sz):
-            byte = (val.value) >> (s*8) & 0xff # TODO: big/little-end
-            self.mem[addr.value + s] = byte
-
-
-class GPR(dict):
-    def __init__(self, sd, regfile):
-        dict.__init__(self)
-        self.sd = sd
-        for i in range(32):
-            self[i] = SelectableInt(regfile[i], 64)
-
-    def __call__(self, ridx):
-        return self[ridx]
-
-    def set_form(self, form):
-        self.form = form
-
-    def getz(self, rnum):
-        #rnum = rnum.value # only SelectableInt allowed
-        print("GPR getzero", rnum)
-        if rnum == 0:
-            return SelectableInt(0, 64)
-        return self[rnum]
-
-    def _get_regnum(self, attr):
-        getform = self.sd.sigforms[self.form]
-        rnum = getattr(getform, attr)
-        return rnum
-
-    def ___getitem__(self, attr):
-        print("GPR getitem", attr)
-        rnum = self._get_regnum(attr)
-        return self.regfile[rnum]
-
-
 def convert_to_python(pcode):
 
     gsc = GardenSnakeCompiler()