From: Dan White Date: Sun, 8 Apr 2012 21:40:07 +0000 (-0500) Subject: usbio.py: add mux classes X-Git-Tag: calibrations~117 X-Git-Url: http://git.whiteaudio.com/gitweb/?a=commitdiff_plain;h=171e9d05eabfd0fb522ae3ba7902996dbf3bf5d3;p=430.git usbio.py: add mux classes --- diff --git a/python-lib/usbio.py b/python-lib/usbio.py index b0ee15a..758e51b 100644 --- a/python-lib/usbio.py +++ b/python-lib/usbio.py @@ -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()