|
Packit |
534379 |
// Copyright(c) 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 CONTRIBUTOR."AS ."
|
|
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 "pysysobject.h"
|
|
Packit |
534379 |
|
|
Packit |
534379 |
using namespace opae::fpga::types;
|
|
Packit |
534379 |
namespace py = pybind11;
|
|
Packit |
534379 |
|
|
Packit |
534379 |
const char *sysobject_doc() {
|
|
Packit |
534379 |
return R"doc(
|
|
Packit |
534379 |
Wraps the OPAE fpga_object primitive as a Python object.
|
|
Packit |
534379 |
)doc";
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
const char *sysobject_doc_token_get() {
|
|
Packit |
534379 |
return R"doc(
|
|
Packit |
534379 |
Get a sysobject instance from a valid token object.
|
|
Packit |
534379 |
)doc";
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
const char *sysobject_doc_handle_get() {
|
|
Packit |
534379 |
return R"doc(
|
|
Packit |
534379 |
Get a sysobject instance from a valid handle object.
|
|
Packit |
534379 |
)doc";
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
const char *sysobject_doc_object_get() {
|
|
Packit |
534379 |
return R"doc(
|
|
Packit |
534379 |
Get a sysobject instance from a valid sysobject.
|
|
Packit |
534379 |
The parent sysobject must be a container type object.
|
|
Packit |
534379 |
)doc";
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
const char *sysobject_doc_token_find() {
|
|
Packit |
534379 |
return R"doc(
|
|
Packit |
534379 |
Find a sysobject instance from a valid token object.
|
|
Packit |
534379 |
Args:
|
|
Packit |
534379 |
flags: Flags that control behavior of finding sub-objects.
|
|
Packit |
534379 |
SYSOBJECT_GLOB is used to indicate that wildcard patterns (*) are allowed.
|
|
Packit |
534379 |
SYSOBJECT_RECURSE_ONE is used to indicate that the find routine should recurse one level.
|
|
Packit |
534379 |
SYSOBJECT_RECURSE_ALL is used to indicate that the find routine should recurse to all children.
|
|
Packit |
534379 |
)doc";
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
const char *sysobject_doc_handle_find() {
|
|
Packit |
534379 |
return R"doc(
|
|
Packit |
534379 |
Find a sysobject instance from a valid handle object.
|
|
Packit |
534379 |
)doc";
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
const char *sysobject_doc_object_find() {
|
|
Packit |
534379 |
return R"doc(
|
|
Packit |
534379 |
Find a sysobject instance from a valid sysobject.
|
|
Packit |
534379 |
The parent sysobject must be a container type object.
|
|
Packit |
534379 |
)doc";
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
const char *sysobject_doc_bytes() {
|
|
Packit |
534379 |
return R"doc(
|
|
Packit |
534379 |
Get bytes from the sysobject.
|
|
Packit |
534379 |
Raises `RuntimeError` if the sysobject instance is a container type.
|
|
Packit |
534379 |
)doc";
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
const char *sysobject_doc_getitem() {
|
|
Packit |
534379 |
return R"doc(
|
|
Packit |
534379 |
Get a byte from the sysobject at a given index.
|
|
Packit |
534379 |
Raises `RuntimeError` if the sysobject instance is a container type.
|
|
Packit |
534379 |
)doc";
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
const char *sysobject_doc_getslice() {
|
|
Packit |
534379 |
return R"doc(
|
|
Packit |
534379 |
Get a slice of bytes from the sysobject at a given offset.
|
|
Packit |
534379 |
Raises `RuntimeError` if the sysobject instance is a container type.
|
|
Packit |
534379 |
)doc";
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
sysobject::ptr_t token_get_sysobject(token::ptr_t tok, const std::string &name) {
|
|
Packit |
534379 |
return sysobject::get(tok, name, 0);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
sysobject::ptr_t handle_get_sysobject(handle::ptr_t h, const std::string &name) {
|
|
Packit |
534379 |
return sysobject::get(h, name, 0);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
sysobject::ptr_t sysobject_get_sysobject(sysobject::ptr_t o, const std::string &name) {
|
|
Packit |
534379 |
return o->get(name, 0);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
sysobject::ptr_t sysobject_get_sysobject(sysobject::ptr_t o, int i) {
|
|
Packit |
534379 |
return o->get(i);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
sysobject::ptr_t token_find_sysobject(token::ptr_t tok, const std::string &name,
|
|
Packit |
534379 |
int flags) {
|
|
Packit |
534379 |
return sysobject::get(tok, name, flags);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
sysobject::ptr_t handle_find_sysobject(handle::ptr_t h, const std::string &name,
|
|
Packit |
534379 |
int flags) {
|
|
Packit |
534379 |
return sysobject::get(h, name, flags);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
sysobject::ptr_t sysobject_find_sysobject(sysobject::ptr_t o, const std::string &name,
|
|
Packit |
534379 |
int flags) {
|
|
Packit |
534379 |
return o->get(name, flags);
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
std::string sysobject_bytes(sysobject::ptr_t obj) {
|
|
Packit |
534379 |
auto bytes = obj->bytes(FPGA_OBJECT_SYNC);
|
|
Packit |
534379 |
return std::string(bytes.begin(), bytes.end());
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
py::object sysobject_getitem(sysobject::ptr_t obj, uint32_t offset) {
|
|
Packit |
534379 |
switch(obj->type()) {
|
|
Packit |
534379 |
case FPGA_OBJECT_ATTRIBUTE:
|
|
Packit |
534379 |
return py::cast(obj->bytes(offset, 1, FPGA_OBJECT_SYNC)[0]);
|
|
Packit |
534379 |
break;
|
|
Packit |
534379 |
case FPGA_OBJECT_CONTAINER:
|
|
Packit |
534379 |
return py::cast(obj->get(offset));
|
|
Packit |
534379 |
break;
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
return py::object();
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
|
|
Packit |
534379 |
std::string sysobject_getslice(sysobject::ptr_t obj, py::slice slice) {
|
|
Packit |
534379 |
size_t start, stop, step, length;
|
|
Packit |
534379 |
if (!slice.compute(obj->size(), &start, &stop, &step, &length))
|
|
Packit |
534379 |
throw py::error_already_set();
|
|
Packit |
534379 |
auto bytes = obj->bytes(FPGA_OBJECT_SYNC);
|
|
Packit |
534379 |
std::string buf('\0', bytes.size());
|
|
Packit |
534379 |
for (size_t i = start, j = 0; i < stop; i += step, ++j) {
|
|
Packit |
534379 |
buf[j] = bytes[i];
|
|
Packit |
534379 |
}
|
|
Packit |
534379 |
return buf;
|
|
Packit |
534379 |
}
|