summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/solver/nld_matrix_solver.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/solver/nld_matrix_solver.h')
-rw-r--r--src/lib/netlist/solver/nld_matrix_solver.h20
1 files changed, 14 insertions, 6 deletions
diff --git a/src/lib/netlist/solver/nld_matrix_solver.h b/src/lib/netlist/solver/nld_matrix_solver.h
index e6ba72d9717..cd785db9cba 100644
--- a/src/lib/netlist/solver/nld_matrix_solver.h
+++ b/src/lib/netlist/solver/nld_matrix_solver.h
@@ -110,12 +110,14 @@ class proxied_analog_output_t : public analog_output_t
{
public:
- proxied_analog_output_t(core_device_t &dev, const pstring &aname)
+ proxied_analog_output_t(core_device_t &dev, const pstring &aname, analog_net_t *pnet)
: analog_output_t(dev, aname)
- , m_proxied_net(nullptr)
+ , m_proxied_net(pnet)
{ }
virtual ~proxied_analog_output_t();
+ analog_net_t *proxied_net() const { return m_proxied_net;}
+private:
analog_net_t *m_proxied_net; // only for proxy nets in analog input logic
};
@@ -129,7 +131,9 @@ public:
{
NOSORT,
ASCENDING,
- DESCENDING
+ DESCENDING,
+ PREFER_IDENTITY_TOP_LEFT,
+ PREFER_BAND_MATRIX
};
virtual ~matrix_solver_t() override;
@@ -162,6 +166,8 @@ public:
public:
int get_net_idx(detail::net_t *net);
+ std::pair<int, int> get_left_right_of_diag(std::size_t row, std::size_t diag);
+ double get_weight_around_diag(std::size_t row, std::size_t diag);
virtual void log_stats();
@@ -176,7 +182,9 @@ public:
protected:
matrix_solver_t(netlist_base_t &anetlist, const pstring &name,
- const eSortType sort, const solver_parameters_t *params);
+ eSortType sort, const solver_parameters_t *params);
+
+ void sort_terms(eSortType sort);
void setup_base(analog_net_t::list_t &nets);
void update_dynamic();
@@ -259,7 +267,7 @@ void matrix_solver_t::build_LE_A(T &child)
typedef typename T::float_type float_type;
static_assert(std::is_base_of<matrix_solver_t, T>::value, "T must derive from matrix_solver_t");
- const std::size_t iN = child.N();
+ const std::size_t iN = child.size();
for (std::size_t k = 0; k < iN; k++)
{
terms_for_net_t *terms = m_terms[k].get();
@@ -294,7 +302,7 @@ void matrix_solver_t::build_LE_RHS(T &child)
static_assert(std::is_base_of<matrix_solver_t, T>::value, "T must derive from matrix_solver_t");
typedef typename T::float_type float_type;
- const std::size_t iN = child.N();
+ const std::size_t iN = child.size();
for (std::size_t k = 0; k < iN; k++)
{
float_type rhsk_a = 0.0;