put pinbank and mux widths into pinmap.txt
[pinmux.git] / src / spec / gen.py
1 import os
2 import os.path
3 from spec.interfaces import Pinouts
4
5
6 def specgen(of, pth, pinouts, bankspec, muxwidths, pinbanks, fixedpins,
7 fastbus):
8 """ generates a specification of pinouts (tsv files)
9 for reading in by pinmux.
10
11 files generated:
12 * interfaces.txt - contains name and number of interfaces
13 * {interfacename}.txt - contains name of pin, type, and bus
14
15 type may be in, out or inout.
16 if type is "inout" then a THIRD optional parameter of type
17 "bus" indicates whether the bus is ganged together. in
18 future this may be "bus1", "bus2" and so on if an interface
19 contains more than one ganged group.
20
21 basically if the function needs to control whether a group
22 of pins shall be switched from input to output (as opposed
23 to the *pinmux* via user control deciding that), bus is
24 the way to indicate it.
25 """
26 pth = pth or ''
27 #print bankspec.keys()
28 #print fixedpins.keys()
29 #print pinouts.ganged.items()
30 if not os.path.exists(pth):
31 os.makedirs(pth)
32 with open(os.path.join(pth, 'interfaces.txt'), 'w') as f:
33 for k in pinouts.fnspec.keys():
34 s = pinouts.fnspec[k]
35 line = [k.lower(), str(len(s))]
36 for b in fastbus:
37 if b.startswith(k.lower()):
38 line.append(b)
39 line = '\t'.join(line)
40 f.write("%s\n" % line)
41 s0 = s[list(s.keys())[0]] # hack, take first
42 gangedgroup = pinouts.ganged[k]
43 with open(os.path.join(pth, '%s.txt' % k.lower()), 'w') as g:
44 if len(s0.pingroup) == 1: # only one function, grouped higher
45 for ks in s.keys(): # grouped by interface
46 assert False, "TODO, single-function"
47 fntype = 'inout' # XXX TODO
48 k = s[ks].suffix
49 k_ = k.lower()
50 g.write("%s\t%s\n" % (k_, fntype))
51 else:
52 for pinname in s0.pingroup:
53 fntype = s0.fntype.get(pinname, 'inout')
54 pn = pinname.lower()
55 g.write("%s\t%s" % (pn, fntype))
56 if fntype == 'inout' and pinname in gangedgroup:
57 g.write("\tbus")
58 g.write("\n")
59
60 # work out range of bankspecs
61 bankpins = []
62 for k, v in bankspec.items():
63 bankpins.append((v, k))
64 bankpins.sort()
65 bankpins.reverse()
66 muxentries = {}
67 cellbank = {}
68
69 pks = sorted(pinouts.keys())
70
71 # truly dreadful way to work out the max mux size...
72 for k in pks:
73 for (sz, bname) in bankpins:
74 print "keys", k, sz, bname
75 if k >= sz:
76 print "found", bname
77 muxentries[k] = muxwidths[bname]
78 cellbank[k] = bname
79 break
80
81 print muxentries
82 # write out the mux...
83 with open(os.path.join(pth, 'pinmap.txt'), 'w') as g:
84 for k in pks:
85 muxsz = muxentries[k]
86 bank = cellbank[k]
87 res = [str(k), bank, str(muxsz)]
88 # append pin mux
89 for midx in range(muxsz):
90 if midx in pinouts[k]:
91 fname = pinouts[k][midx][0]
92 else:
93 fname = ''
94 res.append(fname.lower())
95 g.write('\t'.join(res) + '\n')
96
97 # ... and the dedicated pins
98 with open(os.path.join(pth, 'fixedpins.txt'), 'w') as g:
99 for p in fixedpins:
100 p = map(str, p)
101 p = map(str.lower, p)
102 g.write('\t'.join(p) + '\n')
103
104 # lists bankspec, shows where the pin-numbers *start*
105 of.write("# Pin Bank starting points and lengths\n\n")
106 with open(os.path.join(pth, 'pinspec.txt'), 'w') as g:
107 keys = sorted(bankspec.keys())
108 for bank in keys:
109 pinstart = bankspec[bank]
110 wid = muxwidths[bank]
111 of.write("* %s %d %d %d\n" % (bank, pinstart, pinbanks[bank], wid))
112 g.write("%s\t%d\t%d\t%d\n" % (bank, pinstart, pinbanks[bank], wid))