From 14a5f0143e267631d1bced5f35f0851748c2ca2c Mon Sep 17 00:00:00 2001 From: couriersud Date: Wed, 22 Jun 2016 23:19:14 +0200 Subject: [PATCH] Better seperation of setup_t and netlist_t. (nw) --- src/devices/machine/netlist.cpp | 2 +- src/lib/netlist/nl_base.cpp | 60 ++++------------------------ src/lib/netlist/nl_base.h | 6 ++- src/lib/netlist/nl_setup.cpp | 70 +++++++++++++++++++++++++++------ src/lib/netlist/nl_setup.h | 1 - 5 files changed, 71 insertions(+), 68 deletions(-) diff --git a/src/devices/machine/netlist.cpp b/src/devices/machine/netlist.cpp index 7160b696b52..b924e052e50 100644 --- a/src/devices/machine/netlist.cpp +++ b/src/devices/machine/netlist.cpp @@ -103,7 +103,7 @@ void netlist_mame_analog_output_t::custom_netlist_additions(netlist::setup_t &se plib::owned_ptr dev = plib::owned_ptr::Create(setup.netlist(), setup.build_fqn(dname)); static_cast(dev.get())->register_callback(m_delegate); - setup.register_dev(std::move(dev)); + setup.netlist().register_dev(std::move(dev)); setup.register_link(dname + ".IN", m_in); } diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index 16f2edaf6e1..e20c240a374 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -217,6 +217,14 @@ nl_double netlist_t::gmin() const return solver()->gmin(); } +void netlist_t::register_dev(plib::owned_ptr dev) +{ + for (auto & d : m_devices) + if (d->name() == dev->name()) + log().fatal("Error adding {1} to device list. Duplicate name \n", d->name()); + m_devices.push_back(std::move(dev)); +} + void netlist_t::start() { /* load the library ... */ @@ -225,59 +233,7 @@ void netlist_t::start() m_lib = plib::palloc(libpath); - /* make sure the solver and parameters are started first! */ - for (auto & e : setup().m_device_factory) - { - if ( setup().factory().is_class(e.second) - || setup().factory().is_class(e.second) - || setup().factory().is_class(e.second) - || setup().factory().is_class(e.second)) - { - auto dev = plib::owned_ptr(e.second->Create(*this, e.first)); - setup().register_dev(std::move(dev)); - } - } - - log().debug("Searching for mainclock and solver ...\n"); - - m_mainclock = get_single_device("mainclock"); - m_solver = get_single_device("solver"); - m_gnd = get_single_device("gnd"); - m_params = get_single_device("parameter"); - - /* create devices */ - - for (auto & e : setup().m_device_factory) - { - if ( !setup().factory().is_class(e.second) - && !setup().factory().is_class(e.second) - && !setup().factory().is_class(e.second) - && !setup().factory().is_class(e.second)) - { - auto dev = plib::owned_ptr(e.second->Create(*this, e.first)); - setup().register_dev(std::move(dev)); - } - } - - bool use_deactivate = (m_params->m_use_deactivate.Value() ? true : false); - - - for (auto &d : m_devices) - { - if (use_deactivate) - { - auto p = setup().m_param_values.find(d->name() + ".HINT_NO_DEACTIVATE"); - if (p != setup().m_param_values.end()) - { - //FIXME: Error checking - auto v = p->second.as_long(); - d->set_hint_deactivate(!v); - } - } - else - d->set_hint_deactivate(false); - } } void netlist_t::stop() diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 5cad1962da5..1451e18038d 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -1066,6 +1066,7 @@ namespace netlist class netlist_t : public plib::plog_dispatch_intf { + friend class setup_t; P_PREVENT_COPYING(netlist_t) public: @@ -1095,6 +1096,9 @@ namespace netlist void set_setup(setup_t *asetup) { m_setup = asetup; } setup_t &setup() { return *m_setup; } + + void register_dev(plib::owned_ptr dev); + net_t *find_net(const pstring &name); template @@ -1156,7 +1160,7 @@ namespace netlist /* sole use is to manage lifetime of family objects */ std::vector>> m_family_cache; -protected: + protected: // performance nperfcount_t m_perf_out_processed; diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index 830d9305327..9de53e2a45f 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -100,15 +100,6 @@ void setup_t::namespace_pop() m_namespace_stack.pop(); } - -void setup_t::register_dev(plib::owned_ptr dev) -{ - for (auto & d : netlist().m_devices) - if (d->name() == dev->name()) - log().fatal("Error adding {1} to device list. Duplicate name \n", d->name()); - netlist().m_devices.push_back(std::move(dev)); -} - void setup_t::register_lib_entry(const pstring &name) { if (plib::container::contains(m_lib, name)) @@ -454,7 +445,7 @@ devices::nld_base_proxy *setup_t::get_d_a_proxy(core_terminal_t &out) proxy = new_proxy.get(); - register_dev(std::move(new_proxy)); + netlist().register_dev(std::move(new_proxy)); } return proxy; } @@ -472,7 +463,7 @@ void setup_t::connect_input_output(core_terminal_t &in, core_terminal_t &out) proxy->m_Q.net().register_con(in); out.net().register_con(proxy->m_I); - register_dev(std::move(proxy)); + netlist().register_dev(std::move(proxy)); } else if (out.is_logic() && in.is_analog()) @@ -515,7 +506,7 @@ void setup_t::connect_terminal_input(terminal_t &term, core_terminal_t &inp) else proxy->m_Q.net().register_con(inp); - register_dev(std::move(proxy)); + netlist().register_dev(std::move(proxy)); } else { @@ -782,10 +773,63 @@ void setup_t::start_devices() auto nc = factory().factory_by_name("LOG")->Create(netlist(), name); register_link(name + ".I", ll); log().debug(" dynamic link {1}: <{2}>\n",ll, name); - register_dev(std::move(nc)); + netlist().register_dev(std::move(nc)); } } + /* make sure the solver and parameters are started first! */ + + for (auto & e : m_device_factory) + { + if ( factory().is_class(e.second) + || factory().is_class(e.second) + || factory().is_class(e.second) + || factory().is_class(e.second)) + { + auto dev = plib::owned_ptr(e.second->Create(netlist(), e.first)); + netlist().register_dev(std::move(dev)); + } + } + + log().debug("Searching for mainclock and solver ...\n"); + + netlist().m_mainclock = netlist().get_single_device("mainclock"); + netlist().m_solver = netlist().get_single_device("solver"); + netlist().m_gnd = netlist().get_single_device("gnd"); + netlist().m_params = netlist().get_single_device("parameter"); + + /* create devices */ + + for (auto & e : m_device_factory) + { + if ( !factory().is_class(e.second) + && !factory().is_class(e.second) + && !factory().is_class(e.second) + && !factory().is_class(e.second)) + { + auto dev = plib::owned_ptr(e.second->Create(netlist(), e.first)); + netlist().register_dev(std::move(dev)); + } + } + + bool use_deactivate = (netlist().m_params->m_use_deactivate.Value() ? true : false); + + for (auto &d : netlist().m_devices) + { + if (use_deactivate) + { + auto p = m_param_values.find(d->name() + ".HINT_NO_DEACTIVATE"); + if (p != m_param_values.end()) + { + //FIXME: Error checking + auto v = p->second.as_long(); + d->set_hint_deactivate(!v); + } + } + else + d->set_hint_deactivate(false); + } + netlist().start(); } diff --git a/src/lib/netlist/nl_setup.h b/src/lib/netlist/nl_setup.h index ed2e4f3bbe2..71311e20a24 100644 --- a/src/lib/netlist/nl_setup.h +++ b/src/lib/netlist/nl_setup.h @@ -185,7 +185,6 @@ namespace netlist void register_term(core_terminal_t &obj); - void register_dev(plib::owned_ptr dev); void register_dev(const pstring &classname, const pstring &name); void register_lib_entry(const pstring &name);