CIRCT 23.0.0git
Loading...
Searching...
No Matches
test_loopback.py
Go to the documentation of this file.
1from __future__ import annotations
2
3from pathlib import Path
4import shutil
5import sys
6from typing import List
7
8import esiaccel
9from esiaccel.accelerator import AcceleratorConnection
10from esiaccel.cosim.pytest import cosim_test
11import esiaccel.types as types
12import pytest
13
14HW_DIR = Path(__file__).resolve().parent.parent / "hw"
15
16
17def run(conn: AcceleratorConnection, platform: str = "cosim") -> None:
18 hostmem = conn.get_service_hostmem()
19 if hostmem is not None:
20 mem1 = hostmem.allocate(1024)
21 assert mem1.size == 1024
22 print(f"mem1: {mem1.ptr} size {mem1.size}")
23 mem1 = None
24
25 assert conn.sysinfo().esi_version() == 0
26 m = conn.manifest()
27 assert m.api_version == 0
28
29 for esiType in m.type_table:
30 print(f"{esiType}")
31
32 for info in m.module_infos:
33 print(f"{info.name}")
34 for const_name, const in info.constants.items():
35 print(f" {const_name}: {const.value} {const.type}")
36 if info.name == "LoopbackIP" and const_name == "depth":
37 assert const.value == 5
38
39 d = conn.build_accelerator()
40
41 loopback = d.children[esiaccel.AppID("loopback_inst", 0)]
42 appid = loopback.id
43 print(appid)
44 assert appid.name == "loopback_inst"
45 assert appid.idx == 0
46
47 mysvc_send = loopback.ports[esiaccel.AppID("mysvc_recv")].write_port("recv")
48 mysvc_send.connect(buffer_size=12)
49 mysvc_send.write(None)
50 print(f"mysvc_send.type: {mysvc_send.type}")
51 assert isinstance(mysvc_send.type, types.VoidType)
52
53 mysvc_recv = loopback.ports[esiaccel.AppID("mysvc_send")].read_port("send")
54 mysvc_recv.connect()
55 mysvc_recv.read()
56 print("mysvc_recv.read() returned")
57
58 recv = loopback.ports[esiaccel.AppID("loopback_tohw")].write_port("recv")
59 recv.connect()
60 assert isinstance(recv.type, types.BitsType)
61
62 send = loopback.ports[esiaccel.AppID("loopback_fromhw")].read_port("send")
63 send.connect()
64 assert isinstance(send.type, types.BitsType)
65
66 data = 24
67 recv.write(int.to_bytes(data, 1, "little"))
68 resp_data: bytearray = send.read()
69 resp_int = int.from_bytes(resp_data, "little")
70
71 print(f"data: {data}")
72 print(f"resp: {resp_int}")
73 # Trace platform intentionally produces random responses.
74 if platform != "trace":
75 assert resp_int == data
76
77 # Placeholder until we have a runtime function API.
78 myfunc = d.ports[esiaccel.AppID("structFunc")]
79 myfunc.connect()
80
81 for _ in range(10):
82 future_result = myfunc(a=10, b=-22)
83 result = future_result.result()
84
85 print(f"result: {result}")
86 if platform != "trace":
87 assert result == {"y": -22, "x": -21}
88
89 if platform != "trace":
90 print("Checking function call result ordering.")
91 future_result1 = myfunc(a=15, b=-32)
92 future_result2 = myfunc(a=32, b=47)
93 result2 = future_result2.result()
94 result1 = future_result1.result()
95 print(f"result1: {result1}")
96 print(f"result2: {result2}")
97 assert result1 == {"y": -32, "x": -31}, "result1 is incorrect"
98 assert result2 == {"y": 47, "x": 48}, "result2 is incorrect"
99
100 myfunc = d.ports[esiaccel.AppID("arrayFunc")]
101 arg_chan = myfunc.write_port("arg").connect()
102 result_chan = myfunc.read_port("result").connect()
103
104 arg = [-22]
105 arg_chan.write(arg)
106
107 result: List[int] = result_chan.read()
108
109 print(f"result: {result}")
110 if platform != "trace":
111 assert result == [-21, -22]
112
113 print("PASS")
114
115
116@cosim_test(HW_DIR / "loopback.py")
117def test_cosim_loopback(conn: AcceleratorConnection) -> None:
118 run(conn)
119
120
121def test_cosim_loopback_make_fallback(monkeypatch) -> None:
122 """Run the loopback test using the ``make`` fallback (no cmake/ninja)."""
123 if shutil.which("make") is None:
124 pytest.skip("make fallback requires make on PATH")
125 from esiaccel.cosim.verilator import Verilator
126 monkeypatch.setattr(Verilator, "_use_cmake", property(lambda self: False))
127 # Delegate to the already-decorated cosim test. The monkeypatch is
128 # inherited by the forked child process.
130
131
132if __name__ == "__main__":
133 platform = sys.argv[1]
134 connstr = sys.argv[2]
135 conn = esiaccel.connect(platform, connstr)
136 run(conn, platform)
static void print(TypedAttr val, llvm::raw_ostream &os)
static mlir::Operation * resolve(Context &context, mlir::SymbolRefAttr sym)
"AcceleratorConnection" connect(str platform, str connection_str)
Definition __init__.py:28
None test_cosim_loopback_make_fallback(monkeypatch)
None test_cosim_loopback(AcceleratorConnection conn)
None run(AcceleratorConnection conn, str platform="cosim")