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.cpp50
1 files changed, 37 insertions, 13 deletions
diff --git a/host/lib/rfnoc/noc_block_base.cpp b/host/lib/rfnoc/noc_block_base.cpp
index c0d8cf2a9..68093d9b1 100644
--- a/host/lib/rfnoc/noc_block_base.cpp
+++ b/host/lib/rfnoc/noc_block_base.cpp
@@ -23,21 +23,28 @@ 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)
+ , _ctrlport_clock_iface(make_args->ctrlport_clk_iface)
+ , _tb_clock_iface(make_args->tb_clk_iface)
, _mb_controller(std::move(make_args->mb_control))
, _block_args(make_args->args)
, _tree(make_args->tree)
{
+ RFNOC_LOG_TRACE(
+ "Using timebase clock: `" << _tb_clock_iface->get_name() << "'. Current frequency: "
+ << (_tb_clock_iface->get_freq() / 1e6) << " MHz");
+ RFNOC_LOG_TRACE("Using ctrlport clock: `"
+ << _ctrlport_clock_iface->get_name() << "'. Current frequency: "
+ << (_ctrlport_clock_iface->get_freq() / 1e6) << " MHz");
// 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,
+ _tb_clock_iface->get_freq(),
{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,
+ _tb_clock_iface->get_freq(),
{res_source_info::OUTPUT_EDGE, output_port}));
}
// Register all the tick_rate properties and create a default resolver
@@ -51,14 +58,16 @@ noc_block_base::noc_block_base(make_args_ptr make_args)
auto prop_refs_copy = prop_refs;
add_property_resolver(
{&prop}, std::move(prop_refs_copy), [this, source_prop = &prop]() {
+ // _set_tick_rate() will update _tick_rate, but only if that's
+ // a valid operation for this block
+ this->_set_tick_rate(source_prop->get());
+ // Now, _tick_rate is valid and we will pass its value to all
+ // tick_rate properties
for (property_t<double>& tick_rate_prop : _tick_rate_props) {
- tick_rate_prop = source_prop->get();
+ tick_rate_prop = get_tick_rate();
}
- this->_set_tick_rate(source_prop->get());
});
}
- // Now enable this clock iface
- _clock_iface->set_running(true);
}
noc_block_base::~noc_block_base()
@@ -89,13 +98,19 @@ void noc_block_base::set_num_output_ports(const size_t num_ports)
}
+double noc_block_base::get_tick_rate() const
+{
+ return _tb_clock_iface->get_freq();
+}
+
void noc_block_base::set_tick_rate(const double tick_rate)
{
- if (_tick_rate == tick_rate) {
+ if (tick_rate == get_tick_rate()) {
return;
}
// Update this node
- _set_tick_rate(tick_rate);
+ RFNOC_LOG_TRACE("Setting tb clock freq to " << tick_rate/1e6 << " MHz");
+ _tb_clock_iface->set_freq(tick_rate);
// Now trigger property propagation
if (!_tick_rate_props.empty()) {
auto src_info = _tick_rate_props.at(0).get_src_info();
@@ -105,12 +120,21 @@ void noc_block_base::set_tick_rate(const double tick_rate)
void noc_block_base::_set_tick_rate(const double tick_rate)
{
- if (tick_rate == _tick_rate) {
+ if (tick_rate == get_tick_rate()) {
+ return;
+ }
+ if (tick_rate <= 0) {
+ RFNOC_LOG_WARNING("Attempting to set tick rate to 0. Skipping.")
return;
}
- RFNOC_LOG_TRACE("Updating tick rate to " << (tick_rate / 1e6) << " MHz");
- _clock_iface->set_freq(tick_rate);
- _tick_rate = tick_rate;
+ if (_tb_clock_iface->get_name() == CLOCK_KEY_GRAPH) {
+ RFNOC_LOG_TRACE("Updating tick rate to " << (tick_rate / 1e6) << " MHz");
+ _tb_clock_iface->set_freq(tick_rate);
+ } else {
+ RFNOC_LOG_WARNING("Cannot change tick rate to "
+ << (tick_rate / 1e6)
+ << " MHz, this clock is not configurable by the graph!");
+ }
}
void noc_block_base::shutdown()