record bus/ganged type in tsv spec files
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Mon, 9 Apr 2018 13:24:55 +0000 (14:24 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Mon, 9 Apr 2018 13:24:55 +0000 (14:24 +0100)
src/spec/gen.py
src/spec/interfaces.py

index 41d98343e57073eea465fde58cd3da81ce937e47..2c1335f6d0d89a11504794c774ff1562a5dec55d 100644 (file)
@@ -5,11 +5,27 @@ from spec.interfaces import Pinouts
 
 def specgen(of, pth, pinouts, bankspec, pinbanks, fixedpins):
     """ generates a specification of pinouts (tsv files)
-        for reading in by pinmux
+        for reading in by pinmux.
+
+        files generated:
+        * interfaces.txt - contains name and number of interfaces
+        * {interfacename}.txt - contains name of pin, type, and bus
+
+        type may be in, out or inout.
+        if type is "inout" then a THIRD optional parameter of type
+        "bus" indicates whether the bus is ganged together.  in
+        future this may be "bus1", "bus2" and so on if an interface
+        contains more than one ganged group.
+
+        basically if the function needs to control whether a group
+        of pins shall be switched from input to output (as opposed
+        to the *pinmux* via user control deciding that), bus is
+        the way to indicate it.
     """
     pth = pth or ''
     #print bankspec.keys()
     #print fixedpins.keys()
+    #print pinouts.ganged.items()
     if not os.path.exists(pth):
         os.makedirs(pth)
     with open(os.path.join(pth, 'interfaces.txt'), 'w') as f:
@@ -17,6 +33,7 @@ def specgen(of, pth, pinouts, bankspec, pinbanks, fixedpins):
             s = pinouts.fnspec[k]
             f.write("%s\t%d\n" % (k.lower(), len(s)))
             s0 = s[list(s.keys())[0]]  # hack, take first
+            gangedgroup = pinouts.ganged[k]
             with open(os.path.join(pth, '%s.txt' % k.lower()), 'w') as g:
                 if len(s0.pingroup) == 1:  # only one function, grouped higher
                     for ks in s.keys():  # grouped by interface
@@ -29,7 +46,10 @@ def specgen(of, pth, pinouts, bankspec, pinbanks, fixedpins):
                     for pinname in s0.pingroup:
                         fntype = s0.fntype.get(pinname, 'inout')
                         pn = pinname.lower()
-                        g.write("%s\t%s\n" % (pn, fntype))
+                        g.write("%s\t%s" % (pn, fntype))
+                        if fntype == 'inout' and pinname in gangedgroup:
+                            g.write("\tbus")
+                        g.write("\n")
 
     pks = sorted(pinouts.keys())
 
index c57a07683352f7170992080479c431592474cb46..03d7a2a9b1ea35679d71ed90ebedeaa1b75fcd92 100644 (file)
@@ -73,7 +73,8 @@ class PinGen(object):
         pins = Pins(prefix, pingroup, self.bankspec,
                     suffix, offs, bank, mux,
                     spec, origsuffix=suffix, gangedgrp=gangedgroup)
-        self.pinouts.pinmerge(pins)
+        fname = self.pinouts.pinmerge(pins)
+        self.pinouts.setganged(fname, gangedgroup)
 
 # pinouts class
 
@@ -83,6 +84,7 @@ class Pinouts(object):
         self.bankspec = bankspec
         self.pins = {}
         self.fnspec = {}
+        self.ganged = {}
         for fname, pinfn in pinspec:
             if isinstance(pinfn, tuple):
                 name, pinfn = pinfn
@@ -90,6 +92,9 @@ class Pinouts(object):
                 name = pinfn.__name__
             setattr(self, name, PinGen(self, fname, pinfn, self.bankspec))
 
+    def setganged(self, fname, grp):
+        self.ganged[fname] = map(lambda x: x[:-1], grp)
+
     def __contains__(self, k):
         return k in self.pins
 
@@ -164,6 +169,8 @@ class Pinouts(object):
         for (pinidx, v) in fn.pins.items():
             self.update(pinidx, v)
 
+        return fname
+
 
 class Pins(object):