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