From 171e9d05eabfd0fb522ae3ba7902996dbf3bf5d3 Mon Sep 17 00:00:00 2001 From: Dan White Date: Sun, 8 Apr 2012 16:40:07 -0500 Subject: [PATCH] usbio.py: add mux classes --- python-lib/usbio.py | 83 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 81 insertions(+), 2 deletions(-) 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() -- 2.25.1