summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/solver
diff options
context:
space:
mode:
author couriersud <couriersud@gmx.org>2020-07-25 14:46:37 +0200
committer couriersud <couriersud@gmx.org>2020-07-25 14:47:26 +0200
commit28ca04dc7e0c213e2ff3629dbb98a3ed32ab688e (patch)
treefd289d9929f63e5744527a41ef62b8bcf02233ad /src/lib/netlist/solver
parent89687cc1a4801f3cd439810b1ee769a51b724de2 (diff)
netlist: sub solvers now have their own parameter set.
* Example: PARAM(Solver.Solver_0.METHOD, "GMRES") * Will use the GMRES solver instead of the default MAT_CR solver. * Same applies to all Solver parameters. * Please use with care. If you change your netlist (e.g. using frontiers) the allocation of nets to solvers and the number of solvers may change. Thus this type of tweaking should only be used after the netlist completely works.
Diffstat (limited to 'src/lib/netlist/solver')
-rw-r--r--src/lib/netlist/solver/nld_matrix_solver.cpp3
-rw-r--r--src/lib/netlist/solver/nld_matrix_solver.h86
-rw-r--r--src/lib/netlist/solver/nld_matrix_solver_ext.h2
-rw-r--r--src/lib/netlist/solver/nld_ms_direct.h4
-rw-r--r--src/lib/netlist/solver/nld_ms_direct1.h2
-rw-r--r--src/lib/netlist/solver/nld_ms_direct2.h2
-rw-r--r--src/lib/netlist/solver/nld_ms_gcr.h2
-rw-r--r--src/lib/netlist/solver/nld_ms_gmres.h2
-rw-r--r--src/lib/netlist/solver/nld_solver.cpp80
-rw-r--r--src/lib/netlist/solver/nld_solver.h17
10 files changed, 122 insertions, 78 deletions
diff --git a/src/lib/netlist/solver/nld_matrix_solver.cpp b/src/lib/netlist/solver/nld_matrix_solver.cpp
index 038d914df5a..b518e92918d 100644
--- a/src/lib/netlist/solver/nld_matrix_solver.cpp
+++ b/src/lib/netlist/solver/nld_matrix_solver.cpp
@@ -40,7 +40,7 @@ namespace solver
matrix_solver_t::matrix_solver_t(devices::nld_solver &main_solver, const pstring &name,
const net_list_t &nets,
- const solver_parameters_t *params)
+ const solver::solver_parameters_t *params)
: device_t(static_cast<device_t &>(main_solver), name)
, m_params(*params)
, m_iterative_fail(*this, "m_iterative_fail", 0)
@@ -57,6 +57,7 @@ namespace solver
// now setup the matrix
setup_matrix();
+ //printf("Freq: %f\n", m_params.m_freq());
}
analog_net_t *matrix_solver_t::get_connected_net(terminal_t *term)
diff --git a/src/lib/netlist/solver/nld_matrix_solver.h b/src/lib/netlist/solver/nld_matrix_solver.h
index d17950eaa42..3d1a025d289 100644
--- a/src/lib/netlist/solver/nld_matrix_solver.h
+++ b/src/lib/netlist/solver/nld_matrix_solver.h
@@ -62,39 +62,78 @@ namespace solver
using static_compile_container = std::vector<std::pair<pstring, pstring>>;
+ struct solver_parameter_defaults
+ {
+ constexpr nl_fptype m_freq() { return nlconst::magic(48000.0); }
+
+ // iteration parameters
+ constexpr nl_fptype m_gs_sor() { return nlconst::magic(1.059); }
+ constexpr matrix_type_e m_method() { return matrix_type_e::MAT_CR; }
+ constexpr matrix_fp_type_e m_fp_type() { return matrix_fp_type_e::DOUBLE; }
+ constexpr nl_fptype m_reltol() { return nlconst::magic(1e-3); }
+ constexpr nl_fptype m_vntol() { return nlconst::magic(1e-7); }
+ constexpr nl_fptype m_accuracy() { return nlconst::magic(1e-7); }
+ constexpr std::size_t m_nr_loops() { return 250; }
+ constexpr std::size_t m_gs_loops() { return 9; }
+
+ // general parameters
+ constexpr nl_fptype m_gmin() { return nlconst::magic(1e-9); }
+ constexpr bool m_pivot() { return false; }
+ constexpr nl_fptype m_nr_recalc_delay(){ return netlist_time::quantum().as_fp<nl_fptype>(); }
+ constexpr std::size_t m_parallel() { return 0; }
+
+ constexpr nl_fptype m_min_ts_ts() { return nlconst::magic(1e-9); }
+ // automatic time step
+ constexpr bool m_dynamic_ts() { return false; }
+ constexpr nl_fptype m_dynamic_lte() { return nlconst::magic(1e-5); }
+ constexpr nl_fptype m_dynamic_min_ts() { return nlconst::magic(1e-6); }
+
+ // matrix sorting
+ constexpr matrix_sort_type_e m_sort_type() { return matrix_sort_type_e::PREFER_IDENTITY_TOP_LEFT; }
+
+ // special
+ constexpr bool m_use_gabs() { return true; }
+
+ static solver_parameter_defaults &get_instance()
+ {
+ static solver_parameter_defaults s;
+ return s;
+ }
+ };
+
struct solver_parameters_t
{
- solver_parameters_t(device_t &parent)
- : m_freq(parent, "FREQ", nlconst::magic(48000.0))
+ template <typename D>
+ solver_parameters_t(device_t &parent, const pstring &prefix, D &defaults)
+ : m_freq(parent, prefix + "FREQ", defaults.m_freq())
// iteration parameters
- , m_gs_sor(parent, "SOR_FACTOR", nlconst::magic(1.059))
- , m_method(parent, "METHOD", matrix_type_e::MAT_CR)
- , m_fp_type(parent, "FPTYPE", matrix_fp_type_e::DOUBLE)
- , m_reltol(parent, "RELTOL", nlconst::magic(1e-3)) ///< SPICE RELTOL parameter
- , m_vntol(parent, "VNTOL", nlconst::magic(1e-7)) ///< SPICE VNTOL parameter
- , m_accuracy(parent, "ACCURACY", nlconst::magic(1e-7)) ///< Iterative solver accuracy
- , m_nr_loops(parent, "NR_LOOPS", 250) ///< Maximum number of Newton-Raphson loops
- , m_gs_loops(parent, "GS_LOOPS", 9) ///< Maximum number of Gauss-Seidel loops
+ , m_gs_sor(parent, prefix + "SOR_FACTOR", defaults.m_gs_sor())
+ , m_method(parent, prefix + "METHOD", defaults.m_method())
+ , m_fp_type(parent, prefix + "FPTYPE", defaults.m_fp_type())
+ , m_reltol(parent, prefix + "RELTOL", defaults.m_reltol()) ///< SPICE RELTOL parameter
+ , m_vntol(parent, prefix + "VNTOL", defaults.m_vntol()) ///< SPICE VNTOL parameter
+ , m_accuracy(parent, prefix + "ACCURACY", defaults.m_accuracy()) ///< Iterative solver accuracy
+ , m_nr_loops(parent, prefix + "NR_LOOPS", defaults.m_nr_loops()) ///< Maximum number of Newton-Raphson loops
+ , m_gs_loops(parent, prefix + "GS_LOOPS", defaults.m_gs_loops()) ///< Maximum number of Gauss-Seidel loops
// general parameters
- , m_gmin(parent, "GMIN", nlconst::magic(1e-9))
- , m_pivot(parent, "PIVOT", false) ///< use pivoting on supported solvers
- , m_nr_recalc_delay(parent, "NR_RECALC_DELAY",
- netlist_time::quantum().as_fp<nl_fptype>()) ///< Delay to next solve attempt if nr loops exceeded
- , m_parallel(parent, "PARALLEL", 0)
+ , m_gmin(parent, prefix + "GMIN", defaults.m_gmin())
+ , m_pivot(parent, prefix + "PIVOT", defaults.m_pivot()) ///< use pivoting on supported solvers
+ , m_nr_recalc_delay(parent, prefix + "NR_RECALC_DELAY", defaults.m_nr_recalc_delay()) ///< Delay to next solve attempt if nr loops exceeded
+ , m_parallel(parent, prefix + "PARALLEL", defaults.m_parallel())
+ , m_min_ts_ts(parent, prefix + "MIN_TS_TS", defaults.m_min_ts_ts()) ///< The minimum time step for solvers with time stepping devices.
- , m_min_ts_ts(parent, "MIN_TS_TS", nlconst::magic(1e-9)) ///< The minimum times step for solvers with time stepping devices.
// automatic time step
- , m_dynamic_ts(parent, "DYNAMIC_TS", false) ///< Use dynamic time stepping
- , m_dynamic_lte(parent, "DYNAMIC_LTE", nlconst::magic(1e-5)) ///< dynamic time stepping slope
- , m_dynamic_min_ts(parent, "DYNAMIC_MIN_TIMESTEP", nlconst::magic(1e-6)) ///< smallest time step allowed
+ , m_dynamic_ts(parent, prefix + "DYNAMIC_TS", defaults.m_dynamic_ts()) ///< Use dynamic time stepping
+ , m_dynamic_lte(parent, prefix + "DYNAMIC_LTE", defaults.m_dynamic_lte()) ///< dynamic time stepping slope
+ , m_dynamic_min_ts(parent, prefix + "DYNAMIC_MIN_TIMESTEP", defaults.m_dynamic_min_ts()) ///< smallest time step allowed
// matrix sorting
- , m_sort_type(parent, "SORT_TYPE", matrix_sort_type_e::PREFER_IDENTITY_TOP_LEFT)
+ , m_sort_type(parent, prefix + "SORT_TYPE", defaults.m_sort_type())
// special
- , m_use_gabs(parent, "USE_GABS", true)
+ , m_use_gabs(parent, prefix + "USE_GABS", defaults.m_use_gabs())
{
m_min_timestep = m_dynamic_min_ts();
@@ -291,13 +330,13 @@ namespace solver
return max_rail;
}
+ const solver_parameters_t &m_params;
+
plib::pmatrix2d_vrl<fptype, arena_type> m_gonn;
plib::pmatrix2d_vrl<fptype, arena_type> m_gtn;
plib::pmatrix2d_vrl<fptype, arena_type> m_Idrn;
plib::pmatrix2d_vrl<fptype *, arena_type> m_connected_net_Vn;
- const solver_parameters_t &m_params;
-
state_var<std::size_t> m_iterative_fail;
state_var<std::size_t> m_iterative_total;
@@ -344,7 +383,6 @@ namespace solver
std::size_t m_ops;
plib::aligned_vector<terms_for_net_t> m_rails_temp; // setup only
-
};
} // namespace solver
diff --git a/src/lib/netlist/solver/nld_matrix_solver_ext.h b/src/lib/netlist/solver/nld_matrix_solver_ext.h
index 577abbb7fd6..d308f1cf7c1 100644
--- a/src/lib/netlist/solver/nld_matrix_solver_ext.h
+++ b/src/lib/netlist/solver/nld_matrix_solver_ext.h
@@ -26,7 +26,7 @@ namespace solver
matrix_solver_ext_t(devices::nld_solver &main_solver, const pstring &name,
const net_list_t &nets,
- const solver_parameters_t *params, const std::size_t size)
+ const solver::solver_parameters_t *params, const std::size_t size)
: matrix_solver_t(main_solver, name, nets, params)
, m_new_V(size)
, m_RHS(size)
diff --git a/src/lib/netlist/solver/nld_ms_direct.h b/src/lib/netlist/solver/nld_ms_direct.h
index 584469fae1f..64f906b75ab 100644
--- a/src/lib/netlist/solver/nld_ms_direct.h
+++ b/src/lib/netlist/solver/nld_ms_direct.h
@@ -31,7 +31,7 @@ namespace solver
matrix_solver_direct_t(devices::nld_solver &main_solver, const pstring &name,
const matrix_solver_t::net_list_t &nets,
- const solver_parameters_t *params, std::size_t size);
+ const solver::solver_parameters_t *params, std::size_t size);
void reset() override { matrix_solver_t::reset(); }
@@ -190,7 +190,7 @@ namespace solver
template <typename FT, int SIZE>
matrix_solver_direct_t<FT, SIZE>::matrix_solver_direct_t(devices::nld_solver &main_solver, const pstring &name,
const matrix_solver_t::net_list_t &nets,
- const solver_parameters_t *params,
+ const solver::solver_parameters_t *params,
std::size_t size)
: matrix_solver_ext_t<FT, SIZE>(main_solver, name, nets, params, size)
, m_pitch(m_pitch_ABS ? m_pitch_ABS : (((size + 0) + 7) / 8) * 8)
diff --git a/src/lib/netlist/solver/nld_ms_direct1.h b/src/lib/netlist/solver/nld_ms_direct1.h
index c44b4cdde1d..497ad09517f 100644
--- a/src/lib/netlist/solver/nld_ms_direct1.h
+++ b/src/lib/netlist/solver/nld_ms_direct1.h
@@ -26,7 +26,7 @@ namespace solver
matrix_solver_direct1_t(devices::nld_solver &main_solver, const pstring &name,
const matrix_solver_t::net_list_t &nets,
- const solver_parameters_t *params)
+ const solver::solver_parameters_t *params)
: matrix_solver_direct_t<FT, 1>(main_solver, name, nets, params, 1)
{}
diff --git a/src/lib/netlist/solver/nld_ms_direct2.h b/src/lib/netlist/solver/nld_ms_direct2.h
index c54630b764c..db81da8f770 100644
--- a/src/lib/netlist/solver/nld_ms_direct2.h
+++ b/src/lib/netlist/solver/nld_ms_direct2.h
@@ -30,7 +30,7 @@ namespace solver
matrix_solver_direct2_t(devices::nld_solver &main_solver, const pstring &name,
const matrix_solver_t::net_list_t &nets,
- const solver_parameters_t *params)
+ const solver::solver_parameters_t *params)
: matrix_solver_direct_t<FT, 2>(main_solver, name, nets, params, 2)
{}
void vsolve_non_dynamic() override
diff --git a/src/lib/netlist/solver/nld_ms_gcr.h b/src/lib/netlist/solver/nld_ms_gcr.h
index 0df5b3b46ba..53bf9208649 100644
--- a/src/lib/netlist/solver/nld_ms_gcr.h
+++ b/src/lib/netlist/solver/nld_ms_gcr.h
@@ -37,7 +37,7 @@ namespace solver
matrix_solver_GCR_t(devices::nld_solver &main_solver, const pstring &name,
const matrix_solver_t::net_list_t &nets,
- const solver_parameters_t *params, const std::size_t size)
+ const solver::solver_parameters_t *params, const std::size_t size)
: matrix_solver_ext_t<FT, SIZE>(main_solver, name, nets, params, size)
, mat(static_cast<typename mat_type::index_type>(size))
, m_proc()
diff --git a/src/lib/netlist/solver/nld_ms_gmres.h b/src/lib/netlist/solver/nld_ms_gmres.h
index 2783d96a5c7..c702d2e3ba6 100644
--- a/src/lib/netlist/solver/nld_ms_gmres.h
+++ b/src/lib/netlist/solver/nld_ms_gmres.h
@@ -36,7 +36,7 @@ namespace solver
matrix_solver_GMRES_t(devices::nld_solver &main_solver, const pstring &name,
matrix_solver_t::net_list_t &nets,
- const solver_parameters_t *params,
+ const solver::solver_parameters_t *params,
const std::size_t size)
: matrix_solver_direct_t<FT, SIZE>(main_solver, name, nets, params, size)
, m_ops(size, 0)
diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp
index 87884e480c0..f429dc66843 100644
--- a/src/lib/netlist/solver/nld_solver.cpp
+++ b/src/lib/netlist/solver/nld_solver.cpp
@@ -177,43 +177,43 @@ namespace devices
template <class C>
NETLIB_NAME(solver)::solver_ptr create_it(NETLIB_NAME(solver) &main_solver, pstring name,
NETLIB_NAME(solver)::net_list_t &nets,
- solver::solver_parameters_t &params, std::size_t size)
+ const solver::solver_parameters_t *params, std::size_t size)
{
- return plib::make_unique<C, device_arena>(main_solver, name, nets, &params, size);
+ return plib::make_unique<C, device_arena>(main_solver, name, nets, params, size);
}
template <typename FT, int SIZE>
NETLIB_NAME(solver)::solver_ptr NETLIB_NAME(solver)::create_solver(std::size_t size,
- const pstring &solvername,
+ const pstring &solvername, const solver::solver_parameters_t *params,
NETLIB_NAME(solver)::net_list_t &nets)
{
- switch (m_params.m_method())
+ switch (params->m_method())
{
case solver::matrix_type_e::MAT_CR:
- return create_it<solver::matrix_solver_GCR_t<FT, SIZE>>(*this, solvername, nets, m_params, size);
+ return create_it<solver::matrix_solver_GCR_t<FT, SIZE>>(*this, solvername, nets, params, size);
case solver::matrix_type_e::MAT:
- return create_it<solver::matrix_solver_direct_t<FT, SIZE>>(*this, solvername, nets, m_params, size);
+ return create_it<solver::matrix_solver_direct_t<FT, SIZE>>(*this, solvername, nets, params, size);
case solver::matrix_type_e::GMRES:
- return create_it<solver::matrix_solver_GMRES_t<FT, SIZE>>(*this, solvername, nets, m_params, size);
+ return create_it<solver::matrix_solver_GMRES_t<FT, SIZE>>(*this, solvername, nets, params, size);
#if (NL_USE_ACADEMIC_SOLVERS)
case solver::matrix_type_e::SOR:
- return create_it<solver::matrix_solver_SOR_t<FT, SIZE>>(*this, solvername, nets, m_params, size);
+ return create_it<solver::matrix_solver_SOR_t<FT, SIZE>>(*this, solvername, nets, params, size);
case solver::matrix_type_e::SOR_MAT:
- return create_it<solver::matrix_solver_SOR_mat_t<FT, SIZE>>(*this, solvername, nets, m_params, size);
+ return create_it<solver::matrix_solver_SOR_mat_t<FT, SIZE>>(*this, solvername, nets, params, size);
case solver::matrix_type_e::SM:
// Sherman-Morrison Formula
- return create_it<solver::matrix_solver_sm_t<FT, SIZE>>(*this, solvername, nets, m_params, size);
+ return create_it<solver::matrix_solver_sm_t<FT, SIZE>>(*this, solvername, nets, params, size);
case solver::matrix_type_e::W:
// Woodbury Formula
- return create_it<solver::matrix_solver_w_t<FT, SIZE>>(*this, solvername, nets, m_params, size);
+ return create_it<solver::matrix_solver_w_t<FT, SIZE>>(*this, solvername, nets, params, size);
#else
//case solver::matrix_type_e::GMRES:
case solver::matrix_type_e::SOR:
case solver::matrix_type_e::SOR_MAT:
case solver::matrix_type_e::SM:
case solver::matrix_type_e::W:
- state().log().warning(MW_SOLVER_METHOD_NOT_SUPPORTED(m_params.m_method().name(), "MAT_CR"));
- return create_it<solver::matrix_solver_GCR_t<FT, SIZE>>(*this, solvername, nets, m_params, size);
+ state().log().warning(MW_SOLVER_METHOD_NOT_SUPPORTED(params->m_method().name(), "MAT_CR"));
+ return create_it<solver::matrix_solver_GCR_t<FT, SIZE>>(*this, solvername, nets, params, size);
#endif
}
return solver_ptr();
@@ -221,57 +221,55 @@ namespace devices
template <typename FT>
NETLIB_NAME(solver)::solver_ptr NETLIB_NAME(solver)::create_solvers(
- const pstring &sname,
+ const pstring &sname, const solver::solver_parameters_t *params,
net_list_t &nets)
{
std::size_t net_count = nets.size();
switch (net_count)
{
case 1:
- return plib::make_unique<solver::matrix_solver_direct1_t<FT>, device_arena>(*this, sname, nets, &m_params);
- //return state().make_pool_object<solver::matrix_solver_direct1_t<FT>>(state(), sname, nets, &m_params);
+ return plib::make_unique<solver::matrix_solver_direct1_t<FT>, device_arena>(*this, sname, nets, params);
case 2:
- return plib::make_unique<solver::matrix_solver_direct2_t<FT>, device_arena>(*this, sname, nets, &m_params);
- //return state().make_pool_object<solver::matrix_solver_direct2_t<FT>>(state(), sname, nets, &m_params);
+ return plib::make_unique<solver::matrix_solver_direct2_t<FT>, device_arena>(*this, sname, nets, params);
case 3:
- return create_solver<FT, 3>(3, sname, nets);
+ return create_solver<FT, 3>(3, sname, params, nets);
case 4:
- return create_solver<FT, 4>(4, sname, nets);
+ return create_solver<FT, 4>(4, sname, params, nets);
case 5:
- return create_solver<FT, 5>(5, sname, nets);
+ return create_solver<FT, 5>(5, sname, params, nets);
case 6:
- return create_solver<FT, 6>(6, sname, nets);
+ return create_solver<FT, 6>(6, sname, params, nets);
case 7:
- return create_solver<FT, 7>(7, sname, nets);
+ return create_solver<FT, 7>(7, sname, params, nets);
case 8:
- return create_solver<FT, 8>(8, sname, nets);
+ return create_solver<FT, 8>(8, sname, params, nets);
default:
log().info(MI_NO_SPECIFIC_SOLVER(net_count));
if (net_count <= 16)
{
- return create_solver<FT, -16>(net_count, sname, nets);
+ return create_solver<FT, -16>(net_count, sname, params, nets);
}
if (net_count <= 32)
{
- return create_solver<FT, -32>(net_count, sname, nets);
+ return create_solver<FT, -32>(net_count, sname, params, nets);
}
if (net_count <= 64)
{
- return create_solver<FT, -64>(net_count, sname, nets);
+ return create_solver<FT, -64>(net_count, sname, params, nets);
}
if (net_count <= 128)
{
- return create_solver<FT, -128>(net_count, sname, nets);
+ return create_solver<FT, -128>(net_count, sname, params, nets);
}
if (net_count <= 256)
{
- return create_solver<FT, -256>(net_count, sname, nets);
+ return create_solver<FT, -256>(net_count, sname, params, nets);
}
if (net_count <= 512)
{
- return create_solver<FT, -512>(net_count, sname, nets);
+ return create_solver<FT, -512>(net_count, sname, params, nets);
}
- return create_solver<FT, 0>(net_count, sname, nets);
+ return create_solver<FT, 0>(net_count, sname, params, nets);
}
}
@@ -387,28 +385,29 @@ namespace devices
{
solver_ptr ms;
pstring sname = plib::pfmt("Solver_{1}")(m_mat_solvers.size());
+ params_uptr params = plib::make_unique<solver::solver_parameters_t, solver_arena>(*this, sname + ".", m_params);
- switch (m_params.m_fp_type())
+ switch (params->m_fp_type())
{
case solver::matrix_fp_type_e::FLOAT:
if (!config::use_float_matrix())
- log().info("FPTYPE {1} not supported. Using DOUBLE", m_params.m_fp_type().name());
- ms = create_solvers<std::conditional_t<config::use_float_matrix::value, float, double>>(sname, grp);
+ log().info("FPTYPE {1} not supported. Using DOUBLE", params->m_fp_type().name());
+ ms = create_solvers<std::conditional_t<config::use_float_matrix::value, float, double>>(sname, params.get(), grp);
break;
case solver::matrix_fp_type_e::DOUBLE:
- ms = create_solvers<double>(sname, grp);
+ ms = create_solvers<double>(sname, params.get(), grp);
break;
case solver::matrix_fp_type_e::LONGDOUBLE:
if (!config::use_long_double_matrix())
- log().info("FPTYPE {1} not supported. Using DOUBLE", m_params.m_fp_type().name());
- ms = create_solvers<std::conditional_t<config::use_long_double_matrix::value, long double, double>>(sname, grp);
+ log().info("FPTYPE {1} not supported. Using DOUBLE", params->m_fp_type().name());
+ ms = create_solvers<std::conditional_t<config::use_long_double_matrix::value, long double, double>>(sname, params.get(), grp);
break;
case solver::matrix_fp_type_e::FLOATQ128:
#if (NL_USE_FLOAT128)
- ms = create_solvers<FLOAT128>(sname, grp);
+ ms = create_solvers<FLOAT128>(sname, params.get(), grp);
#else
- log().info("FPTYPE {1} not supported. Using DOUBLE", m_params.m_fp_type().name());
- ms = create_solvers<double>(sname, grp);
+ log().info("FPTYPE {1} not supported. Using DOUBLE", params->m_fp_type().name());
+ ms = create_solvers<double>(sname, params.get(), grp);
#endif
break;
}
@@ -426,6 +425,7 @@ namespace devices
}
}
+ m_mat_params.push_back(std::move(params));
m_mat_solvers.push_back(std::move(ms));
}
diff --git a/src/lib/netlist/solver/nld_solver.h b/src/lib/netlist/solver/nld_solver.h
index 269be1cd5ff..f742132b862 100644
--- a/src/lib/netlist/solver/nld_solver.h
+++ b/src/lib/netlist/solver/nld_solver.h
@@ -28,11 +28,12 @@ namespace devices
{
public:
using queue_type = detail::queue_base<solver::matrix_solver_t, false>;
+ using solver_arena = device_arena;
NETLIB_CONSTRUCTOR(solver)
, m_fb_step(*this, "FB_step", NETLIB_DELEGATE(fb_step<false>))
, m_Q_step(*this, "Q_step")
- , m_params(*this)
+ , m_params(*this, "", solver::solver_parameter_defaults::get_instance())
, m_queue(config::MAX_SOLVER_QUEUE_SIZE::value,
queue_type::id_delegate(&NETLIB_NAME(solver) :: get_solver_id, this),
queue_type::obj_delegate(&NETLIB_NAME(solver) :: solver_by_id, this))
@@ -53,13 +54,15 @@ namespace devices
NETLIB_RESETI();
// NETLIB_UPDATE_PARAMI();
- using solver_ptr = device_arena::unique_ptr<solver::matrix_solver_t>;
- //using solver_ptr = host_arena::unique_ptr<solver::matrix_solver_t>;
+ 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:
+ using params_uptr = solver_arena::unique_ptr<solver::solver_parameters_t>;
+
template<bool KEEP_STATS>
NETLIB_HANDLERI(fb_step);
@@ -67,17 +70,19 @@ namespace devices
logic_output_t m_Q_step;
// FIXME: these should be created in device space
+ std::vector<params_uptr> m_mat_params;
std::vector<solver_ptr> m_mat_solvers;
solver::solver_parameters_t m_params;
queue_type m_queue;
template <typename FT, int SIZE>
- solver_ptr create_solver(std::size_t size,
- const pstring &solvername, net_list_t &nets);
+ solver_ptr create_solver(std::size_t size, const pstring &solvername,
+ const solver::solver_parameters_t *params,net_list_t &nets);
template <typename FT>
- solver_ptr create_solvers(const pstring &sname, net_list_t &nets);
+ 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;