diff options
| author | Martin Braun <martin.braun@ettus.com> | 2021-07-23 10:06:46 +0200 | 
|---|---|---|
| committer | Aaron Rossetto <aaron.rossetto@ni.com> | 2021-07-23 10:01:46 -0500 | 
| commit | 3f8d93d2f178e6291ffd0112aa3342b00a3e2e5a (patch) | |
| tree | 12744498066a4d0bfc57072062637e9bd7f41e42 /host | |
| parent | 5683b30c8f62a0dc176cefbab25b56760363e878 (diff) | |
| download | uhd-3f8d93d2f178e6291ffd0112aa3342b00a3e2e5a.tar.gz uhd-3f8d93d2f178e6291ffd0112aa3342b00a3e2e5a.tar.bz2 uhd-3f8d93d2f178e6291ffd0112aa3342b00a3e2e5a.zip | |
python: rfnoc: Change reference type for noc_block_base export
By changing the type for accesses to noc_block_base calls in the Python
from sptr& to a simple reference (&), we fix the "holder type" issues
that crop up when trying to use radio_control from multi_usrp, which
returns access to the block as a reference rather than a `sptr`.
The error message seen without this fix always contains this string:
    Unable to cast from non-held to held instance (T& to Holder<T>)
(The exact message depends on the API call made).
Diffstat (limited to 'host')
| -rw-r--r-- | host/lib/rfnoc/rfnoc_python.hpp | 118 | 
1 files changed, 64 insertions, 54 deletions
| diff --git a/host/lib/rfnoc/rfnoc_python.hpp b/host/lib/rfnoc/rfnoc_python.hpp index 2b0b2df4b..6eb669b1c 100644 --- a/host/lib/rfnoc/rfnoc_python.hpp +++ b/host/lib/rfnoc/rfnoc_python.hpp @@ -280,133 +280,143 @@ void export_rfnoc(py::module& m)                  uhd::property_tree::sptr tree = self->get_tree();                  return tree;              }) -        .def("poke32", -            [](noc_block_base::sptr& self, uint32_t addr, uint32_t data) { -                self->regs().poke32(addr, data); +        .def( +            "poke32", +            [](noc_block_base& self, uint32_t addr, uint32_t data) { +                self.regs().poke32(addr, data);              },              py::arg("addr"),              py::arg("data")) -        .def("poke32", -            [](noc_block_base::sptr& self, +        .def( +            "poke32", +            [](noc_block_base& self,                  uint32_t addr,                  uint32_t data,                  uhd::time_spec_t time, -                bool ack = false) { self->regs().poke32(addr, data, time, ack); }, +                bool ack = false) { self.regs().poke32(addr, data, time, ack); },              py::arg("addr"),              py::arg("data"),              py::arg("time"),              py::arg("ack") = false) -        .def("poke64", -            [](noc_block_base::sptr& self, uint32_t addr, uint64_t data) { -                self->regs().poke64(addr, data); +        .def( +            "poke64", +            [](noc_block_base& self, uint32_t addr, uint64_t data) { +                self.regs().poke64(addr, data);              },              py::arg("addr"),              py::arg("data")) -        .def("poke64", -            [](noc_block_base::sptr& self, +        .def( +            "poke64", +            [](noc_block_base& self,                  uint32_t addr,                  uint32_t data,                  uhd::time_spec_t time, -                bool ack = false) { self->regs().poke64(addr, data, time, ack); }, +                bool ack = false) { self.regs().poke64(addr, data, time, ack); },              py::arg("addr"),              py::arg("data"),              py::arg("time"),              py::arg("ack") = false) -        .def("multi_poke32", -            [](noc_block_base::sptr& self, +        .def( +            "multi_poke32", +            [](noc_block_base& self,                  std::vector<uint32_t> addr, -                std::vector<uint32_t> data) { self->regs().multi_poke32(addr, data); }, +                std::vector<uint32_t> data) { self.regs().multi_poke32(addr, data); },              py::arg("addr"),              py::arg("data")) -        .def("multi_poke32", -            [](noc_block_base::sptr& self, +        .def( +            "multi_poke32", +            [](noc_block_base& self,                  std::vector<uint32_t> addr,                  std::vector<uint32_t> data,                  uhd::time_spec_t time, -                bool ack = false) { self->regs().multi_poke32(addr, data, time, ack); }, +                bool ack = false) { self.regs().multi_poke32(addr, data, time, ack); },              py::arg("addr"),              py::arg("data"),              py::arg("time"),              py::arg("ack") = false) -        .def("block_poke32", -            [](noc_block_base::sptr& self, -                uint32_t first_addr, -                std::vector<uint32_t> data) { -                self->regs().block_poke32(first_addr, data); +        .def( +            "block_poke32", +            [](noc_block_base& self, uint32_t first_addr, std::vector<uint32_t> data) { +                self.regs().block_poke32(first_addr, data);              },              py::arg("first_addr"),              py::arg("data")) -        .def("block_poke32", -            [](noc_block_base::sptr& self, +        .def( +            "block_poke32", +            [](noc_block_base& self,                  uint32_t first_addr,                  std::vector<uint32_t> data,                  uhd::time_spec_t time,                  bool ack = false) { -                self->regs().block_poke32(first_addr, data, time, ack); +                self.regs().block_poke32(first_addr, data, time, ack);              },              py::arg("first_addr"),              py::arg("data"),              py::arg("time"),              py::arg("ack") = false) -        .def("peek32", -            [](noc_block_base::sptr& self, uint32_t addr) { -                return self->regs().peek32(addr); -            }, +        .def( +            "peek32", +            [](noc_block_base& self, uint32_t addr) { return self.regs().peek32(addr); },              py::arg("addr")) -        .def("peek32", -            [](noc_block_base::sptr& self, uint32_t addr, uhd::time_spec_t time) { -                return self->regs().peek32(addr, time); +        .def( +            "peek32", +            [](noc_block_base& self, uint32_t addr, uhd::time_spec_t time) { +                return self.regs().peek32(addr, time);              },              py::arg("addr"),              py::arg("time")) -        .def("peek64", -            [](noc_block_base::sptr& self, uint32_t addr) { -                return self->regs().peek64(addr); -            }, +        .def( +            "peek64", +            [](noc_block_base& self, uint32_t addr) { return self.regs().peek64(addr); },              py::arg("addr")) -        .def("peek64", -            [](noc_block_base::sptr& self, uint32_t addr, uhd::time_spec_t time) { -                return self->regs().peek64(addr, time); +        .def( +            "peek64", +            [](noc_block_base& self, uint32_t addr, uhd::time_spec_t time) { +                return self.regs().peek64(addr, time);              },              py::arg("addr"),              py::arg("time")) -        .def("block_peek32", -            [](noc_block_base::sptr& self, uint32_t first_addr, size_t length) { -                return self->regs().block_peek32(first_addr, length); +        .def( +            "block_peek32", +            [](noc_block_base& self, uint32_t first_addr, size_t length) { +                return self.regs().block_peek32(first_addr, length);              },              py::arg("first_addr"),              py::arg("length")) -        .def("block_peek32", -            [](noc_block_base::sptr& self, +        .def( +            "block_peek32", +            [](noc_block_base& self,                  uint32_t first_addr,                  size_t length,                  uhd::time_spec_t time) { -                return self->regs().block_peek32(first_addr, length, time); +                return self.regs().block_peek32(first_addr, length, time);              },              py::arg("first_addr"),              py::arg("length"),              py::arg("time")) -        .def("poll32", -            [](noc_block_base::sptr& self, +        .def( +            "poll32", +            [](noc_block_base& self,                  uint32_t addr,                  uint32_t data,                  uint32_t mask,                  uhd::time_spec_t timeout) { -                return self->regs().poll32(addr, data, mask, timeout); +                return self.regs().poll32(addr, data, mask, timeout);              },              py::arg("addr"),              py::arg("data"),              py::arg("mask"),              py::arg("timeout")) -        .def("poll32", -            [](noc_block_base::sptr& self, +        .def( +            "poll32", +            [](noc_block_base& self,                  uint32_t addr,                  uint32_t data,                  uint32_t mask,                  uhd::time_spec_t timeout,                  uhd::time_spec_t time,                  bool ack = false) { -                return self->regs().poll32(addr, data, mask, timeout, time, ack); +                return self.regs().poll32(addr, data, mask, timeout, time, ack);              },              py::arg("addr"),              py::arg("data"), @@ -415,8 +425,8 @@ void export_rfnoc(py::module& m)              py::arg("time"),              py::arg("ack") = false)          .def("__repr__", -            [](noc_block_base::sptr& self) { -                return "<NocBlock for block ID '" + self->get_unique_id() + "'>"; +            [](noc_block_base& self) { +                return "<NocBlock for block ID '" + self.get_unique_id() + "'>";              })          // node_t superclass methods--not worth having a separate Py class          // for them | 
