From de246ea6174e3a6d5fe0dd554d5208f24c2932bb Mon Sep 17 00:00:00 2001 From: Martin Braun Date: Thu, 13 Jun 2019 08:13:57 -0700 Subject: rfnoc: clock_iface: Add flag for clock to be (im-)mutable An immutable clock means it has a locked frequency, and attempts to change the frequency will cause an exception to be thrown. --- host/lib/include/uhdlib/rfnoc/clock_iface.hpp | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'host/lib/include') diff --git a/host/lib/include/uhdlib/rfnoc/clock_iface.hpp b/host/lib/include/uhdlib/rfnoc/clock_iface.hpp index 807382f13..ae61a645e 100644 --- a/host/lib/include/uhdlib/rfnoc/clock_iface.hpp +++ b/host/lib/include/uhdlib/rfnoc/clock_iface.hpp @@ -8,6 +8,8 @@ #define INCLUDED_UHD_RFNOC_CLOCK_IFACE_HPP #include +#include +#include #include #include @@ -16,12 +18,18 @@ namespace uhd { namespace rfnoc { class clock_iface { public: - clock_iface(const std::string& name) : _name(name) + clock_iface(const std::string& name) : _name(name), _is_mutable(true) { _is_running = false; _freq = 0.0; } + clock_iface(const std::string& name, const double freq, const bool is_mutable = true) + : _name(name), _freq(freq), _is_mutable(is_mutable) + { + _is_running = false; + } + clock_iface() = delete; clock_iface(const clock_iface& rhs) = delete; clock_iface(clock_iface&& rhs) = delete; @@ -38,6 +46,11 @@ public: return _is_running; } + inline bool is_mutable() const + { + return _is_mutable; + } + inline void set_running(bool is_running) { _is_running = is_running; @@ -48,8 +61,14 @@ public: return _freq; } + //! If the clock is immutable, this will throw if freq is different from the + // current frequency. inline void set_freq(double freq) { + if (!_is_mutable && freq != _freq.load()) { + UHD_LOG_ERROR(_name, "Trying to change an immutable clock!"); + throw uhd::runtime_error("Trying to change an immutable clock!"); + } _freq = freq; } @@ -57,6 +76,7 @@ private: const std::string _name; std::atomic _is_running; std::atomic _freq; + const bool _is_mutable; }; }} // namespace uhd::rfnoc -- cgit v1.2.3