diff options
Diffstat (limited to 'src/lib/netlist/nl_base.h')
-rw-r--r-- | src/lib/netlist/nl_base.h | 168 |
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 // |