diff options
Diffstat (limited to 'src/lib/netlist/solver/nld_matrix_solver.cpp')
-rw-r--r-- | src/lib/netlist/solver/nld_matrix_solver.cpp | 34 |
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 |