110 py::class_<Type>(m,
"Type")
111 .def_property_readonly(
"id", &Type::getID)
112 .def(
"__repr__", [](
Type &t) {
return "<" + t.
getID() +
">"; });
113 py::class_<ChannelType, Type>(m,
"ChannelType")
114 .def_property_readonly(
"inner", &ChannelType::getInner,
115 py::return_value_policy::reference);
116 py::enum_<BundleType::Direction>(m,
"Direction")
117 .value(
"To", BundleType::Direction::To)
118 .value(
"From", BundleType::Direction::From)
120 py::class_<BundleType, Type>(m,
"BundleType")
121 .def_property_readonly(
"channels", &BundleType::getChannels,
122 py::return_value_policy::reference);
123 py::class_<VoidType, Type>(m,
"VoidType");
124 py::class_<AnyType, Type>(m,
"AnyType");
125 py::class_<BitVectorType, Type>(m,
"BitVectorType")
127 py::class_<BitsType, BitVectorType>(m,
"BitsType");
128 py::class_<IntegerType, BitVectorType>(m,
"IntegerType");
129 py::class_<SIntType, IntegerType>(m,
"SIntType");
130 py::class_<UIntType, IntegerType>(m,
"UIntType");
131 py::class_<StructType, Type>(m,
"StructType")
132 .def_property_readonly(
"fields", &StructType::getFields,
133 py::return_value_policy::reference);
134 py::class_<ArrayType, Type>(m,
"ArrayType")
135 .def_property_readonly(
"element", &ArrayType::getElementType,
136 py::return_value_policy::reference)
137 .def_property_readonly(
"size", &ArrayType::getSize);
139 py::class_<Constant>(m,
"Constant")
140 .def_property_readonly(
"value", [](
Constant &c) {
return c.
value; })
141 .def_property_readonly(
143 py::return_value_policy::reference);
145 py::class_<AppID>(m,
"AppID")
146 .def(py::init<std::string, std::optional<uint32_t>>(), py::arg(
"name"),
147 py::arg(
"idx") = std::nullopt)
148 .def_property_readonly(
"name", [](
AppID &
id) {
return id.name; })
149 .def_property_readonly(
"idx",
150 [](
AppID &
id) -> py::object {
152 return py::cast(
id.idx);
157 std::string ret =
"<" +
id.name;
159 ret = ret +
"[" + std::to_string(*
id.idx) +
"]";
163 .def(
"__eq__", [](
AppID &a,
AppID &b) {
return a == b; })
164 .def(
"__hash__", [](
AppID &
id) {
166 std::hash<uint32_t>{}(
id.idx.value_or(-1)));
170 py::class_<ModuleInfo>(m,
"ModuleInfo")
171 .def_property_readonly(
"name", [](
ModuleInfo &info) {
return info.name; })
172 .def_property_readonly(
"summary",
173 [](
ModuleInfo &info) {
return info.summary; })
174 .def_property_readonly(
"version",
175 [](
ModuleInfo &info) {
return info.version; })
176 .def_property_readonly(
"repo", [](
ModuleInfo &info) {
return info.repo; })
177 .def_property_readonly(
"commit_hash",
178 [](
ModuleInfo &info) {
return info.commitHash; })
179 .def_property_readonly(
"constants",
180 [](
ModuleInfo &info) {
return info.constants; })
184 std::stringstream os(ret);
189 py::enum_<Logger::Level>(m,
"LogLevel")
190 .value(
"Debug", Logger::Level::Debug)
191 .value(
"Info", Logger::Level::Info)
192 .value(
"Warning", Logger::Level::Warning)
193 .value(
"Error", Logger::Level::Error)
195 py::class_<Logger>(m,
"Logger");
197 py::class_<services::Service>(m,
"Service");
199 py::class_<SysInfo, services::Service>(m,
"SysInfo")
203 py::class_<MMIO::RegionDescriptor>(m,
"MMIORegionDescriptor")
204 .def_property_readonly(
"base",
206 .def_property_readonly(
"size",
208 py::class_<services::MMIO, services::Service>(m,
"MMIO")
212 py::return_value_policy::reference);
214 py::class_<services::HostMem::HostMemRegion>(m,
"HostMemRegion")
215 .def_property_readonly(
"ptr",
217 return reinterpret_cast<uintptr_t
>(mem.
getPtr());
219 .def_property_readonly(
"size",
222 py::class_<services::HostMem::Options>(m,
"HostMemOptions")
225 .def_readwrite(
"use_large_pages",
228 std::string ret =
"HostMemOptions(";
232 ret +=
"use_large_pages";
237 py::class_<services::HostMem, services::Service>(m,
"HostMem")
240 py::return_value_policy::take_ownership)
244 return self.
mapMemory(
reinterpret_cast<void *
>(ptr), size, opts);
246 py::arg(
"ptr"), py::arg(
"size"),
250 [](
HostMem &self, uintptr_t ptr) {
251 return self.
unmapMemory(
reinterpret_cast<void *
>(ptr));
256 py::class_<std::future<MessageData>>(m,
"MessageDataFuture")
258 [](std::future<MessageData> &f) {
264 .def(
"wait", &std::future<MessageData>::wait)
265 .def(
"get", [](std::future<MessageData> &f) {
267 return py::bytearray((
const char *)data.getBytes(), data.getSize());
270 py::class_<ChannelPort>(m,
"ChannelPort")
272 py::arg(
"buffer_size") = std::nullopt)
275 py::return_value_policy::reference);
277 py::class_<WriteChannelPort, ChannelPort>(m,
"WriteChannelPort")
280 py::buffer_info info(py::buffer(data).request());
281 std::vector<uint8_t> dataVec((uint8_t *)info.ptr,
282 (uint8_t *)info.ptr + info.size);
286 py::buffer_info info(py::buffer(data).request());
287 std::vector<uint8_t> dataVec((uint8_t *)info.ptr,
288 (uint8_t *)info.ptr + info.size);
291 py::class_<ReadChannelPort, ChannelPort>(m,
"ReadChannelPort")
297 return py::bytearray((
const char *)data.getBytes(), data.getSize());
299 "Read data from the channel. Blocking.")
302 py::class_<BundlePort>(m,
"BundlePort")
303 .def_property_readonly(
"id", &BundlePort::getID)
304 .def_property_readonly(
"channels", &BundlePort::getChannels,
305 py::return_value_policy::reference)
306 .def(
"getWrite", &BundlePort::getRawWrite,
307 py::return_value_policy::reference)
308 .def(
"getRead", &BundlePort::getRawRead,
309 py::return_value_policy::reference);
311 py::class_<ServicePort, BundlePort>(m,
"ServicePort");
313 py::class_<MMIO::MMIORegion, ServicePort>(m,
"MMIORegion")
318 py::class_<FuncService::Function, ServicePort>(m,
"Function")
322 py::bytearray msg) -> std::future<MessageData> {
323 py::buffer_info info(py::buffer(msg).request());
324 std::vector<uint8_t> dataVec((uint8_t *)info.ptr,
325 (uint8_t *)info.ptr + info.size);
327 return self.call(data);
329 py::return_value_policy::take_ownership)
332 py::class_<CallService::Callback, ServicePort>(m,
"Callback")
334 std::function<py::object(py::object)> pyCallback) {
339 py::gil_scoped_acquire acquire{};
340 std::vector<uint8_t> arg(req.
getBytes(),
342 py::bytearray argObj((
const char *)arg.data(), arg.size());
343 auto ret = pyCallback(argObj);
346 py::buffer_info info(py::buffer(ret).request());
347 std::vector<uint8_t> dataVec((uint8_t *)info.ptr,
348 (uint8_t *)info.ptr + info.size);
353 py::class_<TelemetryService::Telemetry, ServicePort>(m,
"Telemetry")
360 py::class_<HWModule>(m,
"HWModule")
363 py::return_value_policy::reference)
365 py::return_value_policy::reference);
368 py::class_<Instance, HWModule>(m,
"Instance")
371 py::class_<Accelerator, HWModule>(m,
"Accelerator");
376 py::return_value_policy::reference);
378 auto accConn = py::class_<AcceleratorConnection>(m,
"AcceleratorConnection");
380 py::class_<Context>(m,
"Context")
384 ctxt.setLogger(std::make_unique<StreamLogger>(level));
393 py::return_value_policy::reference)
399 py::return_value_policy::reference)
401 "get_service_hostmem",
405 py::return_value_policy::reference);
407 py::class_<Manifest>(m,
"Manifest")
408 .def(py::init<Context &, std::string>())
409 .def_property_readonly(
"api_version", &Manifest::getApiVersion)
413 auto acc = m.buildAccelerator(conn);
417 py::return_value_policy::reference)
418 .def_property_readonly(
"type_table",
420 std::vector<py::object> ret;
421 std::ranges::transform(m.getTypeTable(),
422 std::back_inserter(ret),
426 .def_property_readonly(
"module_infos", &Manifest::getModuleInfos);