summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/solver/nld_solver.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/solver/nld_solver.h')
-rw-r--r--src/lib/netlist/solver/nld_solver.h143
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_