diff options
-rw-r--r-- | src/lib/netlist/nl_setup.cpp | 27 | ||||
-rw-r--r-- | src/lib/netlist/solver/nld_matrix_solver.cpp | 3 | ||||
-rw-r--r-- | src/lib/netlist/solver/nld_matrix_solver.h | 86 | ||||
-rw-r--r-- | src/lib/netlist/solver/nld_matrix_solver_ext.h | 2 | ||||
-rw-r--r-- | src/lib/netlist/solver/nld_ms_direct.h | 4 | ||||
-rw-r--r-- | src/lib/netlist/solver/nld_ms_direct1.h | 2 | ||||
-rw-r--r-- | src/lib/netlist/solver/nld_ms_direct2.h | 2 | ||||
-rw-r--r-- | src/lib/netlist/solver/nld_ms_gcr.h | 2 | ||||
-rw-r--r-- | src/lib/netlist/solver/nld_ms_gmres.h | 2 | ||||
-rw-r--r-- | src/lib/netlist/solver/nld_solver.cpp | 80 | ||||
-rw-r--r-- | src/lib/netlist/solver/nld_solver.h | 17 | ||||
-rw-r--r-- | src/mame/audio/nl_kidniki.cpp | 8 |
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 ¶ms, 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, ¶ms, 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 |