diff --git a/src/devices/machine/netlist.cpp b/src/devices/machine/netlist.cpp index b05ae7b9625..1eccdd3f291 100644 --- a/src/devices/machine/netlist.cpp +++ b/src/devices/machine/netlist.cpp @@ -213,22 +213,26 @@ private: class netlist_source_memregion_t : public netlist::source_t { public: - netlist_source_memregion_t(netlist::nlparse_t &setup, pstring name) - : netlist::source_t(setup), m_name(name) + netlist_source_memregion_t(device_t &dev, pstring name) + : netlist::source_t(), m_dev(dev), m_name(name) { } virtual std::unique_ptr stream(const pstring &name) override; private: + device_t &m_dev; pstring m_name; }; class netlist_data_memregions_t : public netlist::source_t { public: - netlist_data_memregions_t(netlist::setup_t &setup); + netlist_data_memregions_t(device_t &dev); virtual std::unique_ptr stream(const pstring &name) override; + +private: + device_t &m_dev; }; @@ -238,18 +242,20 @@ public: std::unique_ptr netlist_source_memregion_t::stream(const pstring &name) { - memory_region *mem = static_cast(setup().setup().exec()).machine().root_device().memregion(m_name.c_str()); + //memory_region *mem = static_cast(setup().setup().exec()).machine().root_device().memregion(m_name.c_str()); + memory_region *mem = m_dev.machine().root_device().memregion(m_name.c_str()); return plib::make_unique(mem->base(), mem->bytes()); } -netlist_data_memregions_t::netlist_data_memregions_t(netlist::setup_t &setup) - : netlist::source_t(setup, netlist::source_t::DATA) +netlist_data_memregions_t::netlist_data_memregions_t(device_t &dev) + : netlist::source_t(netlist::source_t::DATA), m_dev(dev) { } std::unique_ptr netlist_data_memregions_t::stream(const pstring &name) { - memory_region *mem = static_cast(setup().setup().exec()).parent().memregion(name.c_str()); + //memory_region *mem = static_cast(setup().setup().exec()).parent().memregion(name.c_str()); + memory_region *mem = m_dev.memregion(name.c_str()); if (mem != nullptr) { return plib::make_unique(mem->base(), mem->bytes()); @@ -454,9 +460,9 @@ netlist::setup_t &netlist_mame_device::setup() return m_netlist->nlstate().setup(); } -void netlist_mame_device::register_memregion_source(netlist::nlparse_t &setup, const char *name) +void netlist_mame_device::register_memregion_source(netlist::nlparse_t &setup, device_t &dev, const char *name) { - setup.register_source(plib::make_unique(setup, pstring(name))); + setup.register_source(plib::make_unique(dev, pstring(name))); } void netlist_mame_analog_input_device::write(const double val) @@ -826,12 +832,6 @@ netlist_mame_device::~netlist_mame_device() LOGDEVCALLS("~netlist_mame_device\n"); } -void netlist_mame_device::set_constructor(void (*setup_func)(netlist::nlparse_t &)) -{ - if (LOG_DEV_CALLS) logerror("set_constructor\n"); - m_setup_func = setup_func; -} - void netlist_mame_device::device_config_complete() { LOGDEVCALLS("device_config_complete %s\n", this->mconfig().gamedrv().name); @@ -867,7 +867,7 @@ void netlist_mame_device::device_start() } /* add default data provider for roms */ - setup().register_source(plib::make_unique(setup())); + setup().register_source(plib::make_unique(*this)); m_setup_func(setup()); diff --git a/src/devices/machine/netlist.h b/src/devices/machine/netlist.h index 615f1fb1880..182c77ece2c 100644 --- a/src/devices/machine/netlist.h +++ b/src/devices/machine/netlist.h @@ -11,6 +11,8 @@ #ifndef MAME_MACHINE_NETLIST_H #define MAME_MACHINE_NETLIST_H +#include + #include "netlist/nl_time.h" #include "netlist/netlist_types.h" @@ -32,6 +34,9 @@ namespace netlist { #define MCFG_NETLIST_SETUP(_setup) \ downcast(*device).set_constructor(NETLIST_NAME(_setup)); +#define MCFG_NETLIST_SETUP_MEMBER(_obj, _setup) \ + downcast(*device).set_constructor(_obj, _setup); + #define MCFG_NETLIST_ANALOG_INPUT(_basetag, _tag, _name) \ MCFG_DEVICE_ADD(_basetag ":" _tag, NETLIST_ANALOG_INPUT, 0) \ downcast(*device).set_name(_name); @@ -80,9 +85,10 @@ namespace netlist { #define NETLIST_ANALOG_PORT_CHANGED(_base, _tag) \ PORT_CHANGED_MEMBER(_base ":" _tag, netlist_mame_analog_input_device, input_changed, 0) +/* This macro can only be called from device member */ #define MEMREGION_SOURCE(_name) \ - netlist_mame_device::register_memregion_source(setup, _name); + netlist_mame_device::register_memregion_source(setup, *this, _name); #define NETDEV_ANALOG_CALLBACK_MEMBER(_name) \ void _name(const double data, const attotime &time) @@ -102,11 +108,22 @@ public: class netlist_mame_t; class netlist_mame_callbacks_t; + using func_type = std::function; + // construction/destruction netlist_mame_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); virtual ~netlist_mame_device(); - void set_constructor(void (*setup_func)(netlist::nlparse_t &)); + void set_constructor(void (*setup_func)(netlist::nlparse_t &)) + { + m_setup_func = func_type(setup_func); + } + + template + void set_constructor(T *obj, F && f) + { + m_setup_func = std::move(std::bind(std::forward(f), obj, std::placeholders::_1)); + } ATTR_HOT inline netlist::setup_t &setup(); ATTR_HOT inline netlist_mame_t &netlist() { return *m_netlist; } @@ -114,7 +131,7 @@ public: ATTR_HOT void update_icount(netlist::netlist_time time); ATTR_HOT void check_mame_abort_slice(); - static void register_memregion_source(netlist::nlparse_t &setup, const char *name); + static void register_memregion_source(netlist::nlparse_t &setup, device_t &dev, const char *name); int m_icount; @@ -145,7 +162,7 @@ private: netlist::poolptr m_netlist; - void (*m_setup_func)(netlist::nlparse_t &); + func_type m_setup_func; }; // ---------------------------------------------------------------------------------------- diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index d032ad45b02..c99bc1d116b 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -237,13 +237,13 @@ detail::terminal_type detail::core_terminal_t::type() const // ---------------------------------------------------------------------------------------- netlist_t::netlist_t(const pstring &aname, std::unique_ptr callbacks) - : m_time(netlist_time::zero()) - , m_mainclock(nullptr) - , m_state(plib::make_unique(aname, + : m_state(plib::make_unique(aname, std::move(callbacks), plib::make_unique(*this))) // FIXME, ugly but needed to have netlist_state_t constructed first - , m_queue(*m_state) , m_solver(nullptr) + , m_time(netlist_time::zero()) + , m_mainclock(nullptr) + , m_queue(*m_state) { devices::initialize_factory(nlstate().setup().factory()); NETLIST_NAME(base)(nlstate().setup()); diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index bee5ffe9b38..24f57c979c1 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -1453,19 +1453,16 @@ namespace netlist void print_stats() const; private: + std::unique_ptr m_state; + devices::NETLIB_NAME(solver) * m_solver; + /* mostly rw */ PALIGNAS_CACHELINE() netlist_time m_time; - PALIGNAS_CACHELINE() devices::NETLIB_NAME(mainclock) * m_mainclock; - PALIGNAS_CACHELINE() - std::unique_ptr m_state; - PALIGNAS_CACHELINE() detail::queue_t m_queue; - devices::NETLIB_NAME(solver) * m_solver; - // performance nperftime_t m_stat_mainloop; nperfcount_t m_perf_out_processed; diff --git a/src/lib/netlist/nl_lists.h b/src/lib/netlist/nl_lists.h index 7dfe8139e19..39f4343be30 100644 --- a/src/lib/netlist/nl_lists.h +++ b/src/lib/netlist/nl_lists.h @@ -37,6 +37,7 @@ namespace netlist void lock() noexcept{ while (m_lock.test_and_set(std::memory_order_acquire)) { } } void unlock() noexcept { m_lock.clear(std::memory_order_release); } private: + PALIGNAS_CACHELINE() std::atomic_flag m_lock = ATOMIC_FLAG_INIT; }; @@ -96,7 +97,7 @@ namespace netlist /* Use TS = true for a threadsafe queue */ template - class PALIGNAS_CACHELINE() timed_queue_linear : plib::nocopyassignmove + class timed_queue_linear : plib::nocopyassignmove { public: @@ -192,6 +193,7 @@ namespace netlist using lock_guard_type = std::lock_guard; mutex_type m_lock; + PALIGNAS_CACHELINE() T * m_end; std::vector m_list; diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index b8fba6f03aa..b9196852878 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -101,7 +101,7 @@ namespace netlist { for (auto &source : m_sources) { - if (source->parse(netlist_name)) + if (source->parse(*this, netlist_name)) return; } log().fatal(MF_1_NOT_FOUND_IN_SOURCE_COLLECTION, netlist_name); @@ -1136,13 +1136,13 @@ void setup_t::prepare_to_run() // base sources // ---------------------------------------------------------------------------------------- -bool source_t::parse(const pstring &name) +bool source_t::parse(nlparse_t &setup, const pstring &name) { if (m_type != SOURCE) return false; else { - return m_setup.parse_stream(stream(name), name); + return setup.parse_stream(stream(name), name); } } @@ -1164,11 +1164,11 @@ std::unique_ptr source_file_t::stream(const pstring &name) return plib::make_unique(m_filename); } -bool source_proc_t::parse(const pstring &name) +bool source_proc_t::parse(nlparse_t &setup, const pstring &name) { if (name == m_setup_func_name) { - m_setup_func(setup()); + m_setup_func(setup); return true; } else diff --git a/src/lib/netlist/nl_setup.h b/src/lib/netlist/nl_setup.h index bbffba1257a..448df3490da 100644 --- a/src/lib/netlist/nl_setup.h +++ b/src/lib/netlist/nl_setup.h @@ -67,7 +67,7 @@ void NETLIST_NAME(name)(netlist::nlparse_t &setup) \ #define NETLIST_END() } #define LOCAL_SOURCE(name) \ - setup.register_source(plib::make_unique(setup, # name, &NETLIST_NAME(name))); + setup.register_source(plib::make_unique(# name, &NETLIST_NAME(name))); #define LOCAL_LIB_ENTRY(name) \ LOCAL_SOURCE(name) \ @@ -182,24 +182,22 @@ namespace netlist using list_t = std::vector>; - source_t(nlparse_t &setup, const type_t type = SOURCE) - : m_setup(setup) - , m_type(type) + source_t(const type_t type = SOURCE) + : m_type(type) {} COPYASSIGNMOVE(source_t, delete) virtual ~source_t() noexcept = default; - virtual bool parse(const pstring &name); - nlparse_t &setup() { return m_setup; } + virtual bool parse(nlparse_t &setup, const pstring &name); + type_t type() const { return m_type; } protected: virtual std::unique_ptr stream(const pstring &name) = 0; private: - nlparse_t &m_setup; const type_t m_type; }; @@ -400,8 +398,8 @@ namespace netlist { public: - source_string_t(setup_t &setup, const pstring &source) - : source_t(setup), m_str(source) + source_string_t(const pstring &source) + : source_t(), m_str(source) { } @@ -416,8 +414,8 @@ namespace netlist { public: - source_file_t(setup_t &setup, const pstring &filename) - : source_t(setup), m_filename(filename) + source_file_t(const pstring &filename) + : source_t(), m_filename(filename) { } @@ -431,8 +429,8 @@ namespace netlist class source_mem_t : public source_t { public: - source_mem_t(setup_t &setup, const char *mem) - : source_t(setup), m_str(mem) + source_mem_t(const char *mem) + : source_t(), m_str(mem) { } @@ -446,14 +444,14 @@ namespace netlist class source_proc_t : public source_t { public: - source_proc_t(nlparse_t &setup, pstring name, void (*setup_func)(nlparse_t &)) - : source_t(setup), + source_proc_t(pstring name, void (*setup_func)(nlparse_t &)) + : source_t(), m_setup_func(setup_func), m_setup_func_name(name) { } - bool parse(const pstring &name) override; + bool parse(nlparse_t &setup, const pstring &name) override; protected: std::unique_ptr stream(const pstring &name) override; diff --git a/src/lib/netlist/prg/nltool.cpp b/src/lib/netlist/prg/nltool.cpp index 37b2ba6565d..ea7e1426626 100644 --- a/src/lib/netlist/prg/nltool.cpp +++ b/src/lib/netlist/prg/nltool.cpp @@ -120,9 +120,8 @@ NETLIST_END() class netlist_data_folder_t : public netlist::source_t { public: - netlist_data_folder_t(netlist::setup_t &setup, - pstring folder) - : netlist::source_t(setup, netlist::source_t::DATA) + netlist_data_folder_t(pstring folder) + : netlist::source_t(netlist::source_t::DATA) , m_folder(folder) { } @@ -189,9 +188,9 @@ public: setup().add_define(d); for (auto & r : roms) - setup().register_source(plib::make_unique(setup(), r)); + setup().register_source(plib::make_unique(r)); - setup().register_source(plib::make_unique(setup(), filename)); + setup().register_source(plib::make_unique(filename)); setup().include(name); create_dynamic_logs(logs); @@ -524,7 +523,7 @@ void tool_app_t::create_header() nt.log().verbose.set_enabled(false); nt.log().warning.set_enabled(false); - nt.setup().register_source(plib::make_unique(nt.setup(), "dummy", &netlist_dummy)); + nt.setup().register_source(plib::make_unique("dummy", &netlist_dummy)); nt.setup().include("dummy"); pout("// license:GPL-2.0+\n"); @@ -568,7 +567,7 @@ void tool_app_t::create_docheader() nt.log().verbose.set_enabled(false); nt.log().warning.set_enabled(false); - nt.setup().register_source(plib::make_unique(nt.setup(), "dummy", &netlist_dummy)); + nt.setup().register_source(plib::make_unique("dummy", &netlist_dummy)); nt.setup().include("dummy"); std::vector devs; @@ -620,7 +619,7 @@ void tool_app_t::listdevices() netlist::factory::list_t &list = nt.setup().factory(); - nt.setup().register_source(plib::make_unique(nt.setup(), "dummy", &netlist_dummy)); + nt.setup().register_source(plib::make_unique("dummy", &netlist_dummy)); nt.setup().include("dummy"); diff --git a/src/mame/drivers/pong.cpp b/src/mame/drivers/pong.cpp index 926e35ddee4..b7fd9b4d77d 100644 --- a/src/mame/drivers/pong.cpp +++ b/src/mame/drivers/pong.cpp @@ -184,6 +184,15 @@ public: void pongd(machine_config &config); void pong(machine_config &config); void pongf(machine_config &config); + + NETLIST_START(pong) + + MEMREGION_SOURCE("maincpu") + PARAM(NETLIST.USE_DEACTIVATE, 1) + INCLUDE(pong_schematics) + + NETLIST_END() + protected: // driver_device overrides @@ -260,6 +269,7 @@ private: }; +#if 0 static NETLIST_START(pong) MEMREGION_SOURCE("maincpu") @@ -267,6 +277,7 @@ static NETLIST_START(pong) INCLUDE(pong_schematics) NETLIST_END() +#endif INPUT_CHANGED_MEMBER(pong_state::input_changed) { @@ -379,7 +390,8 @@ MACHINE_CONFIG_START(pong_state::pong) /* basic machine hardware */ MCFG_DEVICE_ADD("maincpu", NETLIST_CPU, NETLIST_CLOCK) - MCFG_NETLIST_SETUP(pong) + //MCFG_NETLIST_SETUP(pong) + MCFG_NETLIST_SETUP_MEMBER(this, &pong_state::NETLIST_NAME(pong)) MCFG_NETLIST_ANALOG_INPUT("maincpu", "vr0", "ic_b9_R.R") MCFG_NETLIST_ANALOG_MULT_OFFSET(1.0 / 100.0 * RES_K(50), RES_K(56) )