5from __future__
import annotations
8from pathlib
import Path
13from esiaccel.cosim.pytest
import cosim_test
17from .conftest
import HW_DIR, check_lines, require_tool, run_cmd
20@cosim_test(HW_DIR / "esitester.py", args=("{tmp_dir}", "cosim"))
24 require_tool(
"esitester")
25 require_tool(
"esiquery")
28 conn = f
"{host}:{port}"
29 stdout = run_cmd([
"esitester",
"-v",
"cosim", conn,
"callback",
"-i",
"5"])
31 "[CONNECT] connecting to backend",
35 assert f
"callback: {i}" in stdout, \
36 f
"Expected 'callback: {i}' in stdout"
39 conn = f
"{host}:{port}"
40 stdout = run_cmd([
"esitester",
"cosim", conn,
"streaming_add"])
42 "Streaming add test results:",
43 "input[0]=222709 + 5 = 222714 (expected 222714)",
44 "input[1]=894611 + 5 = 894616 (expected 894616)",
45 "input[2]=772894 + 5 = 772899 (expected 772899)",
46 "input[3]=429150 + 5 = 429155 (expected 429155)",
47 "input[4]=629806 + 5 = 629811 (expected 629811)",
48 "Streaming add test passed",
52 conn = f
"{host}:{port}"
53 stdout = run_cmd([
"esitester",
"cosim", conn,
"streaming_add",
"-t"])
55 "Streaming add test results:",
56 "Streaming add test passed",
60 conn = f
"{host}:{port}"
61 stdout = run_cmd([
"esitester",
"cosim", conn,
"translate_coords"])
63 "Coord translate test results:",
64 "coord[0]=(222709,894611) + (10,20) = (222719,894631)",
65 "coord[1]=(772894,429150) + (10,20) = (772904,429170)",
66 "coord[2]=(629806,138727) + (10,20) = (629816,138747)",
67 "coord[3]=(218516,390276) + (10,20) = (218526,390296)",
68 "coord[4]=(750021,423525) + (10,20) = (750031,423545)",
69 "Coord translate test passed",
73 conn = f
"{host}:{port}"
75 [
"esitester",
"cosim", conn,
"serial_coords",
"-n",
"40",
"-b",
"33"])
77 "Serial coord translate test results:",
79 "Serial coord translate test passed",
83 conn = f
"{host}:{port}"
85 [
"esitester",
"cosim", conn,
"auto_serial_coords",
"-n",
"5"])
87 "Auto serial coord translate test results:",
89 "Auto serial coord translate test passed",
93 conn = f
"{host}:{port}"
94 stdout = run_cmd([
"esitester",
"cosim", conn,
"channel",
"-i",
"3"])
96 "[channel] producer i=0 got=0",
97 "[channel] producer i=1 got=1",
98 "[channel] producer i=2 got=2",
99 "[channel] loopback i=0",
100 "[channel] loopback i=1",
101 "[channel] loopback i=2",
102 "Channel test passed",
106 conn = f
"{host}:{port}"
107 result = subprocess.run(
108 [
"esiquery",
"cosim", conn,
"telemetry"],
113 assert result.returncode == 0, result.stdout + result.stderr
114 stdout = result.stdout
115 check_lines(stdout, [
117 "fromhostdma[32].fromHostChecksum: 0",
118 "fromhostdma[32].fromHostCycles: 0",
119 "readmem[32].addrCmdIssued: 0",
120 "readmem[32].addrCmdResponses: 0",
121 "readmem[32].lastReadLSB: 0",
122 "readmem[32].readChecksum: 0",
123 "tohostdma[32].toHostCycles: 0",
124 "tohostdma[32].totalWrites: 0",
125 "writemem[32].addrCmdIssued: 0",
126 "writemem[32].addrCmdResponses: 0",
127 "readmem[32].addrCmdResp.cycles: 0",
128 "writemem[32].addrCmdResp.cycles: 0",
132 conn = f
"{host}:{port}"
133 stdout = run_cmd([
"esitester",
"cosim", conn,
"reset"])
134 check_lines(stdout, [
135 "[reset] reset requested",
136 "[reset] telemetry addrCmdResponses after reset = 0",
141 """Test ChannelService ToHost and FromHost ports from Python."""
142 acc = conn.build_accelerator()
143 channel_test = acc.children[esiaccel.AppID(
"channel_test")]
144 ports = channel_test.ports
147 mmio = ports[esiaccel.AppID(
"cmd")]
149 f
"Expected MMIORegion, got {type(mmio)}"
151 producer = ports[esiaccel.AppID(
"producer")]
153 f
"Expected ToHostPort, got {type(producer)}"
157 mmio.write(0x0, num_values)
158 for i
in range(num_values):
159 result = producer.read().result()
160 assert result == i, f
"Producer: expected {i}, got {result}"
163 loopback_in = ports[esiaccel.AppID(
"loopback_in")]
165 f
"Expected FromHostPort, got {type(loopback_in)}"
166 loopback_in.connect()
168 loopback_out = ports[esiaccel.AppID(
"loopback_out")]
170 f
"Expected ToHostPort, got {type(loopback_out)}"
171 loopback_out.connect()
174 loopback_in.write(42 + i)
175 result = loopback_out.read().result()
176 assert result == 42 + i, \
177 f
"Loopback: expected {42 + i}, got {result}"
180@cosim_test(HW_DIR / "esitester.py", args=("{tmp_dir}", "cosim_dma"))
184 require_tool(
"esitester")
185 require_tool(
"esiquery")
188 """CosimBSP_DMA's caller-supplied channel service must emit DMA engines."""
189 manifest = json.loads(
190 (sources_dir /
"esi_system_manifest.json").read_text())
191 engine_names = {
"OneItemBuffersToHost",
"OneItemBuffersFromHost"}
193 engine
for engine
in manifest[
"design"][
"engines"]
194 if engine[
"serviceImplName"]
in engine_names
196 assert {engine[
"serviceImplName"]
for engine
in engines} == engine_names
197 assert all(engine[
"clientDetails"]
for engine
in engines)
200 conn = f
"{host}:{port}"
201 run_cmd([
"esitester",
"cosim", conn,
"hostmem"])
204 conn = f
"{host}:{port}"
205 result = subprocess.run(
206 [
"esitester",
"cosim", conn,
"dma",
"-w",
"-r"],
211 assert result.returncode == 0, result.stdout + result.stderr
214 """Verify complete engine payloads in both transfer directions."""
215 conn = f
"{host}:{port}"
216 result = subprocess.run(
236 assert result.returncode == 0, result.stdout + result.stderr
239 conn = f
"{host}:{port}"
248 result = subprocess.run(
263 combined = result.stdout + result.stderr
264 assert result.returncode == 0, combined
265 assert "exceeds the PCIe maximum read request size" not in combined, \
269 conn = f
"{host}:{port}"
273 result = subprocess.run(
275 "esitester",
"cosim", conn,
"aggbandwidth",
"--width",
"512",
"-r",
282 assert result.returncode == 0, result.stdout + result.stderr
285 conn = f
"{host}:{port}"
286 result = subprocess.run(
287 [
"esiquery",
"cosim", conn,
"telemetry"],
292 assert result.returncode == 0, result.stdout + result.stderr
293 stdout = result.stdout
294 check_lines(stdout, [
296 "fromhostdma[32].fromHostChecksum: 0",
297 "fromhostdma[32].fromHostCycles: 0",
298 "tohostdma[32].toHostCycles: 0",
302 conn = f
"{host}:{port}"
303 stdout = run_cmd([
"esitester",
"cosim", conn,
"channel",
"-i",
"3"])
304 check_lines(stdout, [
305 "[channel] producer i=0 got=0",
306 "[channel] producer i=1 got=1",
307 "[channel] producer i=2 got=2",
308 "[channel] loopback i=0",
309 "[channel] loopback i=1",
310 "[channel] loopback i=2",
311 "Channel test passed",
315 conn = f
"{host}:{port}"
317 [
"esitester",
"cosim", conn,
"serial_coords",
"-n",
"40",
"-b",
"33"])
318 check_lines(stdout, [
319 "Serial coord translate test results:",
321 "Serial coord translate test passed",
None test_bandwidth_data_integrity(self, str host, int port)
None test_hostmem(self, str host, int port)
None test_serial_coords(self, str host, int port)
None test_channel(self, str host, int port)
None test_aggbandwidth(self, str host, int port)
None test_hostmembw(self, str host, int port)
None test_telemetry(self, str host, int port)
None test_channel_engine_manifest(self, Path sources_dir)
None test_dma(self, str host, int port)
None test_callback(self, str host, int port)
None test_channel_python(self, AcceleratorConnection conn)
None test_streaming_add_quiet(self, str host, int port)
None test_channel(self, str host, int port)
None test_telemetry(self, str host, int port)
None test_translate_coords(self, str host, int port)
None test_streaming_add(self, str host, int port)
None test_serial_coords(self, str host, int port)
None test_auto_serial_coords(self, str host, int port)
None test_reset(self, str host, int port)