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
# 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()