diff options
author | Martin Braun <martin.braun@ettus.com> | 2019-06-13 08:13:57 -0700 |
---|---|---|
committer | Martin Braun <martin.braun@ettus.com> | 2019-11-26 11:49:27 -0800 |
commit | de246ea6174e3a6d5fe0dd554d5208f24c2932bb (patch) | |
tree | ce7d42a8f8c97c1ea2360bed90b73091db2e35c2 /host/lib/include | |
parent | 6bd43946a71173cbf0f1d318843ba34d6849dc30 (diff) | |
download | uhd-de246ea6174e3a6d5fe0dd554d5208f24c2932bb.tar.gz uhd-de246ea6174e3a6d5fe0dd554d5208f24c2932bb.tar.bz2 uhd-de246ea6174e3a6d5fe0dd554d5208f24c2932bb.zip |
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.
Diffstat (limited to 'host/lib/include')
-rw-r--r-- | host/lib/include/uhdlib/rfnoc/clock_iface.hpp | 22 |
1 files changed, 21 insertions, 1 deletions
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 <uhd/config.hpp> +#include <uhd/exception.hpp> +#include <uhd/utils/log.hpp> #include <atomic> #include <string> @@ -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<bool> _is_running; std::atomic<double> _freq; + const bool _is_mutable; }; }} // namespace uhd::rfnoc |