split out interfaces to separate module
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Fri, 9 Mar 2018 05:25:26 +0000 (05:25 +0000)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Fri, 9 Mar 2018 05:25:37 +0000 (05:25 +0000)
shakti/i_class/interfaces.py [new file with mode: 0644]
shakti/i_class/pinouts.py

diff --git a/shakti/i_class/interfaces.py b/shakti/i_class/interfaces.py
new file mode 100644 (file)
index 0000000..ee18593
--- /dev/null
@@ -0,0 +1,457 @@
+#!/usr/bin/env python
+
+from copy import deepcopy
+
+def pins(pingroup, bankspec, suffix, offs, bank, mux, spec=None, limit=None):
+    res = {}
+    names = {}
+    idx = 0
+    for name in pingroup[:limit]:
+        if suffix:
+            name_ = "%s_%s" % (name, suffix)
+        else:
+            name_ = name
+        if spec and spec.has_key(name):
+            continue
+        pin = {mux: (name_, bank)}
+        offs_bank, offs_ = offs
+        idx_ = offs_ + idx
+        idx += 1
+        idx_ += bankspec[bank]
+        res[idx_] = pin
+        names[name] = idx_
+    for name in pingroup:
+        if suffix:
+            name_ = "%s_%s" % (name, suffix)
+        else:
+            name_ = name
+        if not spec:
+            continue
+        if not spec.has_key(name):
+            continue
+        idx_, mux_, bank_ = spec[name]
+        idx_ = names[idx_]
+        #idx_ += bankspec[bank_]
+        pin = {mux_: (name_, bank_)}
+        if res.has_key(idx_):
+            res[idx_].update(pin)
+        else:
+            res[idx_] = pin
+    return res
+
+def i2s(bankspec, suffix, offs, bank, mux=1, spec=None, limit=None):
+    i2spins = ['IISMCK', 'IISBCK', 'IISLRCK', 'IISDI']
+    for i in range(4):
+        i2spins.append("IISDO%d" % i)
+    return pins(i2spins, bankspec, suffix, offs, bank, mux, spec, limit)
+
+def emmc(bankspec, suffix, offs, bank, mux=1, spec=None):
+    emmcpins = ['MMCCMD', 'MMCCLK']
+    for i in range(8):
+        emmcpins.append("MMCD%d" % i)
+    return pins(emmcpins, bankspec, suffix, offs, bank, mux, spec)
+
+def sdmmc(bankspec, suffix, offs, bank, mux=1, spec=None,
+                start=None, limit=None):
+    sdmmcpins = ['CMD', 'CLK']
+    for i in range(4):
+        sdmmcpins.append("D%d" % i)
+    sdmmcpins = sdmmcpins[start:limit]
+    sdmmcpins = namesuffix('SD', suffix, sdmmcpins)
+    return pins(sdmmcpins, bankspec, '', offs, bank, mux, spec)
+
+def spi(bankspec, suffix, offs, bank, mux=1, spec=None):
+    spipins = namesuffix('SPI', suffix,
+                ['CLK', 'NSS', 'MOSI', 'MISO', 'NSS'])
+    return pins(spipins, bankspec, '', offs, bank, mux, spec)
+
+def quadspi(bankspec, suffix, offs, bank, mux=1, spec=None, limit=None):
+    spipins = namesuffix('SPI', suffix,
+                ['CK', 'NSS', 'IO0', 'IO1', 'IO2', 'IO3'])
+    return pins(spipins, bankspec, '', offs, bank, mux, spec, limit)
+
+def i2c(bankspec, suffix, offs, bank, mux=1, spec=None):
+    spipins = namesuffix('TWI', suffix,
+                ['SDA', 'SCL'])
+    return pins(spipins, bankspec, '', offs, bank, mux, spec)
+
+def jtag(bankspec, suffix, offs, bank, mux=1, spec=None):
+    uartpins = namesuffix('JTAG', suffix, ['MS', 'DI', 'DO', 'CK'])
+    return pins(uartpins, bankspec, '', offs, bank, mux, spec)
+
+def uart(bankspec, suffix, offs, bank, mux=1, spec=None):
+    uartpins = namesuffix('UART', suffix, ['TX', 'RX'])
+    return pins(uartpins, bankspec, '', offs, bank, mux, spec)
+
+def namesuffix(name, suffix, namelist):
+    names = []
+    for n in namelist:
+        names.append("%s%s_%s" % (name, suffix, n))
+    return names
+
+def ulpi(bankspec, suffix, offs, bank, mux=1, spec=None):
+    ulpipins = namesuffix('ULPI', suffix, ['CK', 'DIR', 'STP', 'NXT'])
+    for i in range(8):
+        ulpipins.append('ULPI%s_D%d' % (suffix, i))
+    return pins(ulpipins, bankspec, "", offs, bank, mux, spec)
+
+def uartfull(bankspec, suffix, offs, bank, mux=1, spec=None):
+    uartpins = namesuffix('UART', suffix, ['TX', 'RX', 'CTS', 'RTS'])
+    return pins(uartpins, bankspec, '', offs, bank, mux, spec)
+
+def rgbttl(bankspec, suffix, offs, bank, mux=1, spec=None):
+    ttlpins = ['LCDCK', 'LCDDE', 'LCDHS', 'LCDVS']
+    for i in range(24):
+        ttlpins.append("LCD%d" % i)
+    return pins(ttlpins, bankspec, suffix, offs, bank, mux, spec)
+
+def rgmii(bankspec, suffix, offs, bank, mux=1, spec=None):
+    buspins = []
+    for i in range(4):
+        buspins.append("RG_ERXD%d" % i)
+    for i in range(4):
+        buspins.append("RG_ETXD%d" % i)
+    for i in range(2):
+        buspins.append("RG_FB_CS%d" % i)
+    buspins += ['RG_ERXCK', 'RG_ERXERR', 'RG_ERXDV',
+                'RG_EMDC', 'RG_EMDIO',
+                'RG_ETXEN', 'RG_ETXCK', 'RG_ECRS',
+                'RG_ECOL', 'RG_ETXERR']
+    return pins(buspins, bankspec, suffix, offs, bank, mux, spec)
+
+def flexbus1(bankspec, suffix, offs, bank, mux=1, spec=None, limit=None):
+    buspins = []
+    for i in range(8):
+        buspins.append("FB_AD%d" % i)
+    for i in range(2):
+        buspins.append("FB_CS%d" % i)
+    buspins += ['FB_ALE', 'FB_OE', 'FB_RW', 'FB_TA', 'FB_CLK',
+                'FB_A0', 'FB_A1', 'FB_TS', 'FB_TBST',
+                'FB_TSIZ0', 'FB_TSIZ1']
+    for i in range(4):
+        buspins.append("FB_BWE%d" % i)
+    for i in range(2,6):
+        buspins.append("FB_CS%d" % i)
+    return pins(buspins, bankspec, suffix, offs, bank, mux, spec, limit)
+
+def flexbus2(bankspec, suffix, offs, bank, mux=1, spec=None, limit=None):
+    buspins = []
+    for i in range(8,32):
+        buspins.append("FB_AD%d" % i)
+    return pins(buspins, bankspec, suffix, offs, bank, mux, spec, limit)
+
+def sdram1(bankspec, suffix, offs, bank, mux=1, spec=None):
+    buspins = []
+    for i in range(16):
+        buspins.append("SDRDQM%d" % i)
+    for i in range(12):
+        buspins.append("SDRAD%d" % i)
+    for i in range(8):
+        buspins.append("SDRDQ%d" % i)
+    for i in range(3):
+        buspins.append("SDRCS%d#" % i)
+    for i in range(2):
+        buspins.append("SDRDQ%d" % i)
+    for i in range(2):
+        buspins.append("SDRBA%d" % i)
+    buspins += ['SDRCKE', 'SDRRAS#', 'SDRCAS#', 'SDRWE#',
+                'SDRRST']
+    return pins(buspins, bankspec, suffix, offs, bank, mux, spec)
+
+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)
+    return pins(buspins, bankspec, suffix, offs, bank, mux, spec, limit)
+
+def mcu8080(bankspec, suffix, offs, bank, mux=1, spec=None):
+    buspins = []
+    for i in range(8):
+        buspins.append("MCUD%d" % i)
+    for i in range(8):
+        buspins.append("MCUAD%d" % (i+8))
+    for i in range(6):
+        buspins.append("MCUCS%d" % i)
+    for i in range(2):
+        buspins.append("MCUNRB%d" % i)
+    buspins += ['MCUCD', 'MCURD', 'MCUWR', 'MCUCLE', 'MCUALE',
+                'MCURST']
+    return pins(buspins, bankspec, suffix, offs, bank, mux, spec)
+
+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%s%d" % (prefix, bank, i))
+    return pins(gpiopins, bankspec, suffix, offs, bank, mux, spec)
+
+def eint(bankspec, suffix, offs, bank, gpiooffs, gpionum=1, mux=1, spec=None):
+    gpiopins = []
+    for i in range(gpiooffs, gpiooffs+gpionum):
+        gpiopins.append("EINT%d" % (i))
+    return pins(gpiopins, bankspec, suffix, offs, bank, mux, spec)
+
+def pwm(bankspec, suffix, offs, bank, mux=1, spec=None):
+    return pins(['PWM', ], bankspec, suffix, offs, bank, mux, spec)
+
+def gpio(bankspec, suffix, offs, bank, gpiooffs, gpionum=1, mux=1, spec=None):
+    return _pinbank(bankspec, "GPIO", 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[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]
+            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
+        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):
+    for (pinidx, v) in fn.items():
+        if not pins.has_key(pinidx):
+            pins[pinidx] = v
+            continue
+        pins[pinidx].update(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
+
index b9cf7eeb047254d0c159295dadbb2316a6e83445..df8f865ea2ee6b16108bd80a59eb160286a52bf5 100644 (file)
 #!/usr/bin/env python
 
-from copy import deepcopy
-
-def pins(pingroup, bankspec, suffix, offs, bank, mux, spec=None, limit=None):
-    res = {}
-    names = {}
-    idx = 0
-    for name in pingroup[:limit]:
-        if suffix:
-            name_ = "%s_%s" % (name, suffix)
-        else:
-            name_ = name
-        if spec and spec.has_key(name):
-            continue
-        pin = {mux: (name_, bank)}
-        offs_bank, offs_ = offs
-        idx_ = offs_ + idx
-        idx += 1
-        idx_ += bankspec[bank]
-        res[idx_] = pin
-        names[name] = idx_
-    for name in pingroup:
-        if suffix:
-            name_ = "%s_%s" % (name, suffix)
-        else:
-            name_ = name
-        if not spec:
-            continue
-        if not spec.has_key(name):
-            continue
-        idx_, mux_, bank_ = spec[name]
-        idx_ = names[idx_]
-        #idx_ += bankspec[bank_]
-        pin = {mux_: (name_, bank_)}
-        if res.has_key(idx_):
-            res[idx_].update(pin)
-        else:
-            res[idx_] = pin
-    return res
-
-def i2s(bankspec, suffix, offs, bank, mux=1, spec=None, limit=None):
-    i2spins = ['IISMCK', 'IISBCK', 'IISLRCK', 'IISDI']
-    for i in range(4):
-        i2spins.append("IISDO%d" % i)
-    return pins(i2spins, bankspec, suffix, offs, bank, mux, spec, limit)
-
-def emmc(bankspec, suffix, offs, bank, mux=1, spec=None):
-    emmcpins = ['MMCCMD', 'MMCCLK']
-    for i in range(8):
-        emmcpins.append("MMCD%d" % i)
-    return pins(emmcpins, bankspec, suffix, offs, bank, mux, spec)
-
-def sdmmc(bankspec, suffix, offs, bank, mux=1, spec=None,
-                start=None, limit=None):
-    sdmmcpins = ['CMD', 'CLK']
-    for i in range(4):
-        sdmmcpins.append("D%d" % i)
-    sdmmcpins = sdmmcpins[start:limit]
-    sdmmcpins = namesuffix('SD', suffix, sdmmcpins)
-    return pins(sdmmcpins, bankspec, '', offs, bank, mux, spec)
-
-def spi(bankspec, suffix, offs, bank, mux=1, spec=None):
-    spipins = namesuffix('SPI', suffix,
-                ['CLK', 'NSS', 'MOSI', 'MISO', 'NSS'])
-    return pins(spipins, bankspec, '', offs, bank, mux, spec)
-
-def quadspi(bankspec, suffix, offs, bank, mux=1, spec=None, limit=None):
-    spipins = namesuffix('SPI', suffix,
-                ['CK', 'NSS', 'IO0', 'IO1', 'IO2', 'IO3'])
-    return pins(spipins, bankspec, '', offs, bank, mux, spec, limit)
-
-def i2c(bankspec, suffix, offs, bank, mux=1, spec=None):
-    spipins = namesuffix('TWI', suffix,
-                ['SDA', 'SCL'])
-    return pins(spipins, bankspec, '', offs, bank, mux, spec)
-
-def jtag(bankspec, suffix, offs, bank, mux=1, spec=None):
-    uartpins = namesuffix('JTAG', suffix, ['MS', 'DI', 'DO', 'CK'])
-    return pins(uartpins, bankspec, '', offs, bank, mux, spec)
-
-def uart(bankspec, suffix, offs, bank, mux=1, spec=None):
-    uartpins = namesuffix('UART', suffix, ['TX', 'RX'])
-    return pins(uartpins, bankspec, '', offs, bank, mux, spec)
-
-def namesuffix(name, suffix, namelist):
-    names = []
-    for n in namelist:
-        names.append("%s%s_%s" % (name, suffix, n))
-    return names
-
-def ulpi(bankspec, suffix, offs, bank, mux=1, spec=None):
-    ulpipins = namesuffix('ULPI', suffix, ['CK', 'DIR', 'STP', 'NXT'])
-    for i in range(8):
-        ulpipins.append('ULPI%s_D%d' % (suffix, i))
-    return pins(ulpipins, bankspec, "", offs, bank, mux, spec)
-
-def uartfull(bankspec, suffix, offs, bank, mux=1, spec=None):
-    uartpins = namesuffix('UART', suffix, ['TX', 'RX', 'CTS', 'RTS'])
-    return pins(uartpins, bankspec, '', offs, bank, mux, spec)
-
-def rgbttl(bankspec, suffix, offs, bank, mux=1, spec=None):
-    ttlpins = ['LCDCK', 'LCDDE', 'LCDHS', 'LCDVS']
-    for i in range(24):
-        ttlpins.append("LCD%d" % i)
-    return pins(ttlpins, bankspec, suffix, offs, bank, mux, spec)
-
-def rgmii(bankspec, suffix, offs, bank, mux=1, spec=None):
-    buspins = []
-    for i in range(4):
-        buspins.append("RG_ERXD%d" % i)
-    for i in range(4):
-        buspins.append("RG_ETXD%d" % i)
-    for i in range(2):
-        buspins.append("RG_FB_CS%d" % i)
-    buspins += ['RG_ERXCK', 'RG_ERXERR', 'RG_ERXDV',
-                'RG_EMDC', 'RG_EMDIO',
-                'RG_ETXEN', 'RG_ETXCK', 'RG_ECRS',
-                'RG_ECOL', 'RG_ETXERR']
-    return pins(buspins, bankspec, suffix, offs, bank, mux, spec)
-
-def flexbus1(bankspec, suffix, offs, bank, mux=1, spec=None, limit=None):
-    buspins = []
-    for i in range(8):
-        buspins.append("FB_AD%d" % i)
-    for i in range(2):
-        buspins.append("FB_CS%d" % i)
-    buspins += ['FB_ALE', 'FB_OE', 'FB_RW', 'FB_TA', 'FB_CLK',
-                'FB_A0', 'FB_A1', 'FB_TS', 'FB_TBST',
-                'FB_TSIZ0', 'FB_TSIZ1']
-    for i in range(4):
-        buspins.append("FB_BWE%d" % i)
-    for i in range(2,6):
-        buspins.append("FB_CS%d" % i)
-    return pins(buspins, bankspec, suffix, offs, bank, mux, spec, limit)
-
-def flexbus2(bankspec, suffix, offs, bank, mux=1, spec=None, limit=None):
-    buspins = []
-    for i in range(8,32):
-        buspins.append("FB_AD%d" % i)
-    return pins(buspins, bankspec, suffix, offs, bank, mux, spec, limit)
-
-def sdram1(bankspec, suffix, offs, bank, mux=1, spec=None):
-    buspins = []
-    for i in range(16):
-        buspins.append("SDRDQM%d" % i)
-    for i in range(12):
-        buspins.append("SDRAD%d" % i)
-    for i in range(8):
-        buspins.append("SDRDQ%d" % i)
-    for i in range(3):
-        buspins.append("SDRCS%d#" % i)
-    for i in range(2):
-        buspins.append("SDRDQ%d" % i)
-    for i in range(2):
-        buspins.append("SDRBA%d" % i)
-    buspins += ['SDRCKE', 'SDRRAS#', 'SDRCAS#', 'SDRWE#',
-                'SDRRST']
-    return pins(buspins, bankspec, suffix, offs, bank, mux, spec)
-
-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)
-    return pins(buspins, bankspec, suffix, offs, bank, mux, spec, limit)
-
-def mcu8080(bankspec, suffix, offs, bank, mux=1, spec=None):
-    buspins = []
-    for i in range(8):
-        buspins.append("MCUD%d" % i)
-    for i in range(8):
-        buspins.append("MCUAD%d" % (i+8))
-    for i in range(6):
-        buspins.append("MCUCS%d" % i)
-    for i in range(2):
-        buspins.append("MCUNRB%d" % i)
-    buspins += ['MCUCD', 'MCURD', 'MCUWR', 'MCUCLE', 'MCUALE',
-                'MCURST']
-    return pins(buspins, bankspec, suffix, offs, bank, mux, spec)
-
-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%s%d" % (prefix, bank, i))
-    return pins(gpiopins, bankspec, suffix, offs, bank, mux, spec)
-
-def eint(bankspec, suffix, offs, bank, gpiooffs, gpionum=1, mux=1, spec=None):
-    gpiopins = []
-    for i in range(gpiooffs, gpiooffs+gpionum):
-        gpiopins.append("EINT%d" % (i))
-    return pins(gpiopins, bankspec, suffix, offs, bank, mux, spec)
-
-def pwm(bankspec, suffix, offs, bank, mux=1, spec=None):
-    return pins(['PWM', ], bankspec, suffix, offs, bank, mux, spec)
-
-def gpio(bankspec, suffix, offs, bank, gpiooffs, gpionum=1, mux=1, spec=None):
-    return _pinbank(bankspec, "GPIO", 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[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]
-            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
-        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("EINT", eint, fns, pins, descriptions)
-    if pwm:
-        display_group("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(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):
-    for (pinidx, v) in fn.items():
-        if not pins.has_key(pinidx):
-            pins[pinidx] = v
-            continue
-        pins[pinidx].update(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
+from interfaces import pins, i2s, emmc, sdmmc, spi, quadspi, i2c
+from interfaces import jtag, uart, ulpi, uartfull, rgbttl, rgmii
+from interfaces import flexbus1, flexbus2, sdram1, sdram2, mcu8080
+from interfaces import eint, pwm, gpio
+from interfaces import display, display_fns, check_functions
+from interfaces import pinmerge, display_fixed
 
 if __name__ == '__main__':
     pinouts = {}