summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/solver/nld_matrix_solver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/solver/nld_matrix_solver.cpp')
-rw-r--r--src/lib/netlist/solver/nld_matrix_solver.cpp34
1 files changed, 14 insertions, 20 deletions
diff --git a/src/lib/netlist/solver/nld_matrix_solver.cpp b/src/lib/netlist/solver/nld_matrix_solver.cpp
index cd2e8eacc7e..b741259c49e 100644
--- a/src/lib/netlist/solver/nld_matrix_solver.cpp
+++ b/src/lib/netlist/solver/nld_matrix_solver.cpp
@@ -86,7 +86,7 @@ namespace netlist::solver
m_main_solver.reschedule(this, ts);
}
- void matrix_solver_t::setup_base(setup_t &setup, const net_list_t &nets)
+ void matrix_solver_t::setup_base([[maybe_unused]] setup_t &setup, const net_list_t &nets)
{
log().debug("New solver setup\n");
std::vector<core_device_t *> step_devices;
@@ -102,14 +102,19 @@ namespace netlist::solver
for (std::size_t k = 0; k < nets.size(); k++)
{
+ std::vector<detail::core_terminal_t *> temp;
+
analog_net_t &net = *nets[k];
- log().debug("adding net with {1} populated connections\n", setup.nlstate().core_terms(net).size());
+ // FIXME: add size() to list
+ // log().debug("adding net with {1} populated connections\n", net.core_terms().size());
net.set_solver(this);
- for (auto &p : setup.nlstate().core_terms(net))
+ for (detail::core_terminal_t * p : net.core_terms_copy())
{
+ nl_assert_always(&p->net() == &net, "Net integrity violated");
+
log().debug("{1} {2} {3}\n", p->name(), net.name(), net.is_rail_net());
switch (p->type())
{
@@ -122,6 +127,7 @@ namespace netlist::solver
dynamic_devices.push_back(&p->device());
{
auto *pterm = dynamic_cast<terminal_t *>(p);
+ nl_assert(pterm != nullptr);
add_term(k, pterm);
}
log().debug("Added terminal {1}\n", p->name());
@@ -139,12 +145,13 @@ namespace netlist::solver
if (net_proxy_output == nullptr)
{
pstring new_name(this->name() + "." + pstring(plib::pfmt("m{1}")(m_inputs.size())));
- nl_assert(p->net().is_analog());
+ nl_assert_always(net.is_analog(), "Net is not an analog net");
auto net_proxy_output_u = state().make_pool_object<proxied_analog_output_t>(*this, new_name, &dynamic_cast<analog_net_t &>(p->net()));
net_proxy_output = net_proxy_output_u.get();
m_inputs.emplace_back(std::move(net_proxy_output_u));
}
- setup.add_terminal(net_proxy_output->net(), *p);
+ net.remove_terminal(*p);
+ net_proxy_output->net().add_terminal(*p);
// FIXME: repeated calling - kind of brute force
net_proxy_output->net().rebuild_list();
log().debug("Added input {1}", net_proxy_output->name());
@@ -155,6 +162,7 @@ namespace netlist::solver
throw nl_exception(MF_UNHANDLED_ELEMENT_1_FOUND(p->name()));
}
}
+ net.rebuild_list();
}
for (auto &d : step_devices)
m_step_funcs.emplace_back(nl_delegate_ts(&core_device_t::time_step, d));
@@ -167,7 +175,7 @@ namespace netlist::solver
/// @param sort Sort algorithm to use.
///
/// Sort in descending order by number of connected matrix voltages.
- ///The idea is, that for Gauss-Seidel algorithm the first voltage computed
+ /// The idea is, that for Gauss-Seidel algorithm the first voltage computed
/// depends on the greatest number of previous voltages thus taking into
/// account the maximum amount of information.
///
@@ -427,20 +435,6 @@ namespace netlist::solver
inp->push(inp->proxied_net()->Q_Analog());
}
- bool matrix_solver_t::updates_net(const analog_net_t *net) const noexcept
- {
- if (net != nullptr)
- {
- for (const auto &t : m_terms )
- if (t.is_net(net))
- return true;
- for (const auto &inp : m_inputs)
- if (&inp->net() == net)
- return true;
- }
- return false;
- }
-
void matrix_solver_t::update_dynamic() noexcept
{
// update all non-linear devices