summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/netlist/solver/nld_solver.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/netlist/solver/nld_solver.c')
-rw-r--r--src/emu/netlist/solver/nld_solver.c62
1 files changed, 52 insertions, 10 deletions
diff --git a/src/emu/netlist/solver/nld_solver.c b/src/emu/netlist/solver/nld_solver.c
index ce3bb36826b..9aae218d3ff 100644
--- a/src/emu/netlist/solver/nld_solver.c
+++ b/src/emu/netlist/solver/nld_solver.c
@@ -17,7 +17,6 @@
#endif
-//#pragma GCC optimize "-ffast-math"
#if 0
#pragma GCC optimize "-ffast-math"
//#pragma GCC optimize "-ftree-parallelize-loops=4"
@@ -37,7 +36,11 @@
#include <iostream>
#include <algorithm>
#include "nld_solver.h"
+#if 1
#include "nld_ms_direct.h"
+#else
+#include "nld_ms_direct_lu.h"
+#endif
#include "nld_ms_direct1.h"
#include "nld_ms_direct2.h"
#include "nld_ms_sor.h"
@@ -302,11 +305,6 @@ ATTR_HOT nl_double matrix_solver_t::solve()
return next_time_step;
}
-
-// ----------------------------------------------------------------------------------------
-// matrix_solver - Direct base
-// ----------------------------------------------------------------------------------------
-
ATTR_COLD int matrix_solver_t::get_net_idx(net_t *net)
{
for (std::size_t k = 0; k < m_nets.size(); k++)
@@ -315,6 +313,25 @@ ATTR_COLD int matrix_solver_t::get_net_idx(net_t *net)
return -1;
}
+void matrix_solver_t::log_stats()
+{
+ if (this->m_stat_calculations != 0 && this->m_params.m_log_stats)
+ {
+ this->netlist().log("==============================================");
+ this->netlist().log("Solver %s", this->name().cstr());
+ this->netlist().log(" ==> %d nets", (unsigned) this->m_nets.size()); //, (*(*groups[i].first())->m_core_terms.first())->name().cstr());
+ this->netlist().log(" has %s elements", this->is_dynamic() ? "dynamic" : "no dynamic");
+ this->netlist().log(" has %s elements", this->is_timestep() ? "timestep" : "no timestep");
+ this->netlist().log(" %6.3f average newton raphson loops", (double) this->m_stat_newton_raphson / (double) this->m_stat_vsolver_calls);
+ this->netlist().log(" %10d invocations (%6d Hz) %10d gs fails (%6.2f%%) %6.3f average",
+ this->m_stat_calculations,
+ this->m_stat_calculations * 10 / (int) (this->netlist().time().as_double() * 10.0),
+ this->m_iterative_fail,
+ 100.0 * (double) this->m_iterative_fail / (double) this->m_stat_calculations,
+ (double) this->m_iterative_total / (double) this->m_stat_calculations);
+ }
+}
+
@@ -335,15 +352,21 @@ NETLIB_START(solver)
register_param("FREQ", m_freq, 48000.0);
- register_param("ITERATIVE", m_iterative_solver, "SOR");
+ /* iteration parameters */
+ register_param("SOR_FACTOR", m_sor, 1.059);
+ register_param("ITERATIVE", m_iterative_solver, "SOR");
register_param("ACCURACY", m_accuracy, 1e-7);
- register_param("GS_LOOPS", m_gs_loops, 9); // Gauss-Seidel loops
register_param("GS_THRESHOLD", m_gs_threshold, 6); // below this value, gaussian elimination is used
+ register_param("GS_LOOPS", m_gs_loops, 9); // Gauss-Seidel loops
+
+ /* general parameters */
+ register_param("GMIN", m_gmin, NETLIST_GMIN_DEFAULT);
+ register_param("PIVOT", m_pivot, 0); // use pivoting - on supported solvers
register_param("NR_LOOPS", m_nr_loops, 250); // Newton-Raphson loops
register_param("PARALLEL", m_parallel, 0);
- register_param("SOR_FACTOR", m_sor, 1.059);
- register_param("GMIN", m_gmin, NETLIST_GMIN_DEFAULT);
+
+ /* automatic time step */
register_param("DYNAMIC_TS", m_dynamic, 0);
register_param("LTE", m_lte, 5e-5); // diff/timestep
register_param("MIN_TIMESTEP", m_min_timestep, 1e-6); // nl_double timestep resolution
@@ -474,6 +497,7 @@ ATTR_COLD void NETLIB_NAME(solver)::post_start()
int cur_group = -1;
const bool use_specific = true;
+ m_params.m_pivot = m_pivot.Value();
m_params.m_accuracy = m_accuracy.Value();
m_params.m_gs_loops = m_gs_loops.Value();
m_params.m_nr_loops = m_nr_loops.Value();
@@ -551,13 +575,31 @@ ATTR_COLD void NETLIB_NAME(solver)::post_start()
case 8:
ms = create_solver<8,8>(8, use_specific);
break;
+ case 10:
+ ms = create_solver<10,10>(10, use_specific);
+ break;
+ case 11:
+ ms = create_solver<11,11>(11, use_specific);
+ break;
case 12:
ms = create_solver<12,12>(12, use_specific);
break;
+ case 15:
+ ms = create_solver<15,15>(15, use_specific);
+ break;
+ case 31:
+ ms = create_solver<31,31>(31, use_specific);
+ break;
+ case 49:
+ ms = create_solver<49,49>(49, use_specific);
+ break;
+#if 0
case 87:
ms = create_solver<87,87>(87, use_specific);
break;
+#endif
default:
+ netlist().warning("No specific solver found for netlist of size %d", (unsigned) net_count);
if (net_count <= 16)
{
ms = create_solver<0,16>(net_count, use_specific);