diff options
Diffstat (limited to 'src/lib/netlist/solver/nld_solver.h')
-rw-r--r-- | src/lib/netlist/solver/nld_solver.h | 143 |
1 files changed, 58 insertions, 85 deletions
diff --git a/src/lib/netlist/solver/nld_solver.h b/src/lib/netlist/solver/nld_solver.h index 99937f72812..c4f6c2e5bf1 100644 --- a/src/lib/netlist/solver/nld_solver.h +++ b/src/lib/netlist/solver/nld_solver.h @@ -1,118 +1,91 @@ -// license:GPL-2.0+ +// license:BSD-3-Clause // copyright-holders:Couriersud -/* - * nld_solver.h - * - */ #ifndef NLD_SOLVER_H_ #define NLD_SOLVER_H_ -#include "netlist/nl_base.h" +/// +/// \file nld_solver.h +/// + #include "nld_matrix_solver.h" -#include "plib/pstream.h" + +#include "core/core_device.h" +#include "core/logic.h" +#include "core/state_var.h" + +#include "../plib/pstream.h" #include <map> #include <memory> #include <vector> -//#define ATTR_ALIGNED(N) __attribute__((aligned(N))) -#define ATTR_ALIGNED(N) ATTR_ALIGN - -// ---------------------------------------------------------------------------------------- -// solver -// ---------------------------------------------------------------------------------------- - -namespace netlist +namespace netlist::devices { -namespace devices -{ - class NETLIB_NAME(solver); - - class matrix_solver_t; + // ------------------------------------------------------------------------- + // solver + // ------------------------------------------------------------------------- - NETLIB_OBJECT(solver) + class nld_solver : public device_t { - NETLIB_CONSTRUCTOR(solver) - , m_fb_step(*this, "FB_step") - , m_Q_step(*this, "Q_step") - , m_freq(*this, "FREQ", 48000.0) - - /* iteration parameters */ - , m_gs_sor(*this, "SOR_FACTOR", 1.059) - , m_method(*this, "METHOD", "MAT_CR") - , m_accuracy(*this, "ACCURACY", 1e-7) - , m_gs_loops(*this, "GS_LOOPS", 9) // Gauss-Seidel loops - - /* general parameters */ - , m_gmin(*this, "GMIN", 1e-9) - , m_pivot(*this, "PIVOT", false) // use pivoting - on supported solvers - , m_nr_loops(*this, "NR_LOOPS", 250) // Newton-Raphson loops - , m_nr_recalc_delay(*this, "NR_RECALC_DELAY", netlist_time::quantum().as_double()) // Delay to next solve attempt if nr loops exceeded - , m_parallel(*this, "PARALLEL", 0) - - /* automatic time step */ - , m_dynamic_ts(*this, "DYNAMIC_TS", false) - , m_dynamic_lte(*this, "DYNAMIC_LTE", 1e-5) // diff/timestep - , m_dynamic_min_ts(*this, "DYNAMIC_MIN_TIMESTEP", 1e-6) // nl_double timestep resolution - - /* special */ - , m_use_gabs(*this, "USE_GABS", true) - , m_use_linear_prediction(*this, "USE_LINEAR_PREDICTION", false) // // savings are eaten up by effort - - , m_params() - { - // internal staff + public: + using solver_arena = device_arena; + using queue_type = detail::queue_base<solver_arena, + solver::matrix_solver_t>; - connect(m_fb_step, m_Q_step); - } + nld_solver(constructor_param_t data); void post_start(); void stop(); - nl_double gmin() const { return m_gmin(); } + auto gmin() const -> decltype(solver::solver_parameters_t::m_gmin()) + { + return m_params.m_gmin(); + } - void create_solver_code(std::map<pstring, pstring> &mp); + solver::static_compile_container + create_solver_code(solver::static_compile_target target); - NETLIB_UPDATEI(); NETLIB_RESETI(); // NETLIB_UPDATE_PARAMI(); + using solver_ptr = solver_arena::unique_ptr<solver::matrix_solver_t>; + + using net_list_t = solver::matrix_solver_t::net_list_t; + + void reschedule(solver::matrix_solver_t *solv, netlist_time ts); + private: - logic_input_t m_fb_step; + using params_uptr = solver_arena::unique_ptr< + solver::solver_parameters_t>; + + template <bool KEEP_STATS> + NETLIB_HANDLERI(fb_step); + + logic_input_t m_fb_step; logic_output_t m_Q_step; - param_double_t m_freq; - param_double_t m_gs_sor; - param_str_t m_method; - param_double_t m_accuracy; - param_int_t m_gs_loops; - param_double_t m_gmin; - param_logic_t m_pivot; - param_int_t m_nr_loops; - param_double_t m_nr_recalc_delay; - param_int_t m_parallel; - param_logic_t m_dynamic_ts; - param_double_t m_dynamic_lte; - param_double_t m_dynamic_min_ts; - - param_logic_t m_use_gabs; - param_logic_t m_use_linear_prediction; - - std::vector<pool_owned_ptr<matrix_solver_t>> m_mat_solvers; - std::vector<matrix_solver_t *> m_mat_solvers_all; - std::vector<matrix_solver_t *> m_mat_solvers_timestepping; - - solver_parameters_t m_params; + // FIXME: these should be created in device space + std::vector<params_uptr> m_mat_params; + std::vector<solver_ptr> m_mat_solvers; - template <typename FT, int SIZE> - pool_owned_ptr<matrix_solver_t> create_solver(std::size_t size, const pstring &solvername); + solver::solver_parameters_t m_params; + queue_type m_queue; template <typename FT, int SIZE> - pool_owned_ptr<matrix_solver_t> create_solver_x(std::size_t size, const pstring &solvername); + solver_ptr create_solver(std::size_t size, const pstring &solver_name, + const solver::solver_parameters_t *params, + net_list_t & nets); + + template <typename FT> + solver_ptr create_solvers(const pstring & sname, + const solver::solver_parameters_t *params, + net_list_t & nets); + + std::size_t get_solver_id(const solver::matrix_solver_t *net) const; + solver::matrix_solver_t *solver_by_id(std::size_t id) const; }; -} //namespace devices -} // namespace netlist +} // namespace netlist::devices -#endif /* NLD_SOLVER_H_ */ +#endif // NLD_SOLVER_H_ |