summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/nl_base.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/nl_base.h')
-rw-r--r--src/lib/netlist/nl_base.h168
1 files changed, 83 insertions, 85 deletions
diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h
index 93fb9ac64a3..54e6622799e 100644
--- a/src/lib/netlist/nl_base.h
+++ b/src/lib/netlist/nl_base.h
@@ -187,20 +187,13 @@ namespace netlist
namespace devices
{
class matrix_solver_t;
- class NETLIB_NAME(gnd);
class NETLIB_NAME(solver);
class NETLIB_NAME(mainclock);
- class NETLIB_NAME(netlistparams);
class NETLIB_NAME(base_proxy);
class NETLIB_NAME(base_d_to_a_proxy);
class NETLIB_NAME(base_a_to_d_proxy);
} // namespace devices
- namespace detail {
- struct family_setter_t;
- class queue_t;
- } // namespace detail
-
class logic_output_t;
class logic_input_t;
class analog_net_t;
@@ -210,7 +203,6 @@ namespace netlist
class netlist_state_t;
class core_device_t;
class device_t;
- class callbacks_t;
//============================================================
// Exceptions
@@ -351,24 +343,32 @@ namespace netlist
* Use this state_var template to define an array whose contents are saved.
* Please refer to \ref state_var.
*/
- template <typename T, std::size_t N>
- struct state_array : public std::array<T, N>
+ template <typename C>
+ struct state_container : public C
{
public:
+ using value_type = typename C::value_type;
//! Constructor.
template <typename O>
- state_array(O &owner, //!< owner must have a netlist() method.
- const pstring &name, //!< identifier/name for this state variable
- const T &value //!< Initial value after construction
+ state_container(O &owner, //!< owner must have a netlist() method.
+ const pstring &name, //!< identifier/name for this state variable
+ const value_type &value //!< Initial value after construction
+ );
+ //! Constructor.
+ template <typename O>
+ state_container(O &owner, //!< owner must have a netlist() method.
+ const pstring &name, //!< identifier/name for this state variable
+ std::size_t n, //!< number of elements to allocate
+ const value_type &value //!< Initial value after construction
);
//! Copy Constructor.
- state_array(const state_array &rhs) noexcept = default;
+ state_container(const state_container &rhs) noexcept = default;
//! Destructor.
- ~state_array() noexcept = default;
+ ~state_container() noexcept = default;
//! Move Constructor.
- state_array(state_array &&rhs) noexcept = default;
- state_array &operator=(const state_array &rhs) noexcept = default;
- state_array &operator=(state_array &&rhs) noexcept = default;
+ state_container(state_container &&rhs) noexcept = default;
+ state_container &operator=(const state_container &rhs) noexcept = default;
+ state_container &operator=(state_container &&rhs) noexcept = default;
};
// -----------------------------------------------------------------------------
@@ -471,9 +471,6 @@ namespace netlist
netlist_state_t & state() noexcept;
const netlist_state_t & state() const noexcept;
- setup_t & setup() noexcept;
- const setup_t & setup() const noexcept;
-
netlist_t & exec() noexcept { return m_netlist; }
const netlist_t & exec() const noexcept { return m_netlist; }
@@ -1244,9 +1241,6 @@ namespace netlist
~device_t() noexcept override = default;
- setup_t &setup() noexcept;
- const setup_t &setup() const noexcept;
-
template<class C, typename... Args>
void create_and_register_subdevice(const pstring &name, unique_pool_ptr<C> &dev, Args&&... args)
{
@@ -1271,62 +1265,66 @@ namespace netlist
// family_setter_t
// -----------------------------------------------------------------------------
- struct detail::family_setter_t
- {
- /* clang will complain about an unused private field if
- * a defaulted constructor is used
- */
- // NOLINTNEXTLINE(modernize-use-equals-default)
- family_setter_t();
- family_setter_t(core_device_t &dev, const pstring &desc);
- family_setter_t(core_device_t &dev, const logic_family_desc_t *desc);
- };
+ namespace detail {
- template <class T, bool TS>
- using timed_queue = plib::timed_queue_linear<T, TS>;
+ struct family_setter_t
+ {
+ /* clang will complain about an unused private field if
+ * a defaulted constructor is used
+ */
+ // NOLINTNEXTLINE(modernize-use-equals-default)
+ family_setter_t();
+ family_setter_t(core_device_t &dev, const pstring &desc);
+ family_setter_t(core_device_t &dev, const logic_family_desc_t *desc);
+ };
- /* Use timed_queue_heap to use stdc++ heap functions instead of linear processing.
- * This slows down processing by about 25% on a Kaby Lake.
- */
+ template <class T, bool TS>
+ using timed_queue = plib::timed_queue_linear<T, TS>;
- //template <class T, bool TS>
- //using timed_queue = timed_queue_heap<T, TS>;
+ /* Use timed_queue_heap to use stdc++ heap functions instead of linear processing.
+ * This slows down processing by about 25% on a Kaby Lake.
+ */
- // -----------------------------------------------------------------------------
- // queue_t
- // -----------------------------------------------------------------------------
+ //template <class T, bool TS>
+ //using timed_queue = timed_queue_heap<T, TS>;
- /* We don't need a thread-safe queue currently. Parallel processing of
- * solvers will update inputs after parallel processing.
- */
- class detail::queue_t :
- //public timed_queue<pqentry_t<net_t *, netlist_time>, false, NL_KEEP_STATISTICS>,
- public timed_queue<plib::pqentry_t<net_t *, netlist_time>, false>,
- public detail::netlist_ref,
- public plib::state_manager_t::callback_t
- {
- public:
- using base_queue = timed_queue<plib::pqentry_t<net_t *, netlist_time>, false>;
- using entry_t = plib::pqentry_t<net_t *, netlist_time>;
- explicit queue_t(netlist_state_t &nl);
- virtual ~queue_t() noexcept = default;
+ // -----------------------------------------------------------------------------
+ // queue_t
+ // -----------------------------------------------------------------------------
+
+ /* We don't need a thread-safe queue currently. Parallel processing of
+ * solvers will update inputs after parallel processing.
+ */
+ class queue_t :
+ //public timed_queue<pqentry_t<net_t *, netlist_time>, false, NL_KEEP_STATISTICS>,
+ public timed_queue<plib::pqentry_t<net_t *, netlist_time>, false>,
+ public netlist_ref,
+ public plib::state_manager_t::callback_t
+ {
+ public:
+ using base_queue = timed_queue<plib::pqentry_t<net_t *, netlist_time>, false>;
+ using entry_t = plib::pqentry_t<net_t *, netlist_time>;
+ explicit queue_t(netlist_state_t &nl);
+ virtual ~queue_t() noexcept = default;
- queue_t(const queue_t &) = delete;
- queue_t(queue_t &&) = delete;
- queue_t &operator=(const queue_t &) = delete;
- queue_t &operator=(queue_t &&) = delete;
+ queue_t(const queue_t &) = delete;
+ queue_t(queue_t &&) = delete;
+ queue_t &operator=(const queue_t &) = delete;
+ queue_t &operator=(queue_t &&) = delete;
- protected:
+ protected:
- void register_state(plib::state_manager_t &manager, const pstring &module) override;
- void on_pre_save(plib::state_manager_t &manager) override;
- void on_post_load(plib::state_manager_t &manager) override;
+ void register_state(plib::state_manager_t &manager, const pstring &module) override;
+ void on_pre_save(plib::state_manager_t &manager) override;
+ void on_post_load(plib::state_manager_t &manager) override;
- private:
- std::size_t m_qsize;
- std::vector<netlist_time::internal_type> m_times;
- std::vector<std::size_t> m_net_ids;
- };
+ private:
+ std::size_t m_qsize;
+ std::vector<netlist_time::internal_type> m_times;
+ std::vector<std::size_t> m_net_ids;
+ };
+
+ }
// -----------------------------------------------------------------------------
// netlist_state__t
@@ -1666,16 +1664,6 @@ namespace netlist
return m_netlist.nlstate();
}
- inline setup_t & detail::netlist_ref::setup() noexcept
- {
- return m_netlist.nlstate().setup();
- }
-
- inline const setup_t & detail::netlist_ref::setup() const noexcept
- {
- return m_netlist.nlstate().setup();
- }
-
template <typename T>
param_num_t<T>::param_num_t(device_t &device, const pstring &name, const T val)
: param_t(device, name)
@@ -1909,15 +1897,25 @@ namespace netlist
owner.state().save(owner, m_value, owner.name(), name);
}
- template <typename T, std::size_t N>
+ template <typename C>
template <typename O>
- state_array<T,N>::state_array(O &owner, const pstring &name, const T & value)
+ state_container<C>::state_container(O &owner, const pstring &name,
+ const state_container<C>::value_type & value)
{
- owner.state().save(owner, *static_cast<std::array<T, N> *>(this), owner.name(), name);
- for (std::size_t i=0; i<N; i++)
+ owner.state().save(owner, *static_cast<C *>(this), owner.name(), name);
+ for (std::size_t i=0; i < this->size(); i++)
(*this)[i] = value;
}
+ template <typename C>
+ template <typename O>
+ state_container<C>::state_container(O &owner, const pstring &name,
+ std::size_t n, const state_container<C>::value_type & value)
+ : C(n, value)
+ {
+ owner.state().save(owner, *static_cast<C *>(this), owner.name(), name);
+ }
+
// -----------------------------------------------------------------------------
// Hot section
//