|
Packit |
534379 |
// Copyright(c) 2017-2018, Intel Corporation
|
|
Packit |
534379 |
//
|
|
Packit |
534379 |
// Redistribution and use in source and binary forms, with or without
|
|
Packit |
534379 |
// modification, are permitted provided that the following conditions are met:
|
|
Packit |
534379 |
//
|
|
Packit |
534379 |
// * Redistributions of source code must retain the above copyright notice,
|
|
Packit |
534379 |
// this list of conditions and the following disclaimer.
|
|
Packit |
534379 |
// * Redistributions in binary form must reproduce the above copyright notice,
|
|
Packit |
534379 |
// this list of conditions and the following disclaimer in the documentation
|
|
Packit |
534379 |
// and/or other materials provided with the distribution.
|
|
Packit |
534379 |
// * Neither the name of Intel Corporation nor the names of its contributors
|
|
Packit |
534379 |
// may be used to endorse or promote products derived from this software
|
|
Packit |
534379 |
// without specific prior written permission.
|
|
Packit |
534379 |
//
|
|
Packit |
534379 |
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
Packit |
534379 |
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
Packit |
534379 |
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
Packit |
534379 |
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
Packit |
534379 |
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
Packit |
534379 |
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
Packit |
534379 |
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
Packit |
534379 |
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
Packit |
534379 |
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
Packit |
534379 |
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
Packit |
534379 |
// POSSIBILITY OF SUCH DAMAGE.
|
|
Packit |
534379 |
#include <Python.h>
|
|
Packit |
534379 |
#include <opae/cxx/core/token.h>
|
|
Packit |
534379 |
#include <opae/cxx/core/version.h>
|
|
Packit |
534379 |
#include <opae/fpga.h>
|
|
Packit |
534379 |
#include <pybind11/pybind11.h>
|
|
Packit |
534379 |
#include <pybind11/stl.h>
|
|
Packit |
534379 |
#include <atomic>
|
|
Packit |
534379 |
#include <exception>
|
|
Packit |
534379 |
#include "pyerrors.h"
|
|
Packit |
534379 |
#include "pyevents.h"
|
|
Packit |
534379 |
#include "pyhandle.h"
|
|
Packit |
534379 |
#include "pyproperties.h"
|
|
Packit |
534379 |
#include "pyshared_buffer.h"
|
|
Packit |
534379 |
#include "pysysobject.h"
|
|
Packit |
534379 |
#include "pytoken.h"
|
|
Packit |
534379 |
|
|
Packit |
534379 |
namespace py = pybind11;
|
|
Packit |
534379 |
using opae::fpga::types::properties;
|
|
Packit |
534379 |
using opae::fpga::types::token;
|
|
Packit |
534379 |
using opae::fpga::types::handle;
|
|
Packit |
534379 |
using opae::fpga::types::shared_buffer;
|
|
Packit |
534379 |
using opae::fpga::types::event;
|
|
Packit |
534379 |
using opae::fpga::types::error;
|
|
Packit |
534379 |
using opae::fpga::types::sysobject;
|
|
Packit |
534379 |
using opae::fpga::types::version;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
const char *memory_barrier_doc = R"opaedoc(
|
|
Packit |
534379 |
Place a memory barrier or fence to ensure that all preceding memory operations have completed before continuing.
|
|
Packit |
534379 |
)opaedoc";
|
|
Packit |
534379 |
|
|
Packit |
534379 |
#ifdef OPAE_EMBEDDED
|
|
Packit |
534379 |
#include <pybind11/embed.h>
|
|
Packit |
534379 |
PYBIND11_EMBEDDED_MODULE(_opae, m) {
|
|
Packit |
534379 |
m.def("initialize", &fpgaInitialize);
|
|
Packit |
534379 |
#else
|
|
Packit |
534379 |
PYBIND11_MODULE(_opae, m) {
|
|
Packit |
534379 |
fpgaInitialize(nullptr);
|
|
Packit |
534379 |
#endif
|
|
Packit |
534379 |
|
|
Packit |
534379 |
py::options opts;
|
|
Packit |
534379 |
// opts.disable_function_signatures();
|
|
Packit |
534379 |
|
|
Packit |
534379 |
m.doc() = "Open Programmable Acceleration Engine - Python bindings";
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// define enumerations
|
|
Packit |
534379 |
py::enum_<fpga_result>(m, "fpga_result", py::arithmetic(),
|
|
Packit |
534379 |
"OPAE return codes")
|
|
Packit |
534379 |
.value("OK", FPGA_OK)
|
|
Packit |
534379 |
.value("INVALID_PARAM", FPGA_INVALID_PARAM)
|
|
Packit |
534379 |
.value("BUSY", FPGA_BUSY)
|
|
Packit |
534379 |
.value("EXCEPTION", FPGA_EXCEPTION)
|
|
Packit |
534379 |
.value("NOT_FOUND", FPGA_NOT_FOUND)
|
|
Packit |
534379 |
.value("NO_MEMORY", FPGA_NO_MEMORY)
|
|
Packit |
534379 |
.value("NOT_SUPPORTED", FPGA_NOT_SUPPORTED)
|
|
Packit |
534379 |
.value("NO_DRIVER", FPGA_NO_DRIVER)
|
|
Packit |
534379 |
.value("NO_DAEMON", FPGA_NO_DAEMON)
|
|
Packit |
534379 |
.value("NO_ACCESS", FPGA_NO_ACCESS)
|
|
Packit |
534379 |
.value("RECONF_ERROR", FPGA_RECONF_ERROR)
|
|
Packit |
534379 |
.export_values();
|
|
Packit |
534379 |
|
|
Packit |
534379 |
py::enum_<fpga_objtype>(m, "fpga_objtype", py::arithmetic(),
|
|
Packit |
534379 |
"OPAE resource objects")
|
|
Packit |
534379 |
.value("DEVICE", FPGA_DEVICE)
|
|
Packit |
534379 |
.value("ACCELERATOR", FPGA_ACCELERATOR)
|
|
Packit |
534379 |
.export_values();
|
|
Packit |
534379 |
|
|
Packit |
534379 |
py::enum_<fpga_open_flags>(m, "fpga_open_flags", py::arithmetic(),
|
|
Packit |
534379 |
"OPAE flags for opening resources")
|
|
Packit |
534379 |
.value("OPEN_SHARED", FPGA_OPEN_SHARED)
|
|
Packit |
534379 |
.export_values();
|
|
Packit |
534379 |
|
|
Packit |
534379 |
py::enum_<fpga_event_type>(m, "fpga_event_type", py::arithmetic(),
|
|
Packit |
534379 |
"OPAE event type")
|
|
Packit |
534379 |
.value("EVENT_INTERRUPT", FPGA_EVENT_INTERRUPT)
|
|
Packit |
534379 |
.value("EVENT_ERROR", FPGA_EVENT_ERROR)
|
|
Packit |
534379 |
.value("EVENT_POWER_THERMAL", FPGA_EVENT_POWER_THERMAL)
|
|
Packit |
534379 |
.export_values();
|
|
Packit |
534379 |
|
|
Packit |
534379 |
py::enum_<fpga_accelerator_state>(m, "fpga_accelerator_state",
|
|
Packit |
534379 |
py::arithmetic(), "OPAE accelerator_state")
|
|
Packit |
534379 |
.value("ACCELERATOR_ASSIGNED", FPGA_ACCELERATOR_ASSIGNED)
|
|
Packit |
534379 |
.value("ACCELERATOR_UNASSIGNED", FPGA_ACCELERATOR_UNASSIGNED)
|
|
Packit |
534379 |
.export_values();
|
|
Packit |
534379 |
|
|
Packit |
534379 |
py::enum_<fpga_sysobject_flags>(m, "fpga_sysobject_flags", py::arithmetic(),
|
|
Packit |
534379 |
"OPAE sysobject API flags.")
|
|
Packit |
534379 |
.value("SYSOBJECT_SYNC", FPGA_OBJECT_SYNC)
|
|
Packit |
534379 |
.value("SYSOBJECT_RAW", FPGA_OBJECT_RAW)
|
|
Packit |
534379 |
.value("SYSOBJECT_GLOB", FPGA_OBJECT_GLOB)
|
|
Packit |
534379 |
.value("SYSOBJECT_RECURSE_ONE", FPGA_OBJECT_RECURSE_ONE)
|
|
Packit |
534379 |
.value("SYSOBJECT_RECURSE_ALL", FPGA_OBJECT_RECURSE_ALL)
|
|
Packit |
534379 |
.export_values();
|
|
Packit |
534379 |
|
|
Packit |
534379 |
py::enum_<fpga_reconf_flags>(
|
|
Packit |
534379 |
m, "fpga_reconf_flags", py::arithmetic(),
|
|
Packit |
534379 |
"Flags that define how an accelerator is opened.")
|
|
Packit |
534379 |
.value("RECONF_FORCE", FPGA_RECONF_FORCE)
|
|
Packit |
534379 |
.export_values();
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// version method
|
|
Packit |
534379 |
m.def("version", &version::as_string,
|
|
Packit |
534379 |
"Get the OPAE runtime version as a string");
|
|
Packit |
534379 |
m.def("build", &version::build, "Get the OPAE runtime build hash");
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// define properties class
|
|
Packit |
534379 |
py::class_<properties, properties::ptr_t> pyproperties(m, "properties",
|
|
Packit |
534379 |
properties_doc());
|
|
Packit |
534379 |
pyproperties.def(py::init(&properties_get), properties_doc_get())
|
|
Packit |
534379 |
.def(py::init(&properties_get_token), properties_doc_get_token())
|
|
Packit |
534379 |
.def(py::init(&properties_get_handle), properties_doc_get_handle())
|
|
Packit |
534379 |
.def_property("parent", properties_get_parent, properties_set_parent,
|
|
Packit |
534379 |
properties_doc_parent())
|
|
Packit |
534379 |
.def_property("guid", properties_get_guid, properties_set_guid,
|
|
Packit |
534379 |
properties_doc_guid())
|
|
Packit |
534379 |
.def_property("type", properties_get_type, properties_set_type,
|
|
Packit |
534379 |
properties_doc_type())
|
|
Packit |
534379 |
.def_property("segment", properties_get_segment, properties_set_segment,
|
|
Packit |
534379 |
properties_doc_segment())
|
|
Packit |
534379 |
.def_property("bus", properties_get_bus, properties_set_bus,
|
|
Packit |
534379 |
properties_doc_bus())
|
|
Packit |
534379 |
.def_property("device", properties_get_device, properties_set_device,
|
|
Packit |
534379 |
properties_doc_device())
|
|
Packit |
534379 |
.def_property("function", properties_get_function,
|
|
Packit |
534379 |
properties_set_function, properties_doc_function())
|
|
Packit |
534379 |
.def_property("socket_id", properties_get_socket_id,
|
|
Packit |
534379 |
properties_set_socket_id, properties_doc_socket_id())
|
|
Packit |
534379 |
.def_property("object_id", properties_get_object_id,
|
|
Packit |
534379 |
properties_set_object_id, properties_doc_object_id())
|
|
Packit |
534379 |
.def_property("num_errors", properties_get_num_errors,
|
|
Packit |
534379 |
properties_set_num_errors, properties_doc_num_errors())
|
|
Packit |
534379 |
.def_property("num_slots", properties_get_num_slots,
|
|
Packit |
534379 |
properties_set_num_slots, properties_doc_num_slots())
|
|
Packit |
534379 |
.def_property("bbs_id", properties_get_bbs_id, properties_set_bbs_id,
|
|
Packit |
534379 |
properties_doc_bbs_id())
|
|
Packit |
534379 |
.def_property("bbs_version", properties_get_bbs_version,
|
|
Packit |
534379 |
properties_set_bbs_version, properties_doc_bbs_version())
|
|
Packit |
534379 |
.def_property("vendor_id", properties_get_vendor_id,
|
|
Packit |
534379 |
properties_set_vendor_id, properties_doc_vendor_id())
|
|
Packit |
534379 |
.def_property("device_id", properties_get_device_id,
|
|
Packit |
534379 |
properties_set_device_id, properties_doc_device_id())
|
|
Packit |
534379 |
.def_property("model", properties_get_model, properties_set_model,
|
|
Packit |
534379 |
properties_doc_model())
|
|
Packit |
534379 |
.def_property("local_memory_size", properties_get_local_memory_size,
|
|
Packit |
534379 |
properties_set_local_memory_size,
|
|
Packit |
534379 |
properties_doc_local_memory_size())
|
|
Packit |
534379 |
.def_property("capabilities", properties_get_capabilities,
|
|
Packit |
534379 |
properties_set_capabilities, properties_doc_capabilities())
|
|
Packit |
534379 |
.def_property("num_mmio", properties_get_num_mmio,
|
|
Packit |
534379 |
properties_set_num_mmio, properties_doc_num_mmio())
|
|
Packit |
534379 |
.def_property("num_interrupts", properties_get_num_interrupts,
|
|
Packit |
534379 |
properties_set_num_interrupts,
|
|
Packit |
534379 |
properties_doc_num_interrupts())
|
|
Packit |
534379 |
.def_property("accelerator_state", properties_get_accelerator_state,
|
|
Packit |
534379 |
properties_set_accelerator_state,
|
|
Packit |
534379 |
properties_doc_accelerator_state());
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// memory fence
|
|
Packit |
534379 |
m.def("memory_barrier",
|
|
Packit |
534379 |
[]() { std::atomic_thread_fence(std::memory_order_release); },
|
|
Packit |
534379 |
memory_barrier_doc);
|
|
Packit |
534379 |
// define token class
|
|
Packit |
534379 |
m.def("enumerate", &token::enumerate, token_doc_enumerate())
|
|
Packit |
534379 |
.def("enumerate", token_enumerate_kwargs, token_doc_enumerate_kwargs());
|
|
Packit |
534379 |
py::class_<token, token::ptr_t> pytoken(m, "token", token_doc());
|
|
Packit |
534379 |
pytoken.def("__getattr__", token_get_sysobject, sysobject_doc_token_get())
|
|
Packit |
534379 |
.def("__getitem__", token_get_sysobject, sysobject_doc_token_get())
|
|
Packit |
534379 |
.def("find", token_find_sysobject, sysobject_doc_token_find(),
|
|
Packit |
534379 |
py::arg("name"), py::arg("flags") = 0);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// define handle class
|
|
Packit |
534379 |
m.def("open", handle_open, handle_doc_open(), py::arg("tok"),
|
|
Packit |
534379 |
py::arg("flags") = 0);
|
|
Packit |
534379 |
py::class_<handle, handle::ptr_t> pyhandle(m, "handle");
|
|
Packit |
534379 |
pyhandle.def("__enter__", handle_context_enter, handle_doc_context_enter())
|
|
Packit |
534379 |
.def("__exit__", handle_context_exit, handle_doc_context_exit())
|
|
Packit |
534379 |
.def("reconfigure", handle_reconfigure, handle_doc_reconfigure(),
|
|
Packit |
534379 |
py::arg("slot"), py::arg("fd"), py::arg("flags") = 0)
|
|
Packit |
534379 |
.def("__bool__", handle_valid, handle_doc_valid())
|
|
Packit |
534379 |
.def("close", &handle::close, handle_doc_close())
|
|
Packit |
534379 |
.def("reset", &handle::reset, handle_doc_reset())
|
|
Packit |
534379 |
.def("read_csr32", &handle::read_csr32, handle_doc_read_csr32(),
|
|
Packit |
534379 |
py::arg("offset"), py::arg("csr_space") = 0)
|
|
Packit |
534379 |
.def("read_csr64", &handle::read_csr64, handle_doc_read_csr64(),
|
|
Packit |
534379 |
py::arg("offset"), py::arg("csr_space") = 0)
|
|
Packit |
534379 |
.def("write_csr32", &handle::write_csr32, handle_doc_write_csr32(),
|
|
Packit |
534379 |
py::arg("offset"), py::arg("value"), py::arg("csr_space") = 0)
|
|
Packit |
534379 |
.def("write_csr64", &handle::write_csr64, handle_doc_write_csr64(),
|
|
Packit |
534379 |
py::arg("offset"), py::arg("value"), py::arg("csr_space") = 0)
|
|
Packit |
534379 |
.def("__getattr__", handle_get_sysobject, sysobject_doc_handle_get())
|
|
Packit |
534379 |
.def("__getitem__", handle_get_sysobject, sysobject_doc_handle_get())
|
|
Packit |
534379 |
.def("find", handle_find_sysobject, sysobject_doc_handle_find(),
|
|
Packit |
534379 |
py::arg("name"), py::arg("flags") = 0);
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// define shared_buffer class
|
|
Packit |
534379 |
m.def("allocate_shared_buffer", shared_buffer_allocate,
|
|
Packit |
534379 |
shared_buffer_doc_allocate());
|
|
Packit |
534379 |
py::class_<shared_buffer, shared_buffer::ptr_t> pybuffer(
|
|
Packit |
534379 |
m, "shared_buffer", py::buffer_protocol(), shared_buffer_doc());
|
|
Packit |
534379 |
pybuffer.def("size", &shared_buffer::size, shared_buffer_doc_size())
|
|
Packit |
534379 |
.def("wsid", &shared_buffer::wsid, shared_buffer_doc_wsid())
|
|
Packit |
534379 |
.def("io_address", &shared_buffer::io_address,
|
|
Packit |
534379 |
shared_buffer_doc_io_address())
|
|
Packit |
534379 |
.def("fill", &shared_buffer::fill, shared_buffer_doc_fill())
|
|
Packit |
534379 |
.def("poll", shared_buffer_poll<uint8_t>,
|
|
Packit |
534379 |
"Poll for an 8-bit value being set at given offset",
|
|
Packit |
534379 |
py::arg("offset"), py::arg("value"), py::arg("mask") = 0,
|
|
Packit |
534379 |
py::arg("timeout_usec") = 1000)
|
|
Packit |
534379 |
.def("poll32", shared_buffer_poll<uint32_t>,
|
|
Packit |
534379 |
"Poll for a 32-bit value being set at given offset",
|
|
Packit |
534379 |
py::arg("offset"), py::arg("value"), py::arg("mask") = 0,
|
|
Packit |
534379 |
py::arg("timeout_usec") = 1000)
|
|
Packit |
534379 |
.def("poll64", shared_buffer_poll<uint64_t>,
|
|
Packit |
534379 |
"Poll for a 64-bit value being set at given offset",
|
|
Packit |
534379 |
py::arg("offset"), py::arg("value"), py::arg("mask"),
|
|
Packit |
534379 |
py::arg("timeout_usec") = 1000)
|
|
Packit |
534379 |
.def("compare", &shared_buffer::compare, shared_buffer_doc_compare())
|
|
Packit |
534379 |
.def("copy", shared_buffer_copy, shared_buffer_doc_copy(),
|
|
Packit |
534379 |
py::arg("other"), py::arg("size") = 0)
|
|
Packit |
534379 |
.def_buffer([](shared_buffer &b) -> py::buffer_info {
|
|
Packit |
534379 |
return py::buffer_info(
|
|
Packit |
534379 |
const_cast<uint8_t *>(b.c_type()), sizeof(uint8_t),
|
|
Packit |
534379 |
py::format_descriptor<uint8_t>::format(), b.size());
|
|
Packit |
534379 |
})
|
|
Packit |
534379 |
.def("read32", &shared_buffer::read<uint32_t>, shared_buffer_doc_read32())
|
|
Packit |
534379 |
.def("read64", &shared_buffer::read<uint64_t>, shared_buffer_doc_read64())
|
|
Packit |
534379 |
.def("write32", &shared_buffer::write<uint32_t>,
|
|
Packit |
534379 |
shared_buffer_doc_write32())
|
|
Packit |
534379 |
.def("write64", &shared_buffer::write<uint64_t>,
|
|
Packit |
534379 |
shared_buffer_doc_write64())
|
|
Packit |
534379 |
.def("split", shared_buffer_split, shared_buffer_doc_split())
|
|
Packit |
534379 |
.def("__getitem__", shared_buffer_getitem, shared_buffer_doc_getitem())
|
|
Packit |
534379 |
.def("__setitem__", shared_buffer_setitem, shared_buffer_doc_setitem())
|
|
Packit |
534379 |
.def("__getitem__", shared_buffer_getslice, shared_buffer_doc_getslice());
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// define event class
|
|
Packit |
534379 |
m.def("register_event", event_register_event, event_doc_register_event(),
|
|
Packit |
534379 |
py::arg("handle"), py::arg("event_type"), py::arg("flags") = 0);
|
|
Packit |
534379 |
py::class_<event, event::ptr_t> pyevent(m, "event", event_doc());
|
|
Packit |
534379 |
|
|
Packit |
534379 |
pyevent.def("os_object", event_os_object, event_doc_os_object());
|
|
Packit |
534379 |
|
|
Packit |
534379 |
py::class_<error, error::ptr_t> pyerror(m, "error", error_doc());
|
|
Packit |
534379 |
pyerror.def_property_readonly("name", &error::name, error_doc_name())
|
|
Packit |
534379 |
.def_property_readonly("can_clear", &error::can_clear,
|
|
Packit |
534379 |
error_doc_can_clear())
|
|
Packit |
534379 |
.def("read_value", &error::read_value, error_doc_read_value());
|
|
Packit |
534379 |
|
|
Packit |
534379 |
m.def("errors", error_errors, error_doc_errors());
|
|
Packit |
534379 |
|
|
Packit |
534379 |
// define object class
|
|
Packit |
534379 |
py::class_<sysobject, sysobject::ptr_t> pysysobject(m, "sysobject",
|
|
Packit |
534379 |
sysobject_doc());
|
|
Packit |
534379 |
pysysobject
|
|
Packit |
534379 |
.def("__getattr__", sysobject_get_sysobject, sysobject_doc_object_get())
|
|
Packit |
534379 |
.def("__getitem__", sysobject_get_sysobject, sysobject_doc_object_get())
|
|
Packit |
534379 |
.def("find", sysobject_find_sysobject, sysobject_doc_object_find(),
|
|
Packit |
534379 |
py::arg("name"), py::arg("flags") = 0)
|
|
Packit |
534379 |
.def("read64",
|
|
Packit |
534379 |
[](sysobject::ptr_t obj) { return obj->read64(FPGA_OBJECT_SYNC); })
|
|
Packit |
534379 |
.def("write64", &sysobject::write64)
|
|
Packit |
534379 |
.def("size", &sysobject::size)
|
|
Packit |
534379 |
.def("bytes", sysobject_bytes, sysobject_doc_bytes())
|
|
Packit |
534379 |
.def("__getitem__", sysobject_getitem, sysobject_doc_getitem())
|
|
Packit |
534379 |
.def("__getitem__", sysobject_getslice, sysobject_doc_getslice());
|
|
Packit |
534379 |
}
|