mirror of https://github.com/m-labs/artiq.git
rtio/sed/OutputDriver: support channels with different fine timestamp widths
This commit is contained in:
parent
f39ee7ad62
commit
6b7a1893c7
|
@ -61,6 +61,8 @@ class OutputDriver(Module):
|
||||||
|
|
||||||
# demultiplex channels (adds one pipeline stage)
|
# demultiplex channels (adds one pipeline stage)
|
||||||
for n, channel in enumerate(channels):
|
for n, channel in enumerate(channels):
|
||||||
|
oif = channel.interface.o
|
||||||
|
|
||||||
onehot_stb = []
|
onehot_stb = []
|
||||||
onehot_fine_ts = []
|
onehot_fine_ts = []
|
||||||
onehot_address = []
|
onehot_address = []
|
||||||
|
@ -69,14 +71,14 @@ class OutputDriver(Module):
|
||||||
selected = Signal()
|
selected = Signal()
|
||||||
self.comb += selected.eq(lane_data.valid & ~lane_data.collision & (lane_data.payload.channel == n))
|
self.comb += selected.eq(lane_data.valid & ~lane_data.collision & (lane_data.payload.channel == n))
|
||||||
onehot_stb.append(selected)
|
onehot_stb.append(selected)
|
||||||
if hasattr(lane_data.payload, "fine_ts"):
|
if hasattr(lane_data.payload, "fine_ts") and hasattr(oif, "fine_ts"):
|
||||||
onehot_fine_ts.append(Mux(selected, lane_data.payload.fine_ts, 0))
|
ts_shift = len(lane_data.payload.fine_ts) - len(oif.fine_ts)
|
||||||
|
onehot_fine_ts.append(Mux(selected, lane_data.payload.fine_ts[ts_shift:], 0))
|
||||||
if hasattr(lane_data.payload, "address"):
|
if hasattr(lane_data.payload, "address"):
|
||||||
onehot_address.append(Mux(selected, lane_data.payload.address, 0))
|
onehot_address.append(Mux(selected, lane_data.payload.address, 0))
|
||||||
if hasattr(lane_data.payload, "data"):
|
if hasattr(lane_data.payload, "data"):
|
||||||
onehot_data.append(Mux(selected, lane_data.payload.data, 0))
|
onehot_data.append(Mux(selected, lane_data.payload.data, 0))
|
||||||
|
|
||||||
oif = channel.interface.o
|
|
||||||
self.sync += oif.stb.eq(reduce(or_, onehot_stb))
|
self.sync += oif.stb.eq(reduce(or_, onehot_stb))
|
||||||
if hasattr(oif, "fine_ts"):
|
if hasattr(oif, "fine_ts"):
|
||||||
self.sync += oif.fine_ts.eq(reduce(or_, onehot_fine_ts))
|
self.sync += oif.fine_ts.eq(reduce(or_, onehot_fine_ts))
|
||||||
|
|
Loading…
Reference in New Issue