summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/nl_factory.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/nl_factory.h')
-rw-r--r--src/lib/netlist/nl_factory.h177
1 files changed, 94 insertions, 83 deletions
diff --git a/src/lib/netlist/nl_factory.h b/src/lib/netlist/nl_factory.h
index 38db6446403..ed4eb276c1f 100644
--- a/src/lib/netlist/nl_factory.h
+++ b/src/lib/netlist/nl_factory.h
@@ -9,6 +9,7 @@
#define NLFACTORY_H_
#include "nltypes.h"
+
#include "plib/palloc.h"
#include "plib/pmempool.h"
#include "plib/psource.h"
@@ -18,30 +19,28 @@
#include <utility>
#include <vector>
-#define NETLIB_DEVICE_IMPL_ALIAS(p_alias, chip, p_name, p_def_param) \
- NETLIB_DEVICE_IMPL_BASE(devices, p_alias, chip, p_name, p_def_param) \
+#define NETLIB_DEVICE_IMPL_ALIAS(p_alias, chip, p_name, p_def_param) \
+ NETLIB_DEVICE_IMPL_BASE(devices, p_alias, chip, p_name, p_def_param)
-#define NETLIB_DEVICE_IMPL(chip, p_name, p_def_param) \
+#define NETLIB_DEVICE_IMPL(chip, p_name, p_def_param) \
NETLIB_DEVICE_IMPL_NS(devices, chip, p_name, p_def_param)
-#define NETLIB_DEVICE_IMPL_NS(ns, chip, p_name, p_def_param) \
- NETLIB_DEVICE_IMPL_BASE(ns, chip, chip, p_name, p_def_param) \
-
-#define NETLIB_DEVICE_IMPL_BASE(ns, p_alias, chip, p_name, p_def_param) \
- static factory::element_t::uptr NETLIB_NAME(p_alias ## _c) () \
- { \
- using devtype = factory::device_element_t<ns :: NETLIB_NAME(chip)>; \
- factory::properties sl(p_def_param, PSOURCELOC()); \
- return devtype::create(p_name, std::move(sl)); \
- } \
- \
- extern factory::constructor_ptr_t decl_ ## p_alias; \
- factory::constructor_ptr_t decl_ ## p_alias = NETLIB_NAME(p_alias ## _c);
-
-namespace netlist {
-
-namespace factory {
-
+#define NETLIB_DEVICE_IMPL_NS(ns, chip, p_name, p_def_param) \
+ NETLIB_DEVICE_IMPL_BASE(ns, chip, chip, p_name, p_def_param)
+
+#define NETLIB_DEVICE_IMPL_BASE(ns, p_alias, chip, p_name, p_def_param) \
+ static factory::element_t::uptr NETLIB_NAME(p_alias##_c)() \
+ { \
+ using devtype = factory::device_element_t<ns ::NETLIB_NAME(chip)>; \
+ factory::properties sl(p_def_param, PSOURCELOC()); \
+ return devtype::create(p_name, std::move(sl)); \
+ } \
+ \
+ extern factory::constructor_ptr_t decl_##p_alias; \
+ factory::constructor_ptr_t decl_##p_alias = NETLIB_NAME(p_alias##_c);
+
+namespace netlist::factory
+{
enum class element_type
{
BUILTIN,
@@ -50,24 +49,23 @@ namespace factory {
struct properties
{
- properties(const pstring &defparam, plib::source_location &&sourceloc)
- : m_defparam(defparam)
- , m_sourceloc(std::move(sourceloc))
+ properties(const pstring & default_parameter,
+ plib::source_location &&location)
+ : m_default_parameter(default_parameter)
+ , m_location(std::move(location))
, m_type(element_type::BUILTIN)
- { }
+ {
+ }
~properties() = default;
PCOPYASSIGNMOVE(properties, default)
- pstring defparam() const noexcept
+ pstring default_parameter() const noexcept
{
- return m_defparam;
+ return m_default_parameter;
}
- plib::source_location source() const noexcept
- {
- return m_sourceloc;
- }
+ plib::source_location source() const noexcept { return m_location; }
element_type type() const noexcept { return m_type; }
@@ -76,20 +74,20 @@ namespace factory {
m_type = t;
return *this;
}
+
private:
- pstring m_defparam;
- plib::source_location m_sourceloc;
- element_type m_type;
+ pstring m_default_parameter;
+ plib::source_location m_location;
+ element_type m_type;
};
- // -----------------------------------------------------------------------------
+ // -------------------------------------------------------------------------
// net_dev class factory
- // -----------------------------------------------------------------------------
+ // -------------------------------------------------------------------------
class element_t
{
public:
-
using dev_uptr = device_arena::unique_ptr<core_device_t>;
using uptr = host_arena::unique_ptr<element_t>;
using pointer = element_t *;
@@ -99,59 +97,71 @@ namespace factory {
PCOPYASSIGNMOVE(element_t, default)
- virtual dev_uptr make_device(device_arena &pool,
- netlist_state_t &anetlist,
- const pstring &name) = 0;
+ virtual dev_uptr
+ make_device(device_arena &pool, netlist_state_t &anetlist,
+ const pstring &name)
+ = 0;
pstring name() const noexcept { return m_name; }
- pstring param_desc() const noexcept { return m_properties.defparam(); }
- plib::source_location source() const noexcept { return m_properties.source(); }
+ pstring param_desc() const noexcept
+ {
+ return m_properties.default_parameter();
+ }
+ plib::source_location source() const noexcept
+ {
+ return m_properties.source();
+ }
element_type type() const noexcept { return m_properties.type(); }
+
private:
- pstring m_name; ///< device name
- properties m_properties; ///< source file and other information and settings
+ pstring m_name; //!< device name
+ properties m_properties; //!< source file and other information and
+ //!< settings
};
template <class C, typename... Args>
class device_element_t : public element_t
{
public:
+ using constructor_data_t = typename C::constructor_data_t;
- device_element_t(const pstring &name, properties &&props, Args&&... args)
+ device_element_t(const pstring &name, properties &&props,
+ Args &&...args)
: element_t(name, std::move(props))
, m_args(std::forward<Args>(args)...)
- { }
-
+ {
+ }
template <std::size_t... Is>
- dev_uptr make_device(device_arena &pool,
- netlist_state_t &anetlist,
- const pstring &name, std::tuple<Args...>& args, std::index_sequence<Is...>)
+ dev_uptr make_device(device_arena &pool, netlist_state_t &anetlist,
+ const pstring &name, std::tuple<Args...> &args,
+ std::index_sequence<Is...>)
{
- return plib::make_unique<C>(pool, anetlist, name, std::forward<Args>(std::get<Is>(args))...);
- //return anetlist.make_pool_object<C>(anetlist, name, std::forward<Args>(std::get<Is>(args))...);
+ return plib::make_unique<C>(
+ pool, constructor_data_t{anetlist, name},
+ std::forward<Args>(std::get<Is>(args))...);
}
- dev_uptr make_device(device_arena &pool,
- netlist_state_t &anetlist,
- const pstring &name, std::tuple<Args...>& args)
+ dev_uptr make_device(device_arena &pool, netlist_state_t &anetlist,
+ const pstring &name, std::tuple<Args...> &args)
{
- return make_device(pool, anetlist, name, args, std::index_sequence_for<Args...>{});
+ return make_device(pool, anetlist, name, args,
+ std::index_sequence_for<Args...>{});
}
- dev_uptr make_device(device_arena &pool,
- netlist_state_t &anetlist,
- const pstring &name) override
+ dev_uptr make_device(device_arena &pool, netlist_state_t &anetlist,
+ const pstring &name) override
{
return make_device(pool, anetlist, name, m_args);
- //return pool.make_unique<C>(anetlist, name);
}
- static uptr create(const pstring &name, properties &&props, Args&&... args)
+ static uptr
+ create(const pstring &name, properties &&props, Args &&...args)
{
- return plib::make_unique<device_element_t<C, Args...>, host_arena>(name,
- std::move(props), std::forward<Args>(args)...);
+ return plib::make_unique<device_element_t<C, Args...>, host_arena>(
+ name, std::move(props), std::forward<Args>(args)...);
}
+
private:
std::tuple<Args...> m_args;
};
@@ -164,60 +174,61 @@ namespace factory {
PCOPYASSIGNMOVE(list_t, delete)
- template<class device_class, typename... Args>
- void add(const pstring &name, properties &&props, Args&&... args)
+ template <class device_class, typename... Args>
+ void add(const pstring &name, properties &&props, Args &&...args)
{
- add(device_element_t<device_class, Args...>::create(name, std::move(props),
- std::forward<Args>(args)...));
+ add(device_element_t<device_class, Args...>::create(
+ name, std::move(props), std::forward<Args>(args)...));
}
void add(element_t::uptr &&factory) noexcept(false);
- element_t::pointer factory_by_name(const pstring &devname) noexcept(false);
+ element_t::pointer
+ factory_by_name(const pstring &devname) noexcept(false);
template <class C>
bool is_class(element_t::pointer f) noexcept
{
- return dynamic_cast<device_element_t<C> *>(f) != nullptr;
+ return bool(plib::dynamic_downcast<device_element_t<C> *>(f));
}
bool exists(const pstring &name) const noexcept;
+
private:
log_type &m_log;
};
- // -----------------------------------------------------------------------------
+ // -------------------------------------------------------------------------
// factory_creator_ptr_t
- // -----------------------------------------------------------------------------
+ // -------------------------------------------------------------------------
using constructor_ptr_t = element_t::uptr (*const)();
template <typename T>
element_t::uptr constructor_t(const pstring &name, properties &&props)
{
- return plib::make_unique<device_element_t<T>, host_arena>(name, std::move(props));
+ return plib::make_unique<device_element_t<T>, host_arena>(
+ name, std::move(props));
}
- // -----------------------------------------------------------------------------
+ // -------------------------------------------------------------------------
// library_element_t: factory class to wrap macro based chips/elements
- // -----------------------------------------------------------------------------
+ // -------------------------------------------------------------------------
class library_element_t : public element_t
{
public:
-
library_element_t(const pstring &name, properties &&props);
- dev_uptr make_device(device_arena &pool,
- netlist_state_t &anetlist,
- const pstring &name) override;
+ dev_uptr make_device(device_arena &pool, netlist_state_t &anetlist,
+ const pstring &name) override;
};
- } // namespace factory
+} // namespace netlist::factory
- namespace devices {
- void initialize_factory(factory::list_t &factory);
- } // namespace devices
-} // namespace netlist
+namespace netlist::devices
+{
+ void initialize_factory(factory::list_t &factory);
+} // namespace netlist::devices
#endif // NLFACTORY_H_