summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author couriersud <couriersud@gmx.org>2019-02-08 20:16:02 +0100
committer couriersud <couriersud@gmx.org>2019-02-08 23:18:47 +0100
commit8f94739f6561d7d0affd8ff855be18f5bc04c502 (patch)
tree16938985299fdac137d8f00e526eea69524df516
parentf4c0f8c74bc6433683098946d6c3fc4398a3cb87 (diff)
netlist: make constants struct members constexpr const. (nw)
- enable GCC diagnostics in vector ops for GCC 7 again - Use forwarding in vector_ops
-rw-r--r--src/lib/netlist/analog/nlid_twoterm.cpp2
-rw-r--r--src/lib/netlist/devices/nld_4066.cpp6
-rw-r--r--src/lib/netlist/devices/nld_74ls629.cpp2
-rw-r--r--src/lib/netlist/plib/gmres.h2
-rw-r--r--src/lib/netlist/plib/putil.h8
-rw-r--r--src/lib/netlist/plib/vector_ops.h28
-rw-r--r--src/lib/netlist/solver/nld_matrix_solver.cpp4
-rw-r--r--src/lib/netlist/solver/nld_ms_sor.h2
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<nl_double>()(-0.99));
+ const double a = std::max((nVd - m_Vd) * m_VtInv, plib::constants<nl_double>::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<nl_double>()(0.45) * sup;
- nl_double high = plib::constants<nl_double>()(0.55) * sup;
+ nl_double low = plib::constants<nl_double>::cast(0.45) * sup;
+ nl_double high = plib::constants<nl_double>::cast(0.55) * sup;
nl_double in = m_control() - m_supply.vss();
- nl_double rON = m_base_r() * plib::constants<nl_double>()(5.0) / sup;
+ nl_double rON = m_base_r() * plib::constants<nl_double>::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<nl_double>()(0.1e-6) / m_CAP();
+ freq *= plib::constants<nl_double>::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<float_type>(n, m_v[kp1], m_v[j]);
+ m_ht[j][k] = vec_mult<FT>(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<FT>(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 <typename T>
struct constants
{
- static constexpr T zero = static_cast<T>(0);
- static constexpr T one = static_cast<T>(1);
- static constexpr T two = static_cast<T>(2);
+ static constexpr const T zero = static_cast<T>(0);
+ static constexpr const T one = static_cast<T>(1);
+ static constexpr const T two = static_cast<T>(2);
template <typename V>
- constexpr T operator()(V &&v) const noexcept { return static_cast<T>(v); }
+ static constexpr const T cast(V &&v) noexcept { return static_cast<T>(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<typename VT, typename T>
- 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<T>(scalar));
for ( std::size_t i = 0; i < n; i++ )
- v[i] = scalar;
+ v[i] = s;
}
template<typename VT, typename VS>
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<typename T, typename V1, typename V2>
@@ -56,21 +59,23 @@ namespace plib
}
template<typename VV, typename T, typename VR>
- 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<T>(scalar));
for ( std::size_t i = 0; i < n; i++ )
- result[i] = scalar * v[i];
+ result[i] = s * v[i];
}
template<typename VV, typename T, typename VR>
- 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<T>(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<typename T>
- 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<typename V, typename T>
- 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<T>(scalar));
for ( std::size_t i = 0; i < n; i++ )
- v[i] = scalar * v[i];
+ v[i] = s * v[i];
}
template<typename T, typename V>
@@ -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<nl_double>()(1e-60)) // avoid div-by-zero
- new_net_timestep = std::sqrt(m_params.m_dynamic_lte / std::fabs(plib::constants<nl_double>()(0.5)*DD2));
+ if (std::fabs(DD2) > plib::constants<nl_double>::cast(1e-60)) // avoid div-by-zero
+ new_net_timestep = std::sqrt(m_params.m_dynamic_lte / std::fabs(plib::constants<nl_double>::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<FT, SIZE>::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<nl_double>()(0.5); // derived by try and error
+ gabs_t *= plib::constants<nl_double>::cast(0.5); // derived by try and error
if (gabs_t <= gtot_t)
{
w[k] = ws / gtot_t;