aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/rfnoc/noc_block_base.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib/rfnoc/noc_block_base.cpp')
-rw-r--r--host/lib/rfnoc/noc_block_base.cpp62
1 files changed, 61 insertions, 1 deletions
diff --git a/host/lib/rfnoc/noc_block_base.cpp b/host/lib/rfnoc/noc_block_base.cpp
index 838e05e74..2bbf52928 100644
--- a/host/lib/rfnoc/noc_block_base.cpp
+++ b/host/lib/rfnoc/noc_block_base.cpp
@@ -4,12 +4,16 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
+#include <uhd/exception.hpp>
+#include <uhd/rfnoc/defaults.hpp>
#include <uhd/rfnoc/noc_block_base.hpp>
#include <uhd/rfnoc/register_iface.hpp>
-#include <uhd/exception.hpp>
+#include <uhdlib/rfnoc/clock_iface.hpp>
using namespace uhd::rfnoc;
+noc_block_base::make_args_t::~make_args_t() = default;
+
/******************************************************************************
* Structors
*****************************************************************************/
@@ -19,7 +23,39 @@ noc_block_base::noc_block_base(make_args_ptr make_args)
, _block_id(make_args->block_id)
, _num_input_ports(make_args->num_input_ports)
, _num_output_ports(make_args->num_output_ports)
+ , _clock_iface(make_args->clk_iface)
{
+ // First, create one tick_rate property for every port
+ _tick_rate_props.reserve(get_num_input_ports() + get_num_output_ports());
+ for (size_t input_port = 0; input_port < get_num_input_ports(); input_port++) {
+ _tick_rate_props.push_back(property_t<double>(PROP_KEY_TICK_RATE,
+ DEFAULT_TICK_RATE,
+ {res_source_info::INPUT_EDGE, input_port}));
+ }
+ for (size_t output_port = 0; output_port < get_num_output_ports(); output_port++) {
+ _tick_rate_props.push_back(property_t<double>(PROP_KEY_TICK_RATE,
+ DEFAULT_TICK_RATE,
+ {res_source_info::OUTPUT_EDGE, output_port}));
+ }
+ // Register all the tick_rate properties and create a default resolver
+ prop_ptrs_t prop_refs;
+ prop_refs.reserve(_tick_rate_props.size());
+ for (auto& prop : _tick_rate_props) {
+ prop_refs.insert(&prop);
+ register_property(&prop);
+ }
+ for (auto& prop : _tick_rate_props) {
+ auto prop_refs_copy = prop_refs;
+ add_property_resolver(
+ {&prop}, std::move(prop_refs_copy), [this, source_prop = &prop]() {
+ for (property_t<double>& tick_rate_prop : _tick_rate_props) {
+ tick_rate_prop = source_prop->get();
+ }
+ this->_set_tick_rate(source_prop->get());
+ });
+ }
+ // Now enable this clock iface
+ _clock_iface->set_running(true);
}
noc_block_base::~noc_block_base()
@@ -27,3 +63,27 @@ noc_block_base::~noc_block_base()
// nop
}
+
+void noc_block_base::set_tick_rate(const double tick_rate)
+{
+ if (_tick_rate == tick_rate) {
+ return;
+ }
+ // Update this node
+ _set_tick_rate(tick_rate);
+ // Now trigger property propagation
+ if (!_tick_rate_props.empty()) {
+ auto src_info = _tick_rate_props.at(0).get_src_info();
+ set_property<double>(PROP_KEY_TICK_RATE, tick_rate, src_info);
+ }
+}
+
+void noc_block_base::_set_tick_rate(const double tick_rate)
+{
+ if (tick_rate == _tick_rate) {
+ return;
+ }
+ RFNOC_LOG_TRACE("Updating tick rate to " << (tick_rate / 1e6) << " MHz");
+ _clock_iface->set_freq(tick_rate);
+ _tick_rate = tick_rate;
+}