summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/lib/netlist/nl_setup.cpp27
-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
-rw-r--r--src/mame/audio/nl_kidniki.cpp8
12 files changed, 143 insertions, 92 deletions
diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp
index 956504d3b27..e6424649149 100644
--- a/src/lib/netlist/nl_setup.cpp
+++ b/src/lib/netlist/nl_setup.cpp
@@ -1553,16 +1553,6 @@ void setup_t::prepare_to_run()
}
int errcnt(0);
- log().debug("Looking for unknown parameters ...\n");
- for (auto &p : m_abstract.m_param_values)
- {
- auto f = m_params.find(p.first);
- if (f == m_params.end())
- {
- log().error(ME_UNKNOWN_PARAMETER(p.first));
- errcnt++;
- }
- }
const bool use_deactivate = m_netlist_params->m_use_deactivate();
@@ -1627,6 +1617,23 @@ void setup_t::prepare_to_run()
else
solver->post_start();
+ errcnt = 0;
+ log().debug("Looking for unknown parameters ...\n");
+ for (auto &p : m_abstract.m_param_values)
+ {
+ auto f = m_params.find(p.first);
+ if (f == m_params.end())
+ {
+ log().error(ME_UNKNOWN_PARAMETER(p.first));
+ errcnt++;
+ }
+ }
+ if (errcnt > 0)
+ {
+ log().fatal(MF_ERRORS_FOUND(errcnt));
+ throw nl_exception(MF_ERRORS_FOUND(errcnt));
+ }
+
for (auto &n : m_nlstate.nets())
for (auto & term : n->core_terms())
if (!term->delegate().is_set())
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;
diff --git a/src/mame/audio/nl_kidniki.cpp b/src/mame/audio/nl_kidniki.cpp
index 4eb328692c1..e95803a2263 100644
--- a/src/mame/audio/nl_kidniki.cpp
+++ b/src/mame/audio/nl_kidniki.cpp
@@ -359,15 +359,15 @@ NETLIST_START(kidniki)
#if (1 || USE_FRONTIERS)
SOLVER(Solver, 48000)
- PARAM(Solver.ACCURACY, 1e-6)
+ PARAM(Solver.ACCURACY, 1e-7)
PARAM(Solver.NR_LOOPS, 300)
- PARAM(Solver.GS_LOOPS, 100)
+ PARAM(Solver.GS_LOOPS, 10)
//PARAM(Solver.METHOD, "SOR")
PARAM(Solver.METHOD, "MAT_CR")
PARAM(Solver.FPTYPE, "DOUBLE")
//PARAM(Solver.METHOD, "MAT")
//PARAM(Solver.PIVOT, 1)
- //PARAM(Solver.METHOD, "GMRES")
+ //PARAM(Solver.Solver_0.METHOD, "GMRES")
PARAM(Solver.SOR_FACTOR, 1.313)
PARAM(Solver.DYNAMIC_TS, 0)
PARAM(Solver.DYNAMIC_LTE, 5e-4)
@@ -385,7 +385,7 @@ NETLIST_START(kidniki)
#endif
#if (USE_FRONTIERS)
- PARAM(Solver.PARALLEL, 3) // More does not help
+ PARAM(Solver.PARALLEL, 2) // More does not help
#else
PARAM(Solver.PARALLEL, 0)
#endif