trunk/src/emu/netlist/nl_setup.c
r26406 | r26407 | |
410 | 410 | } |
411 | 411 | } |
412 | 412 | |
| 413 | void netlist_setup_t::connect(netlist_terminal_t &t1, netlist_terminal_t &t2) |
| 414 | { |
| 415 | NL_VERBOSE_OUT(("Connecting %s to %s\n", t1.name().cstr(), t2s.name().cstr())); |
| 416 | |
| 417 | // FIXME: amend device design so that warnings can be turned into errors |
| 418 | // Only variable inputs have this issue |
| 419 | if (t1.isType(netlist_terminal_t::OUTPUT) && t2.isType(netlist_terminal_t::INPUT)) |
| 420 | { |
| 421 | if (t2.has_net()) |
| 422 | mame_printf_warning("Input %s already connected\n", t2.name().cstr()); |
| 423 | connect_input_output(dynamic_cast<netlist_input_t &>(t2), dynamic_cast<netlist_output_t &>(t1)); |
| 424 | } |
| 425 | else if (t1.isType(netlist_terminal_t::INPUT) && t2.isType(netlist_terminal_t::OUTPUT)) |
| 426 | { |
| 427 | if (t1.has_net()) |
| 428 | mame_printf_warning("Input %s already connected\n", t1.name().cstr()); |
| 429 | connect_input_output(dynamic_cast<netlist_input_t &>(t1), dynamic_cast<netlist_output_t &>(t2)); |
| 430 | } |
| 431 | else if (t1.isType(netlist_terminal_t::OUTPUT) && t2.isType(netlist_terminal_t::TERMINAL)) |
| 432 | { |
| 433 | connect_terminal_output(dynamic_cast<netlist_terminal_t &>(t2), dynamic_cast<netlist_output_t &>(t1)); |
| 434 | } |
| 435 | else if (t1.isType(netlist_terminal_t::TERMINAL) && t2.isType(netlist_terminal_t::OUTPUT)) |
| 436 | { |
| 437 | connect_terminal_output(dynamic_cast<netlist_terminal_t &>(t1), dynamic_cast<netlist_output_t &>(t2)); |
| 438 | } |
| 439 | else if (t1.isType(netlist_terminal_t::INPUT) && t2.isType(netlist_terminal_t::TERMINAL)) |
| 440 | { |
| 441 | connect_terminal_input(dynamic_cast<netlist_terminal_t &>(t2), dynamic_cast<netlist_input_t &>(t1)); |
| 442 | } |
| 443 | else if (t1.isType(netlist_terminal_t::TERMINAL) && t2.isType(netlist_terminal_t::INPUT)) |
| 444 | { |
| 445 | connect_terminal_input(dynamic_cast<netlist_terminal_t &>(t1), dynamic_cast<netlist_input_t &>(t2)); |
| 446 | } |
| 447 | else if (t1.isType(netlist_terminal_t::TERMINAL) && t2.isType(netlist_terminal_t::TERMINAL)) |
| 448 | { |
| 449 | connect_terminals(dynamic_cast<netlist_terminal_t &>(t1), dynamic_cast<netlist_terminal_t &>(t2)); |
| 450 | } |
| 451 | else |
| 452 | fatalerror("Connecting %s to %s not supported!\n", t1.name().cstr(), t2.name().cstr()); |
| 453 | } |
| 454 | |
413 | 455 | void netlist_setup_t::resolve_inputs(void) |
414 | 456 | { |
415 | 457 | NL_VERBOSE_OUT(("Searching for mainclock and solver ...\n")); |
r26406 | r26407 | |
435 | 477 | netlist_terminal_t &t1 = find_terminal(t1s); |
436 | 478 | netlist_terminal_t &t2 = find_terminal(t2s); |
437 | 479 | |
438 | | NL_VERBOSE_OUT(("Connecting %s to %s\n", t1s.cstr(), t2s.cstr())); |
439 | | |
440 | | // FIXME: amend device design so that warnings can be turned into errors |
441 | | // Only variable inputs have this issue |
442 | | if (t1.isType(netlist_terminal_t::OUTPUT) && t2.isType(netlist_terminal_t::INPUT)) |
443 | | { |
444 | | if (t2.has_net()) |
445 | | mame_printf_warning("Input %s already connected\n", t2s.cstr()); |
446 | | connect_input_output(dynamic_cast<netlist_input_t &>(t2), dynamic_cast<netlist_output_t &>(t1)); |
447 | | } |
448 | | else if (t1.isType(netlist_terminal_t::INPUT) && t2.isType(netlist_terminal_t::OUTPUT)) |
449 | | { |
450 | | if (t1.has_net()) |
451 | | mame_printf_warning("Input %s already connected\n", t1s.cstr()); |
452 | | connect_input_output(dynamic_cast<netlist_input_t &>(t1), dynamic_cast<netlist_output_t &>(t2)); |
453 | | } |
454 | | else if (t1.isType(netlist_terminal_t::OUTPUT) && t2.isType(netlist_terminal_t::TERMINAL)) |
455 | | { |
456 | | connect_terminal_output(dynamic_cast<netlist_terminal_t &>(t2), dynamic_cast<netlist_output_t &>(t1)); |
457 | | } |
458 | | else if (t1.isType(netlist_terminal_t::TERMINAL) && t2.isType(netlist_terminal_t::OUTPUT)) |
459 | | { |
460 | | connect_terminal_output(dynamic_cast<netlist_terminal_t &>(t1), dynamic_cast<netlist_output_t &>(t2)); |
461 | | } |
462 | | else if (t1.isType(netlist_terminal_t::INPUT) && t2.isType(netlist_terminal_t::TERMINAL)) |
463 | | { |
464 | | connect_terminal_input(dynamic_cast<netlist_terminal_t &>(t2), dynamic_cast<netlist_input_t &>(t1)); |
465 | | } |
466 | | else if (t1.isType(netlist_terminal_t::TERMINAL) && t2.isType(netlist_terminal_t::INPUT)) |
467 | | { |
468 | | connect_terminal_input(dynamic_cast<netlist_terminal_t &>(t1), dynamic_cast<netlist_input_t &>(t2)); |
469 | | } |
470 | | else if (t1.isType(netlist_terminal_t::TERMINAL) && t2.isType(netlist_terminal_t::TERMINAL)) |
471 | | { |
472 | | connect_terminals(dynamic_cast<netlist_terminal_t &>(t1), dynamic_cast<netlist_terminal_t &>(t2)); |
473 | | } |
474 | | else |
475 | | fatalerror("Connecting %s to %s not supported!\n", t1s.cstr(), t2s.cstr()); |
| 480 | connect(t1, t2); |
476 | 481 | } |
477 | 482 | |
478 | 483 | /* print all outputs */ |
trunk/src/emu/netlist/nl_base.c
r26406 | r26407 | |
292 | 292 | register_input(*this, name, inp, type); |
293 | 293 | } |
294 | 294 | |
| 295 | static void init_term(netlist_core_device_t &dev, netlist_terminal_t &term, netlist_input_t::state_e aState) |
| 296 | { |
| 297 | if (!term.isInitalized()) |
| 298 | { |
| 299 | switch (term.type()) |
| 300 | { |
| 301 | case netlist_terminal_t::OUTPUT: |
| 302 | dynamic_cast<netlist_output_t &>(term).init_object(dev, "internal output"); |
| 303 | break; |
| 304 | case netlist_terminal_t::INPUT: |
| 305 | dynamic_cast<netlist_input_t &>(term).init_object(dev, "internal input", aState); |
| 306 | break; |
| 307 | case netlist_terminal_t::TERMINAL: |
| 308 | dynamic_cast<netlist_terminal_t &>(term).init_object(dev, "internal terminal", aState); |
| 309 | break; |
| 310 | default: |
| 311 | fatalerror("Unknown terminal type"); |
| 312 | } |
| 313 | } |
| 314 | } |
| 315 | |
295 | 316 | // FIXME: Revise internal links ... |
296 | 317 | 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) |
297 | 318 | { |
298 | | in.init_object(dev, "internal input", aState); |
299 | | // ensure we are not yet initialized ... |
300 | | if (!out.net().isRailNet()) |
301 | | out.init_object(dev, "internal output"); |
302 | | //if (in.state() != net_input_t::INP_STATE_PASSIVE) |
303 | | out.net().register_con(in); |
| 319 | init_term(dev, in, aState); |
| 320 | init_term(dev, out, aState); |
| 321 | m_setup->connect(in, out); |
304 | 322 | } |
305 | 323 | |
306 | 324 | ATTR_COLD void netlist_device_t::register_link_internal(netlist_input_t &in, netlist_output_t &out, netlist_input_t::state_e aState) |