5from __future__
import annotations
8from pathlib
import Path
14_TRACE_SEP =
";" if os.name ==
"nt" else ":"
18from esiaccel.cosim.pytest
import cosim_test
20from .conftest
import (HW_DIR, SW_DIR, build_cpp_test, check_lines,
21 get_runtime_root, require_tool, run_probe)
24 (
"depth_constant", [
"depth: 0x5",
"depth_constant ok"]),
25 (
"loopback_i8", [
"loopback_i8 ok: 0x5a"]),
26 (
"struct_func", [
"struct_func ok: b=-7 x=-6 y=-7"]),
28 [
"odd_struct_func ok: a=2749 b=-20 p=10 q=-5 r0=4 r1=6"]),
29 (
"array_func", [
"array_func ok: -3 -2"]),
30 (
"serial_coord_translate", [
"serial_coord_translate ok"]),
31 (
"serial_coord_translate_hostmem", [
"serial_coord_translate_hostmem ok"]),
34LOOPBACK_TYPED_PROBES = [
35 (
"depth_constant", [
"depth: 0x5",
"depth_constant ok"]),
36 (
"loopback_i8", [
"loopback_i8 ok: 0x5a"]),
37 (
"sint4_loopback", [
"sint4_loopback ok: pos=5 neg=-3"]),
38 (
"struct_func", [
"struct_func ok: b=-7 x=-6 y=-7"]),
40 [
"odd_struct_func ok: a=2749 b=-20 p=10 q=-5 r0=4 r1=6"]),
41 (
"array_func", [
"array_func ok: -3 -2"]),
42 (
"serial_coord_translate", [
"serial_coord_translate ok"]),
47 """Run live-connection codegen and build the loopback_test binary.
49 This test deliberately uses ``esiaccel.codegen --platform cosim`` (live
50 connection) rather than ``--file`` (offline manifest) to exercise that
56 runtime_root = get_runtime_root()
58 include_dir = tmp_path /
"include"
59 generated_dir = include_dir /
"loopback"
60 generated_dir.mkdir(parents=
True, exist_ok=
True)
78 header_path = generated_dir /
"LoopbackIP.h"
79 assert header_path.exists(),
"Generated header LoopbackIP.h not found"
80 header_content = header_path.read_text()
81 check_lines(header_content, [
82 "/// Generated header for esi_system module LoopbackIP.",
85 "namespace esi_system {",
87 "static constexpr uint32_t depth = 0x5;",
88 "} // namespace esi_system",
91 build_dir = tmp_path /
"loopback-build"
92 result = subprocess.run(
101 "-DCMAKE_BUILD_TYPE=Release",
102 f
"-DLOOPBACK_GENERATED_DIR={include_dir}",
103 f
"-DESI_RUNTIME_ROOT={runtime_root}",
108 assert result.returncode == 0, (
109 f
"cmake configure failed (rc={result.returncode}):\n"
110 f
"--- stdout ---\n{result.stdout}\n"
111 f
"--- stderr ---\n{result.stderr}")
113 result = subprocess.run(
116 str(build_dir),
"--target",
"loopback_test",
"--config",
"Release"
121 assert result.returncode == 0, (
122 f
"cmake build failed (rc={result.returncode}):\n"
123 f
"--- stdout ---\n{result.stdout}\n"
124 f
"--- stderr ---\n{result.stderr}")
126 return build_dir /
"loopback_test"
129@cosim_test(HW_DIR / "loopback.py")
131 """Tests for esiquery against the loopback design."""
134 assert conn.sysinfo().esi_version() == 1
135 assert conn.get_service_mmio().read(0x10) == 1
136 assert conn.manifest().api_version == 1
140 """Build against live-connection codegen and run all probes."""
142 for probe, expected
in LOOPBACK_PROBES:
143 run_probe(binary, host, port, probe, expected)
146 sources_dir: Path) ->
None:
147 binary = build_cpp_test(sources_dir,
"loopback_typed_test",
"loopback")
148 for probe, expected
in LOOPBACK_TYPED_PROBES:
149 run_probe(binary, host, port, probe, expected)
152 """Verify esiquery info output against the generated manifest
153 (QUERY-INFO checks)."""
154 require_tool(
"esiquery")
155 manifest = sources_dir /
"esi_system_manifest.json"
156 assert manifest.exists(),
"Manifest not found"
157 result = subprocess.run(
158 [
"esiquery",
"trace", f
"w{_TRACE_SEP}{manifest}",
"info"],
163 check_lines(result.stdout, [
165 "* Module information",
167 "IP which simply echos bytes",
175 """Verify esiquery hier output against the generated manifest
176 (QUERY-HIER checks)."""
177 require_tool(
"esiquery")
178 manifest = sources_dir /
"esi_system_manifest.json"
179 assert manifest.exists(),
"Manifest not found"
180 result = subprocess.run(
181 [
"esiquery",
"trace", f
"w{_TRACE_SEP}{manifest}",
"hier"],
186 check_lines(result.stdout, [
187 "* Design hierarchy",
188 "func1: function uint16(uint16)",
189 "structFunc: function ResultStruct(ArgStruct)",
190 "arrayFunc: function ResultArray(sint8[1])",
191 "* Instance: loopback_inst[0]",
200 "* Instance: loopback_inst[1]",
None test_loopback_typed_cpp_codegen(self, str host, int port, Path sources_dir)
None test_esi_version(self, conn)
None test_loopback_cpp_codegen(self, Path tmp_path, str host, int port)
None test_loopback_query_hier(self, Path sources_dir)
None test_loopback_query_info(self, Path sources_dir)
Path _build_loopback_codegen(Path tmp_path, str host, int port)