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) |