forked from M-Labs/artiq
rtio/sed: make ON payload layout configurable, add latency function
This commit is contained in:
parent
527b403bb1
commit
1d2ebbe60f
|
@ -1,6 +1,9 @@
|
||||||
from migen import *
|
from migen import *
|
||||||
|
|
||||||
|
|
||||||
|
__all__ = ["latency", "OutputNetwork"]
|
||||||
|
|
||||||
|
|
||||||
# Based on: https://github.com/Bekbolatov/SortingNetworks/blob/master/src/main/js/gr.js
|
# Based on: https://github.com/Bekbolatov/SortingNetworks/blob/master/src/main/js/gr.js
|
||||||
def boms_get_partner(n, l, p):
|
def boms_get_partner(n, l, p):
|
||||||
if p == 1:
|
if p == 1:
|
||||||
|
@ -34,21 +37,17 @@ def boms_steps_pairs(lane_count):
|
||||||
return steps
|
return steps
|
||||||
|
|
||||||
|
|
||||||
def layout_rtio_payload(fine_ts_width):
|
def latency(lane_count):
|
||||||
return [
|
d = log2_int(lane_count)
|
||||||
("channel", 24),
|
return sum(l for l in range(1, d+1))
|
||||||
("fine_ts", fine_ts_width),
|
|
||||||
("address", 16),
|
|
||||||
("data", 512),
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
def layout_node_data(seqn_width, fine_ts_width):
|
def layout_node_data(seqn_width, layout_payload):
|
||||||
return [
|
return [
|
||||||
("valid", 1),
|
("valid", 1),
|
||||||
("seqn", seqn_width),
|
("seqn", seqn_width),
|
||||||
("replace_occured", 1),
|
("replace_occured", 1),
|
||||||
("payload", layout_rtio_payload(fine_ts_width))
|
("payload", layout_payload)
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@ -57,14 +56,14 @@ def cmp_wrap(a, b):
|
||||||
|
|
||||||
|
|
||||||
class OutputNetwork(Module):
|
class OutputNetwork(Module):
|
||||||
def __init__(self, lane_count, seqn_width, fine_ts_width):
|
def __init__(self, lane_count, seqn_width, layout_payload):
|
||||||
self.input = [Record(layout_node_data(seqn_width, fine_ts_width))
|
self.input = [Record(layout_node_data(seqn_width, layout_payload))
|
||||||
for _ in range(lane_count)]
|
for _ in range(lane_count)]
|
||||||
self.output = None
|
self.output = None
|
||||||
|
|
||||||
step_input = self.input
|
step_input = self.input
|
||||||
for step in boms_steps_pairs(lane_count):
|
for step in boms_steps_pairs(lane_count):
|
||||||
step_output = [Record(layout_node_data(seqn_width, fine_ts_width))
|
step_output = [Record(layout_node_data(seqn_width, layout_payload))
|
||||||
for _ in range(lane_count)]
|
for _ in range(lane_count)]
|
||||||
|
|
||||||
for node1, node2 in step:
|
for node1, node2 in step:
|
||||||
|
|
|
@ -9,7 +9,13 @@ LANE_COUNT = 8
|
||||||
|
|
||||||
|
|
||||||
def simulate(input_events):
|
def simulate(input_events):
|
||||||
dut = output_network.OutputNetwork(LANE_COUNT, LANE_COUNT*4, 3)
|
layout_payload = [
|
||||||
|
("channel", 8),
|
||||||
|
("fine_ts", 3),
|
||||||
|
("address", 16),
|
||||||
|
("data", 512),
|
||||||
|
]
|
||||||
|
dut = output_network.OutputNetwork(LANE_COUNT, LANE_COUNT*4, layout_payload)
|
||||||
output = []
|
output = []
|
||||||
def gen():
|
def gen():
|
||||||
yield
|
yield
|
||||||
|
@ -21,7 +27,7 @@ def simulate(input_events):
|
||||||
yield
|
yield
|
||||||
for n in range(len(input_events)):
|
for n in range(len(input_events)):
|
||||||
yield dut.input[n].valid.eq(0)
|
yield dut.input[n].valid.eq(0)
|
||||||
for i in range(6):
|
for i in range(output_network.latency(LANE_COUNT)):
|
||||||
yield
|
yield
|
||||||
for x in range(LANE_COUNT):
|
for x in range(LANE_COUNT):
|
||||||
if (yield dut.output[x].valid):
|
if (yield dut.output[x].valid):
|
||||||
|
|
Loading…
Reference in New Issue