diff options
author | Martin Braun <martin.braun@ettus.com> | 2019-02-07 15:34:17 +0100 |
---|---|---|
committer | Brent Stapleton <brent.stapleton@ettus.com> | 2019-04-02 10:39:57 -0700 |
commit | 164d76dcfdefe888d0e152d33827187d3d47b57e (patch) | |
tree | 26a8de83ea27f938d3ab55ff37a6ee1ce911c783 /mpm | |
parent | fa659bbe1938875ef27eba2cbb60a43443a65f99 (diff) | |
download | uhd-164d76dcfdefe888d0e152d33827187d3d47b57e.tar.gz uhd-164d76dcfdefe888d0e152d33827187d3d47b57e.tar.bz2 uhd-164d76dcfdefe888d0e152d33827187d3d47b57e.zip |
mpm: python: Move from Boost.Python to PyBind11
Diffstat (limited to 'mpm')
-rw-r--r-- | mpm/CMakeLists.txt | 1 | ||||
-rw-r--r-- | mpm/include/mpm/ad9361/ad9361_ctrl.hpp | 24 | ||||
-rw-r--r-- | mpm/include/mpm/ad937x/ad937x_ctrl.hpp | 85 | ||||
-rw-r--r-- | mpm/include/mpm/dboards/magnesium_manager.hpp | 10 | ||||
-rw-r--r-- | mpm/include/mpm/dboards/neon_manager.hpp | 9 | ||||
-rw-r--r-- | mpm/include/mpm/i2c/i2c_python.hpp | 19 | ||||
-rw-r--r-- | mpm/include/mpm/spi/spi_python.hpp | 13 | ||||
-rw-r--r-- | mpm/include/mpm/types/types_python.hpp | 28 | ||||
-rw-r--r-- | mpm/include/mpm/xbar_iface.hpp | 12 | ||||
-rw-r--r-- | mpm/python/CMakeLists.txt | 3 | ||||
-rw-r--r-- | mpm/python/pyusrp_periphs/converters.hpp | 87 | ||||
-rw-r--r-- | mpm/python/pyusrp_periphs/e320/pyusrp_periphs.cpp | 36 | ||||
-rw-r--r-- | mpm/python/pyusrp_periphs/n3xx/pyusrp_periphs.cpp | 63 | ||||
-rw-r--r-- | mpm/python/usrp_mpm/xports/xportmgr_liberio.py | 2 | ||||
-rw-r--r-- | mpm/python/usrp_mpm/xports/xportmgr_udp.py | 2 |
15 files changed, 126 insertions, 268 deletions
diff --git a/mpm/CMakeLists.txt b/mpm/CMakeLists.txt index 1a5946b63..4f6c3b651 100644 --- a/mpm/CMakeLists.txt +++ b/mpm/CMakeLists.txt @@ -76,7 +76,6 @@ message(STATUS "") message(STATUS "Configuring Boost C++ Libraries...") set(BOOST_REQUIRED_COMPONENTS system - python3 thread ) # Same as with Python version: MPM might work with other versions of Boost, diff --git a/mpm/include/mpm/ad9361/ad9361_ctrl.hpp b/mpm/include/mpm/ad9361/ad9361_ctrl.hpp index 8bcd7f7c4..7673d7460 100644 --- a/mpm/include/mpm/ad9361/ad9361_ctrl.hpp +++ b/mpm/include/mpm/ad9361/ad9361_ctrl.hpp @@ -1,5 +1,6 @@ // // Copyright 2018 Ettus Research, a National Instruments Company +// Copyright 2019 Ettus Research, a National Instruments Brand // // SPDX-License-Identifier: GPL-3.0-or-later // @@ -20,23 +21,18 @@ using uhd::usrp::ad9361_ctrl; // TODO: pull in filter_info_base #ifdef LIBMPM_PYTHON -void export_catalina() +void export_catalina(py::module& top_module) { - LIBMPM_BOOST_PREAMBLE("ad9361") using namespace mpm::chips; - bp::class_<ad9361_ctrl, boost::noncopyable, boost::shared_ptr<ad9361_ctrl>>( - "ad9361_ctrl", bp::no_init) - .def("get_gain_names", &ad9361_ctrl::get_gain_names) - .staticmethod("get_gain_names") + auto m = top_module.def_submodule("ad9361"); + + py::class_<ad9361_ctrl, boost::shared_ptr<ad9361_ctrl>>(m, "ad9361_ctrl") + .def_static("get_gain_names", &ad9361_ctrl::get_gain_names) // Make this "Python private" because the return value can't be serialized - .def("_get_gain_range", &ad9361_ctrl::get_gain_range) - .staticmethod("_get_gain_range") - .def("get_rf_freq_range", &ad9361_ctrl::get_rf_freq_range) - .staticmethod("get_rf_freq_range") - .def("get_bw_filter_range", &ad9361_ctrl::get_bw_filter_range) - .staticmethod("get_bw_filter_range") - .def("get_clock_rate_range", &ad9361_ctrl::get_clock_rate_range) - .staticmethod("get_clock_rate_range") + .def_static("_get_gain_range", &ad9361_ctrl::get_gain_range) + .def_static("get_rf_freq_range", &ad9361_ctrl::get_rf_freq_range) + .def_static("get_bw_filter_range", &ad9361_ctrl::get_bw_filter_range) + .def_static("get_clock_rate_range", &ad9361_ctrl::get_clock_rate_range) .def("set_bw_filter", &ad9361_ctrl::set_bw_filter) .def("set_gain", &ad9361_ctrl::set_gain) .def("set_agc", &ad9361_ctrl::set_agc) diff --git a/mpm/include/mpm/ad937x/ad937x_ctrl.hpp b/mpm/include/mpm/ad937x/ad937x_ctrl.hpp index 7274c433a..6d28eccd1 100644 --- a/mpm/include/mpm/ad937x/ad937x_ctrl.hpp +++ b/mpm/include/mpm/ad937x/ad937x_ctrl.hpp @@ -1,5 +1,6 @@ // // Copyright 2017 Ettus Research, a National Instruments Company +// Copyright 2019 Ettus Research, a National Instruments Brand // // SPDX-License-Identifier: GPL-3.0-or-later // @@ -274,12 +275,12 @@ public: }}; /* namespace mpm::chips */ #ifdef LIBMPM_PYTHON -void export_mykonos() +void export_mykonos(py::module& top_module) { - LIBMPM_BOOST_PREAMBLE("ad937x") using namespace mpm::chips; - bp::class_<ad937x_ctrl, boost::noncopyable, std::shared_ptr<ad937x_ctrl>>( - "ad937x_ctrl", bp::no_init) + auto m = top_module.def_submodule("ad937x"); + + py::class_<ad937x_ctrl, std::shared_ptr<ad937x_ctrl>>(m, "ad937x_ctrl") .def("set_master_clock_rate", &ad937x_ctrl::set_master_clock_rate) .def("begin_initialization", &ad937x_ctrl::begin_initialization) .def("async__finish_initialization", @@ -348,45 +349,45 @@ void export_mykonos() .def("set_fir", &ad937x_ctrl::set_fir) .def("get_fir", &ad937x_ctrl::get_fir) .def("get_temperature", &ad937x_ctrl::get_temperature) - .def_readonly("TX_BB_FILTER", &ad937x_ctrl::TX_BB_FILTER) - .def_readonly("ADC_TUNER", &ad937x_ctrl::ADC_TUNER) - .def_readonly("TIA_3DB_CORNER", &ad937x_ctrl::TIA_3DB_CORNER) - .def_readonly("DC_OFFSET", &ad937x_ctrl::DC_OFFSET) - .def_readonly("TX_ATTENUATION_DELAY", &ad937x_ctrl::TX_ATTENUATION_DELAY) - .def_readonly("RX_GAIN_DELAY", &ad937x_ctrl::RX_GAIN_DELAY) - .def_readonly("FLASH_CAL", &ad937x_ctrl::FLASH_CAL) - .def_readonly("PATH_DELAY", &ad937x_ctrl::PATH_DELAY) - .def_readonly("TX_LO_LEAKAGE_INTERNAL", &ad937x_ctrl::TX_LO_LEAKAGE_INTERNAL) - .def_readonly("TX_LO_LEAKAGE_EXTERNAL", &ad937x_ctrl::TX_LO_LEAKAGE_EXTERNAL) - .def_readonly("TX_QEC_INIT", &ad937x_ctrl::TX_QEC_INIT) - .def_readonly("LOOPBACK_RX_LO_DELAY", &ad937x_ctrl::LOOPBACK_RX_LO_DELAY) - .def_readonly("LOOPBACK_RX_RX_QEC_INIT", &ad937x_ctrl::LOOPBACK_RX_RX_QEC_INIT) - .def_readonly("RX_LO_DELAY", &ad937x_ctrl::RX_LO_DELAY) - .def_readonly("RX_QEC_INIT", &ad937x_ctrl::RX_QEC_INIT) - .def_readonly("DPD_INIT", &ad937x_ctrl::DPD_INIT) - .def_readonly("CLGC_INIT", &ad937x_ctrl::CLGC_INIT) - .def_readonly("VSWR_INIT", &ad937x_ctrl::VSWR_INIT) - .def_readonly("TRACK_RX1_QEC", &ad937x_ctrl::TRACK_RX1_QEC) - .def_readonly("TRACK_RX2_QEC", &ad937x_ctrl::TRACK_RX2_QEC) - .def_readonly("TRACK_ORX1_QEC", &ad937x_ctrl::TRACK_ORX1_QEC) - .def_readonly("TRACK_ORX2_QEC", &ad937x_ctrl::TRACK_ORX2_QEC) - .def_readonly("TRACK_TX1_LOL", &ad937x_ctrl::TRACK_TX1_LOL) - .def_readonly("TRACK_TX2_LOL", &ad937x_ctrl::TRACK_TX2_LOL) - .def_readonly("TRACK_TX1_QEC", &ad937x_ctrl::TRACK_TX1_QEC) - .def_readonly("TRACK_TX2_QEC", &ad937x_ctrl::TRACK_TX2_QEC) - .def_readonly("TRACK_TX1_DPD", &ad937x_ctrl::TRACK_TX1_DPD) - .def_readonly("TRACK_TX2_DPD", &ad937x_ctrl::TRACK_TX2_DPD) - .def_readonly("TRACK_TX1_CLGC", &ad937x_ctrl::TRACK_TX1_CLGC) - .def_readonly("TRACK_TX2_CLGC", &ad937x_ctrl::TRACK_TX2_CLGC) - .def_readonly("TRACK_TX1_VSWR", &ad937x_ctrl::TRACK_TX1_VSWR) - .def_readonly("TRACK_TX2_VSWR", &ad937x_ctrl::TRACK_TX2_VSWR) - .def_readonly("TRACK_ORX1_QEC_SNLO", &ad937x_ctrl::TRACK_ORX1_QEC_SNLO) - .def_readonly("TRACK_ORX2_QEC_SNLO", &ad937x_ctrl::TRACK_ORX2_QEC_SNLO) - .def_readonly("TRACK_SRX_QEC", &ad937x_ctrl::TRACK_SRX_QEC) - .def_readonly("DEFAULT_INIT_CALS_MASKS", &ad937x_ctrl::DEFAULT_INIT_CALS_MASKS) - .def_readonly( + .def_readonly_static("TX_BB_FILTER", &ad937x_ctrl::TX_BB_FILTER) + .def_readonly_static("ADC_TUNER", &ad937x_ctrl::ADC_TUNER) + .def_readonly_static("TIA_3DB_CORNER", &ad937x_ctrl::TIA_3DB_CORNER) + .def_readonly_static("DC_OFFSET", &ad937x_ctrl::DC_OFFSET) + .def_readonly_static("TX_ATTENUATION_DELAY", &ad937x_ctrl::TX_ATTENUATION_DELAY) + .def_readonly_static("RX_GAIN_DELAY", &ad937x_ctrl::RX_GAIN_DELAY) + .def_readonly_static("FLASH_CAL", &ad937x_ctrl::FLASH_CAL) + .def_readonly_static("PATH_DELAY", &ad937x_ctrl::PATH_DELAY) + .def_readonly_static("TX_LO_LEAKAGE_INTERNAL", &ad937x_ctrl::TX_LO_LEAKAGE_INTERNAL) + .def_readonly_static("TX_LO_LEAKAGE_EXTERNAL", &ad937x_ctrl::TX_LO_LEAKAGE_EXTERNAL) + .def_readonly_static("TX_QEC_INIT", &ad937x_ctrl::TX_QEC_INIT) + .def_readonly_static("LOOPBACK_RX_LO_DELAY", &ad937x_ctrl::LOOPBACK_RX_LO_DELAY) + .def_readonly_static("LOOPBACK_RX_RX_QEC_INIT", &ad937x_ctrl::LOOPBACK_RX_RX_QEC_INIT) + .def_readonly_static("RX_LO_DELAY", &ad937x_ctrl::RX_LO_DELAY) + .def_readonly_static("RX_QEC_INIT", &ad937x_ctrl::RX_QEC_INIT) + .def_readonly_static("DPD_INIT", &ad937x_ctrl::DPD_INIT) + .def_readonly_static("CLGC_INIT", &ad937x_ctrl::CLGC_INIT) + .def_readonly_static("VSWR_INIT", &ad937x_ctrl::VSWR_INIT) + .def_readonly_static("TRACK_RX1_QEC", &ad937x_ctrl::TRACK_RX1_QEC) + .def_readonly_static("TRACK_RX2_QEC", &ad937x_ctrl::TRACK_RX2_QEC) + .def_readonly_static("TRACK_ORX1_QEC", &ad937x_ctrl::TRACK_ORX1_QEC) + .def_readonly_static("TRACK_ORX2_QEC", &ad937x_ctrl::TRACK_ORX2_QEC) + .def_readonly_static("TRACK_TX1_LOL", &ad937x_ctrl::TRACK_TX1_LOL) + .def_readonly_static("TRACK_TX2_LOL", &ad937x_ctrl::TRACK_TX2_LOL) + .def_readonly_static("TRACK_TX1_QEC", &ad937x_ctrl::TRACK_TX1_QEC) + .def_readonly_static("TRACK_TX2_QEC", &ad937x_ctrl::TRACK_TX2_QEC) + .def_readonly_static("TRACK_TX1_DPD", &ad937x_ctrl::TRACK_TX1_DPD) + .def_readonly_static("TRACK_TX2_DPD", &ad937x_ctrl::TRACK_TX2_DPD) + .def_readonly_static("TRACK_TX1_CLGC", &ad937x_ctrl::TRACK_TX1_CLGC) + .def_readonly_static("TRACK_TX2_CLGC", &ad937x_ctrl::TRACK_TX2_CLGC) + .def_readonly_static("TRACK_TX1_VSWR", &ad937x_ctrl::TRACK_TX1_VSWR) + .def_readonly_static("TRACK_TX2_VSWR", &ad937x_ctrl::TRACK_TX2_VSWR) + .def_readonly_static("TRACK_ORX1_QEC_SNLO", &ad937x_ctrl::TRACK_ORX1_QEC_SNLO) + .def_readonly_static("TRACK_ORX2_QEC_SNLO", &ad937x_ctrl::TRACK_ORX2_QEC_SNLO) + .def_readonly_static("TRACK_SRX_QEC", &ad937x_ctrl::TRACK_SRX_QEC) + .def_readonly_static("DEFAULT_INIT_CALS_MASKS", &ad937x_ctrl::DEFAULT_INIT_CALS_MASKS) + .def_readonly_static( "DEFAULT_TRACKING_CALS_MASKS", &ad937x_ctrl::DEFAULT_TRACKING_CALS_MASKS) - .def_readonly( + .def_readonly_static( "DEFAULT_INIT_CALS_TIMEOUT", &ad937x_ctrl::DEFAULT_INIT_CALS_TIMEOUT); } #endif diff --git a/mpm/include/mpm/dboards/magnesium_manager.hpp b/mpm/include/mpm/dboards/magnesium_manager.hpp index ab2a20864..76f61d203 100644 --- a/mpm/include/mpm/dboards/magnesium_manager.hpp +++ b/mpm/include/mpm/dboards/magnesium_manager.hpp @@ -1,5 +1,6 @@ // // Copyright 2017 Ettus Research, a National Instruments Company +// Copyright 2019 Ettus Research, a National Instruments Brand // // SPDX-License-Identifier: GPL-3.0-or-later // @@ -45,12 +46,13 @@ private: }}; /* namespace mpm::dboards */ #ifdef LIBMPM_PYTHON -void export_magnesium() +void export_magnesium(py::module& top_module) { - LIBMPM_BOOST_PREAMBLE("dboards") using namespace mpm::dboards; - bp::class_<mpm::dboards::magnesium_manager>( - "magnesium_manager", bp::init<std::string, size_t>()) + auto m = top_module.def_submodule("dboards"); + + py::class_<mpm::dboards::magnesium_manager>(m, "magnesium_manager") + .def(py::init<std::string, size_t>()) .def("get_spi_lock", &mpm::dboards::magnesium_manager::get_spi_lock) .def("get_radio_ctrl", &mpm::dboards::magnesium_manager::get_radio_ctrl); } diff --git a/mpm/include/mpm/dboards/neon_manager.hpp b/mpm/include/mpm/dboards/neon_manager.hpp index 580b9cd38..22f0f0544 100644 --- a/mpm/include/mpm/dboards/neon_manager.hpp +++ b/mpm/include/mpm/dboards/neon_manager.hpp @@ -1,5 +1,6 @@ // // Copyright 2018 Ettus Research, a National Instruments Company +// Copyright 2019 Ettus Research, a National Instruments Brand // // SPDX-License-Identifier: GPL-3.0-or-later // @@ -33,11 +34,13 @@ private: }}; /* namespace mpm::dboards */ #ifdef LIBMPM_PYTHON -void export_neon() +void export_neon(py::module& top_module) { - LIBMPM_BOOST_PREAMBLE("dboards") using namespace mpm::dboards; - bp::class_<mpm::dboards::neon_manager>("neon_manager", bp::init<std::string>()) + auto m = top_module.def_submodule("dboards"); + + py::class_<mpm::dboards::neon_manager>(m, "neon_manager") + .def(py::init<std::string>()) .def("get_radio_ctrl", &mpm::dboards::neon_manager::get_radio_ctrl); } #endif diff --git a/mpm/include/mpm/i2c/i2c_python.hpp b/mpm/include/mpm/i2c/i2c_python.hpp index f358ea687..ebc9cb0a1 100644 --- a/mpm/include/mpm/i2c/i2c_python.hpp +++ b/mpm/include/mpm/i2c/i2c_python.hpp @@ -1,5 +1,6 @@ // // Copyright 2018 Ettus Research, a National Instruments Company +// Copyright 2019 Ettus Research, a National Instruments Brand // // SPDX-License-Identifier: GPL-3.0-or-later // @@ -9,21 +10,9 @@ #include "i2c_iface.hpp" #include "i2c_regs_iface.hpp" -void export_i2c() +void export_i2c(py::module& top_module) { - LIBMPM_BOOST_PREAMBLE("i2c") + auto m = top_module.def_submodule("i2c"); - bp::def("make_i2cdev_regs_iface", &mpm::i2c::make_i2cdev_regs_iface); - /* - bp::def("make_i2cdev", &mpm::i2c::i2c_iface::make_i2cdev); - - int (mpm::i2c::i2c_iface::*transfer_vec)(std::vector<uint8_t>*, - std::vector<uint8_t>*) = - &mpm::i2c::i2c_iface::transfer; - - bp::class_<mpm::i2c::i2c_iface, boost::noncopyable, - std::shared_ptr<mpm::i2c::i2c_iface> >("i2c_iface", bp::no_init) - .def("transfer", transfer_vec) - ; - */ + m.def("make_i2cdev_regs_iface", &mpm::i2c::make_i2cdev_regs_iface); } diff --git a/mpm/include/mpm/spi/spi_python.hpp b/mpm/include/mpm/spi/spi_python.hpp index 2b609c44a..464df8d8b 100644 --- a/mpm/include/mpm/spi/spi_python.hpp +++ b/mpm/include/mpm/spi/spi_python.hpp @@ -1,5 +1,6 @@ // // Copyright 2017 Ettus Research, a National Instruments Company +// Copyright 2019 Ettus Research, a National Instruments Brand // // SPDX-License-Identifier: GPL-3.0-or-later // @@ -9,15 +10,13 @@ #include "spi_iface.hpp" #include "spi_regs_iface.hpp" -void export_spi() +void export_spi(py::module& top_module) { - LIBMPM_BOOST_PREAMBLE("spi") + auto m = top_module.def_submodule("spi"); - bp::def("make_spidev_regs_iface", &mpm::spi::make_spidev_regs_iface); - bp::def("make_spidev", &mpm::spi::spi_iface::make_spidev); + m.def("make_spidev_regs_iface", &mpm::spi::make_spidev_regs_iface); + m.def("make_spidev", &mpm::spi::spi_iface::make_spidev); - bp::class_<mpm::spi::spi_iface, - boost::noncopyable, - std::shared_ptr<mpm::spi::spi_iface>>("spi_iface", bp::no_init) + py::class_<mpm::spi::spi_iface, std::shared_ptr<mpm::spi::spi_iface>>(m, "spi_iface") .def("transfer24_8", &mpm::spi::spi_iface::transfer24_8); } diff --git a/mpm/include/mpm/types/types_python.hpp b/mpm/include/mpm/types/types_python.hpp index d523c2065..b934605ad 100644 --- a/mpm/include/mpm/types/types_python.hpp +++ b/mpm/include/mpm/types/types_python.hpp @@ -1,5 +1,6 @@ // // Copyright 2017 Ettus Research, a National Instruments Company +// Copyright 2019 Ettus Research, a National Instruments Brand // // SPDX-License-Identifier: GPL-3.0-or-later // @@ -11,39 +12,36 @@ #include "mmap_regs_iface.hpp" #include "regs_iface.hpp" -void export_types() +void export_types(py::module& top_module) { - LIBMPM_BOOST_PREAMBLE("types") using namespace mpm::types; - bp::class_<lockable, boost::noncopyable, std::shared_ptr<lockable>>( - "lockable", bp::no_init) + auto m = top_module.def_submodule("types"); + + py::class_<lockable, std::shared_ptr<lockable>>(m, "lockable") .def("lock", &lockable::lock) .def("unlock", &lockable::unlock); - bp::class_<regs_iface, boost::noncopyable, std::shared_ptr<regs_iface>>( - "regs_iface", bp::no_init) + py::class_<regs_iface, std::shared_ptr<regs_iface>>(m, "regs_iface") .def("peek8", ®s_iface::peek8) .def("poke8", ®s_iface::poke8) .def("peek16", ®s_iface::peek16) .def("poke16", ®s_iface::poke16); - bp::class_<log_buf, boost::noncopyable, std::shared_ptr<log_buf>>( - "log_buf", bp::no_init) - .def("make_singleton", &log_buf::make_singleton) - .staticmethod("make_singleton") + py::class_<log_buf, std::shared_ptr<log_buf>>(m, "log_buf") + .def_static("make_singleton", &log_buf::make_singleton) .def("set_notify_callback", - +[](log_buf& self, boost::python::object object) { + +[](log_buf& self, py::object object) { self.set_notify_callback(object); }) - .def("pop", +[](log_buf& self) { + .def("pop", [](log_buf& self) { auto log_msg = self.pop(); - return bp::make_tuple(static_cast<int>(std::get<0>(log_msg)), + return py::make_tuple(static_cast<int>(std::get<0>(log_msg)), std::get<1>(log_msg), std::get<2>(log_msg)); }); - bp::class_<mmap_regs_iface, boost::noncopyable, std::shared_ptr<mmap_regs_iface>>( - "mmap_regs_iface", bp::init<std::string, size_t, size_t, bool, bool>()) + py::class_<mmap_regs_iface, std::shared_ptr<mmap_regs_iface>>(m, "mmap_regs_iface") + .def(py::init<std::string, size_t, size_t, bool, bool>()) .def("open", &mmap_regs_iface::open) .def("close", &mmap_regs_iface::close) .def("peek32", &mmap_regs_iface::peek32) diff --git a/mpm/include/mpm/xbar_iface.hpp b/mpm/include/mpm/xbar_iface.hpp index c76aed640..bf4399593 100644 --- a/mpm/include/mpm/xbar_iface.hpp +++ b/mpm/include/mpm/xbar_iface.hpp @@ -1,5 +1,6 @@ // // Copyright 2017 Ettus Research, a National Instruments Company +// Copyright 2019 Ettus Research, a National Instruments Brand // // SPDX-License-Identifier: GPL-3.0-or-later // @@ -47,13 +48,12 @@ private: #ifdef LIBMPM_PYTHON -void export_xbar() +void export_xbar(py::module& top_module) { - LIBMPM_BOOST_PREAMBLE("xbar") - bp::class_<mpm::xbar_iface, boost::noncopyable, std::shared_ptr<mpm::xbar_iface>>( - "xbar", bp::no_init) - .def("make", &mpm::xbar_iface::make) - .staticmethod("make") + auto m = top_module.def_submodule("xbar"); + + py::class_<mpm::xbar_iface, std::shared_ptr<mpm::xbar_iface>>(m, "xbar") + .def(py::init(&mpm::xbar_iface::make)) .def("set_route", &mpm::xbar_iface::set_route) .def("del_route", &mpm::xbar_iface::del_route); } diff --git a/mpm/python/CMakeLists.txt b/mpm/python/CMakeLists.txt index 84cff3e54..c78dc60b1 100644 --- a/mpm/python/CMakeLists.txt +++ b/mpm/python/CMakeLists.txt @@ -19,8 +19,9 @@ target_include_directories(pyusrp_periphs PUBLIC ${CMAKE_SOURCE_DIR}/lib/ ${UHD_HOST_ROOT}/lib/usrp/common ${UHD_HOST_ROOT}/lib/usrp/common/ad9361_driver + ${UHD_HOST_ROOT}/lib/deps/pybind11/include ) -target_link_libraries(pyusrp_periphs ${Boost_PYTHON_LIBRARY} ${Boost_LIBRARIES} usrp-periphs) +target_link_libraries(pyusrp_periphs ${Boost_LIBRARIES} usrp-periphs) add_custom_command(TARGET pyusrp_periphs POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/libpyusrp_periphs.so ${CMAKE_CURRENT_BINARY_DIR}/usrp_mpm/libpyusrp_periphs.so) set(USRP_MPM_FILES "") diff --git a/mpm/python/pyusrp_periphs/converters.hpp b/mpm/python/pyusrp_periphs/converters.hpp deleted file mode 100644 index 849e8b90e..000000000 --- a/mpm/python/pyusrp_periphs/converters.hpp +++ /dev/null @@ -1,87 +0,0 @@ -// -// Copyright 2017 Ettus Research, a National Instruments Company -// -// SPDX-License-Identifier: GPL-3.0-or-later -// - -#pragma once - -#include <boost/python.hpp> -#include <boost/python/stl_iterator.hpp> -#include <string> -#include <vector> - -namespace bp = boost::python; - -template <typename MapType> struct map_to_python_dict -{ - static PyObject* convert(MapType const& input_map) - { - bp::dict py_dict; - for (const auto& element : input_map) { - py_dict[element.first] = element.second; - } - return bp::incref(py_dict.ptr()); - } -}; - -template <typename Container> struct iterable_to_python_list -{ - static PyObject* convert(Container const& input) - { - bp::list py_list; - for (const auto& element : input) { - py_list.append(element); - } - return bp::incref(py_list.ptr()); - } -}; - -// Converter for std::vector / std::list arguments from python iterables -struct iterable_converter -{ - template <typename Container> iterable_converter& from_python() - { - bp::converter::registry::push_back(&iterable_converter::convertible, - &iterable_converter::construct<Container>, - bp::type_id<Container>()); - return *this; - } - - static void* convertible(PyObject* object) - { - return PyObject_GetIter(object) ? object : NULL; - } - - template <typename Container> - static void construct( - PyObject* object, bp::converter::rvalue_from_python_stage1_data* data) - { - // Object is a borrowed reference, so create a handle indicting it is - // borrowed for proper reference counting. - bp::handle<> handle(bp::borrowed(object)); - - // Obtain a handle to the memory block that the converter has allocated - // for the C++ type. - typedef bp::converter::rvalue_from_python_storage<Container> storage_type; - void* storage = reinterpret_cast<storage_type*>(data)->storage.bytes; - - typedef bp::stl_input_iterator<typename Container::value_type> iterator; - - // Allocate the C++ type into the converter's memory block, and assign - // its handle to the converter's convertible variable. The C++ - // container is populated by passing the begin and end iterators of - // the python object to the container's constructor. - new (storage) Container(iterator(bp::object(handle)), // begin - iterator()); // end - data->convertible = storage; - } -}; - -void export_converter() -{ - // LIBMPM_BOOST_PREAMBLE("helper") - bp::to_python_converter<std::vector<std::string>, - iterable_to_python_list<std::vector<std::string>>, - false>(); -} diff --git a/mpm/python/pyusrp_periphs/e320/pyusrp_periphs.cpp b/mpm/python/pyusrp_periphs/e320/pyusrp_periphs.cpp index 97ccfc864..74a3647db 100644 --- a/mpm/python/pyusrp_periphs/e320/pyusrp_periphs.cpp +++ b/mpm/python/pyusrp_periphs/e320/pyusrp_periphs.cpp @@ -1,38 +1,30 @@ // // Copyright 2018 Ettus Research, a National Instruments Company +// Copyright 2019 Ettus Research, a National Instruments Brand // // SPDX-License-Identifier: GPL-3.0-or-later // -// include hackery to only include boost python and define the macro here -#include <boost/python.hpp> +#include <pybind11/pybind11.h> +namespace py = pybind11; #define LIBMPM_PYTHON -#define LIBMPM_BOOST_PREAMBLE(module) \ - /* Register submodule types */ \ - namespace bp = boost::python; \ - bp::object py_module( \ - bp::handle<>(bp::borrowed(PyImport_AddModule("libpyusrp_periphs." module)))); \ - bp::scope().attr(module) = py_module; \ - bp::scope io_scope = py_module; -#include "../converters.hpp" +// Allow boost::shared_ptr<T> to be a holder class of an object (PyBind11 +// supports std::shared_ptr and std::unique_ptr out of the box) +#include <boost/shared_ptr.hpp> +PYBIND11_DECLARE_HOLDER_TYPE(T, boost::shared_ptr<T>); + #include <mpm/ad9361/ad9361_ctrl.hpp> #include <mpm/dboards/neon_manager.hpp> #include <mpm/spi/spi_python.hpp> #include <mpm/types/types_python.hpp> #include <mpm/xbar_iface.hpp> -#include <boost/noncopyable.hpp> - -namespace bp = boost::python; -BOOST_PYTHON_MODULE(libpyusrp_periphs) +PYBIND11_MODULE(libpyusrp_periphs, m) { - bp::object package = bp::scope(); - package.attr("__path__") = "libpyusrp_periphs"; - export_converter(); - export_types(); - export_spi(); - export_xbar(); - export_catalina(); - export_neon(); + export_types(m); + export_spi(m); + export_xbar(m); + export_catalina(m); + export_neon(m); } diff --git a/mpm/python/pyusrp_periphs/n3xx/pyusrp_periphs.cpp b/mpm/python/pyusrp_periphs/n3xx/pyusrp_periphs.cpp index 85851677f..d4c430f72 100644 --- a/mpm/python/pyusrp_periphs/n3xx/pyusrp_periphs.cpp +++ b/mpm/python/pyusrp_periphs/n3xx/pyusrp_periphs.cpp @@ -1,67 +1,32 @@ // // Copyright 2017 Ettus Research, a National Instruments Company +// Copyright 2019 Ettus Research, a National Instruments Brand // // SPDX-License-Identifier: GPL-3.0-or-later // -// include hackery to only include boost python and define the macro here -#include <boost/python.hpp> +#include <pybind11/pybind11.h> +namespace py = pybind11; #define LIBMPM_PYTHON -#define LIBMPM_BOOST_PREAMBLE(module) \ - /* Register submodule types */ \ - namespace bp = boost::python; \ - bp::object py_module( \ - bp::handle<>(bp::borrowed(PyImport_AddModule("libpyusrp_periphs." module)))); \ - bp::scope().attr(module) = py_module; \ - bp::scope io_scope = py_module; -//! RAII-style GIL release method -// -// To release the GIL using this method, simply instantiate this class in the -// scope that needs to release the GIL. -// -// Note that using this class assumes that threads have already been -// initialized. See also https://docs.python.org/3.5/c-api/init.html for more -// documentation on Python initialization and threads. -class scoped_gil_release -{ -public: - inline scoped_gil_release() - { - _thread_state = PyEval_SaveThread(); - } +// Allow boost::shared_ptr<T> to be a holder class of an object (PyBind11 +// supports std::shared_ptr and std::unique_ptr out of the box) +#include <boost/shared_ptr.hpp> +PYBIND11_DECLARE_HOLDER_TYPE(T, boost::shared_ptr<T>); - inline ~scoped_gil_release() - { - PyEval_RestoreThread(_thread_state); - _thread_state = nullptr; - } - -private: - PyThreadState* _thread_state; -}; - -//#include "types.hpp" -#include "../converters.hpp" #include <mpm/ad937x/ad937x_ctrl.hpp> #include <mpm/dboards/magnesium_manager.hpp> #include <mpm/i2c/i2c_python.hpp> #include <mpm/spi/spi_python.hpp> #include <mpm/types/types_python.hpp> #include <mpm/xbar_iface.hpp> -#include <boost/noncopyable.hpp> - -namespace bp = boost::python; -BOOST_PYTHON_MODULE(libpyusrp_periphs) +PYBIND11_MODULE(libpyusrp_periphs, m) { - bp::object package = bp::scope(); - package.attr("__path__") = "libpyusrp_periphs"; - export_converter(); - export_types(); - export_spi(); - export_i2c(); - export_mykonos(); - export_xbar(); - export_magnesium(); + export_types(m); + export_spi(m); + export_i2c(m); + export_mykonos(m); + export_xbar(m); + export_magnesium(m); } diff --git a/mpm/python/usrp_mpm/xports/xportmgr_liberio.py b/mpm/python/usrp_mpm/xports/xportmgr_liberio.py index d5c0d2e97..b035e64fe 100644 --- a/mpm/python/usrp_mpm/xports/xportmgr_liberio.py +++ b/mpm/python/usrp_mpm/xports/xportmgr_liberio.py @@ -83,7 +83,7 @@ class XportMgrLiberio(object): def commit_xport(self, sid, xport_info): " Commit liberio transport " chan = int(xport_info['dma_chan']) - xbar_iface = lib.xbar.xbar.make(self.xbar_dev) + xbar_iface = lib.xbar.xbar(self.xbar_dev) xbar_iface.set_route(sid.src_addr, self.xbar_port) self._dma_dispatcher.set_route(sid.reversed(), chan) self.log.trace("Liberio transport successfully committed!") diff --git a/mpm/python/usrp_mpm/xports/xportmgr_udp.py b/mpm/python/usrp_mpm/xports/xportmgr_udp.py index f8fcc6ede..17762bb76 100644 --- a/mpm/python/usrp_mpm/xports/xportmgr_udp.py +++ b/mpm/python/usrp_mpm/xports/xportmgr_udp.py @@ -325,7 +325,7 @@ class XportMgrUDP(object): xbar_port = self.iface_config[eth_iface]['xbar_port'] self.log.trace("Using Ethernet interface %s, crossbar port %d", eth_iface, xbar_port) - xbar_iface = lib.xbar.xbar.make(self.get_xbar_dev(eth_iface)) + xbar_iface = lib.xbar.xbar(self.get_xbar_dev(eth_iface)) xbar_iface.set_route(sid.src_addr, xbar_port) self._eth_dispatchers[eth_iface].set_route( sid.reversed(), sender_addr, sender_port) |