summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/netlist/solver/nld_solver.cpp95
-rw-r--r--src/lib/netlist/solver/nld_solver.h2
2 files changed, 49 insertions, 48 deletions
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 &params, unsigned size)
+{
+ typedef C solver;
+ return plib::make_unique<solver>(nl, name, &params, 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;