aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/rfnoc/registry_factory.cpp
diff options
context:
space:
mode:
authorMartin Braun <martin.braun@ettus.com>2019-05-24 14:46:39 -0700
committerMartin Braun <martin.braun@ettus.com>2019-11-26 11:49:16 -0800
commit1ed37cdfda93e430037ee4028ec5ac70ab223b1b (patch)
tree16c20409cf18b0747b107092ed64c3beab4f6e89 /host/lib/rfnoc/registry_factory.cpp
parentde6dfccc835ad46b5f4362caae66a37651716ab2 (diff)
downloaduhd-1ed37cdfda93e430037ee4028ec5ac70ab223b1b.tar.gz
uhd-1ed37cdfda93e430037ee4028ec5ac70ab223b1b.tar.bz2
uhd-1ed37cdfda93e430037ee4028ec5ac70ab223b1b.zip
rfnoc: Add block registry/factory and make_args
- noc_block_base now has a ctor defined - The registry stores factory functions to the individual Noc-Block implementations
Diffstat (limited to 'host/lib/rfnoc/registry_factory.cpp')
-rw-r--r--host/lib/rfnoc/registry_factory.cpp88
1 files changed, 88 insertions, 0 deletions
diff --git a/host/lib/rfnoc/registry_factory.cpp b/host/lib/rfnoc/registry_factory.cpp
new file mode 100644
index 000000000..cf7b897f7
--- /dev/null
+++ b/host/lib/rfnoc/registry_factory.cpp
@@ -0,0 +1,88 @@
+//
+// Copyright 2019 Ettus Research, a National Instruments Brand
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+//
+
+#include <uhd/exception.hpp>
+#include <uhd/rfnoc/registry.hpp>
+#include <uhd/utils/static.hpp>
+#include <uhdlib/rfnoc/factory.hpp>
+#include <unordered_map>
+#include <iomanip>
+#include <iostream>
+#include <sstream>
+
+using namespace uhd::rfnoc;
+
+///////////////////////////////////////////////////////////////////////////////
+// There are two registries:
+// - The "direct" registry, which is for blocks that do not have a block
+// descriptor file
+// - The "descriptor" registry, which is for blocks that *do* have a block
+// descriptor file
+//
+// This is the direct registry:
+using block_direct_reg_t = std::unordered_map<noc_block_base::noc_id_t,
+ std::tuple<std::string /* block_name */,
+ registry::factory_t>>;
+UHD_SINGLETON_FCN(block_direct_reg_t, get_direct_block_registry);
+//
+// This is the descriptor registry:
+using block_descriptor_reg_t =
+ std::unordered_map<std::string /* block_key */, registry::factory_t>;
+UHD_SINGLETON_FCN(block_descriptor_reg_t, get_descriptor_block_registry);
+///////////////////////////////////////////////////////////////////////////////
+
+/******************************************************************************
+ * Registry functions
+ *
+ * Note: Don't use UHD_LOG_*, since all of this can be executed in a static
+ * fashion.
+ *****************************************************************************/
+void registry::register_block_direct(noc_block_base::noc_id_t noc_id,
+ const std::string& block_name,
+ factory_t factory_fn)
+{
+ if (get_direct_block_registry().count(noc_id)) {
+ std::cerr
+ << "[REGISTRY] WARNING: Attempting to overwrite previously registered RFNoC "
+ "block with Noc-ID 0x"
+ << std::hex << noc_id << std::dec << std::endl;
+ return;
+ }
+ get_direct_block_registry().emplace(
+ noc_id, std::make_tuple(block_name, std::move(factory_fn)));
+}
+
+void registry::register_block_descriptor(
+ const std::string& block_key, factory_t factory_fn)
+{
+ if (get_descriptor_block_registry().count(block_key)) {
+ std::cerr << "WARNING: Attempting to overwriting previously registered RFNoC "
+ "block with block key"
+ << block_key << std::endl;
+ return;
+ }
+ get_descriptor_block_registry().emplace(block_key, std::move(factory_fn));
+}
+
+/******************************************************************************
+ * Factory functions
+ *****************************************************************************/
+std::pair<registry::factory_t, std::string> factory::get_block_factory(
+ noc_block_base::noc_id_t noc_id)
+{
+ // First, check the descriptor registry
+ // FIXME TODO
+
+ // Second, check the direct registry
+ if (!get_direct_block_registry().count(noc_id)) {
+ UHD_LOG_WARNING("RFNOC::BLOCK_FACTORY",
+ "Could not find block with Noc-ID "
+ << std::hex << std::setw(sizeof(noc_block_base::noc_id_t) * 2) << noc_id);
+ throw uhd::key_error("Block not found!");
+ }
+ auto& block_info = get_direct_block_registry().at(noc_id);
+ return {std::get<1>(block_info), std::get<0>(block_info)};
+}