3 from spec
.pinfunctions
import pinspec
4 from copy
import deepcopy
6 def namesuffix(name
, suffix
, namelist
):
10 names
.append("%s%s_%s" % (name
, suffix
, n
))
12 names
.append("%s_%s" % (name
, suffix
))
17 def __init__(self
, pinouts
, fname
, pinfn
, bankspec
):
18 self
.pinouts
= pinouts
19 self
.bankspec
= bankspec
23 def __call__(self
, suffix
, offs
, bank
, mux
,
24 start
=None, limit
=None, spec
=None, origsuffix
=None):
25 pingroup
= self
.pinfn(suffix
, bank
)
26 if isinstance(pingroup
, tuple):
27 prefix
, pingroup
= pingroup
32 pingroup
= pingroup
[start
:limit
]
33 pins
= Pins(prefix
, pingroup
, self
.bankspec
,
34 suffix
, offs
, bank
, mux
,
35 spec
, origsuffix
=suffix
)
36 self
.pinouts
.pinmerge(pins
)
40 class Pinouts(object):
41 def __init__(self
, bankspec
):
42 self
.bankspec
= bankspec
45 for fname
, pinfn
in pinspec
:
46 if isinstance(pinfn
, tuple):
50 setattr(self
, name
, PinGen(self
, fname
, pinfn
, self
.bankspec
))
52 def __contains__(self
, k
):
58 def add_spec(self
, k
, v
):
61 def update(self
, pinidx
, v
):
62 if pinidx
not in self
.pins
:
66 assert k
not in self
.pins
[pinidx
], \
67 "pin %d position %d already taken\n%s\n%s" % \
68 (pinidx
, k
, str(v
), self
.pins
[pinidx
])
69 self
.pins
[pinidx
].update(v
)
72 return self
.pins
.keys()
75 return self
.pins
.items()
83 def __delitem__(self
, k
):
86 def __getitem__(self
, k
):
89 def pinmerge(self
, fn
):
90 # hack, store the function specs in the pins dict
92 suffix
= fn
.origsuffix
95 if not hasattr(self
, 'fnspec'):
99 assert 'EINT' not in self
100 if fname
not in self
.fnspec
:
101 self
.add_spec(fname
, {})
102 if suffix
or fname
== 'EINT' or fname
== 'PWM':
103 specname
= fname
+ suffix
106 #print "fname bank specname suffix ", fname, bank, specname, repr(
108 if specname
in self
.fnspec
[fname
]:
109 # ok so some declarations may bring in different
110 # names at different stages (EINT, PWM, flexbus1/2)
111 # so we have to merge the names in. main thing is
113 tomerge
= self
.fnspec
[fname
][specname
]
114 for p
in fn
.pingroup
:
115 if p
not in tomerge
.pingroup
:
116 tomerge
.pingroup
.append(p
)
117 tomerge
.pins
.update(fn
.pins
)
118 tomerge
.fntype
.update(fn
.fntype
)
120 self
.fnspec
[fname
][specname
] = deepcopy(fn
)
123 for (pinidx
, v
) in fn
.pins
.items():
124 self
.update(pinidx
, v
)
129 def __init__(self
, fname
, pingroup
, bankspec
, suffix
, offs
, bank
, mux
,
130 spec
=None, limit
=None, origsuffix
=None):
132 # function type can be in, out or inout, represented by - + *
133 # strip function type out of each pin name
135 for i
in range(len(pingroup
)):
140 if fntype
not in '+-*':
143 fntype
= {'-': 'in', '+': 'out', '*': 'inout'}[fntype
]
144 self
.fntype
[pname
] = fntype
148 self
.pingroup
= pingroup
149 self
.bankspec
= bankspec
151 self
.origsuffix
= origsuffix
or suffix
155 # create consistent name suffixes
156 pingroup
= namesuffix(fname
, suffix
, pingroup
)
162 for name
in pingroup
[:limit
]:
164 name_
= "%s_%s" % (name
, suffix
)
167 if spec
and name
in spec
:
169 pin
= {mux
: (name_
, bank
)}
170 offs_bank
, offs_
= offs
173 idx_
+= bankspec
[bank
]
176 for name
in pingroup
:
178 name_
= "%s_%s" % (name
, suffix
)
185 idx_
, mux_
, bank_
= spec
[name
]
187 pin
= {mux_
: (name_
, bank_
)}
189 res
[idx_
].update(pin
)