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
.banksize
.items():
17 print ("pad name,size", pname
, psize
)
18 pads
[pname
] = [''] * psize
26 for clist
, bank
in zip(p
.muxed_cells
, p
.muxed_cells_bank
):
27 print ("cell", clist
, bank
)
33 domain
= None # TODO, get this from the PinSpec. sigh
35 start
= p
.bankstart
[bank
]
36 banknum
= padnum
- start
37 print ("bank", bank
, banknum
, "padname", name
, padnum
, x
)
41 if name
.startswith('vss'):
42 name
= 'p_%s_' % name
[:-2] + name
[-1]
44 name
= 'ground_' + name
[-1]
47 name
= 'ioground_' + name
[-1]
51 elif name
.startswith('vdd'):
54 name
= 'power_' + name
[-1]
58 name
= 'iopower_' + name
[-1]
62 elif name
.startswith('sys'):
64 if name
== 'sys_pllclk':
65 pad
= ["p_"+name
, name
, name
]
66 elif name
== 'sys_rst':
68 pad
= [name
, name
, name
]
69 padbank
[banknum
] = name
70 print ("sys_rst add", bank
, banknum
, name
)
72 elif name
== 'sys_pllclk':
74 elif name
== 'sys_pllvcout':
75 name
= 'sys_pll_vco_o'
76 pad
= ['p_' + name
, name
, name
, "A"] # A for Analog
77 elif name
== 'sys_plltestout':
78 name
= 'sys_pll_testout_o'
79 pad
= ['p_' + name
, name
, name
]
80 elif name
.startswith('sys_pllsel'):
82 name2
= 'sys_clksel_i(%s)' % i
83 name
= 'p_sys_clksel_' + i
84 pad
= [name
, name2
, name2
]
86 # iopads.append([pname, name, name])
87 print ("sys pad", name
)
89 elif name
.startswith('mspi0') or name
.startswith('mspi1'):
96 if name
.startswith('mspi0'):
100 litex_name
= name
[:6] + suffix
101 name
= prefix
+ suffix
102 pad
= ['p_' + name
, name
, name
]
104 elif name
.startswith('sd0'):
106 if name
.startswith('sd0_d'):
108 name
= 'sdcard_data' + i
109 name2
= 'sdcard_data_%%s(%s)' % i
110 pad
= ['p_'+name
, name
, name2
% 'o', name2
% 'i', name2
% 'oe']
111 elif name
.startswith('sd0_cmd'):
113 name2
= 'sdcard_cmd_%s'
114 pad
= ['p_'+name
, name
, name2
% 'o', name2
% 'i', name2
% 'oe']
116 name
= 'sdcard_' + name
[4:]
117 pad
= ['p_' + name
, name
, name
]
118 litex_name
= orig_name
[:4] + "_".join(name
.split("_")[1:])
120 elif name
.startswith('sdr'):
122 if name
== 'sdr_clk':
124 pad
= ['p_' + name
, name
, name
]
125 elif name
.startswith('sdr_ad'):
127 name
= 'sdram_a_' + i
128 name2
= 'sdram_a(%s)' % i
129 pad
= ['p_' + name
, name2
, name2
]
130 elif name
.startswith('sdr_ba'):
132 name
= 'sdram_ba_' + i
133 name2
= 'sdram_ba(%s)' % i
134 pad
= ['p_' + name
, name2
, name2
]
135 elif name
.startswith('sdr_dqm'):
137 name
= 'sdram_dm_' + i
138 name2
= 'sdram_dm(%s)' % i
139 pad
= ['p_' + name
, name2
, name2
]
140 elif name
.startswith('sdr_d'):
142 name
= 'sdram_dq_' + i
143 name2
= 'sdram_dq_%%s(%s)' % i
144 pad
= ['p_'+name
, name
, name2
% 'o', name2
% 'i', name2
% 'oe']
145 elif name
== 'sdr_csn0':
147 pad
= ['p_' + name
, name
, name
]
148 elif name
[-1] == 'n':
149 name
= 'sdram_' + name
[4:-1] + '_n'
150 pad
= ['p_' + name
, name
, name
]
152 name
= 'sdram_' + name
[4:]
153 pad
= ['p_' + name
, name
, name
]
154 litex_name
= orig_name
[:4] + "_".join(name
.split("_")[1:])
156 elif name
.startswith('uart'):
158 name
= 'uart_' + name
[6:]
159 pad
= ['p_' + name
, name
, name
]
161 elif name
.startswith('gpio'):
166 name2
= 'gpio_%%s(%s)' % i
167 pad
= ['p_' + name
, name
, name2
% 'o', name2
% 'i', name2
% 'oe']
168 print ("GPIO pad", name
, pad
)
169 litex_name
= "gpio_%s" % gbank
+ "_".join(name
.split("_")[1:])
171 elif name
.startswith('mtwi'):
174 litex_name
= 'mtwi' + suffix
175 name
= 'i2c' + suffix
176 if name
.startswith('i2c_sda'):
178 pad
= ['p_'+name
, name
, name2
% 'o', name2
% 'i', name2
% 'oe']
179 print ("I2C pad", name
, pad
)
181 pad
= ['p_' + name
, name
, name
]
183 elif name
.startswith('twi'):
185 name
= 'i2c' + name
[3:]
187 pad
= ['p_'+name
, name
, name2
% 'o', name2
% 'i', name2
% 'oe']
188 print ("I2C pad", name
, pad
)
190 elif name
.startswith('eint'):
194 name2
= 'eint_%s' % i
195 pad
= ['p_' + name
, name2
, name2
]
197 elif name
.startswith('pwm'):
201 name2
= 'pwm(%s)' % i
202 pad
= ['p_' + name
, name2
, name2
]
204 pad
= ['p_' + name
, name
, name
]
205 print ("GPIO pad", name
, pad
)
207 if litex_name
is None:
211 if name
and name
.startswith('jtag'):
214 if name
and not name
.startswith('p_'):
215 if 'power' not in name
and 'ground' not in name
:
218 print (padbank
, banknum
, name
)
219 padbank
[banknum
] = name
221 if domain
is not None:
222 if domain
not in domains
:
224 domains
[domain
].append(name
)
226 if domain
in psp
.clocks
and orig_name
.startswith(dl
):
227 clk
= psp
.clocks
[domain
]
228 if clk
.lower() in orig_name
: # TODO, might over-match
229 clocks
[domain
] = name
231 pinmap
[orig_name
] = name
232 litexmap
[litex_name
] = name
235 if domain
and pad
is not None:
236 # append direction from spec/domain. damn awkward processing
238 fn
, name
= orig_name
.split("_")
243 for k
in psp
.byspec
.keys():
244 if k
.startswith(domain
):
246 print ("spec found", domain
, spec
)
247 assert spec
is not None
250 if pname
.lower().startswith(name
):
252 print ("found spec", found
)
253 assert found
is not None
254 # whewwww. add the direction onto the pad spec list
261 elif pad
is not None:
266 for pl
in pads
.values():
267 for i
in range(len(pl
)):
269 name
= 'nc_%d' % nc_idx
270 name2
= 'nc(%d)' % nc_idx
273 iopads
.append([name
, name2
, name2
, "-"])
280 for name
, iopads
in pads
.items():
281 print ("%s pads" % name
, iopads
)
289 print ("chip domains (excluding sys-default)")
291 print ("chip clocks (excluding sys-default)")
297 'pads.instances' : iopads
,
298 'pins.specs' : psp
.byspec
,
300 'litex.map' : litexmap
,
301 'chip.domains' : domains
,
302 'chip.clocks' : clocks
,
303 'chip.n_intpower': n_intpower
,
304 'chip.n_extpower': n_extpower
,
308 chip
['pads.north'] = pads
['N']
310 chip
['pads.south'] = pads
['S']
312 chip
['pads.east'] = pads
['E']
314 chip
['pads.west'] = pads
['W']
316 for name
, iopads
in pads
.items():
317 chip
['pads.side_%s' % name
] = iopads