20#include "experimental/xrt_bo.h"
21#include "experimental/xrt_device.h"
22#include "experimental/xrt_ip.h"
23#include "experimental/xrt_xclbin.h"
37std::unique_ptr<AcceleratorConnection>
40 std::string device_id;
42 size_t colon = connectionString.find(
':');
43 if (colon == std::string::npos) {
44 xclbin = connectionString;
46 xclbin = connectionString.substr(0, colon);
47 device_id = connectionString.substr(colon + 1);
50 return make_unique<XrtAccelerator>(
ctxt, xclbin, device_id);
56 Impl(std::string xclbin, std::string device_id) {
57 if (device_id.empty())
60 device = ::xrt::device(device_id);
63 ::xrt::xclbin xcl(xclbin);
64 std::optional<::xrt::xclbin::mem> host_mem;
65 for (
auto mem : xcl.get_mems()) {
68 if (mem.get_tag().starts_with(
"HOST")) {
69 if (host_mem.has_value())
70 throw std::runtime_error(
"Multiple host memories found in xclbin");
76 throw std::runtime_error(
"No host memory found in xclbin");
80 auto uuid =
device.load_xclbin(xcl);
91 std::string device_id)
93 impl = make_unique<Impl>(xclbin, device_id);
98class XrtMMIO :
public MMIO {
101 :
MMIO(conn, clients), ip(ip) {}
103 uint64_t read(uint32_t addr)
const override {
104 auto lo =
static_cast<uint64_t
>(ip.read_register(addr));
105 auto hi =
static_cast<uint64_t
>(ip.read_register(addr + 0x4));
106 return (hi << 32) | lo;
108 void write(uint32_t addr, uint64_t data)
override {
109 ip.write_register(addr, data);
110 ip.write_register(addr + 0x4, data >> 32);
120class XrtHostMem :
public HostMem {
122 XrtHostMem(
XrtAccelerator &conn, ::xrt::device &device, int32_t memoryGroup)
123 :
HostMem(conn), device(device), memoryGroup(memoryGroup){};
125 struct XrtHostMemRegion :
public HostMemRegion {
126 XrtHostMemRegion(::xrt::device &device, std::size_t size,
128 bo = ::xrt::bo(device, size, ::xrt::bo::flags::host_only, memoryGroup);
133 virtual void *getPtr()
const override {
return ptr; }
136 virtual void *getDevicePtr()
const override {
return (
void *)bo.address(); }
137 virtual std::size_t getSize()
const override {
return bo.size(); }
140 virtual void flush()
override { bo.sync(XCL_BO_SYNC_BO_TO_DEVICE); }
147 std::unique_ptr<HostMemRegion>
149 return std::unique_ptr<HostMemRegion>(
150 new XrtHostMemRegion(device, size, opts, memoryGroup));
154 ::xrt::device &device;
160 std::string implName,
163 if (svcType ==
typeid(
MMIO))
164 return new XrtMMIO(*
this,
impl->ip, clients);
165 else if (svcType ==
typeid(
HostMem))
166 return new XrtHostMem(*
this,
impl->device,
impl->memoryGroup);
167 else if (svcType ==
typeid(
SysInfo))
#define REGISTER_ACCELERATOR(Name, TAccelerator)
Abstract class representing a connection to an accelerator.
virtual void disconnect()
Disconnect from the accelerator cleanly.
Context & ctxt
ESI accelerator context.
AcceleratorConnections, Accelerators, and Manifests must all share a context.
Connect to an ESI simulation.
XrtAccelerator(Context &, std::string xclbin, std::string kernelName)
Construct and connect to a cosim server.
static std::unique_ptr< AcceleratorConnection > connect(Context &, std::string connectionString)
Parse the connection std::string and instantiate the accelerator.
std::unique_ptr< Impl > impl
virtual Service * createService(Service::Type service, AppIDPath path, std::string implName, const ServiceImplDetails &details, const HWClientDetails &clients) override
Called by getServiceImpl exclusively.
Implement the SysInfo API for a standard MMIO protocol.
Parent class of all APIs modeled as 'services'.
const std::type_info & Type
Information about the Accelerator system.
std::map< std::string, std::any > ServiceImplDetails
std::vector< HWClientDetail > HWClientDetails
static constexpr char kernel_name[]
Impl(std::string xclbin, std::string device_id)
Options for allocating host memory.