diff options
| -rw-r--r-- | nl_examples/congo_bongo.c | 1 | ||||
| -rw-r--r-- | nl_examples/kidniki.c | 1 | ||||
| -rw-r--r-- | nl_examples/norton_opamp.c | 1 | ||||
| -rw-r--r-- | nl_examples/opamp.c | 1 | ||||
| -rw-r--r-- | src/lib/netlist/solver/nld_solver.cpp | 95 | ||||
| -rw-r--r-- | src/lib/netlist/solver/nld_solver.h | 2 | ||||
| -rw-r--r-- | src/mame/audio/nl_kidniki.cpp | 1 | ||||
| -rw-r--r-- | src/mame/audio/nl_mario.cpp | 1 | ||||
| -rw-r--r-- | src/mame/machine/nl_breakout.cpp | 2 |
9 files changed, 49 insertions, 56 deletions
diff --git a/nl_examples/congo_bongo.c b/nl_examples/congo_bongo.c index db94a5adea5..90cc884d0d9 100644 --- a/nl_examples/congo_bongo.c +++ b/nl_examples/congo_bongo.c @@ -46,7 +46,6 @@ NETLIST_START(dummy) PARAM(Solver.NR_LOOPS, 9000) PARAM(Solver.SOR_FACTOR, 0.001) PARAM(Solver.GS_LOOPS, 1) - //PARAM(Solver.GS_THRESHOLD, 99) PARAM(Solver.ITERATIVE, "MAT_CR") #if USE_OPTMIZATIONS diff --git a/nl_examples/kidniki.c b/nl_examples/kidniki.c index 6b2a5c66215..edcae2d58e2 100644 --- a/nl_examples/kidniki.c +++ b/nl_examples/kidniki.c @@ -13,7 +13,6 @@ NETLIST_START(dummy) PARAM(Solver.ACCURACY, 1e-8) PARAM(Solver.NR_LOOPS, 300) PARAM(Solver.GS_LOOPS, 1) - PARAM(Solver.GS_THRESHOLD, 6) //PARAM(Solver.ITERATIVE, "W") PARAM(Solver.ITERATIVE, "MAT_CR") //PARAM(Solver.ITERATIVE, "MAT") diff --git a/nl_examples/norton_opamp.c b/nl_examples/norton_opamp.c index b5d8665fcc7..8e077a91df2 100644 --- a/nl_examples/norton_opamp.c +++ b/nl_examples/norton_opamp.c @@ -18,7 +18,6 @@ NETLIST_START(main) PARAM(Solver.SOR_FACTOR, 1.0) //PARAM(Solver.CONVERG, 1.0) PARAM(Solver.GS_LOOPS, 5) - PARAM(Solver.GS_THRESHOLD, 5) SUBMODEL(op1, opamp_fast) /* Wired as non - inverting amplifier like in LM3900 datasheet */ diff --git a/nl_examples/opamp.c b/nl_examples/opamp.c index 40c04a5d4f2..7e62d405b01 100644 --- a/nl_examples/opamp.c +++ b/nl_examples/opamp.c @@ -18,7 +18,6 @@ NETLIST_START(main) PARAM(Solver.NR_LOOPS, 30000 ) //PARAM(Solver.CONVERG, 1.0) PARAM(Solver.GS_LOOPS, 30) - PARAM(Solver.GS_THRESHOLD, 99) // Tie up +5 to opamps thought it's not currently needed // Stay compatible diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp index 7b86a3e46e6..f8abf9faead 100644 --- a/src/lib/netlist/solver/nld_solver.cpp +++ b/src/lib/netlist/solver/nld_solver.cpp @@ -130,6 +130,13 @@ NETLIB_UPDATE(solver) } } +template <class C> +std::unique_ptr<matrix_solver_t> create_it(netlist_t &nl, pstring name, solver_parameters_t ¶ms, unsigned size) +{ + typedef C solver; + return plib::make_unique<solver>(nl, name, ¶ms, size); +} + template <int m_N, int storage_N> std::unique_ptr<matrix_solver_t> NETLIB_NAME(solver)::create_solver(unsigned size, const bool use_specific) { @@ -140,55 +147,48 @@ std::unique_ptr<matrix_solver_t> NETLIB_NAME(solver)::create_solver(unsigned siz return plib::make_unique<matrix_solver_direct2_t>(netlist(), solvername, &m_params); else { - if (static_cast<int>(size) >= m_gs_threshold()) + if (pstring("SOR_MAT").equals(m_iterative_solver())) { - if (pstring("SOR_MAT").equals(m_iterative_solver())) - { - typedef matrix_solver_SOR_mat_t<m_N,storage_N> solver_sor_mat; - return plib::make_unique<solver_sor_mat>(netlist(), solvername, &m_params, size); - } - else if (pstring("MAT_CR").equals(m_iterative_solver())) - { - typedef matrix_solver_GCR_t<m_N,storage_N> solver_mat; - return plib::make_unique<solver_mat>(netlist(), solvername, &m_params, size); - } - else if (pstring("MAT").equals(m_iterative_solver())) - { - typedef matrix_solver_direct_t<m_N,storage_N> solver_mat; - return plib::make_unique<solver_mat>(netlist(), solvername, &m_params, size); - } - else if (pstring("SM").equals(m_iterative_solver())) - { - /* Sherman-Morrison Formula */ - typedef matrix_solver_sm_t<m_N,storage_N> solver_mat; - return plib::make_unique<solver_mat>(netlist(), solvername, &m_params, size); - } - else if (pstring("W").equals(m_iterative_solver())) - { - /* Woodbury Formula */ - typedef matrix_solver_w_t<m_N,storage_N> solver_mat; - return plib::make_unique<solver_mat>(netlist(), solvername, &m_params, size); - } - else if (pstring("SOR").equals(m_iterative_solver())) - { - typedef matrix_solver_SOR_t<m_N,storage_N> solver_GS; - return plib::make_unique<solver_GS>(netlist(), solvername, &m_params, size); - } - else if (pstring("GMRES").equals(m_iterative_solver())) - { - typedef matrix_solver_GMRES_t<m_N,storage_N> solver_GMRES; - return plib::make_unique<solver_GMRES>(netlist(), solvername, &m_params, size); - } - else - { - netlist().log().fatal("Unknown solver type: {1}\n", m_iterative_solver()); - return nullptr; - } + return create_it<matrix_solver_SOR_mat_t<m_N, storage_N>>(netlist(), solvername, m_params, size); + //typedef matrix_solver_SOR_mat_t<m_N,storage_N> solver_sor_mat; + //return plib::make_unique<solver_sor_mat>(netlist(), solvername, &m_params, size); + } + else if (pstring("MAT_CR").equals(m_iterative_solver())) + { + typedef matrix_solver_GCR_t<m_N,storage_N> solver_mat; + return plib::make_unique<solver_mat>(netlist(), solvername, &m_params, size); + } + else if (pstring("MAT").equals(m_iterative_solver())) + { + typedef matrix_solver_direct_t<m_N,storage_N> solver_mat; + return plib::make_unique<solver_mat>(netlist(), solvername, &m_params, size); + } + else if (pstring("SM").equals(m_iterative_solver())) + { + /* Sherman-Morrison Formula */ + typedef matrix_solver_sm_t<m_N,storage_N> solver_mat; + return plib::make_unique<solver_mat>(netlist(), solvername, &m_params, size); + } + else if (pstring("W").equals(m_iterative_solver())) + { + /* Woodbury Formula */ + typedef matrix_solver_w_t<m_N,storage_N> solver_mat; + return plib::make_unique<solver_mat>(netlist(), solvername, &m_params, size); + } + else if (pstring("SOR").equals(m_iterative_solver())) + { + typedef matrix_solver_SOR_t<m_N,storage_N> solver_GS; + return plib::make_unique<solver_GS>(netlist(), solvername, &m_params, size); + } + else if (pstring("GMRES").equals(m_iterative_solver())) + { + typedef matrix_solver_GMRES_t<m_N,storage_N> solver_GMRES; + return plib::make_unique<solver_GMRES>(netlist(), solvername, &m_params, size); } else { - typedef matrix_solver_direct_t<m_N,storage_N> solver_D; - return plib::make_unique<solver_D>(netlist(), solvername, &m_params, size); + netlist().log().fatal("Unknown solver type: {1}\n", m_iterative_solver()); + return nullptr; } } } @@ -297,6 +297,7 @@ void NETLIB_NAME(solver)::post_start() switch (net_count) { +#if 1 case 1: ms = create_solver<1,1>(1, use_specific); break; @@ -344,6 +345,7 @@ void NETLIB_NAME(solver)::post_start() ms = create_solver<87,87>(87, use_specific); break; #endif +#endif default: netlist().log().warning("No specific solver found for netlist of size {1}", net_count); if (net_count <= 16) @@ -354,7 +356,8 @@ void NETLIB_NAME(solver)::post_start() { ms = create_solver<0,32>(net_count, use_specific); } - else if (net_count <= 64) + else + if (net_count <= 64) { ms = create_solver<0,64>(net_count, use_specific); } diff --git a/src/lib/netlist/solver/nld_solver.h b/src/lib/netlist/solver/nld_solver.h index 6fb7dad37ba..1d3b27bb1b6 100644 --- a/src/lib/netlist/solver/nld_solver.h +++ b/src/lib/netlist/solver/nld_solver.h @@ -49,7 +49,6 @@ NETLIB_OBJECT(solver) , m_sor(*this, "SOR_FACTOR", 1.059) , m_iterative_solver(*this, "ITERATIVE", "SOR") , m_accuracy(*this, "ACCURACY", 1e-7) - , m_gs_threshold(*this, "GS_THRESHOLD", 6) // below this value, gaussian elimination is used , m_gs_loops(*this, "GS_LOOPS",9) // Gauss-Seidel loops /* general parameters */ @@ -92,7 +91,6 @@ protected: param_double_t m_sor; param_str_t m_iterative_solver; param_double_t m_accuracy; - param_int_t m_gs_threshold; param_int_t m_gs_loops; param_double_t m_gmin; param_logic_t m_pivot; diff --git a/src/mame/audio/nl_kidniki.cpp b/src/mame/audio/nl_kidniki.cpp index c3003100a02..1c1d9a3df19 100644 --- a/src/mame/audio/nl_kidniki.cpp +++ b/src/mame/audio/nl_kidniki.cpp @@ -313,7 +313,6 @@ NETLIST_START(kidniki) PARAM(Solver.ACCURACY, 1e-8) PARAM(Solver.NR_LOOPS, 300) PARAM(Solver.GS_LOOPS, 1) - PARAM(Solver.GS_THRESHOLD, 6) //PARAM(Solver.ITERATIVE, "SOR") PARAM(Solver.ITERATIVE, "MAT_CR") //PARAM(Solver.ITERATIVE, "GMRES") diff --git a/src/mame/audio/nl_mario.cpp b/src/mame/audio/nl_mario.cpp index 1f6c2fb4ab6..6a7dab55359 100644 --- a/src/mame/audio/nl_mario.cpp +++ b/src/mame/audio/nl_mario.cpp @@ -220,7 +220,6 @@ NETLIST_START(mario) SOLVER(Solver, 48000) PARAM(Solver.ACCURACY, 1e-6) PARAM(Solver.SOR_FACTOR, 1.0) - PARAM(Solver.GS_THRESHOLD, 5) PARAM(Solver.GS_LOOPS, 1) /* Dynamic timestepping avoids excessive newton loops on startup */ PARAM(Solver.DYNAMIC_LTE, 5e-2) diff --git a/src/mame/machine/nl_breakout.cpp b/src/mame/machine/nl_breakout.cpp index c374c169593..e336c0f71a4 100644 --- a/src/mame/machine/nl_breakout.cpp +++ b/src/mame/machine/nl_breakout.cpp @@ -91,11 +91,9 @@ CIRCUIT_LAYOUT( breakout ) #if (SLOW_BUT_ACCURATE) SOLVER(Solver, 48000) PARAM(Solver.ACCURACY, 1e-8) // less accuracy and diode will not work - PARAM(Solver.GS_THRESHOLD, 6) #else SOLVER(Solver, 48000) PARAM(Solver.ACCURACY, 1e-6) - PARAM(Solver.GS_THRESHOLD, 6) PARAM(Solver.DYNAMIC_TS, 0) //PARAM(Solver.LTE, 1e-10) PARAM(Solver.MIN_TIMESTEP, 1e-8) |
