diff options
Diffstat (limited to 'host/lib')
-rw-r--r-- | host/lib/rfnoc/CMakeLists.txt | 1 | ||||
-rw-r--r-- | host/lib/rfnoc/addsub_block_control.cpp | 78 |
2 files changed, 79 insertions, 0 deletions
diff --git a/host/lib/rfnoc/CMakeLists.txt b/host/lib/rfnoc/CMakeLists.txt index d7c2006d2..8f74e9e6f 100644 --- a/host/lib/rfnoc/CMakeLists.txt +++ b/host/lib/rfnoc/CMakeLists.txt @@ -40,6 +40,7 @@ LIBUHD_APPEND_SOURCES( ${CMAKE_CURRENT_SOURCE_DIR}/tx_async_msg_queue.cpp ${CMAKE_CURRENT_SOURCE_DIR}/mock_block.cpp # Default block control classes: + ${CMAKE_CURRENT_SOURCE_DIR}/addsub_block_control.cpp ${CMAKE_CURRENT_SOURCE_DIR}/block_control.cpp ${CMAKE_CURRENT_SOURCE_DIR}/ddc_block_control.cpp ${CMAKE_CURRENT_SOURCE_DIR}/duc_block_control.cpp diff --git a/host/lib/rfnoc/addsub_block_control.cpp b/host/lib/rfnoc/addsub_block_control.cpp new file mode 100644 index 000000000..516b348b1 --- /dev/null +++ b/host/lib/rfnoc/addsub_block_control.cpp @@ -0,0 +1,78 @@ +// +// Copyright 2019 Ettus Research, a National Instruments Brand +// +// SPDX-License-Identifier: GPL-3.0-or-later +// + +#include <uhd/convert.hpp> +#include <uhd/exception.hpp> +#include <uhd/rfnoc/addsub_block_control.hpp> +#include <uhd/rfnoc/defaults.hpp> +#include <uhd/rfnoc/property.hpp> +#include <uhd/rfnoc/registry.hpp> +#include <string> + +using namespace uhd::rfnoc; + + +class addsub_block_control_impl : public addsub_block_control +{ +public: + constexpr static size_t ARG_A_INPUT_PORT = 0; + constexpr static size_t ARG_B_INPUT_PORT = 1; + constexpr static size_t SUM_OUTPUT_PORT = 0; + constexpr static size_t DIFF_OUTPUT_PORT = 1; + + RFNOC_BLOCK_CONSTRUCTOR(addsub_block_control) + { + // Ensure that the block is configured correctly, i.e., that there + // are exactly two input ports for the input data and two output + // ports, one for the sum and one for the difference data. + const size_t num_input_ports = get_num_input_ports(); + const size_t num_output_ports = get_num_output_ports(); + UHD_ASSERT_THROW(num_input_ports == 2); + UHD_ASSERT_THROW(num_output_ports == 2); + + // Actions and properties are fanned out to all ports on the + // opposite side from which they are received. + set_prop_forwarding_policy(forwarding_policy_t::ONE_TO_FAN); + set_action_forwarding_policy(forwarding_policy_t::ONE_TO_FAN); + + // Register the block's edge type properties. + register_property(&_prop_type_in_a); + register_property(&_prop_type_in_b); + register_property(&_prop_type_out_sum); + register_property(&_prop_type_out_diff); + + // Add resolvers for edge port types to keep them at sc16, which is + // the only data type that this add/sub block can handle. + add_property_resolver({&_prop_type_in_a}, {&_prop_type_in_a}, [this]() { + _prop_type_in_a.set(IO_TYPE_SC16); + }); + add_property_resolver({&_prop_type_in_b}, {&_prop_type_in_b}, [this]() { + _prop_type_in_b.set(IO_TYPE_SC16); + }); + add_property_resolver({&_prop_type_out_sum}, {&_prop_type_out_sum}, [this]() { + _prop_type_out_sum.set(IO_TYPE_SC16); + }); + add_property_resolver({&_prop_type_out_diff}, {&_prop_type_out_diff}, [this]() { + _prop_type_out_diff.set(IO_TYPE_SC16); + }); + } + +private: + /************************************************************************** + * Attributes + *************************************************************************/ + property_t<std::string> _prop_type_in_a = property_t<std::string>{ + PROP_KEY_TYPE, IO_TYPE_SC16, {res_source_info::INPUT_EDGE, ARG_A_INPUT_PORT}}; + property_t<std::string> _prop_type_in_b = property_t<std::string>{ + PROP_KEY_TYPE, IO_TYPE_SC16, {res_source_info::INPUT_EDGE, ARG_B_INPUT_PORT}}; + property_t<std::string> _prop_type_out_sum = property_t<std::string>{ + PROP_KEY_TYPE, IO_TYPE_SC16, {res_source_info::OUTPUT_EDGE, SUM_OUTPUT_PORT}}; + property_t<std::string> _prop_type_out_diff = property_t<std::string>{ + PROP_KEY_TYPE, IO_TYPE_SC16, {res_source_info::OUTPUT_EDGE, DIFF_OUTPUT_PORT}}; +}; + +UHD_RFNOC_BLOCK_REGISTER_DIRECT( + addsub_block_control, ADDSUB_BLOCK, "AddSub", CLOCK_KEY_GRAPH, "bus_clk") |