summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author couriersud <couriersud@gmx.org>2020-07-25 14:43:54 +0200
committer couriersud <couriersud@gmx.org>2020-07-25 14:47:19 +0200
commit3a9ab286c6c03567ae037a192025d7dbd02e5099 (patch)
tree29cae6b6f6582f1490e8821f091dbe87f8e6a5b5
parent94fe22aab1d1b9e3910947c1512c9bd8b86e2817 (diff)
netlist: nld_matrix_solver is now owned by nld_solver.
-rw-r--r--src/lib/netlist/build/makefile4
-rw-r--r--src/lib/netlist/solver/nld_matrix_solver.cpp13
-rw-r--r--src/lib/netlist/solver/nld_matrix_solver.h4
-rw-r--r--src/lib/netlist/solver/nld_matrix_solver_ext.h6
-rw-r--r--src/lib/netlist/solver/nld_ms_direct.h6
-rw-r--r--src/lib/netlist/solver/nld_ms_direct1.h4
-rw-r--r--src/lib/netlist/solver/nld_ms_direct2.h4
-rw-r--r--src/lib/netlist/solver/nld_ms_gcr.h18
-rw-r--r--src/lib/netlist/solver/nld_ms_gmres.h4
-rw-r--r--src/lib/netlist/solver/nld_ms_sm.h4
-rw-r--r--src/lib/netlist/solver/nld_ms_sor.h4
-rw-r--r--src/lib/netlist/solver/nld_ms_sor_mat.h4
-rw-r--r--src/lib/netlist/solver/nld_ms_w.h4
-rw-r--r--src/lib/netlist/solver/nld_solver.cpp24
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 &params, std::size_t size)
{
- return plib::make_unique<C, host_arena>(nl, name, nets, &params, size);
+ return plib::make_unique<C, host_arena>(main_solver, name, nets, &params, size);
//return nl.make_pool_object<C>(nl, name, nets, &params, 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);