Blame opae-libs/pyopae/opae.cpp

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
}