@@ -132,6 +132,7 @@ class _UpConverter(Module):
132
132
def __init__ (self , layout_from , layout_to , ratio , reverse ):
133
133
self .sink = sink = Endpoint (layout_from )
134
134
self .source = source = Endpoint (layout_to )
135
+ self .chunks = Signal (bits_for (ratio ))
135
136
136
137
# # #
137
138
@@ -176,11 +177,15 @@ def __init__(self, layout_from, layout_to, ratio, reverse):
176
177
self .sync += If (load_part , Case (demux , cases ))
177
178
self .comb += source .payload .raw_bits ().eq (source_payload_raw_bits )
178
179
180
+ # chunks
181
+ self .sync += If (load_part , self .chunks .eq (demux + 1 ))
182
+
179
183
180
184
class _DownConverter (Module ):
181
185
def __init__ (self , layout_from , layout_to , ratio , reverse ):
182
186
self .sink = sink = Endpoint (layout_from )
183
187
self .source = source = Endpoint (layout_to )
188
+ self .chunks = Signal ()
184
189
185
190
# # #
186
191
@@ -212,17 +217,24 @@ def __init__(self, layout_from, layout_to, ratio, reverse):
212
217
src = sink_payload_raw_bits [n * width :(n + 1 )* width ]
213
218
dst = source .payload .raw_bits ()
214
219
cases [i ] = dst .eq (src )
215
- self .comb += Case (mux , cases ).makedefault (),
220
+ self .comb += Case (mux , cases ).makedefault ()
221
+
222
+ # chunks
223
+ self .comb += self .chunks .eq (last )
216
224
217
225
218
226
class _IdentityConverter (Module ):
219
227
def __init__ (self , layout_from , layout_to , ratio , reverse ):
220
228
self .sink = sink = Endpoint (layout_from )
221
229
self .source = source = Endpoint (layout_to )
230
+ self .chunks = Signal ()
222
231
223
232
# # #
224
233
225
- self .comb += sink .connect (source )
234
+ self .comb += [
235
+ sink .connect (source ),
236
+ self .chunks .eq (1 )
237
+ ]
226
238
227
239
228
240
def _get_converter_ratio (layout_from , layout_to ):
@@ -247,15 +259,23 @@ def _get_converter_ratio(layout_from, layout_to):
247
259
248
260
249
261
class Converter (Module ):
250
- def __init__ (self , layout_from , layout_to , reverse = False ):
262
+ def __init__ (self , layout_from , layout_to , reverse = False , insert_chunks = False ):
251
263
self .cls , self .ratio = _get_converter_ratio (layout_from , layout_to )
252
264
253
265
# # #
254
266
255
267
converter = self .cls (layout_from , layout_to , self .ratio , reverse )
256
268
self .submodules += converter
257
269
258
- self .sink , self .source = converter .sink , converter .source
270
+ self .sink = converter .sink
271
+ if insert_chunks :
272
+ self .source = Endpoint (layout_from + [("chunks" , bits_for (self .ratio ))])
273
+ self .comb += [
274
+ converter .source .connect (self .source ),
275
+ self .source .chunks .eq (converter .chunks )
276
+ ]
277
+ else :
278
+ self .source = converter .source
259
279
260
280
261
281
class StrideConverter (Module ):
0 commit comments