summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author couriersud <couriersud@gmx.org>2019-02-23 16:24:01 +0100
committer couriersud <couriersud@gmx.org>2019-02-23 16:24:01 +0100
commit0b3787d5f4e66c38b182d7bec8fd7fbc8fcc5b68 (patch)
tree3e6ab137f583b35ef5a0dee030eab9ec643f629c
parentd0ffeee256fe8e76bfd876c24dfad4ed98ca760e (diff)
netlist: Fix some more exotic compile options. (nw)
128bit integers on kaby lake are not that much slower than 64bit. This may be an option for MAME's attotime as well.
-rw-r--r--src/lib/netlist/build/makefile4
-rw-r--r--src/lib/netlist/devices/nlid_system.h4
-rw-r--r--src/lib/netlist/devices/nlid_truthtable.cpp2
-rw-r--r--src/lib/netlist/nl_base.cpp4
-rw-r--r--src/lib/netlist/nl_config.h11
-rw-r--r--src/lib/netlist/nl_time.h5
-rw-r--r--src/lib/netlist/plib/pconfig.h2
-rw-r--r--src/lib/netlist/solver/nld_matrix_solver.cpp28
-rw-r--r--src/lib/netlist/solver/nld_matrix_solver.h26
-rw-r--r--src/lib/netlist/solver/nld_ms_gmres.h5
-rw-r--r--src/lib/netlist/solver/nld_ms_sor.h2
-rw-r--r--src/lib/netlist/solver/nld_ms_sor_mat.h6
-rw-r--r--src/lib/netlist/solver/nld_solver.cpp4
-rw-r--r--src/lib/netlist/solver/nld_solver.h7
14 files changed, 45 insertions, 65 deletions
diff --git a/src/lib/netlist/build/makefile b/src/lib/netlist/build/makefile
index 40d75f32fd8..d4296c1b007 100644
--- a/src/lib/netlist/build/makefile
+++ b/src/lib/netlist/build/makefile
@@ -14,7 +14,7 @@ VSBUILD = $(SRC)/buildVS
DOC = $(SRC)/documentation
TIDY_DB = ../compile_commands.json
-TIDY_FLAGSX = -checks=*,-google*,-hicpp*,-readability*,-fuchsia*,cert-*,-android-*,
+TIDY_FLAGSX = -checks=*,google*,-hicpp*,-readability*,-fuchsia*,cert-*,-android-*,
TIDY_FLAGSX += -llvm-header-guard,-cppcoreguidelines-pro-type-reinterpret-cast,
TIDY_FLAGSX += -cppcoreguidelines-pro-bounds-pointer-arithmetic,-cppcoreguidelines-owning-memory,
TIDY_FLAGSX += -modernize-use-default-member-init,-cppcoreguidelines-pro-bounds-constant-array-index,
@@ -23,7 +23,7 @@ TIDY_FLAGSX += -modernize-pass-by-value,-cppcoreguidelines-pro-type-static-cast-
#TIDY_FLAGSX += -cppcoreguidelines-pro-bounds-array-to-pointer-decay,
TIDY_FLAGSX += performance-unnecessary-value-param,-cppcoreguidelines-avoid-magic-numbers,
TIDY_FLAGSX += -cppcoreguidelines-macro-usage,
-TIDY_FLAGSX += cppcoreguidelines-non-private-member-variables-in-classes,-misc-non-private-member-variables-in-classes,
+TIDY_FLAGSX += -cppcoreguidelines-non-private-member-variables-in-classes,-misc-non-private-member-variables-in-classes,
#TIDY_FLAGSX += -cppcoreguidelines-avoid-c-arrays,-modernize-avoid-c-arrays,
#TIDY_FLAGSX += -modernize-use-using,
TIDY_FLAGSX += performance-unnecessary-copy-initialization,
diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h
index 02e8453c6e7..10cbc498a6b 100644
--- a/src/lib/netlist/devices/nlid_system.h
+++ b/src/lib/netlist/devices/nlid_system.h
@@ -127,7 +127,7 @@ namespace netlist
std::vector<pstring> pat(plib::psplit(m_pattern(),","));
m_off = netlist_time::from_double(m_offset());
- std::array<netlist_time::mult_type, 32> pati = { 0 };
+ std::array<std::int64_t, 32> pati = { 0 };
m_size = static_cast<std::uint8_t>(pat.size());
netlist_time::mult_type total = 0;
@@ -135,7 +135,7 @@ namespace netlist
{
// FIXME: use pstonum_ne
//pati[i] = plib::pstonum<decltype(pati[i])>(pat[i]);
- pati[i] = plib::pstonum<netlist_time::mult_type>(pat[i]);
+ pati[i] = plib::pstonum<std::int64_t>(pat[i]);
total += pati[i];
}
netlist_time ttotal = netlist_time::zero();
diff --git a/src/lib/netlist/devices/nlid_truthtable.cpp b/src/lib/netlist/devices/nlid_truthtable.cpp
index cadbdf0b7bb..78fd076b560 100644
--- a/src/lib/netlist/devices/nlid_truthtable.cpp
+++ b/src/lib/netlist/devices/nlid_truthtable.cpp
@@ -399,7 +399,7 @@ void truthtable_parser::parse(const std::vector<pstring> &truthtable)
else
nl_assert_always(outs == "0", "Unknown value (not 0 or 1");
// FIXME: error handling
- netlist_time t = netlist_time::from_nsec(plib::pstonum<netlist_time::internal_type>(plib::trim(times[j])));
+ netlist_time t = netlist_time::from_nsec(plib::pstonum<std::int64_t>(plib::trim(times[j])));
uint_least8_t k=0;
while (m_timing_nt[k] != netlist_time::zero() && m_timing_nt[k] != t)
k++;
diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp
index 8ba7ad7b5f8..e5c59c7d43d 100644
--- a/src/lib/netlist/nl_base.cpp
+++ b/src/lib/netlist/nl_base.cpp
@@ -476,7 +476,7 @@ void netlist_t::print_stats() const
[&](size_t i1, size_t i2) { return m_state->m_devices[i1].second->m_stat_total_time.total() < m_state->m_devices[i2].second->m_stat_total_time.total(); });
nperftime_t<NL_KEEP_STATISTICS>::type total_time(0);
- netlist_time::mult_type total_count(0);
+ nperftime_t<NL_KEEP_STATISTICS>::ctype total_count(0);
for (auto & j : index)
{
@@ -489,7 +489,7 @@ void netlist_t::print_stats() const
}
log().verbose("Total calls : {1:12} {2:12} {3:12}", total_count,
- total_time, total_time / total_count);
+ total_time, total_time / static_cast<decltype(total_time)>(total_count));
nperftime_t<NL_KEEP_STATISTICS> overhead;
nperftime_t<NL_KEEP_STATISTICS> test;
diff --git a/src/lib/netlist/nl_config.h b/src/lib/netlist/nl_config.h
index de9a370db2f..d5d195367ec 100644
--- a/src/lib/netlist/nl_config.h
+++ b/src/lib/netlist/nl_config.h
@@ -37,7 +37,7 @@
* This approach is stricter and should identify bugs in
* the netlist core faster.
* By default it is disabled since it is not as fast as
- * the default approach.
+ * the default approach. It is up to 5% slower.
*
*/
#define USE_COPY_INSTEAD_OF_REFERENCE (0)
@@ -54,15 +54,6 @@
#define NL_MAX_LINK_RESOLVE_LOOPS (100)
//============================================================
-// Solver defines
-//============================================================
-
-#define USE_GABS (1)
-// savings are eaten up by effort
-// FIXME: Convert into solver parameter
-#define USE_LINEAR_PREDICTION (0)
-
-//============================================================
// DEBUGGING
//============================================================
diff --git a/src/lib/netlist/nl_time.h b/src/lib/netlist/nl_time.h
index 4fd2b0211f1..1db22241d64 100644
--- a/src/lib/netlist/nl_time.h
+++ b/src/lib/netlist/nl_time.h
@@ -131,7 +131,7 @@ namespace netlist
};
#if (PHAS_INT128)
- using netlist_time = ptime<UINT128, NETLIST_INTERNAL_RES>;
+ using netlist_time = ptime<INT128, NETLIST_INTERNAL_RES>;
#else
using netlist_time = ptime<std::int64_t, NETLIST_INTERNAL_RES>;
static_assert(noexcept(netlist_time::from_nsec(1)) == true, "Not evaluated as constexpr");
@@ -149,7 +149,8 @@ namespace netlist
namespace plib {
- template<> inline void state_manager_t::save_item(const void *owner, netlist::netlist_time &nlt, const pstring &stname)
+ template<>
+ inline void state_manager_t::save_item(const void *owner, netlist::netlist_time &nlt, const pstring &stname)
{
save_state_ptr(owner, stname, datatype_t(sizeof(netlist::netlist_time::internal_type), true, false), 1, nlt.get_internaltype_ptr());
}
diff --git a/src/lib/netlist/plib/pconfig.h b/src/lib/netlist/plib/pconfig.h
index 9754643678a..3b4bc55fc32 100644
--- a/src/lib/netlist/plib/pconfig.h
+++ b/src/lib/netlist/plib/pconfig.h
@@ -26,7 +26,7 @@
/*
* Set this to one if you want to use 128 bit int for ptime.
- * This is for tests only.
+ * This is about 5% slower on a kaby lake processor.
*/
#ifndef PHAS_INT128
diff --git a/src/lib/netlist/solver/nld_matrix_solver.cpp b/src/lib/netlist/solver/nld_matrix_solver.cpp
index ff1ed03a633..6494ca6eaee 100644
--- a/src/lib/netlist/solver/nld_matrix_solver.cpp
+++ b/src/lib/netlist/solver/nld_matrix_solver.cpp
@@ -23,16 +23,6 @@ namespace devices
{
}
- void terms_for_net_t::clear()
- {
- m_terms.clear();
- m_connected_net_idx.clear();
- m_gt.clear();
- m_go.clear();
- m_Idr.clear();
- m_connected_net_V.clear();
- }
-
void terms_for_net_t::add(terminal_t *term, int net_other, bool sorted)
{
if (sorted)
@@ -42,23 +32,20 @@ namespace devices
{
plib::container::insert_at(m_terms, i, term);
plib::container::insert_at(m_connected_net_idx, i, net_other);
- plib::container::insert_at(m_gt, i, 0.0);
- plib::container::insert_at(m_go, i, 0.0);
- plib::container::insert_at(m_Idr, i, 0.0);
- plib::container::insert_at(m_connected_net_V, i, nullptr);
return;
}
}
m_terms.push_back(term);
m_connected_net_idx.push_back(net_other);
- m_gt.push_back(0.0);
- m_go.push_back(0.0);
- m_Idr.push_back(0.0);
- m_connected_net_V.push_back(nullptr);
}
void terms_for_net_t::set_pointers()
{
+ m_gt.resize(count(), 0.0);
+ m_go.resize(count(), 0.0);
+ m_Idr.resize(count(), 0.0);
+ m_connected_net_V.resize(count(), nullptr);
+
for (std::size_t i = 0; i < count(); i++)
{
m_terms[i]->set_ptrs(&m_gt[i], &m_go[i], &m_Idr[i]);
@@ -271,11 +258,6 @@ namespace devices
m_terms[k]->set_pointers();
}
- for (auto &rt : m_rails_temp)
- {
- rt->clear(); // no longer needed
- }
-
// free all - no longer needed
m_rails_temp.clear();
diff --git a/src/lib/netlist/solver/nld_matrix_solver.h b/src/lib/netlist/solver/nld_matrix_solver.h
index 6bd00c495ef..71c28236c67 100644
--- a/src/lib/netlist/solver/nld_matrix_solver.h
+++ b/src/lib/netlist/solver/nld_matrix_solver.h
@@ -22,16 +22,18 @@ namespace devices
struct solver_parameters_t
{
- int m_pivot;
+ bool m_pivot;
nl_double m_accuracy;
nl_double m_dynamic_lte;
nl_double m_min_timestep;
nl_double m_max_timestep;
nl_double m_gs_sor;
bool m_dynamic_ts;
- unsigned m_gs_loops;
- unsigned m_nr_loops;
+ std::size_t m_gs_loops;
+ std::size_t m_nr_loops;
netlist_time m_nr_recalc_delay;
+ bool m_use_gabs;
+ bool m_use_linear_prediction;
bool m_log_stats;
};
@@ -63,15 +65,9 @@ namespace devices
const std::size_t term_count = this->count();
const std::size_t railstart = this->m_railstart;
- const FT * const * other_cur_analog = m_connected_net_V.data();
- const FT * p_go = m_go.data();
- const FT * p_gt = m_gt.data();
- const FT * p_Idr = m_Idr.data();
for (std::size_t i = 0; i < railstart; i++)
- {
- *tcr[i] -= p_go[i];
- }
+ *tcr[i] -= m_go[i];
#if 1
FT gtot_t = 0.0;
@@ -79,18 +75,18 @@ namespace devices
for (std::size_t i = 0; i < term_count; i++)
{
- gtot_t += p_gt[i];
- RHS_t += p_Idr[i];
+ gtot_t += m_gt[i];
+ RHS_t += m_Idr[i];
}
// FIXME: Code above is faster than vec_sum - Check this
#else
- auto gtot_t = plib::vec_sum<FT>(term_count, p_gt);
- auto RHS_t = plib::vec_sum<FT>(term_count, p_Idr);
+ auto gtot_t = plib::vec_sum<FT>(term_count, m_gt);
+ auto RHS_t = plib::vec_sum<FT>(term_count, m_Idr);
#endif
for (std::size_t i = railstart; i < term_count; i++)
{
- RHS_t += (/*m_Idr[i]*/ + p_go[i] * *other_cur_analog[i]);
+ RHS_t += (/*m_Idr[i]*/ + m_go[i] * *m_connected_net_V[i]);
}
RHS = RHS_t;
diff --git a/src/lib/netlist/solver/nld_ms_gmres.h b/src/lib/netlist/solver/nld_ms_gmres.h
index dcb3726f5f2..e8963578452 100644
--- a/src/lib/netlist/solver/nld_ms_gmres.h
+++ b/src/lib/netlist/solver/nld_ms_gmres.h
@@ -117,11 +117,10 @@ namespace devices
this->m_new_V[k] = this->m_nets[k]->Q_Analog();
}
-
const float_type accuracy = this->m_params.m_accuracy;
- const std::size_t iter = std::max(1u, this->m_params.m_gs_loops);
- std::size_t gsl = m_gmres.solve(m_ops, this->m_new_V, RHS, iter, accuracy);
+ auto iter = std::max(plib::constants<std::size_t>::one(), this->m_params.m_gs_loops);
+ auto gsl = m_gmres.solve(m_ops, this->m_new_V, RHS, iter, accuracy);
this->m_iterative_total += gsl;
this->m_stat_calculations++;
diff --git a/src/lib/netlist/solver/nld_ms_sor.h b/src/lib/netlist/solver/nld_ms_sor.h
index 5dfc395963a..a1893644084 100644
--- a/src/lib/netlist/solver/nld_ms_sor.h
+++ b/src/lib/netlist/solver/nld_ms_sor.h
@@ -103,7 +103,7 @@ unsigned matrix_solver_SOR_t<FT, SIZE>::vsolve_non_dynamic(const bool newton_rap
RHS[k] = RHS_t;
- if (USE_GABS)
+ if (this->m_params.m_use_gabs)
{
for (std::size_t i = 0; i < term_count; i++)
gabs_t = gabs_t + std::abs(go[i]);
diff --git a/src/lib/netlist/solver/nld_ms_sor_mat.h b/src/lib/netlist/solver/nld_ms_sor_mat.h
index 0bb756c05f5..df4409ca5e9 100644
--- a/src/lib/netlist/solver/nld_ms_sor_mat.h
+++ b/src/lib/netlist/solver/nld_ms_sor_mat.h
@@ -72,7 +72,7 @@ float_type matrix_solver_SOR_mat_t<m_N, storage_N>::vsolve()
* enable linear prediction on first newton pass
*/
- if (USE_LINEAR_PREDICTION)
+ if (this->m_params->use_linear_prediction)
for (unsigned k = 0; k < this->size(); k++)
{
this->m_last_V[k] = this->m_nets[k]->m_cur_Analog;
@@ -86,7 +86,7 @@ float_type matrix_solver_SOR_mat_t<m_N, storage_N>::vsolve()
this->solve_base(this);
- if (USE_LINEAR_PREDICTION)
+ if (this->m_params->use_linear_prediction)
{
float_type sq = 0;
float_type sqo = 0;
@@ -183,7 +183,7 @@ unsigned matrix_solver_SOR_mat_t<FT, SIZE>::vsolve_non_dynamic(const bool newton
Idrive = Idrive + this->A(k,p[i]) * this->m_new_V[p[i]];
FT w = m_omega / this->A(k,k);
- if (USE_GABS)
+ if (this->m_params.m_use_gabs)
{
FT gabs_t = 0.0;
for (std::size_t i = 0; i < e; i++)
diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp
index 64fb7c93998..be008a21706 100644
--- a/src/lib/netlist/solver/nld_solver.cpp
+++ b/src/lib/netlist/solver/nld_solver.cpp
@@ -262,6 +262,10 @@ void NETLIB_NAME(solver)::post_start()
m_params.m_dynamic_ts = (m_dynamic_ts() == 1 ? true : false);
m_params.m_max_timestep = netlist_time::from_double(1.0 / m_freq()).as_double();
+ m_params.m_use_gabs = m_use_gabs();
+ m_params.m_use_linear_prediction = m_use_linear_prediction();
+
+
if (m_params.m_dynamic_ts)
{
m_params.m_max_timestep *= 1;//NL_FCONST(1000.0);
diff --git a/src/lib/netlist/solver/nld_solver.h b/src/lib/netlist/solver/nld_solver.h
index 164b7663f98..646271e0ebd 100644
--- a/src/lib/netlist/solver/nld_solver.h
+++ b/src/lib/netlist/solver/nld_solver.h
@@ -57,6 +57,10 @@ NETLIB_OBJECT(solver)
, m_dynamic_lte(*this, "DYNAMIC_LTE", 1e-5) // diff/timestep
, m_dynamic_min_ts(*this, "DYNAMIC_MIN_TIMESTEP", 1e-6) // nl_double timestep resolution
+ /* special */
+ , m_use_gabs(*this, "USE_GABS", true)
+ , m_use_linear_prediction(*this, "USE_LINEAR_PREDICTION", false) // // savings are eaten up by effort
+
, m_log_stats(*this, "LOG_STATS", true) // log statistics on shutdown
, m_params()
{
@@ -94,6 +98,9 @@ private:
param_double_t m_dynamic_lte;
param_double_t m_dynamic_min_ts;
+ param_logic_t m_use_gabs;
+ param_logic_t m_use_linear_prediction;
+
param_logic_t m_log_stats;
std::vector<poolptr<matrix_solver_t>> m_mat_solvers;