From c04d21aa31bef2971e50ad36fa8c626bbff34f99 Mon Sep 17 00:00:00 2001
From: Donald Sebastian Leung
Date: Tue, 27 Oct 2020 13:33:41 +0800
Subject: [PATCH] Restructure rtio.sed.output_driver to follow nMigen
convention
---
README.md | 4 ++--
rtio/sed/output_driver.py | 36 +++++++++++++++++++++++++-----------
2 files changed, 27 insertions(+), 13 deletions(-)
diff --git a/README.md b/README.md
index a4092cb..1399e1f 100644
--- a/README.md
+++ b/README.md
@@ -30,10 +30,10 @@ $ python -m rtio.test.sed.output_network
- - [ ] `rtio.cri` (`Interface` and `CRIDecoder` only)
- - [x] `rtio.sed.output_network` - Sorting network (high priority)
- - [ ] `rtio.sed.output_driver`
-- [ ] Restructure to code to follow nMigen convention and re-validate existing assertions (if any)
+- [x] Restructure to code to follow nMigen convention and re-validate existing assertions (if any)
- - [x] `rtio.cri` (`Interface` and `CRIDecoder` only)
- - [x] `rtio.sed.output_network`
-- - [ ] `rtio.sed.output_driver`
+- - [x] `rtio.sed.output_driver`
## License
diff --git a/rtio/sed/output_driver.py b/rtio/sed/output_driver.py
index 935edd3..5d5a687 100644
--- a/rtio/sed/output_driver.py
+++ b/rtio/sed/output_driver.py
@@ -10,8 +10,11 @@ __all__ = ["OutputDriver"]
class OutputDriver(Elaboratable):
def __init__(self, channels, glbl_fine_ts_width, lane_count, seqn_width):
- m = Module()
- self.m = m
+ self.channels = channels
+ self.glbl_fine_ts_width = glbl_fine_ts_width
+ self.lane_count = lane_count
+ self.seqn_width = seqn_width
+
self.collision = Signal()
self.collision_channel = Signal(range(len(channels)), reset_less=True)
self.busy = Signal()
@@ -19,9 +22,8 @@ class OutputDriver(Elaboratable):
# output network
layout_on_payload = layouts.output_network_payload(channels, glbl_fine_ts_width)
- output_network = OutputNetwork(lane_count, seqn_width, layout_on_payload)
- m.submodules += output_network
- self.input = output_network.input
+ self.output_network = OutputNetwork(lane_count, seqn_width, layout_on_payload)
+ self.input = self.output_network.input
# detect collisions (adds one pipeline stage)
layout_lane_data = [
@@ -29,8 +31,22 @@ class OutputDriver(Elaboratable):
("collision", 1),
("payload", layout_on_payload)
]
- lane_datas = [Record(layout_lane_data, reset_less=True) for _ in range(lane_count)]
- en_replaces = [channel.interface.o.enable_replace for channel in channels]
+ self.lane_datas = [Record(layout_lane_data) for _ in range(lane_count)]
+ for lane_data in self.lane_datas:
+ lane_data.valid.reset_less = True
+ lane_data.collision.reset_less = True
+ lane_data.payload.reset_less = True
+ self.en_replaces = [channel.interface.o.enable_replace for channel in channels]
+
+ def elaborate(self, platform):
+ m = Module()
+
+ channels = self.channels
+ output_network = self.output_network
+ lane_datas = self.lane_datas
+ en_replaces = self.en_replaces
+
+ m.submodules += self.output_network
for lane_data, on_output in zip(lane_datas, output_network.output):
lane_data.valid.reset_less = False
lane_data.collision.reset_less = False
@@ -67,7 +83,7 @@ class OutputDriver(Elaboratable):
m.d.comb += selected.eq(lane_data.valid & ~lane_data.collision & (lane_data.payload.channel == n))
onehot_stb.append(selected)
if hasattr(lane_data.payload, "fine_ts") and hasattr(oif, "fine_ts"):
- ts_shift = len(lane_data.ayload.fine_ts) - len(oif.fine_ts)
+ 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"):
onehot_address.append(Mux(selected, lane_datapayload.address, 0))
@@ -95,6 +111,4 @@ class OutputDriver(Elaboratable):
m.d.sync += self.busy.eq(1)
m.d.sync += self.busy_channel.eq(channel_r)
-
- def elaborate(self, platform):
- return self.m
+ return m