void matrix_solver_t::solve_base() { m_stat_vsolver_calls++; if (has_dynamic_devices()) { unsigned this_resched; unsigned newton_loops = 0; do { update_dynamic(); // Gauss-Seidel will revert to Gaussian elemination if steps exceeded. this_resched = this->vsolve_non_dynamic(true); newton_loops++; } while (this_resched > 1 && newton_loops < m_params.m_nr_loops); m_stat_newton_raphson += newton_loops; // reschedule .... if (this_resched > 1 && !m_Q_sync.net().is_queued()) { log().warning("NEWTON_LOOPS exceeded on net {1}... reschedule", this->name()); m_Q_sync.net().toggle_new_Q(); m_Q_sync.net().reschedule_in_queue(m_params.m_nt_sync_delay); } } else { this->vsolve_non_dynamic(false); } }
void matrix_solver_t::solve_base(C *p) { m_stat_vsolver_calls++; if (is_dynamic()) { int this_resched; int newton_loops = 0; do { update_dynamic(); // Gauss-Seidel will revert to Gaussian elemination if steps exceeded. this_resched = p->vsolve_non_dynamic(true); newton_loops++; } while (this_resched > 1 && newton_loops < m_params.m_nr_loops); m_stat_newton_raphson += newton_loops; // reschedule .... if (this_resched > 1 && !m_Q_sync.net().is_queued()) { netlist().warning("NEWTON_LOOPS exceeded on net %s... reschedule", this->name().cstr()); m_Q_sync.net().reschedule_in_queue(m_params.m_nt_sync_delay); } } else { p->vsolve_non_dynamic(false); } }