usbio.py: add mux classes
authorDan White <dan@whiteaudio.com>
Sun, 8 Apr 2012 21:40:07 +0000 (16:40 -0500)
committerDan White <dan@whiteaudio.com>
Sun, 8 Apr 2012 21:40:07 +0000 (16:40 -0500)
python-lib/usbio.py

index b0ee15a9f9381aea149d3f97fa57a1e1472d1143..758e51b4f75f40b7ee3b1b29581a9dc4e7850568 100644 (file)
@@ -201,6 +201,25 @@ class OTA(object):
         self._word[a:b] = v
 
 
+class MuxOTA(OTA):
+    """Cast bits cint and zero as the mode.  Bit se is unused."""
+    MODE_SHIFT = 14
+    MODE_WIDTH = 2
+
+    @property
+    def mode(self):
+        b = self.MODE_SHIFT
+        a = b + self.MODE_WIDTH
+        return self._word[a:b]
+
+    @mode.setter
+    def mode(self, value):
+        v = intbv(value, max=2**self.MODE_WIDTH)
+        b = self.MODE_SHIFT
+        a = b + self.MODE_WIDTH
+        self._word[a:b] = v
+
+
 class Harmonic(object):
     HARMONIC_WIDTH = 48
     CAL_POS = 47
@@ -263,12 +282,72 @@ class Chain(object):
         # TODO: check ordering WRT Chain0Ctl mux
         for h in self.h:
             data.extend(h.bytes)
-        return data
+        return tuple(data)
 
 
 class Mux(object):
+    MUX_WIDTH = 48
+    SEL_WIDTH = 6
+    MODE_WIDTH = 2
+    SEL_A_SHIFT = 40
+    SEL_B_SHIFT = 32
+    OTA_A_SHIFT = 16
+    OTA_B_SHIFT = 0
+
+    # mode symbols
+    MUX_CMP = 0
+    MUX_BUF = 1
+    CAL_CMP = 2
+    CAL_BUF = 3
+
     def __init__(self):
-        self.sel = 0
+        self._word = intbv(0)[self.MUX_WIDTH:]
+        self._selA = intbv(48, max=2**self.SEL_WIDTH) #select CMI
+        self._selB = intbv(48, max=2**self.SEL_WIDTH) #select CMI
+        self.otaA = MuxOTA()
+        self.otaB = MuxOTA()
+        self.otaA.mode = self.MUX_BUF
+        self.otaB.mode = self.MUX_BUF
+        self.ota = (self.otaA, self.otaB)
+
+    @property
+    def selA(self):
+        return self._selA
+
+    @selA.setter
+    def selA(self, value):
+        v = intbv(value, max=2**self.SEL_WIDTH)
+        self._selA = v
+
+    @property
+    def selB(self):
+        return self._selB
+
+    @selB.setter
+    def selB(self, value):
+        v = intbv(value, max=2**self.SEL_WIDTH)
+        self._selB = v
+
+    @property
+    def word(self):
+        """Construct and return the composite control word."""
+        oa = self.otaA.word
+        ob = self.otaB.word
+        self._word = intbv(0)[self.MUX_WIDTH:]
+        self._word += (self.selA << self.SEL_A_SHIFT)
+        self._word += (self.selB << self.SEL_B_SHIFT)
+        self._word += (oa << self.OTA_A_SHIFT)
+        self._word += (ob << self.OTA_B_SHIFT)
+        return self._word
+
+    @property
+    def bytes(self):
+        """Return the control data as a byte sequence in MSB..LSB order."""
+        w = self.word
+        b = [w[i:i-8] for i in range(self.MUX_WIDTH, 0, -8)]
+        return tuple(b)
+
+
 
 
 o = OTA()