diff options
Diffstat (limited to 'host/lib/rfnoc/noc_block_base.cpp')
-rw-r--r-- | host/lib/rfnoc/noc_block_base.cpp | 62 |
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; +} |