1 from parse
import Parse
2 from pprint
import pprint
5 # map pins to litex name conventions, primarily for use in coriolis2
6 # yes this is a mess. it'll do the job though. improvements later
7 def pinparse(psp
, pinspec
):
8 p
= Parse(pinspec
, verify
=False)
12 print ("muxed cells", p
.muxed_cells
)
13 print ("muxed cell banks", p
.muxed_cells_bank
)
16 for pname
, psize
in p
.bankwidths
.items():
17 pads
[pname
] = [''] * psize
25 for clist
, bank
in zip(p
.muxed_cells
, p
.muxed_cells_bank
):
26 print ("cell", clist
, bank
)
32 domain
= None # TODO, get this from the PinSpec. sigh
34 start
= p
.bankstart
[bank
]
35 banknum
= padnum
- start
36 print ("bank", bank
, banknum
, "padname", name
, padnum
, x
)
40 if name
.startswith('vss'):
41 name
= 'p_%s_' % name
[:-2] + name
[-1]
43 name
= 'ground_' + name
[-1]
46 name
= 'ioground_' + name
[-1]
50 elif name
.startswith('vdd'):
53 name
= 'power_' + name
[-1]
57 name
= 'iopower_' + name
[-1]
61 elif name
.startswith('sys'):
63 if name
== 'sys_pllclk':
64 pad
= ["p_"+name
, name
, name
]
65 elif name
== 'sys_rst':
67 pad
= [name
, name
, name
]
68 padbank
[banknum
] = name
69 print ("sys_rst add", bank
, banknum
, name
)
71 elif name
== 'sys_pllclk':
73 elif name
== 'sys_pllvcout':
74 name
= 'sys_pll_vco_o'
75 pad
= ['p_' + name
, name
, name
, "A"] # A for Analog
76 elif name
== 'sys_plltestout':
77 name
= 'sys_pll_testout_o'
78 pad
= ['p_' + name
, name
, name
]
79 elif name
.startswith('sys_pllsel'):
81 name2
= 'sys_clksel_i(%s)' % i
82 name
= 'p_sys_clksel_' + i
83 pad
= [name
, name2
, name2
]
85 # iopads.append([pname, name, name])
86 print ("sys pad", name
)
88 elif name
.startswith('mspi0') or name
.startswith('mspi1'):
95 if name
.startswith('mspi0'):
99 litex_name
= name
[:6] + suffix
100 name
= prefix
+ suffix
101 pad
= ['p_' + name
, name
, name
]
103 elif name
.startswith('sd0'):
105 if name
.startswith('sd0_d'):
107 name
= 'sdcard_data' + i
108 name2
= 'sdcard_data_%%s(%s)' % i
109 pad
= ['p_'+name
, name
, name2
% 'o', name2
% 'i', name2
% 'oe']
110 elif name
.startswith('sd0_cmd'):
112 name2
= 'sdcard_cmd_%s'
113 pad
= ['p_'+name
, name
, name2
% 'o', name2
% 'i', name2
% 'oe']
115 name
= 'sdcard_' + name
[4:]
116 pad
= ['p_' + name
, name
, name
]
117 litex_name
= orig_name
[:4] + "_".join(name
.split("_")[1:])
119 elif name
.startswith('sdr'):
121 if name
== 'sdr_clk':
123 pad
= ['p_' + name
, name
, name
]
124 elif name
.startswith('sdr_ad'):
126 name
= 'sdram_a_' + i
127 name2
= 'sdram_a(%s)' % i
128 pad
= ['p_' + name
, name2
, name2
]
129 elif name
.startswith('sdr_ba'):
131 name
= 'sdram_ba_' + i
132 name2
= 'sdram_ba(%s)' % i
133 pad
= ['p_' + name
, name2
, name2
]
134 elif name
.startswith('sdr_dqm'):
136 name
= 'sdram_dm_' + i
137 name2
= 'sdram_dm(%s)' % i
138 pad
= ['p_' + name
, name2
, name2
]
139 elif name
.startswith('sdr_d'):
141 name
= 'sdram_dq_' + i
142 name2
= 'sdram_dq_%%s(%s)' % i
143 pad
= ['p_'+name
, name
, name2
% 'o', name2
% 'i', name2
% 'oe']
144 elif name
== 'sdr_csn0':
146 pad
= ['p_' + name
, name
, name
]
147 elif name
[-1] == 'n':
148 name
= 'sdram_' + name
[4:-1] + '_n'
149 pad
= ['p_' + name
, name
, name
]
151 name
= 'sdram_' + name
[4:]
152 pad
= ['p_' + name
, name
, name
]
153 litex_name
= orig_name
[:4] + "_".join(name
.split("_")[1:])
155 elif name
.startswith('uart'):
157 name
= 'uart_' + name
[6:]
158 pad
= ['p_' + name
, name
, name
]
160 elif name
.startswith('gpio'):
165 name2
= 'gpio_%%s(%s)' % i
166 pad
= ['p_' + name
, name
, name2
% 'o', name2
% 'i', name2
% 'oe']
167 print ("GPIO pad", name
, pad
)
168 litex_name
= "gpio_%s" % gbank
+ "_".join(name
.split("_")[1:])
170 elif name
.startswith('mtwi'):
173 litex_name
= 'mtwi' + suffix
174 name
= 'i2c' + suffix
175 if name
.startswith('i2c_sda'):
177 pad
= ['p_'+name
, name
, name2
% 'o', name2
% 'i', name2
% 'oe']
178 print ("I2C pad", name
, pad
)
180 pad
= ['p_' + name
, name
, name
]
182 elif name
.startswith('twi'):
184 name
= 'i2c' + name
[3:]
186 pad
= ['p_'+name
, name
, name2
% 'o', name2
% 'i', name2
% 'oe']
187 print ("I2C pad", name
, pad
)
189 elif name
.startswith('eint'):
193 name2
= 'eint_%s' % i
194 pad
= ['p_' + name
, name2
, name2
]
196 elif name
.startswith('pwm'):
200 name2
= 'pwm(%s)' % i
201 pad
= ['p_' + name
, name2
, name2
]
203 pad
= ['p_' + name
, name
, name
]
204 print ("GPIO pad", name
, pad
)
206 if litex_name
is None:
210 if name
and name
.startswith('jtag'):
213 if name
and not name
.startswith('p_'):
214 if 'power' not in name
and 'ground' not in name
:
217 padbank
[banknum
] = name
219 if domain
is not None:
220 if domain
not in domains
:
222 domains
[domain
].append(name
)
224 if domain
in psp
.clocks
and orig_name
.startswith(dl
):
225 clk
= psp
.clocks
[domain
]
226 if clk
.lower() in orig_name
: # TODO, might over-match
227 clocks
[domain
] = name
229 pinmap
[orig_name
] = name
230 litexmap
[litex_name
] = name
233 if domain
and pad
is not None:
234 # append direction from spec/domain. damn awkward processing
236 fn
, name
= orig_name
.split("_")
241 for k
in psp
.byspec
.keys():
242 if k
.startswith(domain
):
244 print ("spec found", domain
, spec
)
245 assert spec
is not None
248 if pname
.lower().startswith(name
):
250 print ("found spec", found
)
251 assert found
is not None
252 # whewwww. add the direction onto the pad spec list
259 elif pad
is not None:
264 for pl
in pads
.values():
265 for i
in range(len(pl
)):
267 name
= 'nc_%d' % nc_idx
268 name2
= 'nc(%d)' % nc_idx
271 iopads
.append([name
, name2
, name2
, "-"])
278 for name
, iopads
in pads
.items():
279 print ("%s pads" % name
, iopads
)
287 print ("chip domains (excluding sys-default)")
289 print ("chip clocks (excluding sys-default)")
295 'pads.instances' : iopads
,
296 'pins.specs' : psp
.byspec
,
298 'litex.map' : litexmap
,
299 'chip.domains' : domains
,
300 'chip.clocks' : clocks
,
301 'chip.n_intpower': n_intpower
,
302 'chip.n_extpower': n_extpower
,
306 chip
['pads.north'] = pads
['N']
308 chip
['pads.south'] = pads
['S']
310 chip
['pads.east'] = pads
['E']
312 chip
['pads.west'] = pads
['W']
314 for name
, iopads
in pads
.items():
315 chip
['pads.side_%s' % name
] = iopads