trunk/src/emu/netlist/nl_base.c
r26365 | r26366 | |
153 | 153 | |
154 | 154 | ATTR_COLD void netlist_core_device_t::init(netlist_setup_t &setup, const astring &name) |
155 | 155 | { |
156 | | init_object(setup.netlist()); |
157 | | m_name = name; |
| 156 | init_object(setup.netlist(), name); |
158 | 157 | |
159 | 158 | #if USE_DELEGATES |
160 | 159 | #if USE_PMFDELEGATES |
r26365 | r26366 | |
213 | 212 | |
214 | 213 | ATTR_COLD void netlist_device_t::register_sub(netlist_core_device_t &dev, const astring &name) |
215 | 214 | { |
216 | | dev.init(*m_setup, name); |
| 215 | dev.init(*m_setup, this->name() + "." + name); |
217 | 216 | } |
218 | 217 | |
219 | 218 | ATTR_COLD void netlist_device_t::register_output(netlist_core_device_t &dev, const astring &name, netlist_output_t &port) |
r26365 | r26366 | |
242 | 241 | register_input(*this, name, inp, type); |
243 | 242 | } |
244 | 243 | |
| 244 | // FIXME: Revise internal links ... |
245 | 245 | ATTR_COLD void netlist_device_t::register_link_internal(netlist_core_device_t &dev, netlist_input_t &in, netlist_output_t &out, netlist_input_t::state_e aState) |
246 | 246 | { |
247 | | in.init_terminal(dev, aState); |
| 247 | in.init_terminal(dev, "internal input", aState); |
248 | 248 | // ensure we are not yet initialized ... |
249 | 249 | if (!out.net().isRailNet()) |
250 | | out.init_terminal(dev); |
| 250 | out.init_terminal(dev, "internal output"); |
251 | 251 | //if (in.state() != net_input_t::INP_STATE_PASSIVE) |
252 | 252 | out.net().register_con(in); |
253 | 253 | } |
r26365 | r26366 | |
377 | 377 | // netlist_terminal_t |
378 | 378 | // ---------------------------------------------------------------------------------------- |
379 | 379 | |
380 | | ATTR_COLD void netlist_terminal_t::init_terminal(netlist_core_device_t &dev, const state_e astate) |
| 380 | ATTR_COLD void netlist_terminal_t::init_terminal(netlist_core_device_t &dev, const astring &aname, const state_e astate) |
381 | 381 | { |
382 | 382 | m_netdev = &dev; |
383 | 383 | set_state(astate); |
384 | | init_object(dev.netlist()); |
| 384 | init_object(dev.netlist(), aname); |
385 | 385 | } |
386 | 386 | |
387 | 387 | // ---------------------------------------------------------------------------------------- |
r26365 | r26366 | |
402 | 402 | this->set_net(m_my_net); |
403 | 403 | } |
404 | 404 | |
405 | | ATTR_COLD void netlist_output_t::init_terminal(netlist_core_device_t &dev) |
| 405 | ATTR_COLD void netlist_output_t::init_terminal(netlist_core_device_t &dev, const astring &aname) |
406 | 406 | { |
407 | | netlist_terminal_t::init_terminal(dev, STATE_OUT); |
408 | | net().init_object(dev.netlist()); |
| 407 | netlist_terminal_t::init_terminal(dev, aname, STATE_OUT); |
| 408 | net().init_object(dev.netlist(), aname); |
409 | 409 | net().register_railterminal(*this); |
410 | 410 | } |
411 | 411 | |
trunk/src/emu/netlist/nl_base.h
r26365 | r26366 | |
245 | 245 | }; |
246 | 246 | |
247 | 247 | ATTR_COLD netlist_object_t(const type_t atype, const family_t afamily) |
248 | | : m_objtype(atype) |
| 248 | : m_name(NULL) |
| 249 | , m_objtype(atype) |
249 | 250 | , m_family(afamily) |
250 | 251 | , m_netlist(NULL) |
251 | 252 | {} |
252 | 253 | |
253 | | virtual ~netlist_object_t() {} |
| 254 | virtual ~netlist_object_t() |
| 255 | { |
| 256 | delete m_name; |
| 257 | } |
254 | 258 | |
255 | | ATTR_COLD void init_object(netlist_base_t &nl) |
| 259 | ATTR_COLD void init_object(netlist_base_t &nl, const astring &aname) |
256 | 260 | { |
257 | 261 | m_netlist = &nl; |
| 262 | m_name = new astring(aname); |
258 | 263 | } |
259 | 264 | |
| 265 | ATTR_COLD const astring &name() const { if (m_name == NULL) fatalerror("object not initialized"); return *m_name; } |
| 266 | |
260 | 267 | ATTR_HOT inline const type_t type() const { return m_objtype; } |
261 | 268 | ATTR_HOT inline const family_t family() const { return m_family; } |
262 | 269 | |
r26365 | r26366 | |
267 | 274 | ATTR_HOT inline const netlist_base_t & RESTRICT netlist() const { return *m_netlist; } |
268 | 275 | |
269 | 276 | private: |
| 277 | astring *m_name; |
270 | 278 | const type_t m_objtype; |
271 | 279 | const family_t m_family; |
272 | 280 | netlist_base_t * RESTRICT m_netlist; |
r26365 | r26366 | |
310 | 318 | , m_state(STATE_NONEX) |
311 | 319 | {} |
312 | 320 | |
313 | | ATTR_COLD void init_terminal(netlist_core_device_t &dev, const state_e astate); |
| 321 | ATTR_COLD void init_terminal(netlist_core_device_t &dev, const astring &aname, const state_e astate); |
314 | 322 | |
315 | 323 | ATTR_COLD void set_net(netlist_net_t &anet) { m_net = &anet; } |
316 | 324 | ATTR_COLD bool has_net() { return (m_net != NULL); } |
r26365 | r26366 | |
527 | 535 | |
528 | 536 | netlist_output_t(const type_t atype, const family_t afamily); |
529 | 537 | |
530 | | ATTR_COLD void init_terminal(netlist_core_device_t &dev); |
| 538 | ATTR_COLD void init_terminal(netlist_core_device_t &dev, const astring &aname); |
531 | 539 | |
532 | 540 | double m_low_V; |
533 | 541 | double m_high_V; |
r26365 | r26366 | |
615 | 623 | |
616 | 624 | ATTR_COLD virtual void init(netlist_setup_t &setup, const astring &name); |
617 | 625 | |
618 | | ATTR_COLD const astring &name() const { return m_name; } |
619 | 626 | |
620 | 627 | ATTR_HOT virtual void update_param() {} |
621 | 628 | |
r26365 | r26366 | |
683 | 690 | ATTR_HOT virtual void start() { } |
684 | 691 | |
685 | 692 | private: |
686 | | astring m_name; |
687 | 693 | }; |
688 | 694 | |
689 | 695 | |
r26365 | r26366 | |
835 | 841 | protected: |
836 | 842 | void start() |
837 | 843 | { |
838 | | m_I.init_terminal(*this, netlist_terminal_t::STATE_INP_ACTIVE); |
| 844 | m_I.init_terminal(*this, "I", netlist_terminal_t::STATE_INP_ACTIVE); |
839 | 845 | |
840 | | m_Q.init_terminal(*this); |
| 846 | m_Q.init_terminal(*this, "Q"); |
841 | 847 | m_Q.initial(1); |
842 | 848 | } |
843 | 849 | |
r26365 | r26366 | |
877 | 883 | protected: |
878 | 884 | void start() |
879 | 885 | { |
880 | | m_I.init_terminal(*this, netlist_terminal_t::STATE_INP_ACTIVE); |
881 | | m_Q.init_terminal(*this); |
| 886 | m_I.init_terminal(*this, "I", netlist_terminal_t::STATE_INP_ACTIVE); |
| 887 | m_Q.init_terminal(*this, "Q"); |
882 | 888 | m_Q.initial(0); |
883 | 889 | } |
884 | 890 | |
trunk/src/emu/netlist/nl_setup.c
r26365 | r26366 | |
143 | 143 | case netlist_terminal_t::OUTPUT: |
144 | 144 | { |
145 | 145 | netlist_terminal_t &term = dynamic_cast<netlist_terminal_t &>(obj); |
146 | | astring temp = dev.name(); |
147 | | temp.cat("."); |
148 | | temp.cat(name); |
149 | 146 | if (obj.isType(netlist_terminal_t::OUTPUT)) |
150 | | dynamic_cast<netlist_output_t &>(term).init_terminal(upd_dev); |
| 147 | dynamic_cast<netlist_output_t &>(term).init_terminal(upd_dev, dev.name() + "." + name); |
151 | 148 | else |
152 | | term.init_terminal(upd_dev, state); |
| 149 | term.init_terminal(upd_dev, dev.name() + "." + name, state); |
153 | 150 | |
154 | | if (!(m_terminals.add(temp, &term, false)==TMERR_NONE)) |
155 | | fatalerror("Error adding %s %s to terminal list\n", objtype_as_astr(term).cstr(), temp.cstr()); |
| 151 | if (!(m_terminals.add(term.name(), &term, false)==TMERR_NONE)) |
| 152 | fatalerror("Error adding %s %s to terminal list\n", objtype_as_astr(term).cstr(), term.name().cstr()); |
156 | 153 | NL_VERBOSE_OUT(("%s %s\n", objtype_as_astr(term).cstr(), name.cstr())); |
157 | 154 | } |
158 | 155 | break; |
r26365 | r26366 | |
366 | 363 | netlist_net_t *anet = new netlist_net_t(netlist_object_t::NET, netlist_object_t::ANALOG); |
367 | 364 | t1.set_net(*anet); |
368 | 365 | m_netlist.solver()->m_nets.add(anet); |
369 | | t1.net().init_object(netlist()); |
| 366 | // FIXME: Nets should have a unique name |
| 367 | t1.net().init_object(netlist(),"some net"); |
370 | 368 | t1.net().register_con(t2); |
371 | 369 | t1.net().register_con(t1); |
372 | 370 | } |
trunk/src/mame/drivers/pong.c
r26365 | r26366 | |
465 | 465 | NETDEV_PARAM(videomix.R2, RES_K(1.2)) |
466 | 466 | NETDEV_PARAM(videomix.R3, RES_K(22)) |
467 | 467 | |
| 468 | #if 0 |
468 | 469 | NETDEV_SOLVER(Solver) |
469 | 470 | NETDEV_ANALOG_CONST(V5, 5) |
470 | 471 | NETDEV_ANALOG_CONST(V1, 1) |
471 | 472 | NETDEV_ANALOG_CONST(V0, 0) |
472 | | #if 0 |
| 473 | |
473 | 474 | NETDEV_R(R1, 10) |
474 | 475 | NETDEV_R(R2, 10) |
475 | 476 | NETDEV_R(R3, 10) |
r26365 | r26366 | |
515 | 516 | //NETDEV_LOG(log1, D1.A) |
516 | 517 | #endif |
517 | 518 | |
| 519 | #if 0 |
518 | 520 | // astable NAND Multivibrator |
519 | 521 | NETDEV_R(R1, 1000) |
520 | 522 | NETDEV_C(C1, 1e-6) |
r26365 | r26366 | |
526 | 528 | //NETDEV_LOG(log2, C1.2) |
527 | 529 | //NETDEV_LOG(log2, n1.Q) |
528 | 530 | //NETDEV_LOG(log3, n2.Q) |
| 531 | #endif |
529 | 532 | NETLIST_END |
530 | 533 | |
531 | 534 | static NETLIST_START(pong) |