add pin-to-litex json map
[pinmux.git] / src / spec / ifaceprint.py
index 4e72d512b2b4465e4dcd64f9147fcdb5fc48269e..808985ce5f4fa884939bbb217e73672508f385dd 100644 (file)
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 from copy import deepcopy
-
+from collections import OrderedDict
 
 def display(of, pins, banksel=None, muxwidth=4):
     of.write("""\
@@ -61,12 +61,108 @@ def find_fn(fname, names):
         if fname.startswith(n):
             return n
 
+def map_name(pinmap, fn, fblower, pin, rename):
+    if not rename:
+        if pin[:-1].isdigit():
+            print "map name digit", pin, fn, fblower
+            if fn in ['PWM', 'EINT', 'VDD', 'VSS']:
+                return fn.lower() + pin.lower()
+        if fn == 'GPIO':
+            return 'gpio' + pin[1:].lower()
+        return pin.lower()
+    pin = pin.lower()
+    if fn == 'GPIO':
+        pk = '%s%s_%s' % (fblower, pin[0], pin[:-1])
+    elif pin[:-1].isdigit() and fn != 'EINT':
+        pk = '%s%s_out' % (fblower, pin[:-1])
+    else:
+        pk = '%s_%s' % (fblower, pin[:-1])
+    print "map name", pk, fblower, pinmap.has_key(pk)
+    if not pinmap.has_key(pk):
+        return pin.lower()
+    remapped = pinmap[pk]
+    uscore = remapped.find('_')
+    if uscore == -1:
+        return pin.lower()
+    fn, pin = remapped[:uscore], remapped[uscore+1:] + pin[-1]
+    return pin.lower()
+
+def python_pindict(of, pinmap, pins, function_names, dname, remap):
+
+    res = OrderedDict()
+    of.write("\n%s = OrderedDict()\n" % dname)
+
+    for k, pingroup in pins.byspec.items():
+        (a, n) = k.split(":")
+        if n.isdigit():
+            a = "%s%s" % (a, n)
+        fblower = a.lower()
+        of.write("%s['%s'] = [ " % (dname, fblower))
+        res[fblower] = []
+        count = 0
+        for i, p in enumerate(pingroup):
+            name = map_name(pinmap, k[0], fblower, p, remap)
+            res[fblower].append(name)
+            of.write("'%s', " % name)
+            count += 1
+            if count == 4 and i != len(pingroup)-1:
+                of.write("\n                ")
+                count = 0
+        of.write("]\n")
+        print "    dict %s" % dname, a, n, pingroup
+    of.write("\n\n")
+    return res
+
+def python_dict_fns(of, pinmap, pins, function_names):
+    of.write("# auto-generated by Libre-SOC pinmux program: do not edit\n")
+    of.write("# python src/pinmux_generator.py -v -s {spec} -o {output}\n")
+    of.write("# use OrderedDict to fix stable order for JTAG Boundary Scan\n")
+    of.write("from collections import OrderedDict\n")
+
+    fn_names = function_names.keys()
+    fns = {}
+
+    fnidx = list(fns.keys())
+    fnidx.sort(key=fnsplit)
+
+    print "python fnames", function_names
+    print "python speckeys", pins.byspec.keys()
+    print "python dict fns", dir(pins.gpio)
+    print pins.gpio.pinfn('', '')
+    print pins.pwm.pinfn('', '')
+    print pins.sdmmc.pinfn('', '')
+    print "by spec", pins.byspec
+    print pinmap
+
+    pd = python_pindict(of, {}, pins, function_names, 'pindict', False)
+    ld = python_pindict(of, pinmap, pins, function_names, 'litexdict', True)
+
+    print "pd", pd
+    print "ld", ld
+    # process results and create name map
+    litexmap = OrderedDict()
+    for k in pd.keys():
+        pl = pd[k]
+        ll = ld[k]
+        for pname, lname in zip(pl, ll):
+            pname = "%s_%s" % (k, pname[:-1]) # strip direction +/-/*
+            lname = lname[:-1] # strip direction +/-/*
+            if k in ['eint', 'pwm', 'gpio', 'vdd', 'vss']: # sigh
+                lname = "%s_%s" % (k, lname)
+            litexmap[pname] = lname
+    print "litexmap", litexmap
+    of.write("litexmap = {\n")
+    for k, v in litexmap.items():
+        of.write("\t'%s': '%s',\n" % (k, v))
+    of.write("}\n")
+    return litexmap
+
 
 def display_fns(of, 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
+        for mux in range(0, 4):  # skip GPIO for now
             if mux not in pdata:
                 continue
             name, bank = pdata[mux]
@@ -80,6 +176,7 @@ def display_fns(of, bankspec, pins, function_names):
     current_fn = None
     for fname in fnidx:
         fnbase = find_fn(fname, fn_names)
+        #fblower = fnbase.lower()
         assert fnbase in function_names, "fn %s not in descriptions %s" % \
             (fname, str(function_names.keys()))
         #print "name", fname, fnbase
@@ -110,6 +207,7 @@ def check_functions(of, title, bankspec, fns, pins, required, eint, pwm,
     of.write("# Pinmap for %s\n\n" % title)
 
     print "fn_idx", fnidx
+    print "fns", fns
     print "fnspec", pins.fnspec.keys()
     print "required", required
     for name in required: