summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author couriersud <couriersud@gmx.org>2020-04-19 16:08:43 +0200
committer couriersud <couriersud@gmx.org>2020-04-19 16:08:43 +0200
commit0054862e3c69a23d24387977deb7094c0d79db82 (patch)
treee919fdd439412dea38a16398284ce6a8a77a1c41
parent9b92159790f12176b33b50f40713eb51b4e655b2 (diff)
netlist: compile time improvement and code maintenance. (nw)
Added a define NL_USE_ACADEMIC_SOLVERS and disabled it in the build. This will not compile in solvers which are either illustrative or only perform for large sparse matrices like GMRES.
-rw-r--r--scripts/src/netlist.lua1
-rw-r--r--src/lib/netlist/nl_base.h11
-rw-r--r--src/lib/netlist/nl_config.h17
-rw-r--r--src/lib/netlist/nl_errstr.h1
-rw-r--r--src/lib/netlist/solver/nld_matrix_solver.cpp6
-rw-r--r--src/lib/netlist/solver/nld_matrix_solver.h4
-rw-r--r--src/lib/netlist/solver/nld_solver.cpp18
7 files changed, 39 insertions, 19 deletions
diff --git a/scripts/src/netlist.lua b/scripts/src/netlist.lua
index fca5dc2a3ce..89ac13dffa8 100644
--- a/scripts/src/netlist.lua
+++ b/scripts/src/netlist.lua
@@ -28,6 +28,7 @@ project "netlist"
defines {
"__STDC_CONSTANT_MACROS",
+ "NL_USE_ACADEMIC_SOLVERS=0",
}
includedirs {
diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h
index 06b04bf10da..d5cb990006c 100644
--- a/src/lib/netlist/nl_base.h
+++ b/src/lib/netlist/nl_base.h
@@ -714,18 +714,15 @@ namespace netlist
void move_connections(net_t &dest_net);
std::vector<core_terminal_t *> &core_terms() noexcept { return m_core_terms; }
- #if NL_USE_COPY_INSTEAD_OF_REFERENCE
+
void update_inputs() noexcept
{
+#if NL_USE_COPY_INSTEAD_OF_REFERENCE
for (auto & term : m_core_terms)
term->m_Q = m_cur_Q;
+#endif
+ // nothing needs to be done if define not set
}
- #else
- void update_inputs() const noexcept
- {
- // nothing needs to be done
- }
- #endif
protected:
diff --git a/src/lib/netlist/nl_config.h b/src/lib/netlist/nl_config.h
index a6aa74381e4..e08065dd47e 100644
--- a/src/lib/netlist/nl_config.h
+++ b/src/lib/netlist/nl_config.h
@@ -17,7 +17,7 @@
///
/// \brief Version - Minor.
///
-#define NL_VERSION_MINOR 11
+#define NL_VERSION_MINOR 12
/// \brief Version - Patch level.
///
#define NL_VERSION_PATCHLEVEL 0
@@ -53,6 +53,21 @@
#define NL_USE_QUEUE_STATS (0)
#endif
+/// \brief Compile in academic solvers
+///
+/// Set to 0 to disable compiling in the following solvers:
+///
+/// Sherman-Morrison, Woodbury, SOR and GMRES
+///
+/// GMRES may be added to productive solvers in the future
+/// again. Compiling in all solvers may increase compile
+/// time significantly.
+///
+
+#ifndef NL_USE_ACADEMIC_SOLVERS
+#define NL_USE_ACADEMIC_SOLVERS (1)
+#endif
+
/// \brief Store input values in logic_terminal_t.
///
/// Set to 1 to store values in logic_terminal_t instead of
diff --git a/src/lib/netlist/nl_errstr.h b/src/lib/netlist/nl_errstr.h
index f0cd3233856..6202ca6f695 100644
--- a/src/lib/netlist/nl_errstr.h
+++ b/src/lib/netlist/nl_errstr.h
@@ -118,6 +118,7 @@ namespace netlist
// nld_solver.cpp
PERRMSGV(MI_NO_SPECIFIC_SOLVER, 1, "No specific solver found for netlist of size {1}")
+ PERRMSGV(MW_SOLVER_METHOD_NOT_SUPPORTED, 2, "Solver method {1} not supported. Falling back to {2}")
// nld_mm5837.cpp
diff --git a/src/lib/netlist/solver/nld_matrix_solver.cpp b/src/lib/netlist/solver/nld_matrix_solver.cpp
index c4881415a33..912ec0c059f 100644
--- a/src/lib/netlist/solver/nld_matrix_solver.cpp
+++ b/src/lib/netlist/solver/nld_matrix_solver.cpp
@@ -219,11 +219,11 @@ namespace solver
// rebuild
for (auto &term : m_terms)
{
- int *other = term.m_connected_net_idx.data();
+ //int *other = term.m_connected_net_idx.data();
for (std::size_t i = 0; i < term.count(); i++)
//FIXME: this is weird
- if (other[i] != -1)
- other[i] = get_net_idx(get_connected_net(term.terms()[i]));
+ if (term.m_connected_net_idx[i] != -1)
+ term.m_connected_net_idx[i] = get_net_idx(get_connected_net(term.terms()[i]));
}
}
diff --git a/src/lib/netlist/solver/nld_matrix_solver.h b/src/lib/netlist/solver/nld_matrix_solver.h
index 321136e0824..0db1cd6e7b9 100644
--- a/src/lib/netlist/solver/nld_matrix_solver.h
+++ b/src/lib/netlist/solver/nld_matrix_solver.h
@@ -250,8 +250,8 @@ namespace solver
state_var<std::size_t> m_stat_vsolver_calls;
state_var<netlist_time_ext> m_last_step;
- std::vector<nldelegate_ts> m_step_funcs;
- std::vector<nldelegate_dyn> m_dynamic_funcs;
+ plib::aligned_vector<nldelegate_ts> m_step_funcs;
+ plib::aligned_vector<nldelegate_dyn> m_dynamic_funcs;
logic_input_t m_fb_sync;
logic_output_t m_Q_sync;
diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp
index f0b6ea9503d..0489311a03d 100644
--- a/src/lib/netlist/solver/nld_solver.cpp
+++ b/src/lib/netlist/solver/nld_solver.cpp
@@ -121,20 +121,26 @@ namespace devices
{
case solver::matrix_type_e::MAT_CR:
return create_it<solver::matrix_solver_GCR_t<FT, SIZE>>(state(), solvername, nets, m_params, size);
- case solver::matrix_type_e::SOR_MAT:
- return create_it<solver::matrix_solver_SOR_mat_t<FT, SIZE>>(state(), solvername, nets, m_params, size);
case solver::matrix_type_e::MAT:
return create_it<solver::matrix_solver_direct_t<FT, SIZE>>(state(), solvername, nets, m_params, size);
+#if (NL_USE_ACADEMIC_SOLVERS)
+ case solver::matrix_type_e::GMRES:
+ return create_it<solver::matrix_solver_GMRES_t<FT, SIZE>>(state(), solvername, nets, m_params, size);
+ case solver::matrix_type_e::SOR:
+ return create_it<solver::matrix_solver_SOR_t<FT, SIZE>>(state(), solvername, nets, m_params, size);
+ case solver::matrix_type_e::SOR_MAT:
+ return create_it<solver::matrix_solver_SOR_mat_t<FT, SIZE>>(state(), solvername, nets, m_params, size);
case solver::matrix_type_e::SM:
// Sherman-Morrison Formula
return create_it<solver::matrix_solver_sm_t<FT, SIZE>>(state(), solvername, nets, m_params, size);
case solver::matrix_type_e::W:
// Woodbury Formula
return create_it<solver::matrix_solver_w_t<FT, SIZE>>(state(), solvername, nets, m_params, size);
- case solver::matrix_type_e::SOR:
- return create_it<solver::matrix_solver_SOR_t<FT, SIZE>>(state(), solvername, nets, m_params, size);
- case solver::matrix_type_e::GMRES:
- return create_it<solver::matrix_solver_GMRES_t<FT, SIZE>>(state(), solvername, nets, m_params, size);
+#else
+ default:
+ 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>>(state(), solvername, nets, m_params, size);
+#endif
}
return plib::unique_ptr<solver::matrix_solver_t>();
}