diff options
Diffstat (limited to 'src/lib/netlist/solver/nld_solver.cpp')
-rw-r--r-- | src/lib/netlist/solver/nld_solver.cpp | 60 |
1 files changed, 16 insertions, 44 deletions
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 ¶ms, std::size_t size) { - return plib::make_unique<C>(nl, name, nets, ¶ms, size); + return host_arena::make_unique<C>(nl, name, nets, ¶ms, 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) |