aboutsummaryrefslogtreecommitdiffstats
path: root/host
diff options
context:
space:
mode:
Diffstat (limited to 'host')
-rw-r--r--host/lib/rfnoc/replay_block_control.cpp37
1 files changed, 37 insertions, 0 deletions
diff --git a/host/lib/rfnoc/replay_block_control.cpp b/host/lib/rfnoc/replay_block_control.cpp
index 43a5ff43b..b28476ea8 100644
--- a/host/lib/rfnoc/replay_block_control.cpp
+++ b/host/lib/rfnoc/replay_block_control.cpp
@@ -129,6 +129,7 @@ public:
_record_type.reserve(_num_input_ports);
_record_offset.reserve(_num_input_ports);
_record_size.reserve(_num_input_ports);
+ _atomic_item_size_in.reserve(_num_input_ports);
for (size_t port = 0; port < _num_input_ports; port++) {
_register_input_props(port);
_replay_reg_iface.poke64(
@@ -137,11 +138,13 @@ public:
REG_REC_BUFFER_SIZE_LO_ADDR, _record_size.at(port).get(), port);
}
+
// Initialize playback properties
_play_type.reserve(_num_output_ports);
_play_offset.reserve(_num_output_ports);
_play_size.reserve(_num_output_ports);
_packet_size.reserve(_num_output_ports);
+ _atomic_item_size_out.reserve(_num_output_ports);
for (size_t port = 0; port < _num_output_ports; port++) {
_register_output_props(port);
_replay_reg_iface.poke32(REG_PLAY_ITEM_SIZE_ADDR,
@@ -374,14 +377,18 @@ private:
PROP_KEY_RECORD_OFFSET, record_offset, {res_source_info::USER, port}));
_record_size.push_back(property_t<uint64_t>(
PROP_KEY_RECORD_SIZE, record_size, {res_source_info::USER, port}));
+ _atomic_item_size_in.push_back(property_t<size_t>(
+ PROP_KEY_ATOMIC_ITEM_SIZE, _word_size, {res_source_info::INPUT_EDGE, port}));
UHD_ASSERT_THROW(_record_type.size() == port + 1);
UHD_ASSERT_THROW(_record_offset.size() == port + 1);
UHD_ASSERT_THROW(_record_size.size() == port + 1);
+ UHD_ASSERT_THROW(_atomic_item_size_in.size() == port + 1);
// Register user properties
register_property(&_record_type.at(port));
register_property(&_record_offset.at(port));
register_property(&_record_size.at(port));
+ register_property(&_atomic_item_size_in.at(port));
// Add property resolvers
add_property_resolver({&_record_offset.at(port)}, {}, [this, port]() {
@@ -390,6 +397,18 @@ private:
add_property_resolver({&_record_size.at(port)},
{&_record_size.at(port)},
[this, port]() { _set_record_size(_record_size.at(port).get(), port); });
+ add_property_resolver({&_atomic_item_size_in.back(),
+ get_mtu_prop_ref({res_source_info::INPUT_EDGE, port})},
+ {&_atomic_item_size_in.back()},
+ [this, port, &ais_in = _atomic_item_size_in.back()]() {
+ ais_in = uhd::math::lcm<size_t>(ais_in, get_word_size());
+ ais_in = std::min<size_t>(
+ ais_in, get_mtu({res_source_info::INPUT_EDGE, port}));
+ if (ais_in.get() % get_word_size() > 0) {
+ ais_in = ais_in - (ais_in.get() % get_word_size());
+ }
+ RFNOC_LOG_TRACE("Resolve atomic item size in to " << ais_in);
+ });
}
void _register_output_props(const size_t port)
@@ -409,16 +428,20 @@ private:
PROP_KEY_PLAY_SIZE, play_size, {res_source_info::USER, port}));
_packet_size.push_back(property_t<uint32_t>(
PROP_KEY_PKT_SIZE, packet_size, {res_source_info::USER, port}));
+ _atomic_item_size_out.push_back(property_t<size_t>(
+ PROP_KEY_ATOMIC_ITEM_SIZE, _word_size, {res_source_info::OUTPUT_EDGE, port}));
UHD_ASSERT_THROW(_play_type.size() == port + 1);
UHD_ASSERT_THROW(_play_offset.size() == port + 1);
UHD_ASSERT_THROW(_play_size.size() == port + 1);
UHD_ASSERT_THROW(_packet_size.size() == port + 1);
+ UHD_ASSERT_THROW(_atomic_item_size_out.size() == port + 1);
// Register user properties
register_property(&_play_type.at(port));
register_property(&_play_offset.at(port));
register_property(&_play_size.at(port));
register_property(&_packet_size.at(port));
+ register_property(&_atomic_item_size_out.at(port));
// Add property resolvers
add_property_resolver({&_play_type.at(port)}, {}, [this, port]() {
@@ -434,6 +457,18 @@ private:
get_mtu_prop_ref({res_source_info::OUTPUT_EDGE, port})},
{},
[this, port]() { _set_packet_size(_packet_size.at(port).get(), port); });
+ add_property_resolver({&_atomic_item_size_out.back(),
+ get_mtu_prop_ref({res_source_info::OUTPUT_EDGE, port})},
+ {&_atomic_item_size_out.back()},
+ [this, port, &ais_out = _atomic_item_size_out.back()]() {
+ ais_out = uhd::math::lcm<size_t>(ais_out, get_word_size());
+ ais_out = std::min<size_t>(
+ ais_out, get_mtu({res_source_info::OUTPUT_EDGE, port}));
+ if (ais_out.get() % get_word_size() > 0) {
+ ais_out = ais_out - (ais_out.get() % get_word_size());
+ }
+ RFNOC_LOG_TRACE("Resolve atomic item size out to " << ais_out);
+ });
}
void _set_play_type(const io_type_t type, const size_t port)
@@ -568,6 +603,8 @@ private:
std::vector<property_t<uint64_t>> _play_offset;
std::vector<property_t<uint64_t>> _play_size;
std::vector<property_t<uint32_t>> _packet_size;
+ std::vector<property_t<size_t>> _atomic_item_size_in;
+ std::vector<property_t<size_t>> _atomic_item_size_out;
};
UHD_RFNOC_BLOCK_REGISTER_DIRECT(