stronger autopep8 whitespace cleanup
[pinmux.git] / src / spec / interfaces.py
index 4e843feb72405c116bc180e999cc31709cc4bccc..17fab1656ffb5aeeb77f0a825f86e1a48ea0e836 100644 (file)
@@ -2,19 +2,20 @@
 
 from copy import deepcopy
 
+
 class Pinouts(object):
     def __init__(self):
         self.pins = {}
         self.fnspec = {}
 
     def has_key(self, k):
-        return self.pins.has_key(k)
+        return k in self.pins
 
     def add_spec(self, k, v):
         self.fnspec[k] = v
 
     def update(self, pinidx, v):
-        if not self.pins.has_key(pinidx):
+        if pinidx not in self.pins:
             self.pins[pinidx] = v
         else:
             self.pins[pinidx].update(v)
@@ -34,11 +35,30 @@ class Pinouts(object):
     def __delitem__(self, k):
         del self.pins[k]
 
+    def __getitem__(self, k):
+        return self.pins[k]
+
 
 class Pins(object):
 
     def __init__(self, fname, pingroup, bankspec, suffix, offs, bank, mux,
-             spec=None, limit=None, origsuffix=None):
+                 spec=None, limit=None, origsuffix=None):
+
+        # function type can be in, out or inout, represented by - + *
+        # strip function type out of each pin name
+        self.fntype = {}
+        for i in range(len(pingroup)):
+            pname = pingroup[i]
+            if not pname:
+                continue
+            fntype = pname[-1]
+            if fntype not in '+-*':
+                continue
+            pname = pname[:-1]
+            fntype = {'-': 'in', '+': 'out', '*': 'inout'}[fntype]
+            self.fntype[pname] = fntype
+            pingroup[i] = pname
+
         self.fname = fname
         self.pingroup = pingroup
         self.bankspec = bankspec
@@ -47,8 +67,9 @@ class Pins(object):
         self.bank = bank
         self.mux = mux
 
+        # create consistent name suffixes
         pingroup = namesuffix(fname, suffix, pingroup)
-        suffix = ''
+        suffix = ''  # hack
 
         res = {}
         names = {}
@@ -58,7 +79,7 @@ class Pins(object):
                 name_ = "%s_%s" % (name, suffix)
             else:
                 name_ = name
-            if spec and spec.has_key(name):
+            if spec and name in spec:
                 continue
             pin = {mux: (name_, bank)}
             offs_bank, offs_ = offs
@@ -74,12 +95,12 @@ class Pins(object):
                 name_ = name
             if not spec:
                 continue
-            if not spec.has_key(name):
+            if name not in spec:
                 continue
             idx_, mux_, bank_ = spec[name]
             idx_ = names[idx_]
             pin = {mux_: (name_, bank_)}
-            if res.has_key(idx_):
+            if idx_ in res:
                 res[idx_].update(pin)
             else:
                 res[idx_] = pin
@@ -88,53 +109,70 @@ class Pins(object):
 
 
 def i2s(bankspec, suffix, offs, bank, mux=1, spec=None, limit=None):
-    i2spins = ['MCK', 'BCK', 'LRCK', 'DI']
-    for i in range(4):
-        i2spins.append("DO%d" % i)
+    i2spins = ['MCK+', 'BCK+', 'LRCK+', 'DI-', 'DO+']
+    for i in range(4):
+    #    i2spins.append("DO%d+" % i)
     return Pins('IIS', i2spins, bankspec, suffix, offs, bank, mux, spec, limit,
                 origsuffix=suffix)
 
+
 def emmc(bankspec, suffix, offs, bank, mux=1, spec=None):
-    emmcpins = ['CMD', 'CLK']
+    emmcpins = ['CMD+', 'CLK+']
     for i in range(8):
-        emmcpins.append("D%d" % i)
+        emmcpins.append("D%d*" % i)
     return Pins('MMC', emmcpins, bankspec, suffix, offs, bank, mux, spec,
                 origsuffix=suffix)
 
+
 def sdmmc(bankspec, suffix, offs, bank, mux=1, spec=None,
-                start=None, limit=None):
-    sdmmcpins = ['CMD', 'CLK']
+          start=None, limit=None):
+    sdmmcpins = ['CMD+', 'CLK+']
     for i in range(4):
-        sdmmcpins.append("D%d" % i)
+        sdmmcpins.append("D%d*" % i)
     sdmmcpins = sdmmcpins[start:limit]
     return Pins('SD', sdmmcpins, bankspec, suffix, offs, bank, mux, spec,
                 origsuffix=suffix)
 
+
 def spi(bankspec, suffix, offs, bank, mux=1, spec=None):
-    spipins = ['CLK', 'NSS', 'MOSI', 'MISO', 'NSS']
+    spipins = ['CLK*', 'NSS*', 'MOSI*', 'MISO*']
     return Pins('SPI', spipins, bankspec, suffix, offs, bank, mux, spec,
                 origsuffix=suffix)
 
+
 def quadspi(bankspec, suffix, offs, bank, mux=1, spec=None, limit=None):
-    spipins = ['CK', 'NSS', 'IO0', 'IO1', 'IO2', 'IO3']
-    return Pins('QSPI', spipins, bankspec, suffix, offs, bank, mux, spec, limit,
-                origsuffix=suffix)
+    spipins = ['CK*', 'NSS*', 'IO0*', 'IO1*', 'IO2*', 'IO3*']
+    return Pins(
+        'QSPI',
+        spipins,
+        bankspec,
+        suffix,
+        offs,
+        bank,
+        mux,
+        spec,
+        limit,
+        origsuffix=suffix)
+
 
 def i2c(bankspec, suffix, offs, bank, mux=1, spec=None):
-    spipins = ['SDA', 'SCL']
+    spipins = ['SDA*', 'SCL*']
     return Pins('TWI', spipins, bankspec, suffix, offs, bank, mux, spec,
                 origsuffix=suffix)
 
+
 def jtag(bankspec, suffix, offs, bank, mux=1, spec=None):
-    uartpins = ['MS', 'DI', 'DO', 'CK']
-    return Pins('JTAG', uartpins, bankspec, suffix, offs, bank, mux, spec,
+    jtagpins = ['MS+', 'DI-', 'DO+', 'CK+']
+    return Pins('JTAG', jtagpins, bankspec, suffix, offs, bank, mux, spec,
                 origsuffix=suffix)
 
+
 def uart(bankspec, suffix, offs, bank, mux=1, spec=None):
-    uartpins = ['TX', 'RX']
+    uartpins = ['TX+', 'RX-']
     return Pins('UART', uartpins, bankspec, suffix, offs, bank, mux, spec,
                 origsuffix=suffix)
 
+
 def namesuffix(name, suffix, namelist):
     names = []
     for n in namelist:
@@ -144,348 +182,143 @@ def namesuffix(name, suffix, namelist):
             names.append("%s_%s" % (name, suffix))
     return names
 
+
 def ulpi(bankspec, suffix, offs, bank, mux=1, spec=None):
-    ulpipins = ['CK', 'DIR', 'STP', 'NXT']
+    ulpipins = ['CK+', 'DIR+', 'STP+', 'NXT+']
     for i in range(8):
-        ulpipins.append('D%d' % i)
+        ulpipins.append('D%d*' % i)
     return Pins('ULPI', ulpipins, bankspec, suffix, offs, bank, mux, spec,
                 origsuffix=suffix)
 
+
 def uartfull(bankspec, suffix, offs, bank, mux=1, spec=None):
-    uartpins = ['TX', 'RX', 'CTS', 'RTS']
+    uartpins = ['TX+', 'RX-', 'CTS-', 'RTS+']
     return Pins('UARTQ', uartpins, bankspec, suffix, offs, bank, mux, spec,
                 origsuffix=suffix)
 
+
 def rgbttl(bankspec, suffix, offs, bank, mux=1, spec=None):
-    ttlpins = ['CK', 'DE', 'HS', 'VS']
+    ttlpins = ['CK+', 'DE+', 'HS+', 'VS+']
     for i in range(24):
-        ttlpins.append("D%d" % i)
+        ttlpins.append("D%d+" % i)
     return Pins('LCD', ttlpins, bankspec, suffix, offs, bank, mux, spec,
                 origsuffix=suffix)
 
+
 def rgmii(bankspec, suffix, offs, bank, mux=1, spec=None):
     buspins = []
     for i in range(4):
-        buspins.append("ERXD%d" % i)
+        buspins.append("ERXD%d-" % i)
     for i in range(4):
-        buspins.append("ETXD%d" % i)
-    buspins += ['ERXCK', 'ERXERR', 'ERXDV',
-                'EMDC', 'EMDIO',
-                'ETXEN', 'ETXCK', 'ECRS',
-                'ECOL', 'ETXERR']
+        buspins.append("ETXD%d+" % i)
+    buspins += ['ERXCK-', 'ERXERR-', 'ERXDV-',
+                'EMDC+', 'EMDIO*',
+                'ETXEN+', 'ETXCK+', 'ECRS-',
+                'ECOL+', 'ETXERR+']
     return Pins('RG', buspins, bankspec, suffix, offs, bank, mux, spec,
                 origsuffix=suffix)
 
+
 def flexbus1(bankspec, suffix, offs, bank, mux=1, spec=None, limit=None):
     buspins = []
     for i in range(8):
-        buspins.append("AD%d" % i)
+        buspins.append("AD%d*" % i)
     for i in range(2):
-        buspins.append("CS%d" % i)
-    buspins += ['ALE', 'OE', 'RW', 'TA', 'CLK',
+        buspins.append("CS%d+" % i)
+    buspins += ['ALE', 'OE', 'RW', 'TA', 'CLK+',
                 'A0', 'A1', 'TS', 'TBST',
                 'TSIZ0', 'TSIZ1']
     for i in range(4):
         buspins.append("BWE%d" % i)
-    for i in range(2,6):
-        buspins.append("CS%d" % i)
+    for i in range(2, 6):
+        buspins.append("CS%d+" % i)
     return Pins('FB', buspins, bankspec, suffix, offs, bank, mux, spec, limit,
                 origsuffix=suffix)
 
+
 def flexbus2(bankspec, suffix, offs, bank, mux=1, spec=None, limit=None):
     buspins = []
-    for i in range(8,32):
-        buspins.append("AD%d" % i)
+    for i in range(8, 32):
+        buspins.append("AD%d*" % i)
     return Pins('FB', buspins, bankspec, suffix, offs, bank, mux, spec, limit,
                 origsuffix=suffix)
 
+
 def sdram1(bankspec, suffix, offs, bank, mux=1, spec=None):
     buspins = []
     for i in range(16):
-        buspins.append("SDRDQM%d" % i)
+        buspins.append("SDRDQM%d*" % i)
     for i in range(12):
-        buspins.append("SDRAD%d" % i)
+        buspins.append("SDRAD%d+" % i)
     for i in range(8):
-        buspins.append("SDRDQ%d" % i)
+        buspins.append("SDRDQ%d+" % i)
     for i in range(3):
-        buspins.append("SDRCS%d#" % i)
+        buspins.append("SDRCS%d#+" % i)
     for i in range(2):
-        buspins.append("SDRDQ%d" % i)
+        buspins.append("SDRDQ%d+" % i)
     for i in range(2):
-        buspins.append("SDRBA%d" % i)
-    buspins += ['SDRCKE', 'SDRRAS#', 'SDRCAS#', 'SDRWE#',
-                'SDRRST']
+        buspins.append("SDRBA%d+" % i)
+    buspins += ['SDRCKE+', 'SDRRAS#+', 'SDRCAS#+', 'SDRWE#+',
+                'SDRRST+']
     return Pins('SDR', buspins, bankspec, suffix, offs, bank, mux, spec,
                 origsuffix=suffix)
 
+
 def sdram2(bankspec, suffix, offs, bank, mux=1, spec=None, limit=None):
     buspins = []
-    for i in range(3,6):
-        buspins.append("SDRCS%d#" % i)
-    for i in range(8,32):
-        buspins.append("SDRDQ%d" % i)
+    for i in range(3, 6):
+        buspins.append("SDRCS%d#+" % i)
+    for i in range(8, 32):
+        buspins.append("SDRDQ%d*" % i)
     return Pins('SDR', buspins, bankspec, suffix, offs, bank, mux, spec, limit,
                 origsuffix=suffix)
 
+
 def mcu8080(bankspec, suffix, offs, bank, mux=1, spec=None):
     buspins = []
     for i in range(8):
-        buspins.append("MCUD%d" % i)
+        buspins.append("MCUD%d*" % i)
     for i in range(8):
-        buspins.append("MCUAD%d" % (i+8))
+        buspins.append("MCUAD%d+" % (i + 8))
     for i in range(6):
-        buspins.append("MCUCS%d" % i)
+        buspins.append("MCUCS%d+" % i)
     for i in range(2):
-        buspins.append("MCUNRB%d" % i)
-    buspins += ['MCUCD', 'MCURD', 'MCUWR', 'MCUCLE', 'MCUALE',
-                'MCURST']
+        buspins.append("MCUNRB%d+" % i)
+    buspins += ['MCUCD+', 'MCURD+', 'MCUWR+', 'MCUCLE+', 'MCUALE+',
+                'MCURST+']
     return Pins('MCU', buspins, bankspec, suffix, offs, bank, mux, spec,
                 origsuffix=suffix)
 
+
 def _pinbank(bankspec, prefix, suffix, offs, bank, gpiooffs, gpionum=1, mux=1,
              spec=None):
     gpiopins = []
-    for i in range(gpiooffs, gpiooffs+gpionum):
-        gpiopins.append("%s%d" % (bank, i))
-    return Pins('GPIO', gpiopins, bankspec, suffix, offs, bank, mux, spec,
+    for i in range(gpiooffs, gpiooffs + gpionum):
+        gpiopins.append("%s%d*" % (bank, i))
+    return Pins(prefix, gpiopins, bankspec, suffix, offs, bank, mux, spec,
                 origsuffix=suffix)
 
+
 def eint(bankspec, suffix, offs, bank, gpiooffs, gpionum=1, mux=1, spec=None):
     gpiopins = []
-    for i in range(gpiooffs, gpiooffs+gpionum):
-        gpiopins.append("%d" % (i))
+    for i in range(gpiooffs, gpiooffs + gpionum):
+        gpiopins.append("%d*" % (i))
     return Pins('EINT', gpiopins, bankspec, suffix, offs, bank, mux, spec,
                 origsuffix=suffix)
 
-def pwm(bankspec, suffix, offs, bank, mux=1, spec=None):
-    return Pins('PWM', ['', ], bankspec, suffix, offs, bank, mux, spec,
+
+def pwm(bankspec, suffix, offs, bank, pwmoffs, pwmnum=1, mux=1, spec=None):
+    pwmpins = []
+    for i in range(pwmoffs, pwmoffs + pwmnum):
+        pwmpins.append("%d+" % (i))
+    return Pins('PWM', pwmpins, bankspec, suffix, offs, bank, mux, spec,
                 origsuffix=suffix)
 
+
 def gpio(bankspec, suffix, offs, bank, gpiooffs, gpionum=1, mux=1, spec=None):
-    return _pinbank(bankspec, "GPIO", suffix, offs, bank, gpiooffs,
+    return _pinbank(bankspec, "GPIO%s" % bank, suffix, offs, bank, gpiooffs,
                               gpionum, mux=0, spec=None)
 
-def display(pins):
-    print "| Pin | Mux0        | Mux1        | Mux2        | Mux3        |"
-    print "| --- | ----------- | ----------- | ----------- | ----------- |"
-    pinidx = pins.keys()
-    pinidx.sort()
-    for pin in pinidx:
-        pdata = pins.get(pin)
-        res = '| %3d |' % pin
-        for mux in range(4):
-            if not pdata.has_key(mux):
-                res += "             |"
-                continue
-            name, bank = pdata[mux]
-            res += " %s %-9s |" % (bank, name)
-        print res
-
-def fnsplit(f):
-    a = ''
-    n = 0
-    if not f.startswith('FB_'):
-        f2 = f.split('_')
-        if len(f2) == 2:
-            if f2[1].isdigit():
-                return f2[0], int(f2[1])
-            return f2[0], f2[1]
-    #print f
-    while f and not f[0].isdigit():
-        a += f[0]
-        f = f[1:]
-    return a, int(f) if f else None
-
-def fnsort(f1, f2):
-    a1, n1 = fnsplit(f1)
-    a2, n2 = fnsplit(f2)
-    x = cmp(a1, a2)
-    if x != 0:
-        return x
-    return cmp(n1, n2)
-    
-def find_fn(fname, names):
-    for n in names:
-        if fname.startswith(n):
-            return n
-
-def display_fns(bankspec, pins, function_names):
-    fn_names = function_names.keys()
-    fns = {}
-    for (pin, pdata) in pins.items():
-        for mux in range(1,4): # skip GPIO for now
-            if not pdata.has_key(mux):
-                continue
-            name, bank = pdata[mux]
-            assert name != None, str(bank)
-            if not fns.has_key(name):
-                fns[name] = []
-            fns[name].append((pin-bankspec[bank], mux, bank))
-
-    fnidx = fns.keys()
-    fnidx.sort(fnsort)
-    current_fn = None
-    for fname in fnidx:
-        fnbase = find_fn(fname, fn_names)
-        #print "name", fname, fnbase
-        if fnbase != current_fn:
-            if current_fn is not None:
-                print
-            print "## %s" % fnbase
-            print
-            print function_names[fnbase]
-            print
-            current_fn = fnbase
-        print "* %-9s :" % fname,
-        for (pin, mux, bank) in fns[fname]:
-            print "%s%d/%d" % (bank, pin, mux),
-        print
-
-    return fns
-
-def check_functions(title, bankspec, fns, pins, required, eint, pwm,
-                    descriptions=None):
-    fns = deepcopy(fns)
-    pins = deepcopy(pins)
-    if descriptions is None:
-        descriptions = {}
-
-    print "# Pinmap for %s" % title
-    print
-
-
-    for name in required:
-        print "## %s" % name
-        print
-        if descriptions and descriptions.has_key(name):
-            print descriptions[name]
-            print
-
-        name = name.split(':')
-        if len(name) == 2:
-            findbank = name[0][0]
-            findmux = int(name[0][1:])
-            name = name[1]
-        else:
-            name = name[0]
-            findbank = None
-            findmux = None
-        name = name.split('/')
-        if len(name) == 2:
-            count = int(name[1])
-        else:
-            count = 100000
-        name = name[0]
-        found = set()
-        fnidx = fns.keys()
-        #fnidx.sort(fnsort)
-        pinfound = {}
-        for fname in fnidx:
-            if not fname.startswith(name):
-                continue
-            for pin, mux, bank in fns[fname]:
-                if findbank is not None:
-                    if findbank != bank:
-                        continue
-                    if findmux != mux:
-                        continue
-                pin_ = pin + bankspec[bank]
-                if pins.has_key(pin_):
-                    pinfound[pin_] = (fname, pin_, bank, pin, mux)
-
-        pinidx = pinfound.keys()
-        pinidx.sort()
-
-        for pin_ in pinidx:
-            fname, pin_, bank, pin, mux = pinfound[pin_]
-            if fname in found:
-                continue
-            found.add(fname)
-            if len(found) > count:
-                continue
-            del pins[pin_]
-            print "* %s %d %s%d/%d" % (fname, pin_, bank, pin, mux)
-
-        print
-
-    # gpios
-    gpios = []
-    for name in descriptions.keys():
-        if not name.startswith('GPIO'):
-            continue
-        if name == 'GPIO':
-            continue
-        gpios.append(name)
-    gpios.sort()
-    
-    if gpios:
-        print "## GPIO"
-        print
-
-        for fname in gpios:
-            if fname in found:
-                continue
-            desc = ''
-            if descriptions and descriptions.has_key(fname):
-                desc = ': %s' % descriptions[fname]
-            bank = fname[4]
-            pin = int(fname[5:])
-            pin_ = pin + bankspec[bank]
-            if not pins.has_key(pin_):
-                continue
-            del pins[pin_]
-            found.add(fname)
-            print "* %-8s %d %s%-2d %s" % (fname, pin_, bank, pin, desc)
-        print
-
-    if eint:
-        display_group(bankspec, "EINT", eint, fns, pins, descriptions)
-    if pwm:
-        display_group(bankspec, "PWM", pwm, fns, pins, descriptions)
-
-    print "## Unused Pinouts (spare as GPIO) for '%s'" % title
-    print
-    if descriptions and descriptions.has_key('GPIO'):
-        print descriptions['GPIO']
-        print 
-    display(pins)
-    print
-
-    return pins # unused
-
-def display_group(bankspec, title, todisplay, fns, pins, descriptions):
-    print "## %s" % title
-    print
-
-    found = set()
-    for fname in todisplay:
-        desc = ''
-        if descriptions and descriptions.has_key(fname):
-            desc = ': %s' % descriptions[fname]
-        fname = fname.split(':')
-        if len(fname) == 2:
-            findbank = fname[0][0]
-            findmux = int(fname[0][1:])
-            fname = fname[1]
-        else:
-            fname = fname[0]
-            findbank = None
-            findmux = None
-        for (pin, mux, bank) in fns[fname]:
-            if findbank is not None:
-                if findbank != bank:
-                    continue
-                if findmux != mux:
-                    continue
-            if fname in found:
-                continue
-            pin_ = pin + bankspec[bank]
-            if not pins.has_key(pin_):
-                continue
-            del pins[pin_]
-            found.add(fname)
-            print "* %s %d %s%d/%d %s" % (fname, pin_, bank, pin, mux, desc)
-    print
 
 def pinmerge(pins, fn):
     # hack, store the function specs in the pins dict
@@ -497,47 +330,28 @@ def pinmerge(pins, fn):
         pins.fnspec = pins
     if fname == 'GPIO':
         fname = fname + bank
-    assert not pins.has_key('EINT')
-    if not pins.fnspec.has_key(fname):
+    assert 'EINT' not in pins
+    if fname not in pins.fnspec:
         pins.add_spec(fname, {})
     print "fname bank suffix", fname, bank, suffix
     if suffix or fname == 'EINT' or fname == 'PWM':
         specname = fname + suffix
     else:
         specname = fname + bank
-    pins.fnspec[fname][specname] = fn
-
+    if specname in pins.fnspec[fname]:
+        # ok so some declarations may bring in different
+        # names at different stages (EINT, PWM, flexbus1/2)
+        # so we have to merge the names in.  main thing is
+        # the pingroup
+        tomerge = pins.fnspec[fname][specname]
+        for p in fn.pingroup:
+            if p not in tomerge.pingroup:
+                tomerge.pingroup.append(p)
+        tomerge.pins.update(fn.pins)
+        tomerge.fntype.update(fn.fntype)
+    else:
+        pins.fnspec[fname][specname] = deepcopy(fn)
 
     # merge actual pins
     for (pinidx, v) in fn.pins.items():
-        print "pinidx", pinidx
         pins.update(pinidx, v)
-
-def display_fixed(fixed, offs):
-
-    fkeys = fixed.keys()
-    fkeys.sort()
-    pin_ = offs
-    for pin, k in enumerate(fkeys):
-        print "## %s" % k
-        print
-        prevname = ''
-        linecount = 0
-        for name in fixed[k]:
-            if linecount == 4:
-                linecount = 0
-                print
-            if prevname[:2] == name[:2] and linecount != 0:
-                print name,
-                linecount += 1
-            else:
-                if linecount != 0:
-                    print
-                print "* %d: %d %s" % (pin_, pin, name),
-                linecount = 1
-            prevname = name
-            pin_ += 1
-        if linecount != 0:
-            print
-        print
-