Previous 199869 Revisions Next

r26423 Monday 25th November, 2013 at 22:24:22 UTC by Couriersud
Netlist: Introducing type safe parameters.
[src/emu/machine]netlist.h
[src/emu/netlist]nl_base.c nl_base.h nl_setup.c
[src/emu/netlist/devices]net_lib.c net_lib.h nld_system.c nld_system.h
[src/mame/drivers]pong.c

trunk/src/mame/drivers/pong.c
r26422r26423
465465   NETDEV_PARAM(videomix.R2, RES_K(1.2))
466466   NETDEV_PARAM(videomix.R3, RES_K(22))
467467
468#if 0
469468    NETDEV_SOLVER(Solver)
470469    NETDEV_ANALOG_CONST(V5, 5)
471470    NETDEV_ANALOG_CONST(V1, 1)
472471    NETDEV_ANALOG_CONST(V0, 0)
473472
473#if 0
474474    NETDEV_R(R1, 10)
475475    NETDEV_R(R2, 10)
476476    NETDEV_R(R3, 10)
r26422r26423
516516    //NETDEV_LOG(log1, D1.A)
517517#endif
518518
519#if 0
519#if 1
520520    // astable NAND Multivibrator
521521    NETDEV_R(R1, 1000)
522522    NETDEV_C(C1, 1e-6)
r26422r26423
583583   netlist_mame_device::required_output<netlist_logic_output_t> m_srst;
584584   netlist_mame_device::required_output<netlist_analog_output_t> m_p_V0;
585585   netlist_mame_device::required_output<netlist_analog_output_t> m_p_V1;
586   netlist_mame_device::required_param m_sw1a;
587   netlist_mame_device::required_param m_sw1b;
588   netlist_mame_device::required_param m_p_R0;
589   netlist_mame_device::required_param m_p_R1;
586   netlist_mame_device::required_param<netlist_param_int_t> m_sw1a;
587   netlist_mame_device::required_param<netlist_param_int_t> m_sw1b;
588   netlist_mame_device::required_param<netlist_param_double_t> m_p_R0;
589   netlist_mame_device::required_param<netlist_param_double_t> m_p_R1;
590590
591591   UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
592592
trunk/src/emu/machine/netlist.h
r26422r26423
102102
103103   template<bool _Required, class _NETClass>
104104   class output_finder;
105    template<class C>
105106   class optional_output;
106107   template<class C>
107108   class required_output;
109    template<class C>
108110   class optional_param;
111    template<class C>
109112   class required_param;
110113   class on_device_start;
111114
r26422r26423
190193};
191194
192195// optional device finder
193class netlist_mame_device::optional_output : public netlist_mame_device::output_finder<false, netlist_output_t>
196template<class C>
197class netlist_mame_device::optional_output : public netlist_mame_device::output_finder<false, C>
194198{
195199public:
196   optional_output(device_t &base, const char *tag, const char *output) : output_finder<false, netlist_output_t>(base, tag, output) { }
200   optional_output(device_t &base, const char *tag, const char *output) : output_finder<false, C>(base, tag, output) { }
197201
198202   virtual ~optional_output() {};
199203
200204   virtual bool OnDeviceStart()
201205   {
202      this->m_target = dynamic_cast<netlist_output_t *>(&m_netlist->setup().find_terminal(m_output, netlist_object_t::OUTPUT));
206      this->m_target = dynamic_cast<C *>(&this->m_netlist->setup().find_terminal(this->m_output, netlist_object_t::OUTPUT));
203207      return this->report_missing(this->m_target != NULL, "output", false);
204208   }
205209
r26422r26423
216220
217221   virtual bool OnDeviceStart()
218222   {
219      this->m_target = (C *) &(this->m_netlist->setup().find_terminal(this->m_output, netlist_object_t::OUTPUT));
223      this->m_target = dynamic_cast<C *>(&this->m_netlist->setup().find_terminal(this->m_output, netlist_object_t::OUTPUT));
220224      return this->report_missing(this->m_target != NULL, "output", true);
221225   }
222226
223227};
224228
225229// optional device finder
226class netlist_mame_device::optional_param : public netlist_mame_device::output_finder<false, netlist_param_t>
230template<class C>
231class netlist_mame_device::optional_param : public netlist_mame_device::output_finder<false, C>
227232{
228233public:
229   optional_param(device_t &base, const char *tag, const char *output) : output_finder<false, netlist_param_t>(base, tag, output) { }
234   optional_param(device_t &base, const char *tag, const char *output) : output_finder<false, C>(base, tag, output) { }
230235
231236   virtual bool OnDeviceStart()
232237   {
233      this->m_target = &m_netlist->setup().find_param(m_output);
238      this->m_target = dynamic_cast<C *>(&this->m_netlist->setup().find_param(this->m_output));
234239      return this->report_missing(this->m_target != NULL, "parameter", false);
235240   }
236241
237242};
238243
239244// required devices are similar but throw an error if they are not found
240class netlist_mame_device::required_param : public netlist_mame_device::output_finder<true, netlist_param_t>
245template<class C>
246class netlist_mame_device::required_param : public netlist_mame_device::output_finder<true, C>
241247{
242248public:
243   required_param(device_t &base, const char *tag, const char *output) : output_finder<true, netlist_param_t>(base, tag, output) { }
249   required_param(device_t &base, const char *tag, const char *output) : output_finder<true, C>(base, tag, output) { }
244250
245251   virtual bool OnDeviceStart()
246252   {
247      this->m_target = &m_netlist->setup().find_param(m_output);
253      this->m_target = dynamic_cast<C *>( &this->m_netlist->setup().find_param(this->m_output));
248254      return this->report_missing(this->m_target != NULL, "parameter", true);
249255   }
250256};
trunk/src/emu/netlist/devices/net_lib.c
r26422r26423
9393      m_low.net().register_con(m_I[i]);
9494      //m_I[i].set_net(m_low.m_net);
9595   }
96   register_param("POS", m_POS);
96   register_param("POS", m_POS, 0);
9797   register_output("Q", m_Q);
9898
9999   m_variable_input_count = true;
r26422r26423
107107
108108NETLIB_UPDATE_PARAM(nicMultiSwitch)
109109{
110   m_position = m_POS.ValueInt();
110   m_position = m_POS.Value();
111111   //update();
112112}
113113
r26422r26423
189189   register_input("CV", m_CV);
190190
191191   register_output("Q", m_Q);
192   register_param("R", m_R);
193   register_param("C", m_C);
192   register_param("R", m_R, 0.0);
193   register_param("C", m_C, 0.0);
194194   register_param("VS", m_VS, 5.0);
195195   register_param("VL", m_VL, 0.0 *5.0);
196196
trunk/src/emu/netlist/devices/net_lib.h
r26422r26423
218218   netlist_analog_output_t m_Q;
219219   netlist_analog_output_t m_low;
220220
221   netlist_param_t m_POS;
221   netlist_param_int_t m_POS;
222222
223223   int m_position;
224224);
r26422r26423
237237   netlist_analog_output_t m_Q;
238238   netlist_analog_output_t m_low;
239239
240   netlist_param_t m_R[8];
240   netlist_param_double_t m_R[8];
241241
242242   double m_w[8];
243243);
r26422r26423
260260   netlist_analog_output_t m_THRESHOLD_OUT; /* internal */
261261
262262   //netlist_base_timer_t *m_timer;
263   netlist_param_t m_R;
264   netlist_param_t m_C;
265   netlist_param_t m_VS;
266   netlist_param_t m_VL;
263   netlist_param_double_t m_R;
264   netlist_param_double_t m_C;
265   netlist_param_double_t m_VS;
266   netlist_param_double_t m_VL;
267267
268268   double nicNE555N_cv();
269269   double nicNE555N_clamp(const double v, const double a, const double b);
trunk/src/emu/netlist/devices/nld_system.c
r26422r26423
1212NETLIB_START(ttl_const)
1313{
1414    register_output("Q", m_Q);
15    register_param("CONST", m_const, 0.0);
15    register_param("CONST", m_const, 0);
1616}
1717
1818NETLIB_UPDATE(ttl_const)
r26422r26423
2121
2222NETLIB_UPDATE_PARAM(ttl_const)
2323{
24    OUTLOGIC(m_Q, m_const.ValueInt(), NLTIME_IMMEDIATE);
24    OUTLOGIC(m_Q, m_const.Value(), NLTIME_IMMEDIATE);
2525}
2626
2727NETLIB_START(analog_const)
r26422r26423
5959    register_output("Q", m_Q);
6060    //register_input("FB", m_feedback);
6161
62    register_param("FREQ", m_freq, 7159000.0 * 5);
62    register_param("FREQ", m_freq, 7159000.0 * 5.0);
6363    m_inc = netlist_time::from_hz(m_freq.Value()*2);
6464
6565    register_link_internal(m_feedback, m_Q, netlist_input_t::STATE_INP_ACTIVE);
r26422r26423
8585    register_output("Q", m_Q);
8686    //register_input("FB", m_feedback);
8787
88    register_param("FREQ", m_freq, 50000);
88    register_param("FREQ", m_freq, 50000.0);
8989    m_inc = netlist_time::from_hz(m_freq.Value());
9090
9191    register_link_internal(m_feedback, m_Q, netlist_input_t::STATE_INP_ACTIVE);
trunk/src/emu/netlist/devices/nld_system.h
r26422r26423
5757
5858NETLIB_DEVICE_WITH_PARAMS(ttl_const,
5959   netlist_ttl_output_t m_Q;
60   netlist_param_t m_const;
60   netlist_param_logic_t m_const;
6161);
6262
6363NETLIB_DEVICE_WITH_PARAMS(analog_const,
6464   netlist_analog_output_t m_Q;
65   netlist_param_t m_const;
65   netlist_param_double_t m_const;
6666);
6767
6868// ----------------------------------------------------------------------------------------
r26422r26423
7373public:
7474    netlist_ttl_output_t m_Q;
7575
76   netlist_param_t m_freq;
76   netlist_param_double_t m_freq;
7777   netlist_time m_inc;
7878
7979   ATTR_HOT inline static void mc_update(netlist_net_t &net, const netlist_time curtime);
r26422r26423
8787    netlist_ttl_input_t m_feedback;
8888    netlist_ttl_output_t m_Q;
8989
90    netlist_param_t m_freq;
90    netlist_param_double_t m_freq;
9191    netlist_time m_inc;
9292);
9393
r26422r26423
102102        netlist_ttl_input_t m_feedback;
103103        netlist_ttl_output_t m_Q;
104104
105        netlist_param_t m_freq;
105        netlist_param_double_t m_freq;
106106
107107        netlist_time m_inc;
108108        netlist_time m_last_step;
r26422r26423
206206    {
207207    }
208208
209    netlist_param_t m_R;
209    netlist_param_double_t m_R;
210210
211211protected:
212212    void start()
r26422r26423
233233    {
234234    }
235235
236    netlist_param_t m_C;
236    netlist_param_double_t m_C;
237237
238238protected:
239239    void start()
r26422r26423
266266    {
267267    }
268268
269    netlist_param_t m_Vt;
270    netlist_param_t m_Is;
271    netlist_param_t m_Rmin;
269    netlist_param_double_t m_Vt;
270    netlist_param_double_t m_Is;
271    netlist_param_double_t m_Rmin;
272272
273273    double m_VtInv;
274274    double m_Vcrit;
trunk/src/emu/netlist/nl_base.c
r26422r26423
326326   register_link_internal(*this, in, out, aState);
327327}
328328
329ATTR_COLD void netlist_device_t::register_param(netlist_core_device_t &dev, const pstring &name, netlist_param_t &param, double initialVal)
329template <class C, class T>
330ATTR_COLD void netlist_device_t::register_param(netlist_core_device_t &dev, const pstring &sname, C &param, const T initialVal)
330331{
331   param.set_netdev(dev);
332   param.initial(initialVal);
333   m_setup->register_object(*this, *this, name, param, netlist_terminal_t::STATE_NONEX);
332    param.set_netdev(dev);
333    param.initial(initialVal);
334    m_setup->register_object(*this, *this, sname, param, netlist_terminal_t::STATE_NONEX);
334335}
335336
336ATTR_COLD void netlist_device_t::register_param(const pstring &name, netlist_param_t &param, double initialVal)
337{
338   register_param(*this,name, param, initialVal);
339}
337template ATTR_COLD void netlist_device_t::register_param(netlist_core_device_t &dev, const pstring &sname, netlist_param_double_t &param, const double initialVal);
338template ATTR_COLD void netlist_device_t::register_param(netlist_core_device_t &dev, const pstring &sname, netlist_param_int_t &param, const int initialVal);
339template ATTR_COLD void netlist_device_t::register_param(netlist_core_device_t &dev, const pstring &sname, netlist_param_logic_t &param, const int initialVal);
340340
341
341342// ----------------------------------------------------------------------------------------
342343// net_net_t
343344// ----------------------------------------------------------------------------------------
trunk/src/emu/netlist/nl_base.h
r26422r26423
714714   virtual void update() { }
715715   virtual void start() { }
716716
717   ATTR_COLD void register_param(const pstring &sname, netlist_param_t &param, const double initialVal = 0.0);
718   ATTR_COLD void register_param(netlist_core_device_t &dev, const pstring &sname, netlist_param_t &param, const double initialVal = 0.0);
717    template <class C, class T>
718   ATTR_COLD void register_param(const pstring &sname, C &param, const T initialVal)
719   {
720       register_param(*this, sname, param, initialVal);
721   }
719722
723   template <class C, class T>
724    ATTR_COLD void register_param(netlist_core_device_t &dev, const pstring &sname, C &param, const T initialVal);
725
720726   netlist_setup_t *m_setup;
721727   bool m_variable_input_count;
722728
r26422r26423
726732class netlist_param_t : public netlist_object_t
727733{
728734public:
729   netlist_param_t()
735
736    enum param_type_t {
737        STRING,
738        DOUBLE,
739        INTEGER,
740        LOGIC
741    };
742
743   netlist_param_t(const param_type_t atype)
730744   : netlist_object_t(PARAM, ANALOG)
731    , m_param(0.0)
745    , m_param_type(atype)
732746   , m_netdev(NULL)
733747   {  }
734748
735   ATTR_HOT inline void setTo(const double param) { m_param = param; m_netdev->update_param(); }
736   ATTR_HOT inline void setTo(const int param) { m_param = param; m_netdev->update_param(); }
737   ATTR_COLD inline void initial(const double val) { m_param = val; }
738   ATTR_COLD inline void initial(const int val) { m_param = val; }
739749
740   ATTR_HOT inline const double Value() const        { return m_param;   }
741   ATTR_HOT inline const int    ValueInt() const     { return (int) m_param;     }
742
750    ATTR_HOT inline const param_type_t param_type() const { return m_param_type; }
743751   ATTR_HOT inline netlist_core_device_t &netdev() const { return *m_netdev; }
744752   ATTR_COLD void set_netdev(netlist_core_device_t &dev) { m_netdev = &dev; }
745753
746754private:
747
748   double m_param;
755    const param_type_t m_param_type;
749756   netlist_core_device_t *m_netdev;
750757};
751758
759class netlist_param_double_t : public netlist_param_t
760{
761public:
762    netlist_param_double_t()
763    : netlist_param_t(DOUBLE)
764    , m_param(0.0)
765    {  }
752766
767    ATTR_HOT inline void setTo(const double param) { m_param = param; netdev().update_param(); }
768    ATTR_COLD inline void initial(const double val) { m_param = val; }
769    ATTR_HOT inline const double Value() const        { return m_param;   }
770
771private:
772    double m_param;
773};
774
775class netlist_param_int_t : public netlist_param_t
776{
777public:
778    netlist_param_int_t()
779    : netlist_param_t(INTEGER)
780    , m_param(0)
781    {  }
782
783    ATTR_HOT inline void setTo(const int param) { m_param = param; netdev().update_param(); }
784    ATTR_COLD inline void initial(const int val) { m_param = val; }
785
786    ATTR_HOT inline const int Value() const     { return m_param;     }
787
788private:
789    int m_param;
790};
791
792class netlist_param_logic_t : public netlist_param_int_t
793{
794public:
795    netlist_param_logic_t()
796    : netlist_param_int_t()
797    {  }
798};
799
753800// ----------------------------------------------------------------------------------------
754801// netlist_base_t
755802// ----------------------------------------------------------------------------------------
trunk/src/emu/netlist/nl_setup.c
r26422r26423
167167                const pstring val = m_params_temp.find(temp);
168168                if (val != "")
169169                {
170                    //printf("Found parameter ... %s : %s\n", temp.cstr(), val->cstr());
171                    double vald = 0;
172                    if (sscanf(val.cstr(), "%lf", &vald) != 1)
173                        fatalerror("Invalid number conversion %s : %s\n", temp.cstr(), val.cstr());
174                    param.initial(vald);
170                    switch (param.param_type())
171                    {
172                        case netlist_param_t::DOUBLE:
173                        {
174                            //printf("Found parameter ... %s : %s\n", temp.cstr(), val->cstr());
175                            double vald = 0;
176                            if (sscanf(val.cstr(), "%lf", &vald) != 1)
177                                fatalerror("Invalid number conversion %s : %s\n", temp.cstr(), val.cstr());
178                            dynamic_cast<netlist_param_double_t &>(param).initial(vald);
179                        }
180                        break;
181                        case netlist_param_t::INTEGER:
182                        case netlist_param_t::LOGIC:
183                        {
184                            //printf("Found parameter ... %s : %s\n", temp.cstr(), val->cstr());
185                            int vald = 0;
186                            if (sscanf(val.cstr(), "%d", &vald) != 1)
187                                fatalerror("Invalid number conversion %s : %s\n", temp.cstr(), val.cstr());
188                            dynamic_cast<netlist_param_int_t &>(param).initial(vald);
189                        }
190                        break;
191                        default:
192                            fatalerror("Parameter is not supported %s : %s\n", temp.cstr(), val.cstr());
193                    }
175194                }
176195                if (!(m_params.add(temp, &param, false)==TMERR_NONE))
177196                    fatalerror("Error adding parameter %s to parameter list\n", name.cstr());

Previous 199869 Revisions Next


© 1997-2024 The MAME Team