summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine
diff options
context:
space:
mode:
author Couriersud <couriersud@gmx.org>2020-09-05 19:43:54 +0200
committer Couriersud <couriersud@gmx.org>2020-09-05 21:31:49 +0200
commitf3eb6324652fea263972087146fbdde9e32f9a0f (patch)
treef63d352948c3a4fcf62857839cc5c5359804b0f5 /src/devices/machine
parent4dd7e21f565b12e8487b884089d769f0b30147c6 (diff)
netlist: code maintenance and performance optimizations.
* rename some misleading type names * remove callback_t and replace by better scalable approach * hide implementations details * move sources classes from putil.h to psources.h * reduce code complexity * improve parsing performance, parsing netlists now is twice as fast. * fix issues around multi-byte string support * moved psplit into pstrutil.h
Diffstat (limited to 'src/devices/machine')
-rw-r--r--src/devices/machine/netlist.cpp190
-rw-r--r--src/devices/machine/netlist.h1
2 files changed, 80 insertions, 111 deletions
diff --git a/src/devices/machine/netlist.cpp b/src/devices/machine/netlist.cpp
index 0744b67d87d..10208d8e357 100644
--- a/src/devices/machine/netlist.cpp
+++ b/src/devices/machine/netlist.cpp
@@ -85,18 +85,21 @@ static attotime attotime_from_nltime(netlist::netlist_time_ext t)
}
#endif
-class netlist_mame_device::netlist_mame_callbacks_t : public netlist::callbacks_t
+class netlist_mame_device::netlist_mame_t : public netlist::netlist_state_t
{
public:
- netlist_mame_callbacks_t(const netlist_mame_device &parent)
- : netlist::callbacks_t()
+ netlist_mame_t(netlist_mame_device &parent, const pstring &name)
+ : netlist::netlist_state_t(name, plib::plog_delegate(&netlist_mame_t::logger, this))
, m_parent(parent)
{
}
-protected:
- void vlog(const plib::plog_level &l, const pstring &ls) const noexcept override
+ running_machine &machine() { return m_parent.machine(); }
+ netlist_mame_device &parent() const { return m_parent; }
+
+private:
+ void logger(plib::plog_level l, const pstring &ls)
{
switch (l)
{
@@ -121,78 +124,6 @@ protected:
}
}
- std::unique_ptr<plib::dynlib_base> static_solver_lib() const noexcept override
- {
- //return plib::make_unique<plib::dynlib_static>(nullptr);
- return std::make_unique<plib::dynlib_static>(nl_static_solver_syms);
- }
-
-private:
- const netlist_mame_device &m_parent;
-};
-
-class netlist_validate_callbacks_t : public netlist::callbacks_t
-{
-public:
-
- netlist_validate_callbacks_t()
- : netlist::callbacks_t()
- {
- }
-
-protected:
- void vlog(const plib::plog_level &l, const pstring &ls) const noexcept override
- {
- switch (l)
- {
- case plib::plog_level::DEBUG:
- break;
- case plib::plog_level::VERBOSE:
- break;
- case plib::plog_level::INFO:
- osd_printf_verbose("netlist INFO: %s\n", ls);
- break;
- case plib::plog_level::WARNING:
- osd_printf_warning("netlist WARNING: %s\n", ls);
- break;
- case plib::plog_level::ERROR:
- osd_printf_error("netlist ERROR: %s\n", ls);
- break;
- case plib::plog_level::FATAL:
- osd_printf_error("netlist FATAL: %s\n", ls);
- break;
- }
- }
-
- std::unique_ptr<plib::dynlib_base> static_solver_lib() const noexcept override
- {
- return std::make_unique<plib::dynlib_static>(nullptr);
- }
-
-private:
-};
-
-
-class netlist_mame_device::netlist_mame_t : public netlist::netlist_state_t
-{
-public:
-
- netlist_mame_t(netlist_mame_device &parent, const pstring &name)
- : netlist::netlist_state_t(name, plib::make_unique<netlist_mame_device::netlist_mame_callbacks_t, netlist::host_arena>(parent))
- , m_parent(parent)
- {
- }
-
- netlist_mame_t(netlist_mame_device &parent, const pstring &name, netlist::host_arena::unique_ptr<netlist::callbacks_t> cbs)
- : netlist::netlist_state_t(name, std::move(cbs))
- , m_parent(parent)
- {
- }
-
- running_machine &machine() { return m_parent.machine(); }
- netlist_mame_device &parent() const { return m_parent; }
-
-private:
netlist_mame_device &m_parent;
};
@@ -236,7 +167,7 @@ public:
{
}
- virtual stream_ptr stream(const pstring &name) override;
+ virtual plib::istream_uptr stream(const pstring &name) override;
private:
device_t &m_dev;
pstring m_name;
@@ -247,7 +178,7 @@ class netlist_data_memregions_t : public netlist::source_data_t
public:
netlist_data_memregions_t(const device_t &dev);
- virtual stream_ptr stream(const pstring &name) override;
+ virtual plib::istream_uptr stream(const pstring &name) override;
private:
const device_t &m_dev;
@@ -258,13 +189,13 @@ private:
// memregion source support
// ----------------------------------------------------------------------------------------
-netlist_source_memregion_t::stream_ptr netlist_source_memregion_t::stream(const pstring &name)
+plib::istream_uptr netlist_source_memregion_t::stream(const pstring &name)
{
if (m_dev.has_running_machine())
{
- memory_region *mem = m_dev.memregion(m_name.c_str());
- stream_ptr ret(std::make_unique<std::istringstream>(pstring(reinterpret_cast<char *>(mem->base()), mem->bytes())), name);
- ret.stream().imbue(std::locale::classic());
+ memory_region *mem = m_dev.memregion(putf8string(m_name).c_str());
+ plib::istream_uptr ret(std::make_unique<std::istringstream>(putf8string(reinterpret_cast<char *>(mem->base()), mem->bytes())), name);
+ ret->imbue(std::locale::classic());
return ret;
}
else
@@ -296,20 +227,20 @@ static bool rom_exists(device_t &root, pstring name)
return false;
}
-netlist_data_memregions_t::stream_ptr netlist_data_memregions_t::stream(const pstring &name)
+plib::istream_uptr netlist_data_memregions_t::stream(const pstring &name)
{
//memory_region *mem = static_cast<netlist_mame_device::netlist_mame_t &>(setup().setup().exec()).parent().memregion(name.c_str());
if (m_dev.has_running_machine())
{
- memory_region *mem = m_dev.memregion(name.c_str());
+ memory_region *mem = m_dev.memregion(putf8string(name).c_str());
if (mem != nullptr)
{
- stream_ptr ret(std::make_unique<std::istringstream>(std::string(reinterpret_cast<char *>(mem->base()), mem->bytes()), std::ios_base::binary), name);
- ret.stream().imbue(std::locale::classic());
+ plib::istream_uptr ret(std::make_unique<std::istringstream>(std::string(reinterpret_cast<char *>(mem->base()), mem->bytes()), std::ios_base::binary), name);
+ ret->imbue(std::locale::classic());
return ret;
}
else
- return stream_ptr();
+ return plib::istream_uptr();
}
else
{
@@ -317,12 +248,12 @@ netlist_data_memregions_t::stream_ptr netlist_data_memregions_t::stream(const ps
if (rom_exists(m_dev.mconfig().root_device(), pstring(m_dev.tag()) + ":" + name))
{
// Create an empty stream.
- stream_ptr ret(std::make_unique<std::istringstream>(std::ios_base::binary), name);
- ret.stream().imbue(std::locale::classic());
+ plib::istream_uptr ret(std::make_unique<std::istringstream>(std::ios_base::binary), name);
+ ret->imbue(std::locale::classic());
return ret;
}
else
- return stream_ptr();
+ return plib::istream_uptr();
}
}
@@ -813,9 +744,9 @@ void netlist_mame_stream_input_device::custom_netlist_additions(netlist::nlparse
parser.register_dev("NETDEV_SOUND_IN", name);
parser.register_param(name + ".CHAN", pstring(m_param_name));
- parser.register_param_val(name + ".MULT", m_mult);
- parser.register_param_val(name + ".OFFSET", m_offset);
- parser.register_param_val(name + ".ID", m_channel);
+ parser.register_param(name + ".MULT", m_mult);
+ parser.register_param(name + ".OFFSET", m_offset);
+ parser.register_param(name + ".ID", m_channel);
}
@@ -845,19 +776,19 @@ void netlist_mame_stream_output_device::set_params(int channel, const char *out_
///
struct save_helper
{
- save_helper(device_t *dev, const pstring &prefix)
+ save_helper(device_t *dev, const std::string &prefix)
: m_device(dev), m_prefix(prefix)
{}
template<typename T, typename X = void *>
- void save_item(T &&item, const pstring &name, X = nullptr)
+ void save_item(T &&item, const std::string &name, X = nullptr)
{
m_device->save_item(item, (m_prefix + "_" + name).c_str());
}
template <typename X = void *>
std::enable_if_t<plib::compile_info::has_int128::value && std::is_pointer<X>::value, void>
- save_item(INT128 &item, const pstring &name, X = nullptr)
+ save_item(INT128 &item, const std::string &name, X = nullptr)
{
auto *p = reinterpret_cast<std::uint64_t *>(&item);
m_device->save_item(p[0], (m_prefix + "_" + name + "_1").c_str());
@@ -866,7 +797,7 @@ struct save_helper
private:
device_t *m_device;
- pstring m_prefix;
+ std::string m_prefix;
};
void netlist_mame_stream_output_device::device_start()
@@ -1029,16 +960,48 @@ void netlist_mame_device::common_dev_start(netlist::netlist_state_t *lnetlist) c
}
}
+struct validity_logger
+{
+ void log(plib::plog_level l, const pstring &ls)
+ {
+ putf8string ls8(ls);
+
+ switch (l)
+ {
+ case plib::plog_level::DEBUG:
+ break;
+ case plib::plog_level::VERBOSE:
+ break;
+ case plib::plog_level::INFO:
+ osd_printf_verbose("netlist INFO: %s\n", ls8);
+ break;
+ case plib::plog_level::WARNING:
+ osd_printf_warning("netlist WARNING: %s\n", ls8);
+ break;
+ case plib::plog_level::ERROR:
+ osd_printf_error("netlist ERROR: %s\n", ls8);
+ break;
+ case plib::plog_level::FATAL:
+ osd_printf_error("netlist FATAL: %s\n", ls8);
+ break;
+ }
+ }
+};
+
std::unique_ptr<netlist::netlist_state_t> netlist_mame_device::base_validity_check(validity_checker &valid) const
{
try
{
+ validity_logger logger;
plib::chrono::timer<plib::chrono::system_ticks> t;
t.start();
auto lnetlist = std::make_unique<netlist::netlist_state_t>("netlist",
- plib::make_unique<netlist_validate_callbacks_t, netlist::host_arena>());
+ plib::plog_delegate(&validity_logger::log, &logger));
// enable validation mode
lnetlist->set_extended_validation(true);
+
+ lnetlist->set_static_solver_lib(std::make_unique<plib::dynlib_static>(nullptr));
+
common_dev_start(lnetlist.get());
lnetlist->setup().prepare_to_run();
@@ -1084,6 +1047,9 @@ void netlist_mame_device::device_validity_check(validity_checker &valid) const
void netlist_mame_device::device_start_common()
{
m_netlist = std::make_unique<netlist_mame_t>(*this, "netlist");
+
+ m_netlist->set_static_solver_lib(std::make_unique<plib::dynlib_static>(nl_static_solver_syms));
+
if (!machine().options().verbose())
{
m_netlist->log().verbose.set_enabled(false);
@@ -1186,37 +1152,39 @@ void netlist_mame_device::save_state()
{
for (auto const & s : netlist().run_state_manager().save_list())
{
- netlist().log().debug("saving state for {1}\n", s->name().c_str());
+ putf8string u8name(s->name());
+
+ netlist().log().debug("saving state for {1}\n", u8name.c_str());
if (s->dt().is_float())
{
if (s->dt().size() == sizeof(double))
- save_pointer((double *) s->ptr(), s->name().c_str(), s->count());
+ save_pointer((double *) s->ptr(), u8name.c_str(), s->count());
else if (s->dt().size() == sizeof(float))
- save_pointer((float *) s->ptr(), s->name().c_str(), s->count());
+ save_pointer((float *) s->ptr(), u8name.c_str(), s->count());
else
- netlist().log().fatal("Unknown floating type for {1}\n", s->name().c_str());
+ netlist().log().fatal("Unknown floating type for {1}\n", u8name.c_str());
}
else if (s->dt().is_integral())
{
if (s->dt().size() == sizeof(int64_t))
- save_pointer((int64_t *) s->ptr(), s->name().c_str(), s->count());
+ save_pointer((int64_t *) s->ptr(), u8name.c_str(), s->count());
else if (s->dt().size() == sizeof(int32_t))
- save_pointer((int32_t *) s->ptr(), s->name().c_str(), s->count());
+ save_pointer((int32_t *) s->ptr(), u8name.c_str(), s->count());
else if (s->dt().size() == sizeof(int16_t))
- save_pointer((int16_t *) s->ptr(), s->name().c_str(), s->count());
+ save_pointer((int16_t *) s->ptr(), u8name.c_str(), s->count());
else if (s->dt().size() == sizeof(int8_t))
- save_pointer((int8_t *) s->ptr(), s->name().c_str(), s->count());
+ save_pointer((int8_t *) s->ptr(), u8name.c_str(), s->count());
else if (plib::compile_info::has_int128::value && s->dt().size() == sizeof(INT128))
- save_pointer((int64_t *) s->ptr(), s->name().c_str(), s->count() * 2);
+ save_pointer((int64_t *) s->ptr(), u8name.c_str(), s->count() * 2);
else
- netlist().log().fatal("Unknown integral type size {1} for {2}\n", s->dt().size(), s->name().c_str());
+ netlist().log().fatal("Unknown integral type size {1} for {2}\n", s->dt().size(), u8name.c_str());
}
else if (s->dt().is_custom())
{
/* do nothing */
}
else
- netlist().log().fatal("found unsupported save element {1}\n", s->name());
+ netlist().log().fatal("found unsupported save element {1}\n", u8name);
}
}
@@ -1259,7 +1227,7 @@ void netlist_mame_cpu_device::device_start()
int index = 0;
for (auto &n : netlist().nets())
{
- pstring name = n->name(); //plib::replace_all(n->name(), ".", "_");
+ putf8string name(n->name()); //plib::replace_all(n->name(), ".", "_");
if (n->is_logic())
{
auto nl = downcast<netlist::logic_net_t *>(n.get());
diff --git a/src/devices/machine/netlist.h b/src/devices/machine/netlist.h
index 8b35b13bacf..b7a78c0bd77 100644
--- a/src/devices/machine/netlist.h
+++ b/src/devices/machine/netlist.h
@@ -105,6 +105,7 @@ protected:
std::unique_ptr<netlist::netlist_state_t> base_validity_check(validity_checker &valid) const;
private:
+
void common_dev_start(netlist::netlist_state_t *lnetlist) const;
std::unique_ptr<netlist_mame_t> m_netlist;