diff options
-rw-r--r-- | host/include/uhd/utils/math.hpp | 23 | ||||
-rw-r--r-- | host/lib/include/uhdlib/usrp/common/adf535x.hpp | 9 | ||||
-rw-r--r-- | host/lib/include/uhdlib/usrp/common/lmx2592.hpp | 1 | ||||
-rw-r--r-- | host/lib/usrp/b100/clock_ctrl.cpp | 8 | ||||
-rw-r--r-- | host/lib/usrp/b200/b200_io_impl.cpp | 3 | ||||
-rw-r--r-- | host/tests/math_test.cpp | 10 |
6 files changed, 40 insertions, 14 deletions
diff --git a/host/include/uhd/utils/math.hpp b/host/include/uhd/utils/math.hpp index 8606923fa..944e9a951 100644 --- a/host/include/uhd/utils/math.hpp +++ b/host/include/uhd/utils/math.hpp @@ -12,6 +12,15 @@ #include <stdint.h> #include <boost/numeric/conversion/bounds.hpp> #include <cmath> +#if BOOST_VERSION >= 106700 +# include <boost/integer/common_factor.hpp> +// "bmint" for "boost math integer" +namespace _bmint = boost::integer; +#else +# include <boost/math/common_factor.hpp> +namespace _bmint = boost::math; +#endif + namespace uhd { @@ -223,6 +232,20 @@ UHD_INLINE bool frequencies_are_equal(double lhs, double rhs) == fp_compare::fp_compare_delta<double>(rhs, FREQ_COMPARISON_DELTA_HZ)); } +//! Portable version of lcm() across Boost versions +template <typename IntegerType> inline IntegerType lcm(IntegerType x, IntegerType y) +{ + // Note: _bmint is defined conditionally at the top of the file + return _bmint::lcm<IntegerType>(x, y); +} + +//! Portable version of gcd() across Boost versions +template <typename IntegerType> inline IntegerType gcd(IntegerType x, IntegerType y) +{ + // Note: _bmint is defined conditionally at the top of the file + return _bmint::gcd<IntegerType>(x, y); +} + } // namespace math } // namespace uhd diff --git a/host/lib/include/uhdlib/usrp/common/adf535x.hpp b/host/lib/include/uhdlib/usrp/common/adf535x.hpp index 200610d02..6350261ef 100644 --- a/host/lib/include/uhdlib/usrp/common/adf535x.hpp +++ b/host/lib/include/uhdlib/usrp/common/adf535x.hpp @@ -15,7 +15,6 @@ #include <stdint.h> #include <boost/format.hpp> #include <boost/function.hpp> -#include <boost/math/common_factor_rt.hpp> //gcd #include <algorithm> #include <utility> #include <vector> @@ -376,8 +375,8 @@ inline double adf535x_impl<adf5355_regs_t>::_set_frequency( const auto FRAC1 = static_cast<uint32_t>(floor((N - INT) * ADF535X_MOD1)); const double residue = (N - INT) * ADF535X_MOD1 - FRAC1; - const double gcd = - boost::math::gcd(static_cast<int>(_pfd_freq), static_cast<int>(freq_resolution)); + const double gcd = double( + uhd::math::gcd(static_cast<int>(_pfd_freq), static_cast<int>(freq_resolution))); const auto MOD2 = static_cast<uint16_t>( std::min(floor(_pfd_freq / gcd), static_cast<double>(ADF535X_MAX_MOD2))); const auto FRAC2 = static_cast<uint16_t>( @@ -491,8 +490,8 @@ inline double adf535x_impl<adf5356_regs_t>::_set_frequency( const auto FRAC1 = static_cast<uint32_t>(floor((N - INT) * ADF535X_MOD1)); const double residue = (N - INT) * ADF535X_MOD1 - FRAC1; - const double gcd = - boost::math::gcd(static_cast<int>(_pfd_freq), static_cast<int>(freq_resolution)); + const double gcd = double( + uhd::math::gcd(static_cast<int>(_pfd_freq), static_cast<int>(freq_resolution))); const auto MOD2 = static_cast<uint16_t>( std::min(floor(_pfd_freq / gcd), static_cast<double>(ADF535X_MAX_MOD2))); const auto FRAC2 = static_cast<uint16_t>( diff --git a/host/lib/include/uhdlib/usrp/common/lmx2592.hpp b/host/lib/include/uhdlib/usrp/common/lmx2592.hpp index f71ae0cf5..181b81269 100644 --- a/host/lib/include/uhdlib/usrp/common/lmx2592.hpp +++ b/host/lib/include/uhdlib/usrp/common/lmx2592.hpp @@ -13,7 +13,6 @@ #include <uhd/utils/safe_call.hpp> #include <boost/format.hpp> #include <boost/function.hpp> -#include <boost/math/common_factor_rt.hpp> //gcd #include <algorithm> #include <cstdint> #include <utility> diff --git a/host/lib/usrp/b100/clock_ctrl.cpp b/host/lib/usrp/b100/clock_ctrl.cpp index e30ca120f..676ebd981 100644 --- a/host/lib/usrp/b100/clock_ctrl.cpp +++ b/host/lib/usrp/b100/clock_ctrl.cpp @@ -11,10 +11,11 @@ #include <uhd/exception.hpp> #include <uhd/utils/assert_has.hpp> #include <uhd/utils/log.hpp> +#include <uhd/utils/math.hpp> #include <uhd/utils/safe_call.hpp> +#include <uhdlib/utils/narrow.hpp> #include <stdint.h> #include <boost/format.hpp> -#include <boost/math/common_factor_rt.hpp> //gcd #include <algorithm> #include <chrono> #include <thread> @@ -122,7 +123,8 @@ static clock_settings_type get_clock_settings(double rate) const uint64_t out_rate = uint64_t(rate); const uint64_t ref_rate = uint64_t(cs.get_ref_rate()); - const size_t gcd = size_t(boost::math::gcd(ref_rate, out_rate)); + const size_t gcd = + uhd::narrow_cast<size_t>((uhd::math::gcd<size_t>(ref_rate, out_rate))); for (size_t i = 1; i <= 100; i++) { const size_t X = size_t(i * ref_rate / gcd); @@ -312,7 +314,7 @@ public: const double ref_rate = REFERENCE_INPUT_RATE * 2; // bypass prescaler such that N = B - long gcd = boost::math::gcd(long(ref_rate), long(rate)); + long gcd = uhd::math::gcd(long(ref_rate), long(rate)); _ad9522_regs.set_r_counter(int(ref_rate / gcd)); _ad9522_regs.a_counter = 0; _ad9522_regs.set_b_counter(int(rate / gcd)); diff --git a/host/lib/usrp/b200/b200_io_impl.cpp b/host/lib/usrp/b200/b200_io_impl.cpp index 4f4eba052..69797017b 100644 --- a/host/lib/usrp/b200/b200_io_impl.cpp +++ b/host/lib/usrp/b200/b200_io_impl.cpp @@ -14,7 +14,6 @@ #include <uhdlib/usrp/common/validate_subdev_spec.hpp> #include <boost/bind.hpp> #include <boost/make_shared.hpp> -#include <boost/math/common_factor.hpp> #include <set> using namespace uhd; @@ -111,7 +110,7 @@ void b200_impl::set_auto_tick_rate( } // Clean up floating point rounding errors if they crept in this_dsp_rate = std::min(max_tick_rate, this_dsp_rate); - lcm_rate = boost::math::lcm<uint32_t>( + lcm_rate = uhd::math::lcm<uint32_t>( lcm_rate, static_cast<uint32_t>(floor(this_dsp_rate + 0.5))); } } diff --git a/host/tests/math_test.cpp b/host/tests/math_test.cpp index 575cfe071..4714f6625 100644 --- a/host/tests/math_test.cpp +++ b/host/tests/math_test.cpp @@ -9,8 +9,12 @@ #include <stdint.h> #include <boost/test/unit_test.hpp> -// We need an empty test -BOOST_AUTO_TEST_CASE(test_) +BOOST_AUTO_TEST_CASE(test_lcm) { - BOOST_CHECK_EQUAL(true, true); + BOOST_CHECK_EQUAL(uhd::math::lcm<int>(2, 3), 6); +} + +BOOST_AUTO_TEST_CASE(test_gcd) +{ + BOOST_CHECK_EQUAL(uhd::math::gcd<int>(6, 15), 3); } |