Previous 199869 Revisions Next

r30982 Sunday 15th June, 2014 at 17:38:18 UTC by Couriersud
Optimized netlist proxies. Small but measurable performance increase for pongf and Pong Doubles. In addition, moved some code between classes and sorted code in nl_base.c
[src/emu/netlist]nl_base.c nl_base.h
[src/emu/netlist/analog]nld_bjt.c nld_fourterm.c nld_solver.h nld_twoterm.c
[src/emu/netlist/devices]nld_system.c nld_system.h

trunk/src/emu/netlist/devices/nld_system.c
r30981r30982
8787// nld_d_to_a_proxy
8888// ----------------------------------------------------------------------------------------
8989
90ATTR_COLD void nld_d_to_a_proxy::start()
91{
92    nld_base_d_to_a_proxy::start();
93
94    register_sub(m_RV, "RV");
95    register_terminal("1", m_RV.m_P);
96    register_terminal("2", m_RV.m_N);
97
98    register_output("_Q", m_Q);
99    register_subalias("Q", m_RV.m_P);
100
101    connect(m_RV.m_N, m_Q);
102    m_Q.initial(0.0);
103}
104
105ATTR_COLD void nld_d_to_a_proxy::reset()
106{
107    m_RV.do_reset();
108}
109
110ATTR_COLD netlist_core_terminal_t &nld_d_to_a_proxy::out()
111{
112    return m_RV.m_P;
113}
114
90115ATTR_HOT ATTR_ALIGN void nld_d_to_a_proxy::update()
91116{
92    double R = INPLOGIC(m_I) ? m_family_desc->m_R_high : m_family_desc->m_R_low;
93    double V = INPLOGIC(m_I) ? m_family_desc->m_high_V : m_family_desc->m_low_V;
117    const int state = INPLOGIC(m_I);
118    if (state != m_last_state)
119    {
120        m_last_state = state;
121        const double R = state ? m_family_desc->m_R_high : m_family_desc->m_R_low;
122        const double V = state ? m_family_desc->m_high_V : m_family_desc->m_low_V;
94123
95    m_R.update_dev();
96    OUTANALOG(m_Q, V);
97    m_R.set_R(R);
124        // We only need to update the net first if this is a time stepping net
125        if (m_RV.m_P.net().as_analog().solver()->is_timestep())
126        {
127            m_RV.update_dev();
128            m_RV.set(1.0 / R, V, 0.0);
129            m_RV.m_P.schedule_after(NLTIME_FROM_NS(1));
130        }
131        else
132        {
133            m_RV.set(1.0 / R, V, 0.0);
134            m_RV.update_dev();
135        }
136    }
98137}
trunk/src/emu/netlist/devices/nld_system.h
r30981r30982
225225{
226226public:
227227   ATTR_COLD nld_d_to_a_proxy(netlist_output_t &out_proxied)
228         : nld_base_d_to_a_proxy(out_proxied)
228    : nld_base_d_to_a_proxy(out_proxied)
229    , m_RV(TWOTERM)
230   , m_last_state(-1)
229231   {
230232   }
231233
232234   ATTR_COLD virtual ~nld_d_to_a_proxy() {}
233235
234236protected:
235   ATTR_COLD void start()
236   {
237      nld_base_d_to_a_proxy::start();
237   ATTR_COLD virtual void start();
238238
239      register_sub(m_R, "R");
240      register_output("_Q", m_Q);
241      register_subalias("Q", m_R.m_P);
239   ATTR_COLD virtual void reset();
242240
243      connect(m_R.m_N, m_Q);
244   }
241   ATTR_COLD virtual netlist_core_terminal_t &out();
245242
246   ATTR_COLD void reset()
247   {
248      m_R.do_reset();
249   }
250
251   ATTR_COLD virtual netlist_core_terminal_t &out()
252   {
253      return m_R.m_P;
254   }
255
256243   ATTR_HOT ATTR_ALIGN void update();
257244
258245private:
259246   netlist_analog_output_t m_Q;
260   nld_R_base m_R;
247   nld_twoterm m_RV;
248   int m_last_state;
261249};
262250#endif
263251
trunk/src/emu/netlist/nl_base.c
r30981r30982
356356
357357
358358// ----------------------------------------------------------------------------------------
359// net_device_t
359// netlist_device_t
360360// ----------------------------------------------------------------------------------------
361361
362362netlist_device_t::netlist_device_t()
r30981r30982
448448
449449
450450// ----------------------------------------------------------------------------------------
451// net_net_t
451// netlist_net_t
452452// ----------------------------------------------------------------------------------------
453453
454454ATTR_COLD netlist_net_t::netlist_net_t(const family_t afamily)
r30981r30982
471471        netlist().remove_save_items(this);
472472}
473473
474ATTR_COLD netlist_analog_net_t::netlist_analog_net_t()
475    : netlist_net_t(ANALOG)
476    , m_DD_n_m_1(0.0)
477    , m_h_n_m_1(1e-6)
478    , m_solver(NULL)
474ATTR_COLD void netlist_net_t::init_object(netlist_base_t &nl, const pstring &aname)
479475{
480};
476   netlist_object_t::init_object(nl, aname);
477   nl.m_nets.add(this);
478}
481479
482ATTR_COLD netlist_logic_net_t::netlist_logic_net_t()
483    : netlist_net_t(LOGIC)
484{
485};
486
487
488480ATTR_HOT void netlist_net_t::inc_active(netlist_core_terminal_t &term)
489481{
490482   m_active++;
r30981r30982
530522   }
531523}
532524
525ATTR_COLD void netlist_net_t::register_railterminal(netlist_output_t &mr)
526{
527   assert(m_railterminal == NULL);
528   m_railterminal = &mr;
529}
530
533531ATTR_COLD void netlist_net_t::rebuild_list()
534532{
535533   /* rebuild m_list */
r30981r30982
540538         m_list_active.add(*m_core_terms[i]);
541539}
542540
541ATTR_COLD void netlist_net_t::save_register()
542{
543   save(NAME(m_time));
544   save(NAME(m_active));
545   save(NAME(m_in_queue));
546    save(NAME(m_last_Analog));
547    save(NAME(m_cur_Analog));
548    save(NAME(m_last_Q));
549    save(NAME(m_cur_Q));
550    save(NAME(m_new_Q));
551   netlist_object_t::save_register();
552}
553
554ATTR_HOT ATTR_ALIGN static inline void update_dev(const netlist_core_terminal_t *inp, const UINT32 mask)
555{
556    if ((inp->state() & mask) != 0)
557    {
558        netlist_core_device_t &netdev = inp->netdev();
559        begin_timing(netdev.total_time);
560        inc_stat(netdev.stat_count);
561        netdev.update_dev();
562        end_timing(netdev().total_time);
563    }
564}
565
566ATTR_HOT ATTR_ALIGN inline void netlist_net_t::update_devs()
567{
568   //assert(m_num_cons != 0);
569   assert(this->isRailNet());
570
571   const UINT32 masks[4] = { 1, 5, 3, 1 };
572   const UINT32 mask = masks[ (m_last_Q  << 1) | m_new_Q ];
573   netlist_core_terminal_t *p = m_list_active.first();
574
575   m_in_queue = 2; /* mark as taken ... */
576   m_cur_Q = m_new_Q;
577
578    switch (m_active)
579    {
580    case 2:
581        update_dev(p, mask);
582        p = m_list_active.next(p);
583        if (p == NULL) break;
584    case 1:
585        update_dev(p, mask);
586        break;
587    default:
588        while (p != NULL)
589        {
590            update_dev(p, mask);
591            p = m_list_active.next(p);
592        }
593        break;
594    }
595   m_last_Q = m_cur_Q;
596   m_last_Analog = m_cur_Analog;
597}
598
543599ATTR_COLD void netlist_net_t::reset()
544600{
545601   m_time = netlist_time::zero;
r30981r30982
566622            m_active++;
567623}
568624
569ATTR_COLD void netlist_logic_net_t::reset()
625ATTR_COLD void netlist_net_t::register_con(netlist_core_terminal_t &terminal)
570626{
571    netlist_net_t::reset();
572}
627   terminal.set_net(*this);
573628
574ATTR_COLD void netlist_analog_net_t::reset()
575{
576    netlist_net_t::reset();
577}
629   m_core_terms.add(&terminal);
578630
579ATTR_COLD void netlist_net_t::init_object(netlist_base_t &nl, const pstring &aname)
580{
581   netlist_object_t::init_object(nl, aname);
582   nl.m_nets.add(this);
631   if (terminal.state() != netlist_input_t::STATE_INP_PASSIVE)
632      m_active++;
583633}
584634
585ATTR_COLD void netlist_net_t::save_register()
635ATTR_COLD void netlist_net_t::move_connections(netlist_net_t *dest_net)
586636{
587   save(NAME(m_time));
588   save(NAME(m_active));
589   save(NAME(m_in_queue));
590    save(NAME(m_last_Analog));
591    save(NAME(m_cur_Analog));
592    save(NAME(m_last_Q));
593    save(NAME(m_cur_Q));
594    save(NAME(m_new_Q));
595   netlist_object_t::save_register();
637    for (int i = 0; i < m_core_terms.count(); i++)
638    {
639        netlist_core_terminal_t *p = m_core_terms[i];
640        dest_net->register_con(*p);
641    }
642    m_core_terms.clear(); // FIXME: othernet needs to be free'd from memory
596643}
597644
598ATTR_COLD void netlist_analog_net_t::save_register()
599{
600    save(NAME(m_DD_n_m_1));
601    save(NAME(m_h_n_m_1));
602    netlist_net_t::save_register();
603}
604
605ATTR_COLD void netlist_logic_net_t::save_register()
606{
607    netlist_net_t::save_register();
608}
609
610ATTR_COLD void netlist_net_t::register_railterminal(netlist_output_t &mr)
611{
612   assert(m_railterminal == NULL);
613   m_railterminal = &mr;
614}
615
616645ATTR_COLD void netlist_net_t::merge_net(netlist_net_t *othernet)
617646{
618647   NL_VERBOSE_OUT(("merging nets ...\n"));
r30981r30982
639668   }
640669}
641670
642ATTR_COLD void netlist_net_t::move_connections(netlist_net_t *dest_net)
671// ----------------------------------------------------------------------------------------
672// netlist_logic_net_t
673// ----------------------------------------------------------------------------------------
674
675ATTR_COLD netlist_logic_net_t::netlist_logic_net_t()
676    : netlist_net_t(LOGIC)
643677{
644    for (int i = 0; i < m_core_terms.count(); i++)
645    {
646        netlist_core_terminal_t *p = m_core_terms[i];
647        dest_net->register_con(*p);
648    }
649    m_core_terms.clear(); // FIXME: othernet needs to be free'd from memory
678};
679
680
681ATTR_COLD void netlist_logic_net_t::reset()
682{
683    netlist_net_t::reset();
650684}
651685
686ATTR_COLD void netlist_logic_net_t::save_register()
687{
688    netlist_net_t::save_register();
689}
690
691// ----------------------------------------------------------------------------------------
692// netlist_analog_net_t
693// ----------------------------------------------------------------------------------------
694
695ATTR_COLD netlist_analog_net_t::netlist_analog_net_t()
696    : netlist_net_t(ANALOG)
697    , m_DD_n_m_1(0.0)
698    , m_h_n_m_1(1e-6)
699    , m_solver(NULL)
700{
701};
702
703ATTR_COLD void netlist_analog_net_t::reset()
704{
705    netlist_net_t::reset();
706}
707
708ATTR_COLD void netlist_analog_net_t::save_register()
709{
710    save(NAME(m_DD_n_m_1));
711    save(NAME(m_h_n_m_1));
712    netlist_net_t::save_register();
713}
714
652715ATTR_COLD bool netlist_analog_net_t::already_processed(list_t *groups, int cur_group)
653716{
654717    if (isRailNet())
r30981r30982
684747}
685748
686749
687
688ATTR_COLD void netlist_net_t::register_con(netlist_core_terminal_t &terminal)
689{
690   terminal.set_net(*this);
691
692   m_core_terms.add(&terminal);
693
694   if (terminal.state() != netlist_input_t::STATE_INP_PASSIVE)
695      m_active++;
696}
697
698ATTR_HOT ATTR_ALIGN static inline void update_dev(const netlist_core_terminal_t *inp, const UINT32 mask)
699{
700   if ((inp->state() & mask) != 0)
701   {
702      netlist_core_device_t &netdev = inp->netdev();
703      begin_timing(netdev.total_time);
704      inc_stat(netdev.stat_count);
705      netdev.update_dev();
706      end_timing(netdev().total_time);
707   }
708}
709
710ATTR_HOT ATTR_ALIGN inline void netlist_net_t::update_devs()
711{
712   //assert(m_num_cons != 0);
713   assert(this->isRailNet());
714
715   const UINT32 masks[4] = { 1, 5, 3, 1 };
716   const UINT32 mask = masks[ (m_last_Q  << 1) | m_new_Q ];
717   netlist_core_terminal_t *p = m_list_active.first();
718
719   m_in_queue = 2; /* mark as taken ... */
720   m_cur_Q = m_new_Q;
721
722    switch (m_active)
723    {
724    case 2:
725        update_dev(p, mask);
726        p = m_list_active.next(p);
727        if (p == NULL) break;
728    case 1:
729        update_dev(p, mask);
730        break;
731    default:
732        while (p != NULL)
733        {
734            update_dev(p, mask);
735            p = m_list_active.next(p);
736        }
737        break;
738    }
739   m_last_Q = m_cur_Q;
740   m_last_Analog = m_cur_Analog;
741}
742
743ATTR_HOT void netlist_analog_net_t::schedule_solve()
744{
745   if (m_solver != NULL)
746      m_solver->update_forced();
747}
748
749750// ----------------------------------------------------------------------------------------
750// netlist_terminal_t
751// netlist_core_terminal_t
751752// ----------------------------------------------------------------------------------------
752753
753754ATTR_COLD netlist_core_terminal_t::netlist_core_terminal_t(const type_t atype, const family_t afamily)
r30981r30982
759760{
760761}
761762
763ATTR_COLD void netlist_core_terminal_t::set_net(netlist_net_t &anet)
764{
765   m_net = &anet;
766}
767
768// ----------------------------------------------------------------------------------------
769// netlist_terminal_t
770// ----------------------------------------------------------------------------------------
771
762772ATTR_COLD netlist_terminal_t::netlist_terminal_t()
763773: netlist_core_terminal_t(TERMINAL, ANALOG)
764774, m_Idr1(NULL)
r30981r30982
768778{
769779}
770780
781ATTR_HOT void netlist_terminal_t::schedule_solve()
782{
783    net().as_analog().solver()->update_forced();
784}
771785
786ATTR_HOT void netlist_terminal_t::schedule_after(const netlist_time &after)
787{
788    net().as_analog().solver()->update_after(after);
789}
790
772791ATTR_COLD void netlist_terminal_t::reset()
773792{
774793   //netlist_terminal_core_terminal_t::reset();
r30981r30982
787806}
788807
789808
790ATTR_COLD void netlist_core_terminal_t::set_net(netlist_net_t &anet)
791{
792   m_net = &anet;
793}
794
795809// ----------------------------------------------------------------------------------------
796810// net_input_t
797811// ----------------------------------------------------------------------------------------
trunk/src/emu/netlist/nl_base.h
r30981r30982
296296   };
297297   enum family_t {
298298      // Terminal families
299      LOGIC     = 1,
300      ANALOG    = 2,
299      LOGIC,
300      ANALOG,
301301      // Device families
302      GENERIC   = 3,   // <== devices usually fall into this category
303      RESISTOR  = 4,   // Resistor
304      CAPACITOR = 5,   // Capacitor
305      DIODE     = 6,   // Diode
306      BJT_SWITCH = 7,  // BJT(Switch)
307      VCVS       = 8,  // Voltage controlled voltage source
308      VCCS       = 9,  // Voltage controlled current source
309      BJT_EB     = 10, // BJT(Ebers-Moll)
310      GND        = 11, // GND device
302      GENERIC,    // <== devices usually fall into this category
303      TWOTERM,    // Generic twoterm ...
304      RESISTOR,   // Resistor
305      CAPACITOR,  // Capacitor
306      DIODE,      // Diode
307        BJT_EB,     // BJT(Ebers-Moll)
308      BJT_SWITCH, // BJT(Switch)
309      VCVS,       // Voltage controlled voltage source
310      VCCS,       // Voltage controlled current source
311      GND,        // GND device
311312   };
312313
313314   ATTR_COLD netlist_object_t(const type_t atype, const family_t afamily);
r30981r30982
458459      set_ptr(m_gt1, GT);
459460   }
460461
462    ATTR_HOT void schedule_solve();
463    ATTR_HOT void schedule_after(const netlist_time &after);
461464
462465   netlist_terminal_t *m_otherterm;
463466
r30981r30982
715718        return m_cur_Analog;
716719    }
717720
718    ATTR_HOT void schedule_solve();
721    ATTR_HOT inline netlist_matrix_solver_t *solver() { return m_solver; }
719722
720723    ATTR_COLD bool already_processed(list_t *groups, int cur_group);
721724    ATTR_COLD void process_net(list_t *groups, int &cur_group);
r30981r30982
734737
735738    //FIXME: needed by current solver code
736739    netlist_matrix_solver_t *m_solver;
737//    netlist_terminal_t::list_t m_terms;
738//    netlist_terminal_t::list_t m_rails;
739740};
740741
741742// ----------------------------------------------------------------------------------------
r30981r30982
964965      out.set_Q(val, delay);
965966   }
966967
967   ATTR_HOT inline bool INP_HL(const netlist_logic_input_t &inp) const
968    ATTR_HOT inline bool INP_CHANGED(const netlist_logic_input_t &inp) const
969    {
970        return (inp.last_Q() != inp.Q());
971    }
972
973    ATTR_HOT inline bool INP_HL(const netlist_logic_input_t &inp) const
968974   {
969975      return ((inp.last_Q() & !inp.Q()) == 1);
970976   }
trunk/src/emu/netlist/analog/nld_fourterm.c
r30981r30982
6363   /* only called if connected to a rail net ==> notify the solver to recalculate */
6464   /* Big FIXME ... */
6565   if (!m_IP.net().isRailNet())
66      m_IP.net().as_analog().schedule_solve();
66      m_IP.schedule_solve();
6767   else if (!m_IN.net().isRailNet())
68      m_IN.net().as_analog().schedule_solve();
68      m_IN.schedule_solve();
6969   else if (!m_OP.net().isRailNet())
70      m_OP.net().as_analog().schedule_solve();
70      m_OP.schedule_solve();
7171   else if (!m_ON.net().isRailNet())
72      m_ON.net().as_analog().schedule_solve();
72      m_ON.schedule_solve();
7373}
7474
7575// ----------------------------------------------------------------------------------------
trunk/src/emu/netlist/analog/nld_bjt.c
r30981r30982
116116NETLIB_UPDATE(QBJT_switch)
117117{
118118    if (!m_RB.m_P.net().isRailNet())
119        m_RB.m_P.net().as_analog().schedule_solve();   // Basis
119        m_RB.m_P.schedule_solve();   // Basis
120120    else if (!m_RB.m_N.net().isRailNet())
121        m_RB.m_N.net().as_analog().schedule_solve();   // Emitter
121        m_RB.m_N.schedule_solve();   // Emitter
122122    else if (!m_RC.m_P.net().isRailNet())
123        m_RC.m_P.net().as_analog().schedule_solve();   // Collector
123        m_RC.m_P.schedule_solve();   // Collector
124124}
125125
126126
r30981r30982
176176NETLIB_UPDATE(QBJT_EB)
177177{
178178   if (!m_D_EB.m_P.net().isRailNet())
179      m_D_EB.m_P.net().as_analog().schedule_solve();   // Basis
179      m_D_EB.m_P.schedule_solve();   // Basis
180180   else if (!m_D_EB.m_N.net().isRailNet())
181      m_D_EB.m_N.net().as_analog().schedule_solve();   // Emitter
181      m_D_EB.m_N.schedule_solve();   // Emitter
182182   else
183      m_D_CB.m_N.net().as_analog().schedule_solve();   // Collector
183      m_D_CB.m_N.schedule_solve();   // Collector
184184}
185185
186186NETLIB_RESET(QBJT_EB)
trunk/src/emu/netlist/analog/nld_solver.h
r30981r30982
205205   ATTR_HOT inline bool is_timestep() { return m_step_devices.count() > 0; }
206206
207207    ATTR_HOT void update_forced();
208    ATTR_HOT inline void update_after(const netlist_time after)
209    {
210        m_Q_sync.net().reschedule_in_queue(after);
211    }
208212
209213   /* netdevice functions */
210214   ATTR_HOT  virtual void update();
trunk/src/emu/netlist/analog/nld_twoterm.c
r30981r30982
6060   /* only called if connected to a rail net ==> notify the solver to recalculate */
6161   /* we only need to call the non-rail terminal */
6262   if (!m_P.net().isRailNet())
63      m_P.net().as_analog().schedule_solve();
63      m_P.schedule_solve();
6464   else
65      m_N.net().as_analog().schedule_solve();
65      m_N.schedule_solve();
6666}
6767
6868// ----------------------------------------------------------------------------------------

Previous 199869 Revisions Next


© 1997-2024 The MAME Team