summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/solver
diff options
context:
space:
mode:
author couriersud <couriersud@arcor.de>2016-03-05 17:11:04 +0100
committer couriersud <couriersud@arcor.de>2016-03-14 20:24:29 +0100
commit41c8a9f6fa49b10c021196463adc654ecce25790 (patch)
tree2e59db2aa4d0730711e7e0a9541905b2f6380479 /src/lib/netlist/solver
parent0e48eb2a4392df8dd020f42432d90f614d73c6b3 (diff)
netlist updates:
- First steps to move towards c++11. - Base plist on std::vector - Replace pstack with std::stack - Remove pnamed_list - use c++ "for each" in a number of places - Fixed two "time bombs" [couriersud]
Diffstat (limited to 'src/lib/netlist/solver')
-rw-r--r--src/lib/netlist/solver/nld_ms_direct.h12
-rw-r--r--src/lib/netlist/solver/nld_ms_direct_lu.h2
-rw-r--r--src/lib/netlist/solver/nld_ms_gmres.h2
-rw-r--r--src/lib/netlist/solver/nld_solver.cpp70
4 files changed, 41 insertions, 45 deletions
diff --git a/src/lib/netlist/solver/nld_ms_direct.h b/src/lib/netlist/solver/nld_ms_direct.h
index 8bb578ec6cd..ecc3cb19c3d 100644
--- a/src/lib/netlist/solver/nld_ms_direct.h
+++ b/src/lib/netlist/solver/nld_ms_direct.h
@@ -206,8 +206,8 @@ ATTR_COLD void matrix_solver_direct_t<m_N, _storage_N>::vsetup(analog_net_t::lis
{
if ((m_terms[i]->m_railstart - m_terms[i+1]->m_railstart) * sort_order < 0)
{
- std::swap(m_terms[i],m_terms[i+1]);
- m_nets.swap(i, i+1);
+ std::swap(m_terms[i], m_terms[i+1]);
+ std::swap(m_nets[i], m_nets[i+1]);
}
}
@@ -253,14 +253,14 @@ ATTR_COLD void matrix_solver_direct_t<m_N, _storage_N>::vsetup(analog_net_t::lis
for (unsigned i = 0; i < t->m_railstart; i++)
{
if (!t->m_nzrd.contains(other[i]) && other[i] >= (int) (k + 1))
- t->m_nzrd.add(other[i]);
+ t->m_nzrd.push_back(other[i]);
if (!t->m_nz.contains(other[i]))
- t->m_nz.add(other[i]);
+ t->m_nz.push_back(other[i]);
}
}
psort_list(t->m_nzrd);
- t->m_nz.add(k); // add diagonal
+ t->m_nz.push_back(k); // add diagonal
psort_list(t->m_nz);
}
@@ -283,7 +283,7 @@ ATTR_COLD void matrix_solver_direct_t<m_N, _storage_N>::vsetup(analog_net_t::lis
if (touched[row][k])
{
if (!m_terms[k]->m_nzbd.contains(row))
- m_terms[k]->m_nzbd.add(row);
+ m_terms[k]->m_nzbd.push_back(row);
for (unsigned col = k; col < N(); col++)
if (touched[k][col])
touched[row][col] = true;
diff --git a/src/lib/netlist/solver/nld_ms_direct_lu.h b/src/lib/netlist/solver/nld_ms_direct_lu.h
index 877e0b56cd8..5af166cfb84 100644
--- a/src/lib/netlist/solver/nld_ms_direct_lu.h
+++ b/src/lib/netlist/solver/nld_ms_direct_lu.h
@@ -287,7 +287,7 @@ ATTR_COLD void matrix_solver_direct_t<m_N, _storage_N>::vsetup(analog_net_t::lis
if ((m_terms[i]->m_railstart - m_terms[i+1]->m_railstart) * sort_order < 0)
{
std::swap(m_terms[i],m_terms[i+1]);
- m_nets.swap(i, i+1);
+ std::swap(m_nets[i], m_nets[i+1]);
}
}
diff --git a/src/lib/netlist/solver/nld_ms_gmres.h b/src/lib/netlist/solver/nld_ms_gmres.h
index 6124f7e527d..66649d5375b 100644
--- a/src/lib/netlist/solver/nld_ms_gmres.h
+++ b/src/lib/netlist/solver/nld_ms_gmres.h
@@ -114,7 +114,7 @@ void matrix_solver_GMRES_t<m_N, _storage_N>::vsetup(analog_net_t::list_t &nets)
for (unsigned i = mat.ia[k]; i<nz; i++)
if (this->m_terms[k]->net_other()[j] == (int) mat.ja[i])
{
- m_term_cr[k].add(i);
+ m_term_cr[k].push_back(i);
break;
}
nl_assert(m_term_cr[k].size() == this->m_terms[k]->m_railstart);
diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp
index b862e031f3d..75d320e15cd 100644
--- a/src/lib/netlist/solver/nld_solver.cpp
+++ b/src/lib/netlist/solver/nld_solver.cpp
@@ -9,8 +9,11 @@
* the vectorizations fast-math enables pretty expensive
*/
+#pragma GCC optimize "-ffast-math"
+#pragma GCC optimize "-fstrict-aliasing"
#if 0
#pragma GCC optimize "-ffast-math"
+#pragma GCC optimize "-fstrict-aliasing"
//#pragma GCC optimize "-ftree-parallelize-loops=4"
#pragma GCC optimize "-funroll-loops"
#pragma GCC optimize "-funswitch-loops"
@@ -54,21 +57,21 @@ ATTR_COLD void terms_t::add(terminal_t *term, int net_other, bool sorted)
{
if (m_net_other[i] > net_other)
{
- m_term.insert_at(term, i);
- m_net_other.insert_at(net_other, i);
- m_gt.insert_at(0.0, i);
- m_go.insert_at(0.0, i);
- m_Idr.insert_at(0.0, i);
- m_other_curanalog.insert_at(NULL, i);
+ m_term.insert_at(i, term);
+ m_net_other.insert_at(i, net_other);
+ m_gt.insert_at(i, 0.0);
+ m_go.insert_at(i, 0.0);
+ m_Idr.insert_at(i, 0.0);
+ m_other_curanalog.insert_at(i, NULL);
return;
}
}
- m_term.add(term);
- m_net_other.add(net_other);
- m_gt.add(0.0);
- m_go.add(0.0);
- m_Idr.add(0.0);
- m_other_curanalog.add(NULL);
+ m_term.push_back(term);
+ m_net_other.push_back(net_other);
+ m_gt.push_back(0.0);
+ m_go.push_back(0.0);
+ m_Idr.push_back(0.0);
+ m_other_curanalog.push_back(NULL);
}
ATTR_COLD void terms_t::set_pointers()
@@ -109,10 +112,8 @@ ATTR_COLD void matrix_solver_t::setup(analog_net_t::list_t &nets)
m_nets.clear();
- for (std::size_t k = 0; k < nets.size(); k++)
- {
- m_nets.add(nets[k]);
- }
+ for (auto & net : nets)
+ m_nets.push_back(net);
for (std::size_t k = 0; k < nets.size(); k++)
{
@@ -122,9 +123,8 @@ ATTR_COLD void matrix_solver_t::setup(analog_net_t::list_t &nets)
net->m_solver = this;
- for (std::size_t i = 0; i < net->m_core_terms.size(); i++)
+ for (core_terminal_t *p : net->m_core_terms)
{
- core_terminal_t *p = net->m_core_terms[i];
log().debug("{1} {2} {3}\n", p->name(), net->name(), (int) net->isRailNet());
switch (p->type())
{
@@ -133,7 +133,7 @@ ATTR_COLD void matrix_solver_t::setup(analog_net_t::list_t &nets)
{
case device_t::CAPACITOR:
if (!m_step_devices.contains(&p->device()))
- m_step_devices.add(&p->device());
+ m_step_devices.push_back(&p->device());
break;
case device_t::BJT_EB:
case device_t::DIODE:
@@ -141,7 +141,7 @@ ATTR_COLD void matrix_solver_t::setup(analog_net_t::list_t &nets)
case device_t::BJT_SWITCH:
log().debug("found BJT/Diode/LVCCS\n");
if (!m_dynamic_devices.contains(&p->device()))
- m_dynamic_devices.add(&p->device());
+ m_dynamic_devices.push_back(&p->device());
break;
default:
break;
@@ -155,10 +155,10 @@ ATTR_COLD void matrix_solver_t::setup(analog_net_t::list_t &nets)
case terminal_t::INPUT:
{
analog_output_t *net_proxy_output = NULL;
- for (std::size_t j = 0; j < m_inps.size(); j++)
- if (m_inps[j]->m_proxied_net == &p->net().as_analog())
+ for (auto & input : m_inps)
+ if (input->m_proxied_net == &p->net().as_analog())
{
- net_proxy_output = m_inps[j];
+ net_proxy_output = input;
break;
}
@@ -166,7 +166,7 @@ ATTR_COLD void matrix_solver_t::setup(analog_net_t::list_t &nets)
{
net_proxy_output = palloc(analog_output_t);
net_proxy_output->init_object(*this, this->name() + "." + pfmt("m{1}")(m_inps.size()));
- m_inps.add(net_proxy_output);
+ m_inps.push_back(net_proxy_output);
net_proxy_output->m_proxied_net = &p->net().as_analog();
}
net_proxy_output->net().register_con(*p);
@@ -399,9 +399,9 @@ NETLIB_UPDATE(solver)
if (m_params.m_dynamic)
return;
- const std::size_t t_cnt = m_mat_solvers.size();
#if HAS_OPENMP && USE_OPENMP
+ const std::size_t t_cnt = m_mat_solvers.size();
if (m_parallel.Value())
{
omp_set_num_threads(3);
@@ -425,14 +425,10 @@ NETLIB_UPDATE(solver)
ATTR_UNUSED const nl_double ts = m_mat_solvers[i]->solve();
}
#else
- for (std::size_t i = 0; i < t_cnt; i++)
- {
- if (m_mat_solvers[i]->is_timestep())
- {
+ for (auto & solver : m_mat_solvers)
+ if (solver->is_timestep())
// Ignore return value
- ATTR_UNUSED const nl_double ts = m_mat_solvers[i]->solve();
- }
- }
+ ATTR_UNUSED const nl_double ts = solver->solve();
#endif
/* step circuit */
@@ -518,13 +514,13 @@ ATTR_COLD void NETLIB_NAME(solver)::post_start()
netlist().log().verbose("Scanning net groups ...");
// determine net groups
- for (std::size_t i=0; i<netlist().m_nets.size(); i++)
+ for (auto & net : netlist().m_nets)
{
- netlist().log().debug("processing {1}\n", netlist().m_nets[i]->name());
- if (!netlist().m_nets[i]->isRailNet())
+ netlist().log().debug("processing {1}\n", net->name());
+ if (!net->isRailNet())
{
netlist().log().debug(" ==> not a rail net\n");
- analog_net_t *n = &netlist().m_nets[i]->as_analog();
+ analog_net_t *n = &net->as_analog();
if (!n->already_processed(groups, cur_group))
{
cur_group++;
@@ -621,7 +617,7 @@ ATTR_COLD void NETLIB_NAME(solver)::post_start()
ms->vsetup(groups[i]);
- m_mat_solvers.add(ms);
+ m_mat_solvers.push_back(ms);
netlist().log().verbose("Solver {1}", ms->name());
netlist().log().verbose(" # {1} ==> {2} nets", i, groups[i].size());