#include <uhd/rfnoc/noc_block_base.hpp>
Classes | |
struct | make_args_t |
Public Types | |
using | sptr = std::shared_ptr< noc_block_base > |
using | make_args_ptr = std::unique_ptr< make_args_t > |
Opaque pointer to the constructor arguments. More... | |
![]() | |
enum | forwarding_policy_t { forwarding_policy_t::ONE_TO_ONE, forwarding_policy_t::ONE_TO_FAN, forwarding_policy_t::ONE_TO_ALL_IN, forwarding_policy_t::ONE_TO_ALL_OUT, forwarding_policy_t::ONE_TO_ALL, forwarding_policy_t::DROP, forwarding_policy_t::USE_MAP } |
Types of property/action forwarding for those not defined by the block itself. More... | |
using | resolver_fn_t = std::function< void(void)> |
using | resolve_callback_t = std::function< void(void)> |
using | graph_mutex_callback_t = std::function< std::recursive_mutex &(void)> |
using | action_handler_t = std::function< void(const res_source_info &, action_info::sptr)> |
using | forwarding_map_t = std::unordered_map< res_source_info, std::vector< res_source_info > > |
Public Member Functions | |
~noc_block_base () override | |
std::string | get_unique_id () const override |
Unique ID for an RFNoC block is its block ID. More... | |
size_t | get_num_input_ports () const override |
Number of input ports. Note: This gets passed into this block from the. More... | |
size_t | get_num_output_ports () const override |
Number of output ports. Note: This gets passed outto this block from the. More... | |
noc_id_t | get_noc_id () const |
const block_id_t & | get_block_id () const |
double | get_tick_rate () const |
size_t | get_mtu (const res_source_info &edge) |
size_t | get_chdr_hdr_len (const bool account_for_ts=true) const |
size_t | get_max_payload_size (const res_source_info &edge, const bool account_for_ts=true) |
uhd::device_addr_t | get_block_args () const |
uhd::property_tree::sptr & | get_tree () const |
Return a reference to this block's subtree. More... | |
uhd::property_tree::sptr & | get_tree () |
Return a reference to this block's subtree (non-const version) More... | |
std::shared_ptr< mb_controller > | get_mb_controller () |
![]() | |
node_t () | |
virtual | ~node_t () |
std::vector< std::string > | get_property_ids () const |
template<typename prop_data_t > | |
void | set_property (const std::string &id, const prop_data_t &val, const size_t instance=0) |
void | set_properties (const uhd::device_addr_t &props, const size_t instance=0) |
template<typename prop_data_t > | |
const prop_data_t & | get_property (const std::string &id, const size_t instance=0) |
virtual void | set_command_time (uhd::time_spec_t time, const size_t instance) |
virtual uhd::time_spec_t | get_command_time (const size_t instance) const |
virtual void | clear_command_time (const size_t instance) |
![]() | |
register_iface_holder (register_iface::sptr reg) | |
virtual | ~register_iface_holder ()=default |
register_iface & | regs () |
Protected Member Functions | |
noc_block_base (make_args_ptr make_args) | |
void | set_num_input_ports (const size_t num_ports) |
Update number of input ports. More... | |
void | set_num_output_ports (const size_t num_ports) |
Update number of output ports. More... | |
void | set_tick_rate (const double tick_rate) |
void | set_mtu_forwarding_policy (const forwarding_policy_t policy) |
void | set_mtu (const res_source_info &edge, const size_t new_mtu) |
property_base_t * | get_mtu_prop_ref (const res_source_info &edge) |
virtual void | deinit () |
![]() | |
void | register_property (property_base_t *prop, resolve_callback_t &&clean_callback=nullptr) |
void | add_property_resolver (prop_ptrs_t &&inputs, prop_ptrs_t &&outputs, resolver_fn_t &&resolver_fn) |
void | set_prop_forwarding_policy (forwarding_policy_t policy, const std::string &prop_id="") |
void | set_prop_forwarding_map (const forwarding_map_t &map) |
template<typename prop_data_t > | |
void | set_property (const std::string &id, const prop_data_t &val, const res_source_info &src_info) |
template<typename prop_data_t > | |
const prop_data_t & | get_property (const std::string &id, const res_source_info &src_info) |
void | register_action_handler (const std::string &id, action_handler_t &&handler) |
void | set_action_forwarding_policy (forwarding_policy_t policy, const std::string &action_key="") |
void | set_action_forwarding_map (const forwarding_map_t &map) |
void | post_action (const res_source_info &edge_info, action_info::sptr action) |
virtual bool | check_topology (const std::vector< size_t > &connected_inputs, const std::vector< size_t > &connected_outputs) |
![]() | |
void | update_reg_iface (register_iface::sptr new_iface=nullptr) |
Friends | |
class | block_initializer |
Additional Inherited Members | |
![]() | |
static const size_t | ANY_PORT = size_t(~0) |
![]() | |
using | prop_ptrs_t = std::vector< property_base_t * > |
![]() | |
static dirtifier_t | ALWAYS_DIRTY |
A dirtifyer object, useful for properties that always need updating. More... | |
The primary interface to a NoC block in the FPGA
The block supports three types of data access:
The main difference between this class and its parent is the direct access to registers, and the NoC&block IDs.
using uhd::rfnoc::noc_block_base::make_args_ptr = std::unique_ptr<make_args_t> |
Opaque pointer to the constructor arguments.
using uhd::rfnoc::noc_block_base::sptr = std::shared_ptr<noc_block_base> |
A shared pointer to allow easy access to this class and for automatic memory management.
|
override |
|
protected |
|
protectedvirtual |
Safely de-initialize the block
This function is called by the framework when the RFNoC session is about to finish to allow blocks to safely perform actions to shut down a block. For example, if your block is producing samples, like a radio or signal generator, this is a good place to issue a "stop" command.
After this function is called, register access is no more possible. So make sure not to interact with regs() after this was called. Future access to regs() won't throw, but will print error messages and do nothing.
The rationale for having this separate from the destructor is because rfnoc_graph allows exporting references to blocks, and this function ensures that blocks are safely shut down when the rest of the device control goes away.
|
inline |
Return the arguments that were passed into this block from the framework
|
inline |
Returns the unique block ID for this block.
size_t uhd::rfnoc::noc_block_base::get_chdr_hdr_len | ( | const bool | account_for_ts = true | ) | const |
Return the size of a CHDR packet header, in bytes.
This helper function factors in the CHDR width for this block.
account_for_ts | If true (default), the assumption is that we reserve space for a timestamp. It is possible to increase the payload if no timestamp is used (only for 64 bit CHDR widths!), however, this is advanced usage and should only be used in special circumstances, as downstream blocks might not be able to handle such packets. |
size_t uhd::rfnoc::noc_block_base::get_max_payload_size | ( | const res_source_info & | edge, |
const bool | account_for_ts = true |
||
) |
Return the maximum usable payload size on a given edge, in bytes.
This is very similar to get_mtu(), except it also accounts for the header.
Example: Say the MTU on a given edge is 8192 bytes. The CHDR width is 64 bits. If we wanted to add a timestamp, we would thus require 16 bytes for the total header, leaving only 8192-16=8176 bytes for a payload, which is what this function would return. The same MTU, with a CHDR width of 512 bits however, would require leaving 64 bytes for the header (regardless of whether or not a timestamp is included). In that case, this function would return 8192-64=8128 bytes max payload size.
edge | The edge on which the max payload size is queried. edge.type must be INPUT_EDGE or OUTPUT_EDGE! See also get_mtu(). |
account_for_ts | If true (default), the assumption is that we reserve space for a timestamp. It is possible to increase the payload if no timestamp is used (only for 64 bit CHDR widths!), however, this is advanced usage and should only be used in special circumstances, as downstream blocks might not be able to handle such packets. |
uhd::value_error | if edge is not referring to a valid edge |
std::shared_ptr<mb_controller> uhd::rfnoc::noc_block_base::get_mb_controller | ( | ) |
Get access to the motherboard controller for this block's motherboard
This will return a nullptr if this block doesn't have access to the motherboard. In order to gain access to the motherboard, the block needs to have requested access to the motherboard during the registration procedure. See also registry.hpp.
Even if this block requested access to the motherboard controller, there is no guarantee that UHD will honour that request. It is therefore important to verify that the returned pointer is valid.
size_t uhd::rfnoc::noc_block_base::get_mtu | ( | const res_source_info & | edge | ) |
Return the current MTU on a given edge
Note: The MTU is the maximum size of a CHDR packet, including header. In order to find out the maximum payload size, calling get_max_payload_size() is the recommended alternative.
The MTU is determined by the block itself (i.e., how big of a packet can this block handle on this edge), but also the neighboring block, and possibly the transport medium between the blocks. This value can thus be lower than what the block defines as MTU, but never higher.
edge | The edge on which the MTU is queried. edge.type must be INPUT_EDGE or OUTPUT_EDGE! |
uhd::value_error | if edge is not referring to a valid edge |
|
protected |
Return a reference to an MTU property
This can be used to make the MTU an input to a property resolver. For example, blocks that have an spp property, such as the radio, can now trigger a property resolver based on the MTU.
The reference is guaranteed to remain valid for the lifetime of this block.
|
inline |
Return the NoC ID for this block.
|
inlineoverridevirtual |
Number of input ports. Note: This gets passed into this block from the.
Implements uhd::rfnoc::node_t.
|
inlineoverridevirtual |
Number of output ports. Note: This gets passed outto this block from the.
Implements uhd::rfnoc::node_t.
double uhd::rfnoc::noc_block_base::get_tick_rate | ( | ) | const |
Returns the tick rate of the current time base
Note there is only ever one time base (or tick rate) per block.
|
inline |
Return a reference to this block's subtree.
|
inline |
Return a reference to this block's subtree (non-const version)
|
inlineoverridevirtual |
Unique ID for an RFNoC block is its block ID.
Reimplemented from uhd::rfnoc::node_t.
|
protected |
Update the MTU
This is another data point in the MTU discovery process. This means that the MTU cannot be increased using the method, only decreased.
|
protected |
Change the way MTUs are forwarded
The policy will have the following effect:
The default policy is ONE_TO_ONE.
Note: The MTU forwarding policy can only be set once, and only during construction of a noc_block_base. If an RFNoC block subclassing noc_block_base wants to modify the MTU forwarding policy, it must call this function in its constructor. Once set, however, the MTU forwarding policy cannot be changed. This represents a change in behaviour from UHD 4.0. Violations of this restriction will result in a uhd::runtime_error being thrown.
|
protected |
Update number of input ports.
|
protected |
Update number of output ports.
|
protected |
Update tick rate for this node and all the connected nodes
Careful: Calling this function will trigger a property propagation to any block this block is connected to.
|
friend |