mirror of
https://github.com/holub/mame
synced 2025-07-07 19:03:29 +03:00
netlist: make constants struct members constexpr const. (nw)
- enable GCC diagnostics in vector ops for GCC 7 again - Use forwarding in vector_ops
This commit is contained in:
parent
f4c0f8c74b
commit
8f94739f65
@ -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);
|
||||
|
@ -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)
|
||||
|
@ -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 ...
|
||||
|
@ -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]));
|
||||
|
@ -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); }
|
||||
};
|
||||
|
||||
|
||||
|
@ -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_ */
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user