Previous 199869 Revisions Next

r30708 Thursday 29th May, 2014 at 14:03:07 UTC by Couriersud
Further work on vectorization. Works but not yet finished.
[src/emu/netlist]nl_base.h plists.h
[src/emu/netlist/analog]nld_solver.c nld_solver.h

trunk/src/emu/netlist/plists.h
r30707r30708
6464       m_list = NULL;
6565   }
6666
67   ATTR_HOT inline operator _ListClass *  () { return m_list; }
68    ATTR_HOT inline operator const _ListClass * const () { return m_list; }
69
70    /* using the [] operator will not allow gcc to vectorize code because
71     * basically a pointer is returned.
72     * array works around this.
73     */
74
75    ATTR_HOT inline _ListClass *array() { return m_list; }
76
77    ATTR_HOT inline _ListClass& operator[](const int index) { return m_list[index]; }
78    ATTR_HOT inline const _ListClass& operator[](const int index) const { return m_list[index]; }
79
6780   ATTR_HOT inline void add(const _ListClass &elem)
6881   {
6982      if (m_count >= m_num_elements){
r30707r30708
140153      clear();
141154   }
142155
143   ATTR_HOT inline _ListClass& operator[](const int & index) { return m_list[index]; }
144   ATTR_HOT inline const _ListClass& operator[](const int & index) const { return m_list[index]; }
145
146156private:
147157    ATTR_HOT inline void resize(const int new_size)
148158    {
trunk/src/emu/netlist/nl_base.h
r30707r30708
424424NETLIST_SAVE_TYPE(netlist_core_terminal_t::state_e, DT_INT);
425425
426426
427class netlist_terminal_t : public netlist_core_terminal_t
427class ATTR_ALIGN netlist_terminal_t : public netlist_core_terminal_t
428428{
429429   NETLIST_PREVENT_COPYING(netlist_terminal_t)
430430public:
trunk/src/emu/netlist/analog/nld_solver.c
r30707r30708
4141
4242   for (int k = 0; k < nets.count(); k++)
4343   {
44        m_nets.add(net_entry(nets[k]));
44        m_nets.add(nets[k]);
4545    }
4646
4747   for (int k = 0; k < nets.count(); k++)
r30707r30708
8080                  netlist_terminal_t *pterm = dynamic_cast<netlist_terminal_t *>(p);
8181                  // for gauss seidel
8282                     pterm->m_new_analog_ptr = &pterm->m_otherterm->net().as_analog().m_new_Analog;
83
83#if 0
8484                  if (pterm->m_otherterm->net().isRailNet())
8585                     m_nets[k].m_rails.add(pterm);
8686                  else
8787                      m_nets[k].m_terms.add(pterm);
88#endif
89                  add_term(k, pterm);
8890               }
8991               NL_VERBOSE_OUT(("Added terminal\n"));
9092               break;
r30707r30708
139141#else
140142        for (int k = 0; k < N(); k++)
141143        {
142            netlist_analog_net_t *n = m_nets[k].m_net;
144            netlist_analog_net_t *n = m_nets[k];
143145#endif
144146            double DD_n = (n->m_cur_Analog - n->m_last_Analog);
145147
r30707r30708
190192#if 1
191193    for (int k = 0; k < m_nets.count(); k++)
192194    {
193        netlist_analog_net_t *p= m_nets[k].m_net;
195        netlist_analog_net_t *p= m_nets[k];
194196        p->m_last_Analog = p->m_cur_Analog;
195197    }
196198#else
r30707r30708
323325ATTR_COLD int netlist_matrix_solver_t::get_net_idx(netlist_net_t *net)
324326{
325327   for (int k = 0; k < m_nets.count(); k++)
326      if (m_nets[k].m_net == net)
328      if (m_nets[k] == net)
327329         return k;
328330   return -1;
329331}
330332
331333template <int m_N, int _storage_N>
334ATTR_COLD void netlist_matrix_solver_direct_t<m_N, _storage_N>::add_term(int k, netlist_terminal_t *term)
335{
336    if (term->m_otherterm->net().isRailNet())
337    {
338        //m_nets[k].m_rails.add(pterm);
339        m_rails[k].add(terms_t(term, -1));
340    }
341    else
342    {
343        int ot = get_net_idx(&term->m_otherterm->net());
344        if (ot>=0)
345        {
346            m_terms[k].add(terms_t(term, ot));
347            SOLVER_VERBOSE_OUT(("Net %d Term %s %f %f\n", k, terms[i]->name().cstr(), terms[i]->m_gt, terms[i]->m_go));
348        }
349        /* Should this be allowed ? */
350        else // if (ot<0)
351        {
352           m_rails[k].add(terms_t(term, ot));
353           netlist().error("found term with missing othernet %s\n", term->name().cstr());
354        }
355    }
356}
357
358
359template <int m_N, int _storage_N>
332360ATTR_COLD void netlist_matrix_solver_direct_t<m_N, _storage_N>::vsetup(netlist_analog_net_t::list_t &nets)
333361{
334362    m_dim = nets.count();
335   netlist_matrix_solver_t::setup(nets);
336363
337   m_terms.clear();
338   m_rail_start = 0;
364    for (int k = 0; k < N(); k++)
365    {
366        m_terms[k].clear();
367        m_rails[k].clear();
368    }
369
370    netlist_matrix_solver_t::setup(nets);
371
372#if 0
339373   for (int k = 0; k < N(); k++)
340374   {
341375      const netlist_terminal_t::list_t &terms = m_nets[k].m_terms;
r30707r30708
344378         int ot = get_net_idx(&terms[i]->m_otherterm->net());
345379         if (ot>=0)
346380         {
347             m_terms.add(terms_t(terms[i], k, ot));
381             m_terms[k].add(terms_t(terms[i], ot));
348382            SOLVER_VERBOSE_OUT(("Net %d Term %s %f %f\n", k, terms[i]->name().cstr(), terms[i]->m_gt, terms[i]->m_go));
349383         }
350384      }
351385   }
352   m_rail_start = m_terms.count();
386
387    /* Should this be allowed ? */
353388   for (int k = 0; k < N(); k++)
354389   {
355390      const netlist_terminal_t::list_t &terms = m_nets[k].m_terms;
356      const netlist_terminal_t::list_t &rails = m_nets[k].m_rails;
357391      for (int i = 0; i < terms.count(); i++)
358392      {
359393            int ot = get_net_idx(&terms[i]->m_otherterm->net());
360394         if (ot<0)
361395         {
362                m_terms.add(terms_t(terms[i], k, ot));
396                m_rails[k].add(terms_t(terms[i], ot));
363397            netlist().warning("found term with missing othernet %s\n", terms[i]->name().cstr());
364398         }
365399      }
400    }
401
402
403   for (int k = 0; k < N(); k++)
404   {
405      const netlist_terminal_t::list_t &rails = m_nets[k].m_rails;
366406      for (int i = 0; i < rails.count(); i++)
367407      {
368            m_terms.add(terms_t(rails[i], k, -1));
408            m_rails[k].add(terms_t(rails[i], -1));
369409         SOLVER_VERBOSE_OUT(("Net %d Rail %s %f %f\n", k, rails[i]->name().cstr(), rails[i]->m_gt, rails[i]->m_go));
370410      }
371411   }
412#endif
372413}
373414
374415template <int m_N, int _storage_N>
r30707r30708
378419        for (int i=0; i < _storage_N; i++)
379420            m_A[k][i] = 0.0;
380421
381    for (int k=0; k < _storage_N; k++)
382        m_RHS[k] = 0.0;
383#if 0
422    for (int k = 0; k < N(); k++)
423   {
424        double rhsk = 0.0;
425        double akk  = 0.0;
426        const int terms_count = m_terms[k].count();
427        const terms_t *terms = m_terms[k];
384428
385   for (int i = 0; i < m_term_num; i++)
386   {
387      terms_t &t = m_terms[i];
388      m_RHS[t.m_net_this] += t.m_term->m_Idr;
389      m_A[t.m_net_this][t.m_net_this] += t.m_term->m_gt;
390      if (t.m_net_other >= 0)
429        for (int i = 0; i < terms_count; i++)
391430      {
392         //m_A[t.net_other][t.net_other] += t.term->m_otherterm->m_gt;
393         m_A[t.m_net_this][t.m_net_other] += -t.m_term->m_go;
394         //m_A[t.net_other][t.net_this] += -t.term->m_otherterm->m_go;
431            //printf("A %d %d %s %f %f\n",t.net_this, t.net_other, t.term->name().cstr(), t.term->m_gt, t.term->m_go);
432
433            rhsk = rhsk + terms[i].m_term->m_Idr;
434            akk = akk + terms[i].m_term->m_gt;
435            m_A[k][terms[i].m_net_other] += -terms[i].m_term->m_go;
395436      }
396      else
397         m_RHS[t.m_net_this] += t.m_term->m_go * t.m_term->m_otherterm->net().as_analog().Q_Analog();
398   }
399#else
400   for (int i = 0; i < m_rail_start; i++)
401   {
402      const terms_t &t = m_terms[i];
403      //printf("A %d %d %s %f %f\n",t.net_this, t.net_other, t.term->name().cstr(), t.term->m_gt, t.term->m_go);
404437
405      m_RHS[t.m_net_this] += t.m_term->m_Idr;
406      m_A[t.m_net_this][t.m_net_this] += t.m_term->m_gt;
407      m_A[t.m_net_this][t.m_net_other] += -t.m_term->m_go;
408   }
409   for (int i = m_rail_start; i < m_terms.count(); i++)
410   {
411      const terms_t &t = m_terms[i];
438        const int rails_count = m_rails[k].count();
439        const terms_t *rails = m_rails[k];
412440
413      m_RHS[t.m_net_this] += t.m_term->m_Idr;
414      m_A[t.m_net_this][t.m_net_this] += t.m_term->m_gt;
415      m_RHS[t.m_net_this] += t.m_term->m_go * t.m_term->m_otherterm->net().as_analog().Q_Analog();
416   }
417#endif
441        for (int i = 0; i < rails_count; i++)
442        {
443            const terms_t t = rails[i];
444
445            rhsk = rhsk + t.m_term->m_Idr + t.m_term->m_go * t.m_term->m_otherterm->net().as_analog().Q_Analog();
446            akk = akk + t.m_term->m_gt;
447        }
448        m_RHS[k] = rhsk;
449        m_A[k][k] += akk;
450    }
418451}
419452
420453template <int m_N, int _storage_N>
r30707r30708
504537   double cerr2 = 0;
505538   for (int i = 0; i < this->N(); i++)
506539   {
507      const double e = (V[i] - this->m_nets[i].m_net->m_cur_Analog);
540      const double e = (V[i] - this->m_nets[i]->m_cur_Analog);
508541      const double e2 = (m_RHS[i] - this->m_last_RHS[i]);
509542      cerr = (fabs(e) > cerr ? fabs(e) : cerr);
510543        cerr2 = (fabs(e2) > cerr2 ? fabs(e2) : cerr2);
r30707r30708
519552{
520553   for (int i = 0; i < this->N(); i++)
521554   {
522      this->m_nets[i].m_net->m_cur_Analog = this->m_nets[i].m_net->m_new_Analog = V[i];
555      this->m_nets[i]->m_cur_Analog = this->m_nets[i]->m_new_Analog = V[i];
523556   }
524557   if (store_RHS)
525558   {
r30707r30708
569602ATTR_HOT int netlist_matrix_solver_direct1_t::vsolve_non_dynamic()
570603{
571604
572    netlist_analog_net_t *net = m_nets[0].m_net;
605    netlist_analog_net_t *net = m_nets[0];
573606   this->build_LE();
574607   //NL_VERBOSE_OUT(("%f %f\n", new_val, m_RHS[0] / m_A[0][0]);
575608
r30707r30708
646679
647680    for (int k = 0; k < iN; k++)
648681    {
649        new_v[k] = this->m_nets[k].m_net->m_cur_Analog;
682        new_v[k] = this->m_nets[k]->m_cur_Analog;
650683    }
651684    do {
652685        resched = false;
r30707r30708
708741
709742    for (int k = 0; k < iN; k++)
710743    {
711        this->m_nets[k].m_net->m_new_Analog = this->m_nets[k].m_net->m_cur_Analog;
744        this->m_nets[k]->m_new_Analog = this->m_nets[k]->m_cur_Analog;
712745    }
713746
714747   for (int k = 0; k < iN; k++)
r30707r30708
717750      double gabs_t = 0.0;
718751      double RHS_t = 0.0;
719752
720      //const netlist_analog_net_t &net = *this->m_nets[k];
721      const netlist_terminal_t::list_t &terms = this->m_nets[k].m_terms;
722      const netlist_terminal_t::list_t &rails = this->m_nets[k].m_rails;
753        const typename netlist_matrix_solver_direct_t<m_N, _storage_N>::xlist_t &terms = this->m_terms[k];
754        const typename netlist_matrix_solver_direct_t<m_N, _storage_N>::xlist_t &rails = this->m_rails[k];
723755      const int term_count = terms.count();
724756      const int rail_count = rails.count();
725757
726758      for (int i = 0; i < rail_count; i++)
727759      {
728         gtot_t += rails[i]->m_gt;
729         gabs_t += fabs(rails[i]->m_go);
730         RHS_t += rails[i]->m_Idr;
731         RHS_t += rails[i]->m_go * rails[i]->m_otherterm->net().as_analog().Q_Analog();
760          const netlist_terminal_t *rail = rails[i].m_term;
761            gtot_t += rail->m_gt;
762            gabs_t += fabs(rail->m_go);
763            RHS_t += rail->m_Idr;
764            RHS_t += rail->m_go * rail->m_otherterm->net().as_analog().Q_Analog();
732765      }
733766
734767      for (int i = 0; i < term_count; i++)
735768      {
736         gtot_t += terms[i]->m_gt;
737         gabs_t += fabs(terms[i]->m_go);
738         RHS_t += terms[i]->m_Idr;
769            const netlist_terminal_t *term = terms[i].m_term;
770         gtot_t += term->m_gt;
771         gabs_t += fabs(term->m_go);
772         RHS_t += term->m_Idr;
739773      }
740774
741775      gabs_t *= 1.0;
r30707r30708
760794
761795      for (int k = 0; k < iN; k++)
762796      {
763         netlist_analog_net_t & RESTRICT net = *this->m_nets[k].m_net;
764         const netlist_terminal_t::list_t &terms = this->m_nets[k].m_terms;
797         netlist_analog_net_t & RESTRICT net = *this->m_nets[k];
798           const typename netlist_matrix_solver_direct_t<m_N, _storage_N>::xlist_t &terms = this->m_terms[k];
765799         const int term_count = terms.count();
766800         double Idrive = 0;
767801
768802            for (int i = 0; i < term_count; i++)
769                Idrive += terms[i]->m_go * *(terms[i]->m_new_analog_ptr);
803                Idrive += terms[i].m_term->m_go * *(terms[i].m_term->m_new_analog_ptr);
770804
771805            //double new_val = (net->m_cur_Analog * gabs[k] + iIdr) / (gtot[k]);
772806         const double new_val = net.m_new_Analog * one_m_w[k] + (Idrive + RHS[k]) * w[k];
r30707r30708
796830       this->m_calculations++;
797831
798832       for (int k = 0; k < this->N(); k++)
799           this->m_nets[k].m_net->m_cur_Analog = this->m_nets[k].m_net->m_new_Analog;
833           this->m_nets[k]->m_cur_Analog = this->m_nets[k]->m_new_Analog;
800834
801835       return resched_cnt;
802836   }
r30707r30708
906940    }
907941}
908942
943template <int m_N, int _storage_N>
944netlist_matrix_solver_t * NETLIB_NAME(solver)::create_solver(const int gs_threshold, const bool use_specific)
945{
946    if (use_specific && m_N == 1)
947        return new netlist_matrix_solver_direct1_t();
948    else if (use_specific && m_N == 2)
949        return new netlist_matrix_solver_direct2_t();
950    else
951    {
952        if (_storage_N >= gs_threshold)
953            return new netlist_matrix_solver_gauss_seidel_t<m_N,_storage_N>();
954        else
955            return new netlist_matrix_solver_direct_t<m_N, _storage_N>();
956    }
957}
909958
910959ATTR_COLD void NETLIB_NAME(solver)::post_start()
911960{
912961   netlist_analog_net_t::list_t groups[100];
913962   int cur_group = -1;
963   // FIXME: Turn into parameters ...
964   const int gs_threshold = 5;
965   const bool use_specific = true;
914966
915967    m_params.m_accuracy = m_accuracy.Value();
916968    m_params.m_gs_loops = m_gs_loops.Value();
r30707r30708
9561008
9571009      switch (net_count)
9581010      {
959#if 1
9601011         case 1:
961            ms = new netlist_matrix_solver_direct1_t();
1012            ms = create_solver<1,1>(gs_threshold, use_specific);
9621013            break;
9631014         case 2:
964            ms = new netlist_matrix_solver_direct2_t();
1015                ms = create_solver<2,2>(gs_threshold, use_specific);
9651016            break;
9661017         case 3:
967            ms = new netlist_matrix_solver_direct_t<3,3>();
968            //ms = new netlist_matrix_solver_gauss_seidel_t<3,3>();
1018                ms = create_solver<3,3>(gs_threshold, use_specific);
9691019            break;
9701020         case 4:
971            ms = new netlist_matrix_solver_direct_t<4,4>();
972            //ms = new netlist_matrix_solver_gauss_seidel_t<4,4>();
1021                ms = create_solver<4,4>(gs_threshold, use_specific);
9731022            break;
9741023         case 5:
975            ms = new netlist_matrix_solver_direct_t<5,5>();
976            //ms = new netlist_matrix_solver_gauss_seidel_t<5,5>();
1024                ms = create_solver<5,5>(gs_threshold, use_specific);
9771025            break;
9781026         case 6:
979            ms = new netlist_matrix_solver_direct_t<6,6>();
980            //ms = new netlist_matrix_solver_gauss_seidel_t<6,6>();
1027                ms = create_solver<6,6>(gs_threshold, use_specific);
9811028            break;
9821029            case 7:
983                //ms = new netlist_matrix_solver_direct_t<6,6>();
984                ms = new netlist_matrix_solver_gauss_seidel_t<7,7>();
1030                ms = create_solver<7,7>(gs_threshold, use_specific);
9851031                break;
9861032            case 8:
987                //ms = new netlist_matrix_solver_direct_t<6,6>();
988                ms = new netlist_matrix_solver_gauss_seidel_t<8,8>();
1033                ms = create_solver<8,8>(gs_threshold, use_specific);
9891034                break;
990#endif
9911035         default:
9921036            if (net_count <= 16)
9931037            {
994                //ms = new netlist_matrix_solver_direct_t<0,16>();
995               ms = new netlist_matrix_solver_gauss_seidel_t<0,16>();
1038                   ms = create_solver<0,16>(gs_threshold, use_specific);
9961039            }
9971040            else if (net_count <= 32)
9981041            {
999               //ms = new netlist_matrix_solver_direct_t<0,16>();
1000               ms = new netlist_matrix_solver_gauss_seidel_t<0,32>();
1042                   ms = create_solver<0,32>(gs_threshold, use_specific);
10011043            }
10021044            else if (net_count <= 64)
10031045            {
1004               //ms = new netlist_matrix_solver_direct_t<0,16>();
1005               ms = new netlist_matrix_solver_gauss_seidel_t<0,64>();
1046                   ms = create_solver<0,64>(gs_threshold, use_specific);
10061047            }
10071048            else
10081049            {
trunk/src/emu/netlist/analog/nld_solver.h
r30707r30708
99#include "../nl_setup.h"
1010#include "../nl_base.h"
1111
12//#define ATTR_ALIGNED(N) __attribute__((aligned(N)))
13#define ATTR_ALIGNED(N) ATTR_ALIGN
14
1215// ----------------------------------------------------------------------------------------
1316// Macros
1417// ----------------------------------------------------------------------------------------
r30707r30708
3740    netlist_time m_nt_sync_delay;
3841};
3942
40class netlist_matrix_solver_t : public netlist_device_t
43class ATTR_ALIGNED(64) netlist_matrix_solver_t : public netlist_device_t
4144{
4245public:
4346   typedef plinearlist_t<netlist_matrix_solver_t *> list_t;
r30707r30708
6770
6871protected:
6972
70   class net_entry
71   {
72   public:
73       net_entry(netlist_analog_net_t *net) : m_net(net) {}
74        net_entry() : m_net(NULL) {}
75
76        net_entry(const net_entry &rhs)
77        {
78            m_net = rhs.m_net;
79            m_terms = rhs.m_terms;
80            m_rails = rhs.m_rails;
81        }
82
83        net_entry &operator=(const net_entry &rhs)
84        {
85            m_net = rhs.m_net;
86            m_terms = rhs.m_terms;
87            m_rails = rhs.m_rails;
88            return *this;
89        }
90
91       netlist_analog_net_t * RESTRICT m_net;
92       netlist_terminal_t::list_t m_terms;
93       netlist_terminal_t::list_t m_rails;
94   };
95
9673    ATTR_COLD void setup(netlist_analog_net_t::list_t &nets);
9774
9875    // return true if a reschedule is needed ...
9976    ATTR_HOT virtual int vsolve_non_dynamic() = 0;
10077
78    ATTR_COLD virtual void  add_term(int net_idx, netlist_terminal_t *term) = 0;
10179    int m_calculations;
10280
103    plinearlist_t<net_entry> m_nets;
81    plinearlist_t<netlist_analog_net_t *> m_nets;
10482    plinearlist_t<netlist_analog_output_t *> m_inps;
10583
10684private:
r30707r30708
126104};
127105
128106template <int m_N, int _storage_N>
129class netlist_matrix_solver_direct_t: public netlist_matrix_solver_t
107class ATTR_ALIGNED(64) netlist_matrix_solver_direct_t: public netlist_matrix_solver_t
130108{
131109public:
132110
133111   netlist_matrix_solver_direct_t()
134112    : netlist_matrix_solver_t()
135113    , m_dim(0)
136    , m_rail_start(0)
137114    {}
138115
139116   virtual ~netlist_matrix_solver_direct_t() {}
r30707r30708
144121   ATTR_HOT inline const int N() const { if (m_N == 0) return m_dim; else return m_N; }
145122
146123protected:
124    ATTR_COLD virtual void add_term(int net_idx, netlist_terminal_t *term);
125
147126    ATTR_HOT virtual int vsolve_non_dynamic();
148127    ATTR_HOT int solve_non_dynamic();
149128   ATTR_HOT inline void build_LE();
r30707r30708
154133
155134    ATTR_HOT virtual double compute_next_timestep(const double);
156135
157    double m_A[_storage_N][_storage_N];
158    double m_RHS[_storage_N];
159    double m_last_RHS[_storage_N]; // right hand side - contains currents
136    ATTR_ALIGNED(64) double m_A[_storage_N][_storage_N];
137    ATTR_ALIGNED(64) double m_RHS[_storage_N];
138    ATTR_ALIGNED(64) double m_last_RHS[_storage_N]; // right hand side - contains currents
160139
161   struct terms_t{
140   struct ATTR_ALIGNED(64) terms_t{
162141
163       terms_t(netlist_terminal_t *term, int net_this, int net_other)
164       : m_term(term), m_net_this(net_this), m_net_other(net_other)
142        terms_t(netlist_terminal_t *term, int net_other)
143        : m_term(term), m_net_other(net_other)
165144       {}
166145        terms_t()
167        : m_term(NULL), m_net_this(-1), m_net_other(-1)
146        : m_term(NULL), m_net_other(-1)
168147        {}
169148
170        netlist_terminal_t * RESTRICT m_term;
171      int m_net_this;
149        ATTR_ALIGNED(64) netlist_terminal_t ATTR_ALIGNED(64) *  RESTRICT m_term;
172150      int m_net_other;
173151   };
174152
153    typedef plinearlist_t<terms_t> xlist_t;
154    xlist_t m_terms[_storage_N];
155    xlist_t m_rails[_storage_N];
156    plinearlist_t<double> xx[_storage_N];
157
158private:
159
175160   int m_dim;
176   int m_rail_start;
177   plinearlist_t<terms_t> m_terms;
178161};
179162
180163template <int m_N, int _storage_N>
181class netlist_matrix_solver_gauss_seidel_t: public netlist_matrix_solver_direct_t<m_N, _storage_N>
164class ATTR_ALIGNED(64) netlist_matrix_solver_gauss_seidel_t: public netlist_matrix_solver_direct_t<m_N, _storage_N>
182165{
183166public:
184167
r30707r30708
201184
202185};
203186
204class netlist_matrix_solver_direct1_t: public netlist_matrix_solver_direct_t<1,1>
187class ATTR_ALIGNED(64) netlist_matrix_solver_direct1_t: public netlist_matrix_solver_direct_t<1,1>
205188{
206189protected:
207190    ATTR_HOT int vsolve_non_dynamic();
208191private:
209192};
210193
211class netlist_matrix_solver_direct2_t: public netlist_matrix_solver_direct_t<2,2>
194class ATTR_ALIGNED(64) netlist_matrix_solver_direct2_t: public netlist_matrix_solver_direct_t<2,2>
212195{
213196protected:
214197    ATTR_HOT int vsolve_non_dynamic();
215198private:
216199};
217200
218NETLIB_DEVICE_WITH_PARAMS(solver,
219      typedef netlist_core_device_t::list_t dev_list_t;
201class ATTR_ALIGNED(64) NETLIB_NAME(solver) : public netlist_device_t
202{
203public:
204    NETLIB_NAME(solver)()
205    : netlist_device_t()    { }
220206
207    ATTR_COLD virtual ~NETLIB_NAME(solver)();
208
209    ATTR_COLD void post_start();
210
211    ATTR_HOT inline double gmin() { return m_gmin.Value(); }
212
213protected:
214    ATTR_HOT void update();
215    ATTR_HOT void start();
216    ATTR_HOT void reset();
217    ATTR_HOT void update_param();
218
219    //typedef netlist_core_device_t::list_t dev_list_t;
220
221221        netlist_ttl_input_t m_fb_step;
222222        netlist_ttl_output_t m_Q_step;
223223
r30707r30708
234234      netlist_param_int_t m_parallel;
235235
236236      netlist_matrix_solver_t::list_t m_mat_solvers;
237public:
237private:
238238
239      ATTR_COLD virtual ~NETLIB_NAME(solver)();
239    netlist_solver_parameters_t m_params;
240240
241      ATTR_COLD void post_start();
241    template <int m_N, int _storage_N>
242    netlist_matrix_solver_t *create_solver(int gs_threshold, bool use_specific);
243};
242244
243      ATTR_HOT inline double gmin() { return m_gmin.Value(); }
244245
245private:
246       netlist_solver_parameters_t m_params;
247);
248246
249
250247#endif /* NLD_SOLVER_H_ */

Previous 199869 Revisions Next


© 1997-2024 The MAME Team