68 acc = conn.build_accelerator()
69 dut = acc.children[esiaccel.AppID(
"loopback")]
70 gate = dut.ports[esiaccel.AppID(
"gate")]
72 inp = dut.ports[esiaccel.AppID(
"in")].write_port(
"data").connect()
74 out = dut.ports[esiaccel.AppID(
"out")].read_port(
"data").connect(
78 accepted =
_fill(inp.try_write, 0)
79 assert DEFAULT_TO_SERVER_MAX_IN_FLIGHT <= accepted <= (
80 DEFAULT_TO_SERVER_MAX_IN_FLIGHT + HW_SLACK), accepted
81 assert not inp.try_write(accepted)
85 for i
in range(accepted):
86 assert out.read() == i
89 total = accepted + 200
90 for i
in range(accepted, total):
92 for i
in range(accepted, total):
93 assert out.read() == i
97 stalled_at =
_fill(inp.try_write, total)
98 assert stalled_at - total <= DEFAULT_TO_SERVER_MAX_IN_FLIGHT + HW_SLACK
100 for i
in range(total, stalled_at):
101 assert out.read() == i
102 deadline = time.monotonic() + 30
103 while not inp.try_write(stalled_at):
104 assert time.monotonic() < deadline,
"try_write never recovered"
106 assert out.read() == stalled_at
109 acc = conn.build_accelerator()
110 dut = acc.children[esiaccel.AppID(
"producer")]
111 produce = dut.ports[esiaccel.AppID(
"produce")]
112 query = dut.ports[esiaccel.AppID(
"query")]
113 sent = dut.ports[esiaccel.AppID(
"sent")]
114 for p
in (produce, query, sent):
118 stream = dut.ports[esiaccel.AppID(
"stream")].read_port(
"data").connect(
121 def sent_count() -> int:
123 return sent.read().result()
129 assert 2 * buffer <= stalled <= 2 * buffer + HW_SLACK, stalled
133 assert stream.read() == i
134 assert sent_count() == n