diff options
author | couriersud <couriersud@gmx.org> | 2020-07-25 14:43:54 +0200 |
---|---|---|
committer | couriersud <couriersud@gmx.org> | 2020-07-25 14:47:19 +0200 |
commit | 3a9ab286c6c03567ae037a192025d7dbd02e5099 (patch) | |
tree | 29cae6b6f6582f1490e8821f091dbe87f8e6a5b5 | |
parent | 94fe22aab1d1b9e3910947c1512c9bd8b86e2817 (diff) |
netlist: nld_matrix_solver is now owned by nld_solver.
-rw-r--r-- | src/lib/netlist/build/makefile | 4 | ||||
-rw-r--r-- | src/lib/netlist/solver/nld_matrix_solver.cpp | 13 | ||||
-rw-r--r-- | src/lib/netlist/solver/nld_matrix_solver.h | 4 | ||||
-rw-r--r-- | src/lib/netlist/solver/nld_matrix_solver_ext.h | 6 | ||||
-rw-r--r-- | src/lib/netlist/solver/nld_ms_direct.h | 6 | ||||
-rw-r--r-- | src/lib/netlist/solver/nld_ms_direct1.h | 4 | ||||
-rw-r--r-- | src/lib/netlist/solver/nld_ms_direct2.h | 4 | ||||
-rw-r--r-- | src/lib/netlist/solver/nld_ms_gcr.h | 18 | ||||
-rw-r--r-- | src/lib/netlist/solver/nld_ms_gmres.h | 4 | ||||
-rw-r--r-- | src/lib/netlist/solver/nld_ms_sm.h | 4 | ||||
-rw-r--r-- | src/lib/netlist/solver/nld_ms_sor.h | 4 | ||||
-rw-r--r-- | src/lib/netlist/solver/nld_ms_sor_mat.h | 4 | ||||
-rw-r--r-- | src/lib/netlist/solver/nld_ms_w.h | 4 | ||||
-rw-r--r-- | src/lib/netlist/solver/nld_solver.cpp | 24 |
14 files changed, 54 insertions, 49 deletions
diff --git a/src/lib/netlist/build/makefile b/src/lib/netlist/build/makefile index 8ab72f2d7f9..ce7060c4dea 100644 --- a/src/lib/netlist/build/makefile +++ b/src/lib/netlist/build/makefile @@ -92,7 +92,7 @@ DEPENDCC=$(CC) ifndef FAST -FAST=1 +FAST=0 endif ifeq ($(FAST),1) @@ -307,7 +307,7 @@ clang: -Wmissing-variable-declarations -Wno-float-equal -Wconversion \ -Wno-c++98-compat -Wno-c++98-compat-pedantic -Wformat-nonliteral \ -Wno-exit-time-destructors -Winconsistent-missing-destructor-override \ - -Wno-return-std-move-in-c++11 -Wunreachable-code" + -Wno-return-std-move-in-c++11 -Wno-unreachable-code" clang-libc: #clang-11 currently broken diff --git a/src/lib/netlist/solver/nld_matrix_solver.cpp b/src/lib/netlist/solver/nld_matrix_solver.cpp index 0bd175017d7..0b08f198f57 100644 --- a/src/lib/netlist/solver/nld_matrix_solver.cpp +++ b/src/lib/netlist/solver/nld_matrix_solver.cpp @@ -1,6 +1,7 @@ // license:GPL-2.0+ // copyright-holders:Couriersud +#include "nld_solver.h" #include "nld_matrix_solver.h" #include "core/setup.h" #include "nl_setup.h" @@ -37,13 +38,14 @@ namespace solver // matrix_solver // ---------------------------------------------------------------------------------------- - matrix_solver_t::matrix_solver_t(netlist_state_t &anetlist, const pstring &name, + matrix_solver_t::matrix_solver_t(devices::nld_solver &main_solver, const pstring &name, const net_list_t &nets, const solver_parameters_t *params) - : device_t(anetlist, name) + : device_t(static_cast<device_t &>(main_solver), name) , m_params(*params) , m_iterative_fail(*this, "m_iterative_fail", 0) , m_iterative_total(*this, "m_iterative_total", 0) + , m_main_solver(main_solver) , m_stat_calculations(*this, "m_stat_calculations", 0) , m_stat_newton_raphson(*this, "m_stat_newton_raphson", 0) , m_stat_newton_raphson_fail(*this, "m_stat_newton_raphson_fail", 0) @@ -53,12 +55,13 @@ namespace solver , m_Q_sync(*this, "Q_sync") , m_ops(0) { - if (!anetlist.setup().connect(m_fb_sync, m_Q_sync)) + if (!this->state().setup().connect(m_fb_sync, m_Q_sync)) { - log().fatal(MF_ERROR_CONNECTING_1_TO_2(m_fb_sync.name(), m_Q_sync.name())); + // FIXME: avoid clang warning for now + m_main_solver.state().log().fatal(MF_ERROR_CONNECTING_1_TO_2(m_fb_sync.name(), m_Q_sync.name())); throw nl_exception(MF_ERROR_CONNECTING_1_TO_2(m_fb_sync.name(), m_Q_sync.name())); } - setup_base(anetlist.setup(), nets); + setup_base(this->state().setup(), nets); // now setup the matrix setup_matrix(); diff --git a/src/lib/netlist/solver/nld_matrix_solver.h b/src/lib/netlist/solver/nld_matrix_solver.h index f8c454b2b5c..fb63648673e 100644 --- a/src/lib/netlist/solver/nld_matrix_solver.h +++ b/src/lib/netlist/solver/nld_matrix_solver.h @@ -278,7 +278,7 @@ namespace solver constexpr std::size_t ops() const { return m_ops; } protected: - matrix_solver_t(netlist_state_t &anetlist, const pstring &name, + matrix_solver_t(devices::nld_solver &main_solver, const pstring &name, const net_list_t &nets, const solver_parameters_t *params); @@ -327,6 +327,8 @@ namespace solver analog_net_t *get_connected_net(terminal_t *term); + devices::nld_solver &m_main_solver; + state_var<std::size_t> m_stat_calculations; state_var<std::size_t> m_stat_newton_raphson; state_var<std::size_t> m_stat_newton_raphson_fail; diff --git a/src/lib/netlist/solver/nld_matrix_solver_ext.h b/src/lib/netlist/solver/nld_matrix_solver_ext.h index 718eddb2868..b89f7dde9ce 100644 --- a/src/lib/netlist/solver/nld_matrix_solver_ext.h +++ b/src/lib/netlist/solver/nld_matrix_solver_ext.h @@ -24,10 +24,10 @@ namespace solver using float_type = FT; - matrix_solver_ext_t(netlist_state_t &anetlist, const pstring &name, + matrix_solver_ext_t(devices::nld_solver &main_solver, const pstring &name, const net_list_t &nets, const solver_parameters_t *params, const std::size_t size) - : matrix_solver_t(anetlist, name, nets, params) + : matrix_solver_t(main_solver, name, nets, params) , m_new_V(size) , m_RHS(size) , m_mat_ptr(size, this->max_railstart() + 1) @@ -168,7 +168,7 @@ namespace solver { const std::size_t iN = size(); for (std::size_t i = 0; i < iN; i++) - m_last_V[i] = static_cast<float_type>(this->m_terms[i].getV()); + m_last_V[i] = gsl::narrow_cast<fptype>(this->m_terms[i].getV()); } void restore() override diff --git a/src/lib/netlist/solver/nld_ms_direct.h b/src/lib/netlist/solver/nld_ms_direct.h index 8cfb6b65273..584469fae1f 100644 --- a/src/lib/netlist/solver/nld_ms_direct.h +++ b/src/lib/netlist/solver/nld_ms_direct.h @@ -29,7 +29,7 @@ namespace solver using float_type = FT; - matrix_solver_direct_t(netlist_state_t &anetlist, const pstring &name, + matrix_solver_direct_t(devices::nld_solver &main_solver, const pstring &name, const matrix_solver_t::net_list_t &nets, const solver_parameters_t *params, std::size_t size); @@ -188,11 +188,11 @@ namespace solver } template <typename FT, int SIZE> - matrix_solver_direct_t<FT, SIZE>::matrix_solver_direct_t(netlist_state_t &anetlist, const pstring &name, + matrix_solver_direct_t<FT, SIZE>::matrix_solver_direct_t(devices::nld_solver &main_solver, const pstring &name, const matrix_solver_t::net_list_t &nets, const solver_parameters_t *params, std::size_t size) - : matrix_solver_ext_t<FT, SIZE>(anetlist, name, nets, params, size) + : matrix_solver_ext_t<FT, SIZE>(main_solver, name, nets, params, size) , m_pitch(m_pitch_ABS ? m_pitch_ABS : (((size + 0) + 7) / 8) * 8) , m_A(size, m_pitch) { diff --git a/src/lib/netlist/solver/nld_ms_direct1.h b/src/lib/netlist/solver/nld_ms_direct1.h index c9188a7dc9c..c44b4cdde1d 100644 --- a/src/lib/netlist/solver/nld_ms_direct1.h +++ b/src/lib/netlist/solver/nld_ms_direct1.h @@ -24,10 +24,10 @@ namespace solver using float_type = FT; using base_type = matrix_solver_direct_t<FT, 1>; - matrix_solver_direct1_t(netlist_state_t &anetlist, const pstring &name, + matrix_solver_direct1_t(devices::nld_solver &main_solver, const pstring &name, const matrix_solver_t::net_list_t &nets, const solver_parameters_t *params) - : matrix_solver_direct_t<FT, 1>(anetlist, name, nets, params, 1) + : matrix_solver_direct_t<FT, 1>(main_solver, name, nets, params, 1) {} // ---------------------------------------------------------------------------------------- diff --git a/src/lib/netlist/solver/nld_ms_direct2.h b/src/lib/netlist/solver/nld_ms_direct2.h index 0fb1345e1a6..c54630b764c 100644 --- a/src/lib/netlist/solver/nld_ms_direct2.h +++ b/src/lib/netlist/solver/nld_ms_direct2.h @@ -28,10 +28,10 @@ namespace solver using float_type = FT; - matrix_solver_direct2_t(netlist_state_t &anetlist, const pstring &name, + matrix_solver_direct2_t(devices::nld_solver &main_solver, const pstring &name, const matrix_solver_t::net_list_t &nets, const solver_parameters_t *params) - : matrix_solver_direct_t<FT, 2>(anetlist, name, nets, params, 2) + : matrix_solver_direct_t<FT, 2>(main_solver, name, nets, params, 2) {} void vsolve_non_dynamic() override { diff --git a/src/lib/netlist/solver/nld_ms_gcr.h b/src/lib/netlist/solver/nld_ms_gcr.h index a5ab9f6c283..8654a087311 100644 --- a/src/lib/netlist/solver/nld_ms_gcr.h +++ b/src/lib/netlist/solver/nld_ms_gcr.h @@ -35,10 +35,10 @@ namespace solver using base_type = matrix_solver_ext_t<FT, SIZE>; using fptype = typename base_type::fptype; - matrix_solver_GCR_t(netlist_state_t &anetlist, const pstring &name, + matrix_solver_GCR_t(devices::nld_solver &main_solver, const pstring &name, const matrix_solver_t::net_list_t &nets, const solver_parameters_t *params, const std::size_t size) - : matrix_solver_ext_t<FT, SIZE>(anetlist, name, nets, params, size) + : matrix_solver_ext_t<FT, SIZE>(main_solver, name, nets, params, size) , mat(static_cast<typename mat_type::index_type>(size)) , m_proc() { @@ -86,10 +86,10 @@ namespace solver this->m_mat_ptr[k][this->m_terms[k].railstart()] = &mat.A[mat.diag[k]]; } - anetlist.log().verbose("maximum fill: {1}", gr.first); - anetlist.log().verbose("Post elimination occupancy ratio: {2} Ops: {1}", gr.second, + this->state().log().verbose("maximum fill: {1}", gr.first); + this->state().log().verbose("Post elimination occupancy ratio: {2} Ops: {1}", gr.second, static_cast<fptype>(mat.nz_num) / static_cast<fptype>(iN * iN)); - anetlist.log().verbose(" Pre elimination occupancy ratio: {2}", + this->state().log().verbose(" Pre elimination occupancy ratio: {2}", static_cast<fptype>(raw_elements) / static_cast<fptype>(iN * iN)); // FIXME: Move me @@ -98,17 +98,17 @@ namespace solver // During extended validation there is no reason to check for // differences in the generated code since during // extended validation this will be different (and non-functional) - if (!anetlist.is_extended_validation() && anetlist.lib().isLoaded()) + if (!this->state().is_extended_validation() && this->state().lib().isLoaded()) { pstring symname = static_compile_name(); - m_proc.load(anetlist.lib(), symname); + m_proc.load(this->state().lib(), symname); if (m_proc.resolved()) { - anetlist.log().info("External static solver {1} found ...", symname); + this->state().log().info("External static solver {1} found ...", symname); } else { - anetlist.log().warning("External static solver {1} not found ...", symname); + this->state().log().warning("External static solver {1} not found ...", symname); } } } diff --git a/src/lib/netlist/solver/nld_ms_gmres.h b/src/lib/netlist/solver/nld_ms_gmres.h index 47d00e7e2ef..2783d96a5c7 100644 --- a/src/lib/netlist/solver/nld_ms_gmres.h +++ b/src/lib/netlist/solver/nld_ms_gmres.h @@ -34,11 +34,11 @@ namespace solver // maximize the efficiency of the incomplete LUT. // This is already preconditioning. - matrix_solver_GMRES_t(netlist_state_t &anetlist, const pstring &name, + matrix_solver_GMRES_t(devices::nld_solver &main_solver, const pstring &name, matrix_solver_t::net_list_t &nets, const solver_parameters_t *params, const std::size_t size) - : matrix_solver_direct_t<FT, SIZE>(anetlist, name, nets, params, size) + : matrix_solver_direct_t<FT, SIZE>(main_solver, name, nets, params, size) , m_ops(size, 0) , m_gmres(size) { diff --git a/src/lib/netlist/solver/nld_ms_sm.h b/src/lib/netlist/solver/nld_ms_sm.h index 85c4731050e..33109c5ef67 100644 --- a/src/lib/netlist/solver/nld_ms_sm.h +++ b/src/lib/netlist/solver/nld_ms_sm.h @@ -54,10 +54,10 @@ namespace solver // FIXME: dirty hack to make this compile static constexpr const std::size_t storage_N = 100; - matrix_solver_sm_t(netlist_state_t &anetlist, const pstring &name, + matrix_solver_sm_t(devices::nld_solver &main_solver, const pstring &name, const matrix_solver_t::net_list_t &nets, const solver_parameters_t *params, const std::size_t size) - : matrix_solver_ext_t<FT, SIZE>(anetlist, name, nets, params, size) + : matrix_solver_ext_t<FT, SIZE>(main_solver, name, nets, params, size) , m_cnt(0) { this->build_mat_ptr(m_A); diff --git a/src/lib/netlist/solver/nld_ms_sor.h b/src/lib/netlist/solver/nld_ms_sor.h index a828a1cd715..6fb10288452 100644 --- a/src/lib/netlist/solver/nld_ms_sor.h +++ b/src/lib/netlist/solver/nld_ms_sor.h @@ -29,10 +29,10 @@ namespace solver using float_type = FT; - matrix_solver_SOR_t(netlist_state_t &anetlist, const pstring &name, + matrix_solver_SOR_t(devices::nld_solver &main_solver, const pstring &name, matrix_solver_t::net_list_t &nets, const solver_parameters_t *params, const std::size_t size) - : matrix_solver_direct_t<FT, SIZE>(anetlist, name, nets, params, size) + : matrix_solver_direct_t<FT, SIZE>(main_solver, name, nets, params, size) , m_lp_fact(*this, "m_lp_fact", 0) , w(size, plib::constants<FT>::zero()) , one_m_w(size, plib::constants<FT>::zero()) diff --git a/src/lib/netlist/solver/nld_ms_sor_mat.h b/src/lib/netlist/solver/nld_ms_sor_mat.h index f725213228c..cd7a312bf6a 100644 --- a/src/lib/netlist/solver/nld_ms_sor_mat.h +++ b/src/lib/netlist/solver/nld_ms_sor_mat.h @@ -29,10 +29,10 @@ namespace solver using float_type = FT; - matrix_solver_SOR_mat_t(netlist_state_t &anetlist, const pstring &name, + matrix_solver_SOR_mat_t(devices::nld_solver &main_solver, const pstring &name, const matrix_solver_t::net_list_t &nets, const solver_parameters_t *params, std::size_t size) - : matrix_solver_direct_t<FT, SIZE>(anetlist, name, nets, params, size) + : matrix_solver_direct_t<FT, SIZE>(main_solver, name, nets, params, size) , m_omega(*this, "m_omega", static_cast<float_type>(params->m_gs_sor)) { } diff --git a/src/lib/netlist/solver/nld_ms_w.h b/src/lib/netlist/solver/nld_ms_w.h index fde53aac884..f8b6c4d5233 100644 --- a/src/lib/netlist/solver/nld_ms_w.h +++ b/src/lib/netlist/solver/nld_ms_w.h @@ -60,10 +60,10 @@ namespace solver // FIXME: dirty hack to make this compile static constexpr const std::size_t storage_N = 100; - matrix_solver_w_t(netlist_state_t &anetlist, const pstring &name, + matrix_solver_w_t(devices::nld_solver &main_solver, const pstring &name, const matrix_solver_t::net_list_t &nets, const solver_parameters_t *params, const std::size_t size) - : matrix_solver_ext_t<FT, SIZE>(anetlist, name, nets, params, size) + : matrix_solver_ext_t<FT, SIZE>(main_solver, name, nets, params, size) , m_cnt(0) { this->build_mat_ptr(m_A); diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp index 1c5898d866d..d756ecbd8f2 100644 --- a/src/lib/netlist/solver/nld_solver.cpp +++ b/src/lib/netlist/solver/nld_solver.cpp @@ -86,11 +86,11 @@ namespace devices // FIXME: should be created in device space template <class C> - NETLIB_NAME(solver)::solver_ptr create_it(netlist_state_t &nl, pstring name, + NETLIB_NAME(solver)::solver_ptr create_it(NETLIB_NAME(solver) &main_solver, pstring name, NETLIB_NAME(solver)::net_list_t &nets, solver::solver_parameters_t ¶ms, std::size_t size) { - return plib::make_unique<C, host_arena>(nl, name, nets, ¶ms, size); + return plib::make_unique<C, host_arena>(main_solver, name, nets, ¶ms, size); //return nl.make_pool_object<C>(nl, name, nets, ¶ms, size); } @@ -102,22 +102,22 @@ namespace devices switch (m_params.m_method()) { case solver::matrix_type_e::MAT_CR: - return create_it<solver::matrix_solver_GCR_t<FT, SIZE>>(state(), solvername, nets, m_params, size); + return create_it<solver::matrix_solver_GCR_t<FT, SIZE>>(*this, 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); + return create_it<solver::matrix_solver_direct_t<FT, SIZE>>(*this, 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); + return create_it<solver::matrix_solver_GMRES_t<FT, SIZE>>(*this, 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); + return create_it<solver::matrix_solver_SOR_t<FT, SIZE>>(*this, 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); + return create_it<solver::matrix_solver_SOR_mat_t<FT, SIZE>>(*this, 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); + return create_it<solver::matrix_solver_sm_t<FT, SIZE>>(*this, 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); + return create_it<solver::matrix_solver_w_t<FT, SIZE>>(*this, solvername, nets, m_params, size); #else case solver::matrix_type_e::GMRES: case solver::matrix_type_e::SOR: @@ -125,7 +125,7 @@ namespace devices case solver::matrix_type_e::SM: case solver::matrix_type_e::W: 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); + return create_it<solver::matrix_solver_GCR_t<FT, SIZE>>(*this, solvername, nets, m_params, size); #endif } return solver_ptr(); @@ -140,10 +140,10 @@ namespace devices switch (net_count) { case 1: - return plib::make_unique<solver::matrix_solver_direct1_t<FT>, host_arena>(state(), sname, nets, &m_params); + return plib::make_unique<solver::matrix_solver_direct1_t<FT>, host_arena>(*this, sname, nets, &m_params); //return state().make_pool_object<solver::matrix_solver_direct1_t<FT>>(state(), sname, nets, &m_params); case 2: - return plib::make_unique<solver::matrix_solver_direct2_t<FT>, host_arena>(state(), sname, nets, &m_params); + return plib::make_unique<solver::matrix_solver_direct2_t<FT>, host_arena>(*this, sname, nets, &m_params); //return state().make_pool_object<solver::matrix_solver_direct2_t<FT>>(state(), sname, nets, &m_params); case 3: return create_solver<FT, 3>(3, sname, nets); |