3 from spec
.interfaces
import Pinouts
6 def specgen(of
, pth
, pinouts
, bankspec
, muxwidths
, pinbanks
, fixedpins
,
8 """ generates a specification of pinouts (tsv files)
9 for reading in by pinmux.
12 * interfaces.txt - contains name and number of interfaces
13 * {interfacename}.txt - contains name of pin, type, and bus
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.
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.
27 #print bankspec.keys()
28 #print fixedpins.keys()
29 #print pinouts.ganged.items()
30 if not os
.path
.exists(pth
):
32 with
open(os
.path
.join(pth
, 'configs.txt'), 'w') as f
:
33 for (name
, d
) in configs
.items():
38 vals
.append("%s=%s" % (k
, repr(v
)))
39 line
= [name
.lower(), '\t'.join(vals
)]
40 line
= '\t'.join(line
)
41 f
.write("%s\n" % line
)
43 with
open(os
.path
.join(pth
, 'interfaces.txt'), 'w') as f
:
44 for k
in pinouts
.fnspec
.keys():
46 line
= [k
.lower(), str(len(s
))]
47 line
= '\t'.join(line
)
48 f
.write("%s\n" % line
)
49 s0
= s
[list(s
.keys())[0]] # hack, take first
50 gangedgroup
= pinouts
.ganged
[k
]
51 with
open(os
.path
.join(pth
, '%s.txt' % k
.lower()), 'w') as g
:
52 if len(s0
.pingroup
) == 1: # only one function, grouped higher
53 for ks
in s
.keys(): # grouped by interface
54 assert False, "TODO, single-function"
55 fntype
= 'inout' # XXX TODO
58 g
.write("%s\t%s\n" % (k_
, fntype
))
60 for pinname
in s0
.pingroup
:
61 fntype
= s0
.fntype
.get(pinname
, 'inout')
63 g
.write("%s\t%s" % (pn
, fntype
))
64 if fntype
== 'inout' and pinname
in gangedgroup
:
68 # work out range of bankspecs
70 for k
, v
in bankspec
.items():
71 bankpins
.append((v
, k
))
77 pks
= sorted(pinouts
.keys())
79 # truly dreadful way to work out the max mux size...
81 for (sz
, bname
) in bankpins
:
82 print "keys", k
, sz
, bname
85 muxentries
[k
] = muxwidths
[bname
]
90 # write out the mux...
91 with
open(os
.path
.join(pth
, 'pinmap.txt'), 'w') as g
:
95 res
= [str(k
), bank
, str(muxsz
)]
97 for midx
in range(muxsz
):
98 if midx
in pinouts
[k
]:
99 fname
= pinouts
[k
][midx
][0]
102 res
.append(fname
.lower())
103 g
.write('\t'.join(res
) + '\n')
105 # ... and the dedicated pins
106 with
open(os
.path
.join(pth
, 'fixedpins.txt'), 'w') as g
:
109 p
= map(str.lower
, p
)
110 g
.write('\t'.join(p
) + '\n')
112 # lists bankspec, shows where the pin-numbers *start*
113 of
.write("# Pin Bank starting points and lengths\n\n")
114 with
open(os
.path
.join(pth
, 'pinspec.txt'), 'w') as g
:
115 keys
= sorted(bankspec
.keys())
117 pinstart
= bankspec
[bank
]
118 wid
= muxwidths
[bank
]
119 of
.write("* %s %d %d %d\n" % (bank
, pinstart
, pinbanks
[bank
], wid
))
120 g
.write("%s\t%d\t%d\t%d\n" % (bank
, pinstart
, pinbanks
[bank
], wid
))