From 8f94739f6561d7d0affd8ff855be18f5bc04c502 Mon Sep 17 00:00:00 2001 From: couriersud Date: Fri, 8 Feb 2019 20:16:02 +0100 Subject: netlist: make constants struct members constexpr const. (nw) - enable GCC diagnostics in vector ops for GCC 7 again - Use forwarding in vector_ops --- src/lib/netlist/analog/nlid_twoterm.cpp | 2 +- src/lib/netlist/devices/nld_4066.cpp | 6 +++--- src/lib/netlist/devices/nld_74ls629.cpp | 2 +- src/lib/netlist/plib/gmres.h | 2 +- src/lib/netlist/plib/putil.h | 8 ++++---- src/lib/netlist/plib/vector_ops.h | 28 ++++++++++++++++++---------- src/lib/netlist/solver/nld_matrix_solver.cpp | 4 ++-- src/lib/netlist/solver/nld_ms_sor.h | 2 +- 8 files changed, 31 insertions(+), 23 deletions(-) diff --git a/src/lib/netlist/analog/nlid_twoterm.cpp b/src/lib/netlist/analog/nlid_twoterm.cpp index 5b4bf064093..e1151083317 100644 --- a/src/lib/netlist/analog/nlid_twoterm.cpp +++ b/src/lib/netlist/analog/nlid_twoterm.cpp @@ -70,7 +70,7 @@ void generic_diode::update_diode(const nl_double nVd) } else { - const double a = std::max((nVd - m_Vd) * m_VtInv, plib::constants()(-0.99)); + const double a = std::max((nVd - m_Vd) * m_VtInv, plib::constants::cast(-0.99)); m_Vd = m_Vd + std::log1p(a) * m_Vt; //const double IseVDVt = m_Is * std::exp(m_Vd * m_VtInv); const double IseVDVt = std::exp(m_logIs + m_Vd * m_VtInv); diff --git a/src/lib/netlist/devices/nld_4066.cpp b/src/lib/netlist/devices/nld_4066.cpp index 81a9a07ef0b..cafd6c64476 100644 --- a/src/lib/netlist/devices/nld_4066.cpp +++ b/src/lib/netlist/devices/nld_4066.cpp @@ -48,10 +48,10 @@ namespace netlist NETLIB_UPDATE(CD4066_GATE) { nl_double sup = (m_supply.vdd() - m_supply.vss()); - nl_double low = plib::constants()(0.45) * sup; - nl_double high = plib::constants()(0.55) * sup; + nl_double low = plib::constants::cast(0.45) * sup; + nl_double high = plib::constants::cast(0.55) * sup; nl_double in = m_control() - m_supply.vss(); - nl_double rON = m_base_r() * plib::constants()(5.0) / sup; + nl_double rON = m_base_r() * plib::constants::cast(5.0) / sup; nl_double R = -1.0; if (in < low) diff --git a/src/lib/netlist/devices/nld_74ls629.cpp b/src/lib/netlist/devices/nld_74ls629.cpp index 5383501043c..afdd6d9ac4a 100644 --- a/src/lib/netlist/devices/nld_74ls629.cpp +++ b/src/lib/netlist/devices/nld_74ls629.cpp @@ -210,7 +210,7 @@ namespace netlist freq += k9 * v_rng * v_freq_3; freq += k10 * v_rng * v_freq_4; - freq *= plib::constants()(0.1e-6) / m_CAP(); + freq *= plib::constants::cast(0.1e-6) / m_CAP(); // FIXME: we need a possibility to remove entries from queue ... // or an exact model ... diff --git a/src/lib/netlist/plib/gmres.h b/src/lib/netlist/plib/gmres.h index e6012aa02a6..7ced2854b6d 100644 --- a/src/lib/netlist/plib/gmres.h +++ b/src/lib/netlist/plib/gmres.h @@ -267,7 +267,7 @@ namespace plib for (std::size_t j = 0; j <= k; j++) { - m_ht[j][k] = vec_mult(n, m_v[kp1], m_v[j]); + m_ht[j][k] = vec_mult(n, m_v[kp1], m_v[j]); vec_add_mult_scalar(n, m_v[j], -m_ht[j][k], m_v[kp1]); } m_ht[kp1][k] = std::sqrt(vec_mult2(n, m_v[kp1])); diff --git a/src/lib/netlist/plib/putil.h b/src/lib/netlist/plib/putil.h index 71a7146e6c0..c402b0f455c 100644 --- a/src/lib/netlist/plib/putil.h +++ b/src/lib/netlist/plib/putil.h @@ -62,12 +62,12 @@ namespace plib template struct constants { - static constexpr T zero = static_cast(0); - static constexpr T one = static_cast(1); - static constexpr T two = static_cast(2); + static constexpr const T zero = static_cast(0); + static constexpr const T one = static_cast(1); + static constexpr const T two = static_cast(2); template - constexpr T operator()(V &&v) const noexcept { return static_cast(v); } + static constexpr const T cast(V &&v) noexcept { return static_cast(v); } }; diff --git a/src/lib/netlist/plib/vector_ops.h b/src/lib/netlist/plib/vector_ops.h index 406e69a2a91..dde6c7c4049 100644 --- a/src/lib/netlist/plib/vector_ops.h +++ b/src/lib/netlist/plib/vector_ops.h @@ -17,24 +17,27 @@ #include "pconfig.h" #if !defined(__clang__) && !defined(_MSC_VER) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 6)) +#if !(__GNUC__ > 7 || (__GNUC__ == 7 && __GNUC_MINOR__ > 3)) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wmaybe-uninitialized" #endif +#endif namespace plib { template - void vec_set_scalar (const std::size_t n, VT &v, const T & scalar) + void vec_set_scalar (const std::size_t n, VT &v, T && scalar) { + const T s(std::forward(scalar)); for ( std::size_t i = 0; i < n; i++ ) - v[i] = scalar; + v[i] = s; } template void vec_set (const std::size_t n, VT &v, const VS & source) { for ( std::size_t i = 0; i < n; i++ ) - v[i] = source [i]; + v[i] = source[i]; } template @@ -56,21 +59,23 @@ namespace plib } template - void vec_mult_scalar (const std::size_t n, const VV & v, const T & scalar, VR & result) + void vec_mult_scalar (const std::size_t n, const VV & v, T && scalar, VR & result) { + const T s(std::forward(scalar)); for ( std::size_t i = 0; i < n; i++ ) - result[i] = scalar * v[i]; + result[i] = s * v[i]; } template - void vec_add_mult_scalar (const std::size_t n, const VV & v, const T scalar, VR & result) + void vec_add_mult_scalar (const std::size_t n, const VV & v, T && scalar, VR & result) { + const T s(std::forward(scalar)); for ( std::size_t i = 0; i < n; i++ ) - result[i] = result[i] + scalar * v[i]; + result[i] = result[i] + s * v[i]; } template - void vec_add_mult_scalar_p(const std::size_t & n, const T * v, const T scalar, T * result) + void vec_add_mult_scalar_p(const std::size_t & n, const T * v, T scalar, T * result) { for ( std::size_t i = 0; i < n; i++ ) result[i] += scalar * v[i]; @@ -91,10 +96,11 @@ namespace plib } template - void vec_scale(const std::size_t n, V & v, const T scalar) + void vec_scale(const std::size_t n, V & v, T &&scalar) { + const T s(std::forward(scalar)); for ( std::size_t i = 0; i < n; i++ ) - v[i] = scalar * v[i]; + v[i] = s * v[i]; } template @@ -109,7 +115,9 @@ namespace plib } // namespace plib #if !defined(__clang__) && !defined(_MSC_VER) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 6)) +#if !(__GNUC__ > 7 || (__GNUC__ == 7 && __GNUC_MINOR__ > 3)) #pragma GCC diagnostic pop #endif +#endif #endif /* PLIB_VECTOR_OPS_H_ */ diff --git a/src/lib/netlist/solver/nld_matrix_solver.cpp b/src/lib/netlist/solver/nld_matrix_solver.cpp index b678f7f8d8c..f318338b8bf 100644 --- a/src/lib/netlist/solver/nld_matrix_solver.cpp +++ b/src/lib/netlist/solver/nld_matrix_solver.cpp @@ -617,8 +617,8 @@ netlist_time matrix_solver_t::compute_next_timestep(const double cur_ts) t->m_h_n_m_1 = hn; t->m_DD_n_m_1 = DD_n; - if (std::fabs(DD2) > plib::constants()(1e-60)) // avoid div-by-zero - new_net_timestep = std::sqrt(m_params.m_dynamic_lte / std::fabs(plib::constants()(0.5)*DD2)); + if (std::fabs(DD2) > plib::constants::cast(1e-60)) // avoid div-by-zero + new_net_timestep = std::sqrt(m_params.m_dynamic_lte / std::fabs(plib::constants::cast(0.5)*DD2)); else new_net_timestep = m_params.m_max_timestep; diff --git a/src/lib/netlist/solver/nld_ms_sor.h b/src/lib/netlist/solver/nld_ms_sor.h index bb9192a0c01..1f2a5044382 100644 --- a/src/lib/netlist/solver/nld_ms_sor.h +++ b/src/lib/netlist/solver/nld_ms_sor.h @@ -110,7 +110,7 @@ unsigned matrix_solver_SOR_t::vsolve_non_dynamic(const bool newton_rap for (std::size_t i = 0; i < term_count; i++) gabs_t = gabs_t + std::abs(go[i]); - gabs_t *= plib::constants()(0.5); // derived by try and error + gabs_t *= plib::constants::cast(0.5); // derived by try and error if (gabs_t <= gtot_t) { w[k] = ws / gtot_t; -- cgit v1.2.3