diff options
author | 2020-04-19 16:08:43 +0200 | |
---|---|---|
committer | 2020-04-19 16:08:43 +0200 | |
commit | 0054862e3c69a23d24387977deb7094c0d79db82 (patch) | |
tree | e919fdd439412dea38a16398284ce6a8a77a1c41 | |
parent | 9b92159790f12176b33b50f40713eb51b4e655b2 (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.lua | 1 | ||||
-rw-r--r-- | src/lib/netlist/nl_base.h | 11 | ||||
-rw-r--r-- | src/lib/netlist/nl_config.h | 17 | ||||
-rw-r--r-- | src/lib/netlist/nl_errstr.h | 1 | ||||
-rw-r--r-- | src/lib/netlist/solver/nld_matrix_solver.cpp | 6 | ||||
-rw-r--r-- | src/lib/netlist/solver/nld_matrix_solver.h | 4 | ||||
-rw-r--r-- | src/lib/netlist/solver/nld_solver.cpp | 18 |
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>(); } |