summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/solver
diff options
context:
space:
mode:
author couriersud <couriersud@gmx.org>2020-06-08 02:52:39 +0200
committer couriersud <couriersud@gmx.org>2020-06-08 02:52:39 +0200
commitf9fa6b1c81b99303d3448bcb355bc6e3f4d3c44a (patch)
tree6bfa155ca4bd57e7086f0b19cbb9cba6591e1624 /src/lib/netlist/solver
parent29c7171702967abe49bb3f9dcd55b4b083606570 (diff)
netlist: code maintenance. (nw)
- more c++14, use enable_if_t instead of enable_if - cleaned up the use of memory allocation arenas - reduce MACRO usage, use std::conditional where possible
Diffstat (limited to 'src/lib/netlist/solver')
-rw-r--r--src/lib/netlist/solver/nld_matrix_solver.h2
-rw-r--r--src/lib/netlist/solver/nld_solver.cpp60
-rw-r--r--src/lib/netlist/solver/nld_solver.h7
3 files changed, 21 insertions, 48 deletions
diff --git a/src/lib/netlist/solver/nld_matrix_solver.h b/src/lib/netlist/solver/nld_matrix_solver.h
index 09d210fcf55..fef3ec4a29b 100644
--- a/src/lib/netlist/solver/nld_matrix_solver.h
+++ b/src/lib/netlist/solver/nld_matrix_solver.h
@@ -289,7 +289,7 @@ namespace solver
private:
plib::aligned_vector<terms_for_net_t> m_rails_temp;
- std::vector<unique_pool_ptr<proxied_analog_output_t>> m_inps;
+ std::vector<device_arena::unique_ptr<proxied_analog_output_t>> m_inps;
state_var<std::size_t> m_stat_calculations;
state_var<std::size_t> m_stat_newton_raphson;
diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp
index 2cd092cdbdd..c7e8242d83a 100644
--- a/src/lib/netlist/solver/nld_solver.cpp
+++ b/src/lib/netlist/solver/nld_solver.cpp
@@ -1,30 +1,6 @@
// license:GPL-2.0+
// copyright-holders:Couriersud
-// Commented out for now. Relatively low number of terminals / nets make
-// the vectorizations fast-math enables pretty expensive
-//
-#if 0
-#pragma GCC optimize "-ftree-vectorize"
-#pragma GCC optimize "-ffast-math"
-#pragma GCC optimize "-funsafe-math-optimizations"
-#pragma GCC optimize "-funroll-loops"
-#pragma GCC optimize "-funswitch-loops"
-#pragma GCC optimize "-fstrict-aliasing"
-#pragma GCC optimize "tree-vectorizer-verbose=7"
-#pragma GCC optimize "opt-info-vec"
-#pragma GCC optimize "opt-info-vec-missed"
-//#pragma GCC optimize "tree-parallelize-loops=4"
-#pragma GCC optimize "variable-expansion-in-unroller"
-#pragma GCC optimize "unsafe-loop-optimizations"
-#pragma GCC optimize "vect-cost-model"
-#pragma GCC optimize "variable-expansion-in-unroller"
-#pragma GCC optimize "tree-loop-if-convert-stores"
-#pragma GCC optimize "tree-loop-distribution"
-#pragma GCC optimize "tree-loop-im"
-#pragma GCC optimize "tree-loop-ivcanon"
-#pragma GCC optimize "ivopts"
-#endif
#include "netlist/nl_factory.h"
#include "netlist/nl_setup.h" // FIXME: only needed for splitter code
@@ -42,6 +18,7 @@
#include "plib/pomp.h"
#include <algorithm>
+#include <type_traits>
namespace netlist
{
@@ -104,16 +81,17 @@ namespace devices
}
}
+ // FIXME: should be created in device space
template <class C>
- plib::unique_ptr<solver::matrix_solver_t> create_it(netlist_state_t &nl, pstring name,
+ host_arena::unique_ptr<solver::matrix_solver_t> create_it(netlist_state_t &nl, pstring name,
analog_net_t::list_t &nets,
solver::solver_parameters_t &params, std::size_t size)
{
- return plib::make_unique<C>(nl, name, nets, &params, size);
+ return host_arena::make_unique<C>(nl, name, nets, &params, size);
}
template <typename FT, int SIZE>
- plib::unique_ptr<solver::matrix_solver_t> NETLIB_NAME(solver)::create_solver(std::size_t size,
+ host_arena::unique_ptr<solver::matrix_solver_t> NETLIB_NAME(solver)::create_solver(std::size_t size,
const pstring &solvername,
analog_net_t::list_t &nets)
{
@@ -146,11 +124,11 @@ namespace devices
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>();
+ return host_arena::unique_ptr<solver::matrix_solver_t>();
}
template <typename FT>
- plib::unique_ptr<solver::matrix_solver_t> NETLIB_NAME(solver)::create_solvers(
+ host_arena::unique_ptr<solver::matrix_solver_t> NETLIB_NAME(solver)::create_solvers(
const pstring &sname,
analog_net_t::list_t &nets)
{
@@ -158,10 +136,10 @@ namespace devices
switch (net_count)
{
case 1:
- return plib::make_unique<solver::matrix_solver_direct1_t<FT>>(state(), sname, nets, &m_params);
+ return host_arena::make_unique<solver::matrix_solver_direct1_t<FT>>(state(), sname, nets, &m_params);
break;
case 2:
- return plib::make_unique<solver::matrix_solver_direct2_t<FT>>(state(), sname, nets, &m_params);
+ return host_arena::make_unique<solver::matrix_solver_direct2_t<FT>>(state(), sname, nets, &m_params);
break;
case 3:
return create_solver<FT, 3>(3, sname, nets);
@@ -322,29 +300,23 @@ namespace devices
log().verbose("Found {1} net groups in {2} nets\n", splitter.groups.size(), state().nets().size());
for (auto & grp : splitter.groups)
{
- plib::unique_ptr<solver::matrix_solver_t> ms;
+ host_arena::unique_ptr<solver::matrix_solver_t> ms;
pstring sname = plib::pfmt("Solver_{1}")(m_mat_solvers.size());
switch (m_params.m_fp_type())
{
case solver::matrix_fp_type_e::FLOAT:
-#if (NL_USE_FLOAT_MATRIX)
- ms = create_solvers<float>(sname, grp);
-#else
- log().info("FPTYPE {1} not supported. Using DOUBLE", m_params.m_fp_type().name());
- ms = create_solvers<double>(sname, grp);
-#endif
+ if (NL_USE_FLOAT_MATRIX)
+ log().info("FPTYPE {1} not supported. Using DOUBLE", m_params.m_fp_type().name());
+ ms = create_solvers<std::conditional_t<NL_USE_FLOAT_MATRIX,float, double>>(sname, grp);
break;
case solver::matrix_fp_type_e::DOUBLE:
ms = create_solvers<double>(sname, grp);
break;
case solver::matrix_fp_type_e::LONGDOUBLE:
-#if (NL_USE_LONG_DOUBLE_MATRIX)
- ms = create_solvers<long double>(sname, grp);
-#else
- log().info("FPTYPE {1} not supported. Using DOUBLE", m_params.m_fp_type().name());
- ms = create_solvers<double>(sname, grp);
-#endif
+ if (NL_USE_LONG_DOUBLE_MATRIX)
+ log().info("FPTYPE {1} not supported. Using DOUBLE", m_params.m_fp_type().name());
+ ms = create_solvers<std::conditional_t<NL_USE_LONG_DOUBLE_MATRIX, long double, double>>(sname, grp);
break;
case solver::matrix_fp_type_e::FLOATQ128:
#if (NL_USE_FLOAT128)
diff --git a/src/lib/netlist/solver/nld_solver.h b/src/lib/netlist/solver/nld_solver.h
index 46c335804f4..a0c28e6b302 100644
--- a/src/lib/netlist/solver/nld_solver.h
+++ b/src/lib/netlist/solver/nld_solver.h
@@ -51,18 +51,19 @@ namespace devices
logic_input_t m_fb_step;
logic_output_t m_Q_step;
- std::vector<plib::unique_ptr<solver::matrix_solver_t>> m_mat_solvers;
+ // FIXME: these should be created in device space
+ std::vector<host_arena::unique_ptr<solver::matrix_solver_t>> m_mat_solvers;
std::vector<solver::matrix_solver_t *> m_mat_solvers_all;
std::vector<solver::matrix_solver_t *> m_mat_solvers_timestepping;
solver::solver_parameters_t m_params;
template <typename FT, int SIZE>
- plib::unique_ptr<solver::matrix_solver_t> create_solver(std::size_t size,
+ host_arena::unique_ptr<solver::matrix_solver_t> create_solver(std::size_t size,
const pstring &solvername, analog_net_t::list_t &nets);
template <typename FT>
- plib::unique_ptr<solver::matrix_solver_t> create_solvers(
+ host_arena::unique_ptr<solver::matrix_solver_t> create_solvers(
const pstring &sname, analog_net_t::list_t &nets);
};