esiaccel 0.1.0__cp313-cp313-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of esiaccel might be problematic. Click here for more details.

Files changed (44) hide show
  1. esiaccel/CosimBackend.dll +0 -0
  2. esiaccel/CosimBackend.lib +0 -0
  3. esiaccel/ESICppRuntime.dll +0 -0
  4. esiaccel/ESICppRuntime.lib +0 -0
  5. esiaccel/__init__.py +13 -0
  6. esiaccel/accelerator.py +95 -0
  7. esiaccel/bin/esi-cosim.py +405 -0
  8. esiaccel/bin/esiquery.exe +0 -0
  9. esiaccel/cmake/esiaccelConfig.cmake +15 -0
  10. esiaccel/codegen.py +197 -0
  11. esiaccel/cosim/Cosim_DpiPkg.sv +85 -0
  12. esiaccel/cosim/Cosim_Endpoint.sv +189 -0
  13. esiaccel/cosim/Cosim_Manifest.sv +32 -0
  14. esiaccel/cosim/driver.cpp +131 -0
  15. esiaccel/cosim/driver.sv +60 -0
  16. esiaccel/esiCppAccel.cp313-win_amd64.pyd +0 -0
  17. esiaccel/include/esi/Accelerator.h +232 -0
  18. esiaccel/include/esi/CLI.h +77 -0
  19. esiaccel/include/esi/Common.h +154 -0
  20. esiaccel/include/esi/Context.h +74 -0
  21. esiaccel/include/esi/Design.h +127 -0
  22. esiaccel/include/esi/Engines.h +124 -0
  23. esiaccel/include/esi/Logging.h +231 -0
  24. esiaccel/include/esi/Manifest.h +72 -0
  25. esiaccel/include/esi/Ports.h +275 -0
  26. esiaccel/include/esi/Services.h +404 -0
  27. esiaccel/include/esi/Types.h +182 -0
  28. esiaccel/include/esi/Utils.h +102 -0
  29. esiaccel/include/esi/backends/Cosim.h +85 -0
  30. esiaccel/include/esi/backends/RpcServer.h +55 -0
  31. esiaccel/include/esi/backends/Trace.h +87 -0
  32. esiaccel/lib/EsiCosimDpiServer.dll +0 -0
  33. esiaccel/lib/EsiCosimDpiServer.lib +0 -0
  34. esiaccel/lib/MtiPli.dll +0 -0
  35. esiaccel/lib/MtiPli.lib +0 -0
  36. esiaccel/types.py +512 -0
  37. esiaccel/utils.py +36 -0
  38. esiaccel/zlib1.dll +0 -0
  39. esiaccel-0.1.0.dist-info/METADATA +254 -0
  40. esiaccel-0.1.0.dist-info/RECORD +44 -0
  41. esiaccel-0.1.0.dist-info/WHEEL +5 -0
  42. esiaccel-0.1.0.dist-info/entry_points.txt +4 -0
  43. esiaccel-0.1.0.dist-info/licenses/LICENSE +234 -0
  44. esiaccel-0.1.0.dist-info/top_level.txt +1 -0
Binary file
Binary file
Binary file
Binary file
esiaccel/__init__.py ADDED
@@ -0,0 +1,13 @@
1
+ # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
2
+ # See https://llvm.org/LICENSE.txt for license information.
3
+ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
4
+
5
+ from .accelerator import AcceleratorConnection
6
+
7
+ from .esiCppAccel import (AppID, Type, BundleType, ChannelType, ArrayType,
8
+ StructType, BitsType, UIntType, SIntType)
9
+
10
+ __all__ = [
11
+ "AcceleratorConnection", "AppID", "Type", "BundleType", "ChannelType",
12
+ "ArrayType", "StructType", "BitsType", "UIntType", "SIntType"
13
+ ]
@@ -0,0 +1,95 @@
1
+ # ===-----------------------------------------------------------------------===#
2
+ # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
3
+ # See https://llvm.org/LICENSE.txt for license information.
4
+ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
5
+ # ===-----------------------------------------------------------------------===#
6
+ #
7
+ # The structure of the Python classes and hierarchy roughly mirrors the C++
8
+ # side, but wraps the C++ objects. The wrapper classes sometimes add convenience
9
+ # functionality and serve to return wrapped versions of the returned objects.
10
+ #
11
+ # ===-----------------------------------------------------------------------===#
12
+
13
+ from typing import Dict, List, Optional
14
+
15
+ from .types import BundlePort
16
+ from . import esiCppAccel as cpp
17
+
18
+ # Global context for the C++ side.
19
+ ctxt = cpp.Context()
20
+
21
+
22
+ class AcceleratorConnection:
23
+ """A connection to an ESI accelerator."""
24
+
25
+ def __init__(self, platform: str, connection_str: str):
26
+ self.cpp_accel = cpp.AcceleratorConnection(ctxt, platform, connection_str)
27
+
28
+ def manifest(self) -> cpp.Manifest:
29
+ """Get and parse the accelerator manifest."""
30
+ return cpp.Manifest(ctxt, self.cpp_accel.sysinfo().json_manifest())
31
+
32
+ def sysinfo(self) -> cpp.SysInfo:
33
+ return self.cpp_accel.sysinfo()
34
+
35
+ def build_accelerator(self) -> "Accelerator":
36
+ return Accelerator(self.manifest().build_accelerator(self.cpp_accel))
37
+
38
+ def get_service_mmio(self) -> cpp.MMIO:
39
+ return self.cpp_accel.get_service_mmio()
40
+
41
+ def get_service_hostmem(self) -> cpp.HostMem:
42
+ return self.cpp_accel.get_service_hostmem()
43
+
44
+
45
+ from .esiCppAccel import HostMemOptions
46
+
47
+
48
+ class HWModule:
49
+ """Represents either the top level or an instance of a hardware module."""
50
+
51
+ def __init__(self, parent: Optional["HWModule"], cpp_hwmodule: cpp.HWModule):
52
+ self.parent = parent
53
+ self.cpp_hwmodule = cpp_hwmodule
54
+
55
+ @property
56
+ def children(self) -> Dict[cpp.AppID, "Instance"]:
57
+ return {
58
+ name: Instance(self, inst)
59
+ for name, inst in self.cpp_hwmodule.children.items()
60
+ }
61
+
62
+ @property
63
+ def ports(self) -> Dict[cpp.AppID, BundlePort]:
64
+ return {
65
+ name: BundlePort(self, port)
66
+ for name, port in self.cpp_hwmodule.ports.items()
67
+ }
68
+
69
+ @property
70
+ def services(self) -> List[cpp.AppID]:
71
+ return self.cpp_hwmodule.services
72
+
73
+
74
+ MMIO = cpp.MMIO
75
+
76
+
77
+ class Instance(HWModule):
78
+ """Subclass of `HWModule` which represents a submodule instance. Adds an
79
+ AppID, which the top level doesn't have or need."""
80
+
81
+ def __init__(self, parent: Optional["HWModule"], cpp_instance: cpp.Instance):
82
+ super().__init__(parent, cpp_instance)
83
+ self.cpp_hwmodule: cpp.Instance = cpp_instance
84
+
85
+ @property
86
+ def id(self) -> cpp.AppID:
87
+ return self.cpp_hwmodule.id
88
+
89
+
90
+ class Accelerator(HWModule):
91
+ """Root of the accelerator design hierarchy."""
92
+
93
+ def __init__(self, cpp_accelerator: cpp.Accelerator):
94
+ super().__init__(None, cpp_accelerator)
95
+ self.cpp_hwmodule = cpp_accelerator
@@ -0,0 +1,405 @@
1
+ #!/usr/bin/env python3
2
+
3
+ # ===- esi-cosim.py - ESI cosimulation launch utility --------*- python -*-===//
4
+ #
5
+ # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
6
+ # See https://llvm.org/LICENSE.txt for license information.
7
+ # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
8
+ #
9
+ # ===----------------------------------------------------------------------===//
10
+ #
11
+ # Utility script to start a simulation and launch a command to interact with it
12
+ # via ESI cosimulation.
13
+ #
14
+ # ===----------------------------------------------------------------------===//
15
+
16
+ import argparse
17
+ import os
18
+ from pathlib import Path
19
+ import re
20
+ import signal
21
+ import socket
22
+ import subprocess
23
+ import sys
24
+ import textwrap
25
+ import time
26
+ from typing import Dict, List
27
+
28
+ _thisdir = Path(__file__).parent
29
+ CosimCollateralDir = _thisdir.parent / "cosim"
30
+
31
+
32
+ def is_port_open(port) -> bool:
33
+ """Check if a TCP port is open locally."""
34
+ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
35
+ result = sock.connect_ex(('127.0.0.1', port))
36
+ sock.close()
37
+ return True if result == 0 else False
38
+
39
+
40
+ class SourceFiles:
41
+
42
+ def __init__(self, top: str) -> None:
43
+ # User source files.
44
+ self.user: List[Path] = []
45
+ # DPI shared objects.
46
+ self.dpi_so: List[str] = ["EsiCosimDpiServer"]
47
+ # DPI SV files.
48
+ self.dpi_sv: List[Path] = [
49
+ CosimCollateralDir / "Cosim_DpiPkg.sv",
50
+ CosimCollateralDir / "Cosim_Endpoint.sv",
51
+ CosimCollateralDir / "Cosim_Manifest.sv",
52
+ ]
53
+ # Name of the top module.
54
+ self.top = top
55
+
56
+ def add_dir(self, dir: Path):
57
+ """Add all the RTL files in a directory to the source list."""
58
+ for file in sorted(dir.iterdir()):
59
+ if file.is_file() and (file.suffix == ".sv" or file.suffix == ".v"):
60
+ self.user.append(file)
61
+ elif file.is_dir():
62
+ self.add_dir(file)
63
+
64
+ def dpi_so_paths(self) -> List[Path]:
65
+ """Return a list of all the DPI shared object files."""
66
+
67
+ def find_so(name: str) -> Path:
68
+ for path in Simulator.get_env().get("LD_LIBRARY_PATH", "").split(":"):
69
+ if os.name == "nt":
70
+ so = Path(path) / f"{name}.dll"
71
+ else:
72
+ so = Path(path) / f"lib{name}.so"
73
+ if so.exists():
74
+ return so
75
+ raise FileNotFoundError(f"Could not find {name}.so in LD_LIBRARY_PATH")
76
+
77
+ return [find_so(name) for name in self.dpi_so]
78
+
79
+ @property
80
+ def rtl_sources(self) -> List[Path]:
81
+ """Return a list of all the RTL source files."""
82
+ return self.dpi_sv + self.user
83
+
84
+
85
+ class Simulator:
86
+
87
+ # Some RTL simulators don't use stderr for error messages. Everything goes to
88
+ # stdout. Boo! They should feel bad about this. Also, they can specify that
89
+ # broken behavior by overriding this.
90
+ UsesStderr = True
91
+
92
+ def __init__(self, sources: SourceFiles, run_dir: Path, debug: bool):
93
+ self.sources = sources
94
+ self.run_dir = run_dir
95
+ self.debug = debug
96
+
97
+ @staticmethod
98
+ def get_env() -> Dict[str, str]:
99
+ """Get the environment variables to locate shared objects."""
100
+
101
+ env = os.environ.copy()
102
+ env["LIBRARY_PATH"] = env.get("LIBRARY_PATH", "") + ":" + str(
103
+ _thisdir.parent / "lib")
104
+ env["LD_LIBRARY_PATH"] = env.get("LD_LIBRARY_PATH", "") + ":" + str(
105
+ _thisdir.parent / "lib")
106
+ return env
107
+
108
+ def compile_commands(self) -> List[List[str]]:
109
+ """Compile the sources. Returns the exit code of the simulation compiler."""
110
+ assert False, "Must be implemented by subclass"
111
+
112
+ def compile(self) -> int:
113
+ cmds = self.compile_commands()
114
+ self.run_dir.mkdir(parents=True, exist_ok=True)
115
+ with (self.run_dir / "compile_stdout.log").open("w") as stdout, (
116
+ self.run_dir / "compile_stderr.log").open("w") as stderr:
117
+ for cmd in cmds:
118
+ stderr.write(" ".join(cmd) + "\n")
119
+ cp = subprocess.run(cmd,
120
+ env=Simulator.get_env(),
121
+ capture_output=True,
122
+ text=True)
123
+ stdout.write(cp.stdout)
124
+ stderr.write(cp.stderr)
125
+ if cp.returncode != 0:
126
+ print("====== Compilation failure:")
127
+ if self.UsesStderr:
128
+ print(cp.stderr)
129
+ else:
130
+ print(cp.stdout)
131
+ return cp.returncode
132
+ return 0
133
+
134
+ def run_command(self, gui: bool) -> List[str]:
135
+ """Return the command to run the simulation."""
136
+ assert False, "Must be implemented by subclass"
137
+
138
+ def run(self, inner_command: str, gui: bool = False) -> int:
139
+ """Start the simulation then run the command specified. Kill the simulation
140
+ when the command exits."""
141
+
142
+ # 'simProc' is accessed in the finally block. Declare it here to avoid
143
+ # syntax errors in that block.
144
+ simProc = None
145
+ try:
146
+ # Open log files
147
+ self.run_dir.mkdir(parents=True, exist_ok=True)
148
+ simStdout = open(self.run_dir / "sim_stdout.log", "w")
149
+ simStderr = open(self.run_dir / "sim_stderr.log", "w")
150
+
151
+ # Erase the config file if it exists. We don't want to read
152
+ # an old config.
153
+ portFileName = self.run_dir / "cosim.cfg"
154
+ if os.path.exists(portFileName):
155
+ os.remove(portFileName)
156
+
157
+ # Run the simulation.
158
+ simEnv = Simulator.get_env()
159
+ if self.debug:
160
+ simEnv["COSIM_DEBUG_FILE"] = "cosim_debug.log"
161
+ if "DEBUG_PERIOD" not in simEnv:
162
+ # Slow the simulation down to one tick per millisecond.
163
+ simEnv["DEBUG_PERIOD"] = "1"
164
+ simProc = subprocess.Popen(self.run_command(gui),
165
+ stdout=simStdout,
166
+ stderr=simStderr,
167
+ env=simEnv,
168
+ cwd=self.run_dir,
169
+ preexec_fn=os.setsid)
170
+ simStderr.close()
171
+ simStdout.close()
172
+
173
+ # Get the port which the simulation RPC selected.
174
+ checkCount = 0
175
+ while (not os.path.exists(portFileName)) and \
176
+ simProc.poll() is None:
177
+ time.sleep(0.1)
178
+ checkCount += 1
179
+ if checkCount > 200 and not gui:
180
+ raise Exception(f"Cosim never wrote cfg file: {portFileName}")
181
+ port = -1
182
+ while port < 0:
183
+ portFile = open(portFileName, "r")
184
+ for line in portFile.readlines():
185
+ m = re.match("port: (\\d+)", line)
186
+ if m is not None:
187
+ port = int(m.group(1))
188
+ portFile.close()
189
+
190
+ # Wait for the simulation to start accepting RPC connections.
191
+ checkCount = 0
192
+ while not is_port_open(port):
193
+ checkCount += 1
194
+ if checkCount > 200:
195
+ raise Exception(f"Cosim RPC port ({port}) never opened")
196
+ if simProc.poll() is not None:
197
+ raise Exception("Simulation exited early")
198
+ time.sleep(0.05)
199
+
200
+ # Run the inner command, passing the connection info via environment vars.
201
+ testEnv = os.environ.copy()
202
+ testEnv["ESI_COSIM_PORT"] = str(port)
203
+ testEnv["ESI_COSIM_HOST"] = "localhost"
204
+ return subprocess.run(inner_command, cwd=os.getcwd(),
205
+ env=testEnv).returncode
206
+ finally:
207
+ # Make sure to stop the simulation no matter what.
208
+ if simProc:
209
+ os.killpg(os.getpgid(simProc.pid), signal.SIGINT)
210
+ # Allow the simulation time to flush its outputs.
211
+ try:
212
+ simProc.wait(timeout=1.0)
213
+ except subprocess.TimeoutExpired:
214
+ # If the simulation doesn't exit of its own free will, kill it.
215
+ simProc.kill()
216
+
217
+
218
+ class Verilator(Simulator):
219
+ """Run and compile funcs for Verilator."""
220
+
221
+ DefaultDriver = CosimCollateralDir / "driver.cpp"
222
+
223
+ def __init__(self, sources: SourceFiles, run_dir: Path, debug: bool):
224
+ super().__init__(sources, run_dir, debug)
225
+
226
+ self.verilator = "verilator"
227
+ if "VERILATOR_PATH" in os.environ:
228
+ self.verilator = os.environ["VERILATOR_PATH"]
229
+
230
+ def compile_commands(self) -> List[List[str]]:
231
+ cmd: List[str] = [
232
+ self.verilator,
233
+ "--cc",
234
+ "--top-module",
235
+ self.sources.top,
236
+ "-DSIMULATION",
237
+ "-Wno-TIMESCALEMOD",
238
+ "-Wno-fatal",
239
+ "-sv",
240
+ "--build",
241
+ "--exe",
242
+ "--assert",
243
+ str(Verilator.DefaultDriver),
244
+ ]
245
+ cflags = [
246
+ "-DTOP_MODULE=" + self.sources.top,
247
+ ]
248
+ if self.debug:
249
+ cmd += [
250
+ "--trace", "--trace-params", "--trace-structs", "--trace-underscore"
251
+ ]
252
+ cflags.append("-DTRACE")
253
+ if len(cflags) > 0:
254
+ cmd += ["-CFLAGS", " ".join(cflags)]
255
+ if len(self.sources.dpi_so) > 0:
256
+ cmd += ["-LDFLAGS", " ".join(["-l" + so for so in self.sources.dpi_so])]
257
+ cmd += [str(p) for p in self.sources.rtl_sources]
258
+ return [cmd]
259
+
260
+ def run_command(self, gui: bool):
261
+ if gui:
262
+ raise RuntimeError("Verilator does not support GUI mode.")
263
+ exe = Path.cwd() / "obj_dir" / ("V" + self.sources.top)
264
+ return [str(exe)]
265
+
266
+
267
+ class Questa(Simulator):
268
+ """Run and compile funcs for Questasim."""
269
+
270
+ DefaultDriver = CosimCollateralDir / "driver.sv"
271
+
272
+ # Questa doesn't use stderr for error messages. Everything goes to stdout.
273
+ UsesStderr = False
274
+
275
+ def internal_compile_commands(self) -> List[str]:
276
+ cmds = [
277
+ "onerror { quit -f -code 1 }",
278
+ ]
279
+ sources = self.sources.rtl_sources
280
+ sources.append(Questa.DefaultDriver)
281
+ for src in sources:
282
+ cmds.append(f"vlog -incr +acc -sv +define+TOP_MODULE={self.sources.top}"
283
+ f" +define+SIMULATION {str(src)}")
284
+ cmds.append(f"vopt -incr driver -o driver_opt +acc")
285
+ return cmds
286
+
287
+ def compile_commands(self) -> List[List[str]]:
288
+ with open("compile.do", "w") as f:
289
+ for cmd in self.internal_compile_commands():
290
+ f.write(cmd)
291
+ f.write("\n")
292
+ f.write("quit\n")
293
+ return [
294
+ ["vsim", "-batch", "-do", "compile.do"],
295
+ ]
296
+
297
+ def run_command(self, gui: bool) -> List[str]:
298
+ vsim = "vsim"
299
+ # Note: vsim exit codes say nothing about the test run's pass/fail even
300
+ # if $fatal is encountered in the simulation.
301
+ if gui:
302
+ cmd = [
303
+ vsim,
304
+ "driver_opt",
305
+ ]
306
+ else:
307
+ cmd = [
308
+ vsim,
309
+ "driver_opt",
310
+ "-batch",
311
+ "-do",
312
+ "run -all",
313
+ ]
314
+ for lib in self.sources.dpi_so_paths():
315
+ svLib = os.path.splitext(lib)[0]
316
+ cmd.append("-sv_lib")
317
+ cmd.append(svLib)
318
+ return cmd
319
+
320
+ def run(self, inner_command: str, gui: bool = False) -> int:
321
+ """Override the Simulator.run() to add a soft link in the run directory (to
322
+ the work directory) before running vsim the usual way."""
323
+
324
+ # Create a soft link to the work directory.
325
+ workDir = self.run_dir / "work"
326
+ if not workDir.exists():
327
+ os.symlink(Path(os.getcwd()) / "work", workDir)
328
+
329
+ # Run the simulation.
330
+ return super().run(inner_command, gui)
331
+
332
+
333
+ def __main__(args):
334
+ argparser = argparse.ArgumentParser(
335
+ description="Wrap a 'inner_cmd' in an ESI cosimulation environment.",
336
+ formatter_class=argparse.RawDescriptionHelpFormatter,
337
+ epilog=textwrap.dedent("""
338
+ Notes:
339
+ - For Verilator, libEsiCosimDpiServer.so must be in the dynamic
340
+ library runtime search path (LD_LIBRARY_PATH) and link time path
341
+ (LIBRARY_PATH). If it is installed to a standard location (e.g.
342
+ /usr/lib), this should be handled automatically.
343
+ - This script needs to sit in the same directory as the ESI support
344
+ SystemVerilog (e.g. Cosim_DpiPkg.sv, Cosim_MMIO.sv, etc.). It can,
345
+ however, be soft linked to a different location.
346
+ - The simulator executable(s) must be in your PATH.
347
+ """))
348
+
349
+ argparser.add_argument(
350
+ "--sim",
351
+ type=str,
352
+ default="verilator",
353
+ help="Name of the RTL simulator to use or path to an executable.")
354
+ argparser.add_argument("--rundir",
355
+ default="run",
356
+ help="Directory in which simulation should be run.")
357
+ argparser.add_argument(
358
+ "--top",
359
+ default="ESI_Cosim_Top",
360
+ help="Name of the 'top' module to use in the simulation.")
361
+ argparser.add_argument("--no-compile",
362
+ action="store_true",
363
+ help="Do not run the compile.")
364
+ argparser.add_argument("--debug",
365
+ action="store_true",
366
+ help="Enable debug output.")
367
+ argparser.add_argument("--gui",
368
+ action="store_true",
369
+ help="Run the simulator in GUI mode (if supported).")
370
+ argparser.add_argument("--source",
371
+ help="Directories containing the source files.",
372
+ default="hw")
373
+
374
+ argparser.add_argument("inner_cmd",
375
+ nargs=argparse.REMAINDER,
376
+ help="Command to run in the simulation environment.")
377
+
378
+ if len(args) <= 1:
379
+ argparser.print_help()
380
+ return
381
+ args = argparser.parse_args(args[1:])
382
+
383
+ sources = SourceFiles(args.top)
384
+ sources.add_dir(Path(args.source))
385
+
386
+ if args.sim == "verilator":
387
+ sim = Verilator(sources, Path(args.rundir), args.debug)
388
+ elif args.sim == "questa":
389
+ sim = Questa(sources, Path(args.rundir), args.debug)
390
+ else:
391
+ print("Unknown simulator: " + args.sim)
392
+ print("Supported simulators: ")
393
+ print(" - verilator")
394
+ print(" - questa")
395
+ return 1
396
+
397
+ if not args.no_compile:
398
+ rc = sim.compile()
399
+ if rc != 0:
400
+ return rc
401
+ return sim.run(args.inner_cmd[1:], gui=args.gui)
402
+
403
+
404
+ if __name__ == '__main__':
405
+ sys.exit(__main__(sys.argv))
Binary file
@@ -0,0 +1,15 @@
1
+ add_library(esiaccel::ESICppRuntime SHARED IMPORTED)
2
+ set_target_properties(esiaccel::ESICppRuntime PROPERTIES
3
+ INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_LIST_DIR}/../include"
4
+ )
5
+
6
+ if(WIN32)
7
+ set_target_properties(esiaccel::ESICppRuntime PROPERTIES
8
+ IMPORTED_LOCATION "${CMAKE_CURRENT_LIST_DIR}/../ESICppRuntime.dll"
9
+ IMPORTED_IMPLIB "${CMAKE_CURRENT_LIST_DIR}/../ESICppRuntime.lib"
10
+ )
11
+ else()
12
+ set_target_properties(esiaccel::ESICppRuntime PROPERTIES
13
+ IMPORTED_LOCATION "${CMAKE_CURRENT_LIST_DIR}/../python/esiaccel/libESICppRuntime.so"
14
+ )
15
+ endif()