stronger autopep8 whitespace cleanup
[pinmux.git] / src / spec / ifaceprint.py
1 #!/usr/bin/env python
2
3 from copy import deepcopy
4
5
6 def display(pins):
7 print "| Pin | Mux0 | Mux1 | Mux2 | Mux3 |"
8 print "| --- | ----------- | ----------- | ----------- | ----------- |"
9 pinidx = sorted(pins.keys())
10 for pin in pinidx:
11 pdata = pins.get(pin)
12 res = '| %3d |' % pin
13 for mux in range(4):
14 if mux not in pdata:
15 res += " |"
16 continue
17 name, bank = pdata[mux]
18 res += " %s %-9s |" % (bank, name)
19 print res
20
21
22 def fnsplit(f):
23 a = ''
24 n = 0
25 if not f.startswith('FB_'):
26 f2 = f.split('_')
27 if len(f2) == 2:
28 if f2[1].isdigit():
29 return f2[0], int(f2[1])
30 return f2[0], f2[1]
31 #print f
32 while f and not f[0].isdigit():
33 a += f[0]
34 f = f[1:]
35 return a, int(f) if f else None
36
37
38 def fnsort(f1, f2):
39 a1, n1 = fnsplit(f1)
40 a2, n2 = fnsplit(f2)
41 x = cmp(a1, a2)
42 if x != 0:
43 return x
44 return cmp(n1, n2)
45
46
47 def find_fn(fname, names):
48 for n in names:
49 if fname.startswith(n):
50 return n
51
52
53 def display_fns(bankspec, pins, function_names):
54 fn_names = function_names.keys()
55 fns = {}
56 for (pin, pdata) in pins.items():
57 for mux in range(1, 4): # skip GPIO for now
58 if mux not in pdata:
59 continue
60 name, bank = pdata[mux]
61 assert name is not None, str(bank)
62 if name not in fns:
63 fns[name] = []
64 fns[name].append((pin - bankspec[bank], mux, bank))
65
66 fnidx = fns.keys()
67 fnidx.sort(fnsort)
68 current_fn = None
69 for fname in fnidx:
70 fnbase = find_fn(fname, fn_names)
71 #print "name", fname, fnbase
72 if fnbase != current_fn:
73 if current_fn is not None:
74 print
75 print "## %s" % fnbase
76 print
77 print function_names[fnbase]
78 print
79 current_fn = fnbase
80 print "* %-9s :" % fname,
81 for (pin, mux, bank) in fns[fname]:
82 print "%s%d/%d" % (bank, pin, mux),
83 print
84
85 return fns
86
87
88 def check_functions(title, bankspec, fns, pins, required, eint, pwm,
89 descriptions=None):
90 fns = deepcopy(fns)
91 pins = deepcopy(pins)
92 if descriptions is None:
93 descriptions = {}
94
95 print "# Pinmap for %s" % title
96 print
97
98 for name in required:
99 print "## %s" % name
100 print
101 if descriptions and name in descriptions:
102 print descriptions[name]
103 print
104
105 name = name.split(':')
106 if len(name) == 2:
107 findbank = name[0][0]
108 findmux = int(name[0][1:])
109 name = name[1]
110 else:
111 name = name[0]
112 findbank = None
113 findmux = None
114 name = name.split('/')
115 if len(name) == 2:
116 count = int(name[1])
117 else:
118 count = 100000
119 name = name[0]
120 found = set()
121 fnidx = fns.keys()
122 # fnidx.sort(fnsort)
123 pinfound = {}
124 for fname in fnidx:
125 if not fname.startswith(name):
126 continue
127 for pin, mux, bank in fns[fname]:
128 if findbank is not None:
129 if findbank != bank:
130 continue
131 if findmux != mux:
132 continue
133 pin_ = pin + bankspec[bank]
134 if pin_ in pins:
135 pinfound[pin_] = (fname, pin_, bank, pin, mux)
136
137 pinidx = sorted(pinfound.keys())
138
139 for pin_ in pinidx:
140 fname, pin_, bank, pin, mux = pinfound[pin_]
141 if fname in found:
142 continue
143 found.add(fname)
144 if len(found) > count:
145 continue
146 del pins[pin_]
147 print "* %s %d %s%d/%d" % (fname, pin_, bank, pin, mux)
148
149 print
150
151 # gpios
152 gpios = []
153 for name in descriptions.keys():
154 if not name.startswith('GPIO'):
155 continue
156 if name == 'GPIO':
157 continue
158 gpios.append(name)
159 gpios.sort()
160
161 if gpios:
162 print "## GPIO"
163 print
164
165 for fname in gpios:
166 if fname in found:
167 continue
168 desc = ''
169 if descriptions and fname in descriptions:
170 desc = ': %s' % descriptions[fname]
171 bank = fname[4]
172 pin = int(fname[7:])
173 pin_ = pin + bankspec[bank]
174 if pin_ not in pins:
175 continue
176 del pins[pin_]
177 found.add(fname)
178 print "* %-8s %d %s%-2d %s" % (fname, pin_, bank, pin, desc)
179 print
180
181 if eint:
182 display_group(bankspec, "EINT", eint, fns, pins, descriptions)
183 if pwm:
184 display_group(bankspec, "PWM", pwm, fns, pins, descriptions)
185
186 print "## Unused Pinouts (spare as GPIO) for '%s'" % title
187 print
188 if descriptions and 'GPIO' in descriptions:
189 print descriptions['GPIO']
190 print
191 display(pins)
192 print
193
194 return pins # unused
195
196
197 def display_group(bankspec, title, todisplay, fns, pins, descriptions):
198 print "## %s" % title
199 print
200
201 found = set()
202 for fname in todisplay:
203 desc = ''
204 if descriptions and fname in descriptions:
205 desc = ': %s' % descriptions[fname]
206 fname = fname.split(':')
207 if len(fname) == 2:
208 findbank = fname[0][0]
209 findmux = int(fname[0][1:])
210 fname = fname[1]
211 else:
212 fname = fname[0]
213 findbank = None
214 findmux = None
215 for (pin, mux, bank) in fns[fname]:
216 if findbank is not None:
217 if findbank != bank:
218 continue
219 if findmux != mux:
220 continue
221 if fname in found:
222 continue
223 pin_ = pin + bankspec[bank]
224 if pin_ not in pins:
225 continue
226 del pins[pin_]
227 found.add(fname)
228 print "* %s %d %s%d/%d %s" % (fname, pin_, bank, pin, mux, desc)
229 print
230
231
232 def display_fixed(fixed, offs):
233
234 fkeys = sorted(fixed.keys())
235 pin_ = offs
236 res = []
237 for pin, k in enumerate(fkeys):
238 print "## %s" % k
239 print
240 prevname = ''
241 linecount = 0
242 for name in fixed[k]:
243 if linecount == 4:
244 linecount = 0
245 print
246 if prevname[:2] == name[:2] and linecount != 0:
247 print name,
248 linecount += 1
249 else:
250 if linecount != 0:
251 print
252 print "* %d: %d %s" % (pin_, pin, name),
253 linecount = 1
254 res.append((pin_, name))
255
256 prevname = name
257 pin_ += 1
258 if linecount != 0:
259 print
260 print
261
262 return res