diff --git a/src/devices/machine/netlist.cpp b/src/devices/machine/netlist.cpp index 4422481dcd1..2aa5eb0ec60 100644 --- a/src/devices/machine/netlist.cpp +++ b/src/devices/machine/netlist.cpp @@ -19,6 +19,9 @@ //#include "netlist/devices/nlid_system.h" #include "netlist/plib/palloc.h" +#include "netlist/plib/pmempool.h" +#include "netlist/plib/pdynlib.h" +#include "netlist/plib/pstonum.h" #include "debugger.h" #include "romload.h" @@ -116,10 +119,10 @@ protected: } } - netlist::host_arena::unique_ptr static_solver_lib() const noexcept override + std::unique_ptr static_solver_lib() const noexcept override { //return plib::make_unique(nullptr); - return plib::make_unique(nl_static_solver_syms); + return std::make_unique(nl_static_solver_syms); } private: @@ -159,9 +162,9 @@ protected: } } - netlist::host_arena::unique_ptr static_solver_lib() const noexcept override + std::unique_ptr static_solver_lib() const noexcept override { - return plib::make_unique(nullptr); + return std::make_unique(nullptr); } private: @@ -966,11 +969,11 @@ void netlist_mame_device::common_dev_start(netlist::netlist_state_t *lnetlist) c } } -netlist::host_arena::unique_ptr netlist_mame_device::base_validity_check(validity_checker &valid) const +std::unique_ptr netlist_mame_device::base_validity_check(validity_checker &valid) const { try { - auto lnetlist = plib::make_unique("netlist", + auto lnetlist = std::make_unique("netlist", plib::make_unique()); // enable validation mode lnetlist->set_extended_validation(true); @@ -1002,7 +1005,7 @@ netlist::host_arena::unique_ptr netlist_mame_device::b { osd_printf_error("%s\n", err.what()); } - return netlist::host_arena::unique_ptr(nullptr); + return std::unique_ptr(nullptr); } void netlist_mame_device::device_validity_check(validity_checker &valid) const diff --git a/src/devices/machine/netlist.h b/src/devices/machine/netlist.h index 207f168dee8..4486eb729a6 100644 --- a/src/devices/machine/netlist.h +++ b/src/devices/machine/netlist.h @@ -111,7 +111,7 @@ protected: virtual void device_pre_save() override; virtual void device_clock_changed() override; - netlist::host_arena::unique_ptr base_validity_check(validity_checker &valid) const; + std::unique_ptr base_validity_check(validity_checker &valid) const; attotime m_cur_time; attotime m_attotime_per_clock; diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h index 31a31c62d88..2fea9014e5b 100644 --- a/src/lib/netlist/devices/nlid_system.h +++ b/src/lib/netlist/devices/nlid_system.h @@ -11,6 +11,7 @@ #include "netlist/nl_base.h" #include "netlist/nl_factory.h" #include "netlist/plib/prandom.h" +#include "netlist/plib/pstonum.h" #include "netlist/plib/putil.h" #include diff --git a/src/lib/netlist/devices/nlid_truthtable.cpp b/src/lib/netlist/devices/nlid_truthtable.cpp index 348b37729b1..fed6327f9a8 100644 --- a/src/lib/netlist/devices/nlid_truthtable.cpp +++ b/src/lib/netlist/devices/nlid_truthtable.cpp @@ -1,6 +1,9 @@ // license:GPL-2.0+ // copyright-holders:Couriersud +#include "plib/pstonum.h" +#include "plib/pstrutil.h" + #include "nl_base.h" #include "nl_factory.h" #include "nlid_truthtable.h" diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index c57e4f5e1c8..c55931ca9bc 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -8,6 +8,7 @@ #include "plib/pfmtlog.h" #include "plib/pmempool.h" #include "plib/putil.h" +#include "plib/pdynlib.h" #include "devices/nlid_proxy.h" #include "devices/nlid_system.h" @@ -25,9 +26,9 @@ namespace netlist // callbacks_t // ---------------------------------------------------------------------------------------- - host_arena::unique_ptr callbacks_t:: static_solver_lib() const + std::unique_ptr callbacks_t:: static_solver_lib() const { - return plib::make_unique(nullptr); + return std::make_unique(nullptr); } // ---------------------------------------------------------------------------------------- diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index e18c44df9a6..63ae96a6a57 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -13,17 +13,12 @@ #endif #include "plib/palloc.h" // owned_ptr -#include "plib/pdynlib.h" -#include "plib/pexception.h" -#include "plib/pfmtlog.h" #include "plib/pfunction.h" #include "plib/plists.h" #include "plib/pmempool.h" #include "plib/ppmf.h" -#include "plib/pstate.h" -#include "plib/pstonum.h" #include "plib/pstream.h" -#include "plib/ptime.h" +#include "plib/pstate.h" #include "plib/ptimed_queue.h" #include "plib/ptypes.h" @@ -90,7 +85,7 @@ class NETLIB_NAME(name) : public delegator_t /// #NETLIB_OBJECT for an example. #define NETLIB_CONSTRUCTOR(cname) \ using this_type = NETLIB_NAME(cname); \ - public: template NETLIB_NAME(cname)(CLASS &owner, const pstring &name) \ + public: template NETLIB_NAME(cname)(CLASS &owner, const pstring &name)\ : base_type(owner, name) /// \brief Used to define the constructor of a netlist device and define a default model. @@ -203,55 +198,13 @@ class NETLIB_NAME(name) : public delegator_t namespace netlist { + /// \brief Delegate type for device notification. /// using nldelegate = plib::pmfp; using nldelegate_ts = plib::pmfp; using nldelegate_dyn = plib::pmfp; - // ----------------------------------------------------------------------------- - // forward definitions - // ----------------------------------------------------------------------------- - - namespace devices - { - class NETLIB_NAME(solver); - class NETLIB_NAME(mainclock); - class NETLIB_NAME(base_proxy); - class NETLIB_NAME(base_d_to_a_proxy); - class NETLIB_NAME(base_a_to_d_proxy); - } // namespace devices - - namespace solver - { - class matrix_solver_t; - } // namespace solver - - class logic_output_t; - class logic_input_t; - class analog_net_t; - class logic_net_t; - class setup_t; - class nlparse_t; - class netlist_t; - class netlist_state_t; - class core_device_t; - class device_t; - - template - class delegator_t : public CX - { - protected: - using base_type = delegator_t; - using delegated_type = CX; - using delegated_type::delegated_type; - }; - - namespace detail - { - class net_t; - } // namespace detail - //============================================================ // Exceptions //============================================================ @@ -263,7 +216,7 @@ namespace netlist { public: /// \brief Constructor. - /// Allows a descriptive text to be assed to the exception + /// Allows a descriptive text to be passed to the exception explicit nl_exception(const pstring &text //!< text to be passed ) @@ -996,8 +949,6 @@ namespace netlist { public: - using list_t = plib::aligned_vector; - analog_net_t(netlist_state_t &nl, const pstring &aname, detail::core_terminal_t *railterminal = nullptr); nl_fptype Q_Analog() const noexcept { return m_cur_Analog; } @@ -1482,8 +1433,8 @@ namespace netlist void connect(const detail::core_terminal_t &t1, const detail::core_terminal_t &t2); protected: - NETLIB_UPDATEI() { } - NETLIB_UPDATE_TERMINALSI() { } + //NETLIB_UPDATEI() { } + //NETLIB_UPDATE_TERMINALSI() { } private: }; @@ -1513,11 +1464,11 @@ namespace netlist ~device_t() noexcept override = default; //nldelegate default_delegate() { return nldelegate(&device_t::update, this); } - nldelegate default_delegate() { return { &device_t::update, this }; } + nldelegate default_delegate() { return { &core_device_t::update, dynamic_cast(this) }; } protected: - NETLIB_UPDATEI() { } - NETLIB_UPDATE_TERMINALSI() { } + //NETLIB_UPDATEI() { } + //NETLIB_UPDATE_TERMINALSI() { } private: param_model_t m_model; @@ -1799,8 +1750,8 @@ namespace netlist device_arena m_pool; // must be deleted last! device_arena::unique_ptr m_netlist; - host_arena::unique_ptr m_lib; - plib::state_manager_t m_state; + std::unique_ptr m_lib; + plib::state_manager_t m_state; host_arena::unique_ptr m_callbacks; log_type m_log; @@ -2205,13 +2156,6 @@ namespace netlist // logic_input_t // ----------------------------------------------------------------------------- -#if 0 - template - logic_input_t::logic_input_t(D &dev, const pstring &aname) - : logic_input_t(dev, aname, STATE_INP_ACTIVE, nldelegate(&D :: update, &dev)) - { - } -#endif inline void logic_input_t::inactivate() noexcept { if (!is_state(STATE_INP_PASSIVE)) diff --git a/src/lib/netlist/nl_config.h b/src/lib/netlist/nl_config.h index 81e0c860aa9..813c2923246 100644 --- a/src/lib/netlist/nl_config.h +++ b/src/lib/netlist/nl_config.h @@ -44,6 +44,17 @@ #define NL_USE_MEMPOOL (1) #endif +/// brief default minimum alignment of mempool_arena +/// +/// 256 is the best compromise between logic applications like MAME +/// TTL games (e.g. pong) and analog applications like e.g. kidnikik sound. +/// +/// Best performance for pong is achieved with a value of 16, but this degrades +/// kidniki performance by ~10%. +/// +/// More work is needed here. +#define NL_MEMPOOL_ALIGN (16) + /// \brief Enable queue statistics. /// /// Queue statistics come at a performance cost. Although diff --git a/src/lib/netlist/nl_factory.h b/src/lib/netlist/nl_factory.h index 74cb43f3d40..31d1d0e8068 100644 --- a/src/lib/netlist/nl_factory.h +++ b/src/lib/netlist/nl_factory.h @@ -12,6 +12,7 @@ #include "plib/palloc.h" #include "plib/ptypes.h" #include "plib/putil.h" +#include "plib/pmempool.h" #include #include @@ -38,8 +39,6 @@ factory::constructor_ptr_t decl_ ## p_alias = NETLIB_NAME(p_alias ## _c); namespace netlist { - class core_device_t; - class netlist_state_t; namespace factory { diff --git a/src/lib/netlist/nl_setup.h b/src/lib/netlist/nl_setup.h index 6d99f1ca183..38fe06d9b4c 100644 --- a/src/lib/netlist/nl_setup.h +++ b/src/lib/netlist/nl_setup.h @@ -13,9 +13,9 @@ #include "plib/ppreprocessor.h" #include "plib/pstream.h" #include "plib/pstring.h" -#include "plib/putil.h" #include "nl_config.h" +// FIXME: avoid including factory #include "nl_factory.h" #include "nltypes.h" @@ -134,25 +134,6 @@ void NETLIST_NAME(name)(netlist::nlparse_t &setup) \ namespace netlist { - namespace detail { - class core_terminal_t; - class net_t; - } // namespace detail - - namespace devices { - class nld_base_proxy; - class nld_netlistparams; - } // namespace devices - - class core_device_t; - class param_t; - class nlparse_t; - class setup_t; - class netlist_state_t; - class netlist_t; - class logic_family_desc_t; - class terminal_t; - // ----------------------------------------------------------------------------- // truthtable desc // ----------------------------------------------------------------------------- @@ -191,32 +172,6 @@ namespace netlist param_t *m_param; }; - // ---------------------------------------------------------------------------------------- - // Specific netlist psource_t implementations - // ---------------------------------------------------------------------------------------- - - class source_netlist_t : public plib::psource_t - { - public: - - source_netlist_t() = default; - - PCOPYASSIGNMOVE(source_netlist_t, delete) - ~source_netlist_t() noexcept override = default; - - virtual bool parse(nlparse_t &setup, const pstring &name); - }; - - class source_data_t : public plib::psource_t - { - public: - - source_data_t() = default; - - PCOPYASSIGNMOVE(source_data_t, delete) - ~source_data_t() noexcept override = default; - }; - // ---------------------------------------------------------------------------------------- // Collection of models // ---------------------------------------------------------------------------------------- @@ -500,9 +455,31 @@ namespace netlist }; // ---------------------------------------------------------------------------------------- - // base sources + // Specific netlist psource_t implementations // ---------------------------------------------------------------------------------------- + class source_netlist_t : public plib::psource_t + { + public: + + source_netlist_t() = default; + + PCOPYASSIGNMOVE(source_netlist_t, delete) + ~source_netlist_t() noexcept override = default; + + virtual bool parse(nlparse_t &setup, const pstring &name); + }; + + class source_data_t : public plib::psource_t + { + public: + + source_data_t() = default; + + PCOPYASSIGNMOVE(source_data_t, delete) + ~source_data_t() noexcept override = default; + }; + class source_string_t : public source_netlist_t { public: diff --git a/src/lib/netlist/nltypes.h b/src/lib/netlist/nltypes.h index 98bfbb49a92..b259ae55b76 100644 --- a/src/lib/netlist/nltypes.h +++ b/src/lib/netlist/nltypes.h @@ -13,19 +13,94 @@ #define NLTYPES_H_ #include "nl_config.h" -#include "plib/pchrono.h" -#include "plib/pdynlib.h" -#include "plib/pfmtlog.h" -#include "plib/pmempool.h" -#include "plib/pstate.h" + +//#include "plib/pchrono.h" +#include "plib/ptypes.h" #include "plib/pstring.h" #include "plib/ptime.h" -#include "plib/putil.h" -#include +#include + +// FIXME: Move to ptypes +namespace plib +{ + // FORWARD declarations + template + class mempool_arena; + + struct aligned_arena; + class dynlib_base; + + template + class plog_base; + + struct plog_level; +} namespace netlist { + // ----------------------------------------------------------------------------- + // forward definitions + // ----------------------------------------------------------------------------- + + class logic_output_t; + class logic_input_t; + class analog_net_t; + class logic_net_t; + class setup_t; + class nlparse_t; + class netlist_t; + class netlist_state_t; + class core_device_t; + class device_t; + class netlist_state_t; + class param_t; + class logic_family_desc_t; + class terminal_t; + + namespace devices + { + class nld_solver; + class nld_mainclock; + class nld_base_proxy; + class nld_base_d_to_a_proxy; + class nld_base_a_to_d_proxy; + class nld_netlistparams; + } // namespace devices + + namespace solver + { + class matrix_solver_t; + } // namespace solver + + namespace detail + { + class core_terminal_t; + class net_t; + } // namespace detail + + namespace factory + { + class list_t; + class element_t; + struct properties; + } // namespace factory + + template + class delegator_t : public CX + { + protected: + using base_type = delegator_t; + using delegated_type = CX; + using delegated_type::delegated_type; + }; + +} // namespace netlist + + +namespace netlist +{ + /// \brief Constants and const calculations for the library /// template @@ -79,7 +154,7 @@ namespace netlist /// using device_arena = std::conditional_t, + plib::mempool_arena, plib::aligned_arena>; using host_arena = plib::aligned_arena; @@ -109,7 +184,7 @@ namespace netlist /// of a callbacks_t implementation to optionally provide such a collection /// of symbols. /// - virtual host_arena::unique_ptr static_solver_lib() const; + virtual std::unique_ptr static_solver_lib() const; }; using log_type = plib::plog_base; diff --git a/src/lib/netlist/plib/mat_cr.h b/src/lib/netlist/plib/mat_cr.h index 0f21aff2326..f066d44cd7b 100644 --- a/src/lib/netlist/plib/mat_cr.h +++ b/src/lib/netlist/plib/mat_cr.h @@ -249,8 +249,8 @@ namespace plib A[k] = src.A[k]; } - index_type * nzbd(index_type row) { return m_nzbd[row]; } - index_type nzbd_count(index_type row) { return m_nzbd.colcount(row) - 1; } + index_type * nzbd(std::size_t row) { return m_nzbd[row]; } + std::size_t nzbd_count(std::size_t row) { return m_nzbd.colcount(row) - 1; } protected: // FIXME: this should be private // NOLINTNEXTLINE @@ -320,14 +320,9 @@ namespace plib std::size_t pi = base::diag[i]; auto f = reciprocal(base::A[pi++]); const std::size_t piie = base::row_idx[i+1]; -#if 0 - const auto &nz = base::m_nzbd[i]; - while (auto j = nz[nzbdp++]) // NOLINT(bugprone-infinite-loop) -#else const auto *nz = base::m_nzbd[i]; while (auto j = nz[nzbdp++]) // NOLINT(bugprone-infinite-loop) -#endif { // proceed to column i diff --git a/src/lib/netlist/plib/palloc.h b/src/lib/netlist/plib/palloc.h index b3ebcbc52e5..a2f4527adb1 100644 --- a/src/lib/netlist/plib/palloc.h +++ b/src/lib/netlist/plib/palloc.h @@ -10,8 +10,7 @@ #include "pconfig.h" #include "pgsl.h" -#include "pmath.h" -#include "pstring.h" +#include "pmath.h" // FIXME: only uses lcm ... move to ptypes. #include "ptypes.h" #include @@ -254,6 +253,8 @@ namespace plib { //~arena_allocator() noexcept = default; + PCOPYASSIGNMOVE(arena_allocator, default) + explicit arena_allocator(arena_type & a) noexcept : m_a(a) { } diff --git a/src/lib/netlist/plib/pconfig.h b/src/lib/netlist/plib/pconfig.h index 99643139de7..65328327d76 100644 --- a/src/lib/netlist/plib/pconfig.h +++ b/src/lib/netlist/plib/pconfig.h @@ -74,17 +74,6 @@ #define PALIGNAS_CACHELINE() PALIGNAS(PALIGN_CACHELINE) #define PALIGNAS_VECTOROPT() PALIGNAS(PALIGN_VECTOROPT) -/// brief default minimum alignment of mempool_arena -/// -/// 256 is the best compromise between logic applications like MAME -/// TTL games (e.g. pong) and analog applications like e.g. kidnikik sound. -/// -/// Best performance for pong is achieved with a value of 16, but this degrades -/// kidniki performance by ~10%. -/// -/// More work is needed here. -#define PMEMPOOL_ALIGN (256) - // FIXME: Breaks mame build on windows mingw due to -Wattribute // also triggers -Wattribute on ARM // This is fixed on mingw version 10 diff --git a/src/lib/netlist/plib/penum.h b/src/lib/netlist/plib/penum.h index f965411d546..55c0669afb5 100644 --- a/src/lib/netlist/plib/penum.h +++ b/src/lib/netlist/plib/penum.h @@ -9,8 +9,6 @@ /// #include "pstring.h" -#include "pstrutil.h" -#include "putil.h" namespace plib { diff --git a/src/lib/netlist/plib/pfmtlog.h b/src/lib/netlist/plib/pfmtlog.h index ac2a5e9a747..2c3773b1421 100644 --- a/src/lib/netlist/plib/pfmtlog.h +++ b/src/lib/netlist/plib/pfmtlog.h @@ -5,13 +5,12 @@ /// \file pfmtlog.h /// -#ifndef PFMT_H_ -#define PFMT_H_ +#ifndef PFMTLOG_H_ +#define PFMTLOG_H_ #include "penum.h" #include "pstring.h" #include "ptypes.h" -#include "putil.h" #include #include @@ -423,4 +422,4 @@ namespace plib { template plib::pfmt& operator<<(plib::pfmt &p, T&& val) { return p(std::forward(val)); } -#endif // PSTRING_H_ +#endif // PFMT_LOG_H_ diff --git a/src/lib/netlist/plib/pfunction.h b/src/lib/netlist/plib/pfunction.h index 7fcac29aed9..e0b81a25e00 100644 --- a/src/lib/netlist/plib/pfunction.h +++ b/src/lib/netlist/plib/pfunction.h @@ -10,7 +10,6 @@ #include "pmath.h" #include "pstring.h" -#include "putil.h" #include diff --git a/src/lib/netlist/plib/plists.h b/src/lib/netlist/plib/plists.h index f23caa18c2c..4430459b616 100644 --- a/src/lib/netlist/plib/plists.h +++ b/src/lib/netlist/plib/plists.h @@ -8,9 +8,7 @@ /// \file plists.h /// -#include "palloc.h" -#include "pchrono.h" -#include "pstring.h" +#include "ptypes.h" #include #include diff --git a/src/lib/netlist/plib/pmatrix2d.h b/src/lib/netlist/plib/pmatrix2d.h index 0b982b8a034..4591d00b6f6 100755 --- a/src/lib/netlist/plib/pmatrix2d.h +++ b/src/lib/netlist/plib/pmatrix2d.h @@ -154,6 +154,8 @@ namespace plib m_v.resize(N); //FIXME } + PCOPYASSIGNMOVE(pmatrix2d_vrl, default) + void resize(size_type N, size_type M) { m_N = N; diff --git a/src/lib/netlist/plib/pmempool.h b/src/lib/netlist/plib/pmempool.h index d66efe2abdd..60ea24c6641 100644 --- a/src/lib/netlist/plib/pmempool.h +++ b/src/lib/netlist/plib/pmempool.h @@ -10,10 +10,10 @@ #include "palloc.h" #include "pconfig.h" -#include "pstream.h" -#include "pstring.h" +#include "pstream.h" // perrlogger +//#include "pstring.h" #include "ptypes.h" -#include "putil.h" +//#include "putil.h" #include #include @@ -27,13 +27,13 @@ namespace plib { // Memory pool //============================================================ - template - class mempool_arena : public arena_base, false, false> + template + class mempool_arena : public arena_base, false, false> { public: using size_type = typename BASEARENA::size_type; - using base_type = arena_base, false, false>; + using base_type = arena_base, false, false>; template using base_allocator_type = typename BASEARENA::template allocator_type; diff --git a/src/lib/netlist/plib/ppmf.h b/src/lib/netlist/plib/ppmf.h index 39e184eaa5d..75e2e3b184d 100644 --- a/src/lib/netlist/plib/ppmf.h +++ b/src/lib/netlist/plib/ppmf.h @@ -34,7 +34,6 @@ #include "pconfig.h" #include "ptypes.h" -#include "putil.h" #include #include // uintptr_t diff --git a/src/lib/netlist/plib/ppreprocessor.cpp b/src/lib/netlist/plib/ppreprocessor.cpp index b563576c6a8..6c4faf88efa 100644 --- a/src/lib/netlist/plib/ppreprocessor.cpp +++ b/src/lib/netlist/plib/ppreprocessor.cpp @@ -5,6 +5,7 @@ #include "palloc.h" #include "pstonum.h" #include "putil.h" +#include "pstrutil.h" namespace plib { diff --git a/src/lib/netlist/plib/pstate.h b/src/lib/netlist/plib/pstate.h index d4d98c20785..556bde90d07 100644 --- a/src/lib/netlist/plib/pstate.h +++ b/src/lib/netlist/plib/pstate.h @@ -8,7 +8,6 @@ /// \file pstate.h /// -#include "palloc.h" #include "pstring.h" #include "ptypes.h" @@ -54,7 +53,7 @@ public: plib::is_floating_point::value); } - class callback_t + struct callback_t { public: using list_t = std::vector; @@ -201,7 +200,6 @@ private: save_state_ptr( owner, stname, dtype(), 1, &state); } - template std::enable_if_t::value || std::is_enum::value || plib::is_floating_point::value)> diff --git a/src/lib/netlist/plib/pstream.h b/src/lib/netlist/plib/pstream.h index dcb2b0652cf..179a4f5ca98 100644 --- a/src/lib/netlist/plib/pstream.h +++ b/src/lib/netlist/plib/pstream.h @@ -9,12 +9,10 @@ /// \file pstream.h /// -#include "palloc.h" #include "pconfig.h" -#include "pexception.h" #include "pfmtlog.h" #include "pstring.h" -#include "pstrutil.h" +#include "pgsl.h" #include #include @@ -34,7 +32,6 @@ namespace plib { { using ct = typename S::char_type; static_assert((sizeof(T) % sizeof(ct)) == 0, "istream_read sizeof issue"); - // FIXME: throw on return is.read(reinterpret_cast(data), gsl::narrow(len * sizeof(T))); } @@ -45,7 +42,6 @@ namespace plib { { using ct = typename S::char_type; static_assert((sizeof(T) % sizeof(ct)) == 0, "ostream_write sizeof issue"); - // FIXME: throw on return os.write(reinterpret_cast(data), gsl::narrow(len * sizeof(T))); } @@ -155,7 +151,8 @@ public: { // NOLINTNEXTLINE(performance-unnecessary-copy-initialization) const putf8string conv_utf8(text); - m_strm->write(conv_utf8.c_str(), static_cast(plib::strlen(conv_utf8.c_str()))); + //m_strm->write(conv_utf8.c_str(), static_cast(plib::strlen(conv_utf8.c_str() ))); + ostream_write(*m_strm, conv_utf8.c_str(), string_info::mem_size(conv_utf8)); } void write(const pstring::value_type c) const diff --git a/src/lib/netlist/plib/pstring.h b/src/lib/netlist/plib/pstring.h index 622d8548bd1..44d025b5fb0 100644 --- a/src/lib/netlist/plib/pstring.h +++ b/src/lib/netlist/plib/pstring.h @@ -209,10 +209,9 @@ public: static constexpr const size_type npos = static_cast(-1); // the following are extensions to - -private: // FIXME: remove those size_type mem_t_size() const noexcept { return m_str.size(); } +private: string_type m_str; }; @@ -254,6 +253,7 @@ struct putf_traits<1, CT> } return ret; } + static std::size_t codelen(const mem_t *p) noexcept { const auto *p1 = reinterpret_cast(p); @@ -460,6 +460,28 @@ using putf16string = pstring_t; using putf32string = pstring_t; using pwstring = pstring_t; +namespace plib +{ + template + struct string_info + { + }; + + template + struct string_info> + { + using mem_t = typename T::mem_t; + static std::size_t mem_size(const pstring_t &s) { return s.mem_t_size(); } + }; + + template + struct string_info> + { + using mem_t = T; + static std::size_t mem_size(const std::string &s) { return s.size(); } + }; +} // namespace plib + // custom specialization of std::hash can be injected in namespace std namespace std { diff --git a/src/lib/netlist/plib/pstrutil.h b/src/lib/netlist/plib/pstrutil.h index 2b79935dc3a..46424de618d 100644 --- a/src/lib/netlist/plib/pstrutil.h +++ b/src/lib/netlist/plib/pstrutil.h @@ -21,18 +21,6 @@ namespace plib { - template - struct string_info - { - using mem_t = typename T::mem_t; - }; - - template<> - struct string_info - { - using mem_t = char; - }; - template pstring to_string(const T &v) { diff --git a/src/lib/netlist/plib/ptimed_queue.h b/src/lib/netlist/plib/ptimed_queue.h index 2ec158f316e..2de315aa9c6 100644 --- a/src/lib/netlist/plib/ptimed_queue.h +++ b/src/lib/netlist/plib/ptimed_queue.h @@ -8,10 +8,9 @@ /// \file ptimed_queue.h /// -#include "palloc.h" #include "pchrono.h" #include "pmulti_threading.h" -#include "pstring.h" +#include "ptypes.h" #include #include diff --git a/src/lib/netlist/plib/ptypes.h b/src/lib/netlist/plib/ptypes.h index 7379ed68840..5efac1fbad5 100644 --- a/src/lib/netlist/plib/ptypes.h +++ b/src/lib/netlist/plib/ptypes.h @@ -23,19 +23,17 @@ #endif // noexcept on move operator -> issue with macosx clang -#define PCOPYASSIGNMOVE(name, def) \ - name(const name &) = def; \ - name(name &&) noexcept = def; \ - name &operator=(const name &) = def; \ - name &operator=(name &&) noexcept = def; +#define PCOPYASSIGNMOVE(name, def) \ + PCOPYASSIGN(name, def) \ + PMOVEASSIGN(name, def) #define PCOPYASSIGN(name, def) \ - name(const name &) = def; \ - name &operator=(const name &) = def; \ + name(const name &) = def; \ + name &operator=(const name &) = def; #define PMOVEASSIGN(name, def) \ - name(name &&) noexcept = def; \ - name &operator=(name &&) noexcept = def; + name(name &&) /*noexcept*/ = def; \ + name &operator=(name &&) /*noexcept*/ = def; namespace plib { @@ -261,12 +259,34 @@ namespace plib using type = typename fast_type_for_size::value>::type; }; - //============================================================ - // Avoid unused variable warnings - //============================================================ + /// \brief mark arguments as not used for compiler + /// + /// @tparam Ts unsused parameters + /// template inline void unused_var(Ts&&...) noexcept {} // NOLINT(readability-named-parameter) + /// \brief copy type S to type D byte by byte + /// + /// The purpose of this copy function is to suppress compiler warnings. + /// Use at your own risk. This is dangerous. + /// + /// \param s Source object + /// \param d Destination object + /// \tparam S Type of source object + /// \tparam D Type of destination object + template + void reinterpret_copy(S &s, D &d) + { + static_assert(sizeof(D) >= sizeof(S), "size mismatch"); + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) + auto *dp = reinterpret_cast(&d); + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) + const auto *sp = reinterpret_cast(&s); + std::copy(sp, sp + sizeof(S), dp); + } + + } // namespace plib //============================================================ diff --git a/src/lib/netlist/plib/putil.h b/src/lib/netlist/plib/putil.h index dde1918ebaf..4754730e55e 100644 --- a/src/lib/netlist/plib/putil.h +++ b/src/lib/netlist/plib/putil.h @@ -249,26 +249,6 @@ namespace plib list_t m_collection; }; - /// \brief copy type S to type D byte by byte - /// - /// The purpose of this copy function is to suppress compiler warnings. - /// Use at your own risk. This is dangerous. - /// - /// \param s Source object - /// \param d Destination object - /// \tparam S Type of source object - /// \tparam D Type of destination object - template - void reinterpret_copy(S &s, D &d) - { - static_assert(sizeof(D) >= sizeof(S), "size mismatch"); - // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) - auto *dp = reinterpret_cast(&d); - // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) - const auto *sp = reinterpret_cast(&s); - std::copy(sp, sp + sizeof(S), dp); - } - namespace util { pstring basename(const pstring &filename, const pstring &suffix = ""); diff --git a/src/lib/netlist/prg/nltool.cpp b/src/lib/netlist/prg/nltool.cpp index 9bc19779e0b..25b4e6a9307 100644 --- a/src/lib/netlist/prg/nltool.cpp +++ b/src/lib/netlist/prg/nltool.cpp @@ -9,6 +9,7 @@ // // *************************************************************************** +#include "netlist/plib/pdynlib.h" #include "netlist/plib/pmain.h" #include "netlist/devices/net_lib.h" #include "netlist/nl_errstr.h" @@ -222,17 +223,17 @@ public: void vlog(const plib::plog_level &l, const pstring &ls) const noexcept override; - netlist::host_arena::unique_ptr static_solver_lib() const override + std::unique_ptr static_solver_lib() const override { if (m_boostlib == "builtin") - return plib::make_unique(nl_static_solver_syms); + return std::make_unique(nl_static_solver_syms); if (m_boostlib == "generic") - return plib::make_unique(nullptr); + return std::make_unique(nullptr); if (NL_DISABLE_DYNAMIC_LOAD) throw netlist::nl_exception("Dynamic library loading not supported due to project security concerns."); //pstring libpath = plib::util::environment("NL_BOOSTLIB", plib::util::buildpath({".", "nlboost.so"})); - return plib::make_unique(m_boostlib); + return std::make_unique(m_boostlib); } private: diff --git a/src/lib/netlist/prg/nlwav.cpp b/src/lib/netlist/prg/nlwav.cpp index 9a9b3f08e69..221a91fbe27 100755 --- a/src/lib/netlist/prg/nlwav.cpp +++ b/src/lib/netlist/prg/nlwav.cpp @@ -1,10 +1,10 @@ // license:GPL-2.0+ // copyright-holders:Couriersud #include "netlist/plib/pstring.h" -//#include "netlist/nl_setup.h" #include "netlist/plib/pmain.h" #include "netlist/plib/ppmf.h" #include "netlist/plib/pstream.h" +#include "netlist/plib/pstrutil.h" #include diff --git a/src/lib/netlist/solver/nld_matrix_solver.cpp b/src/lib/netlist/solver/nld_matrix_solver.cpp index 87ae2de71d7..6eb4878c9b2 100644 --- a/src/lib/netlist/solver/nld_matrix_solver.cpp +++ b/src/lib/netlist/solver/nld_matrix_solver.cpp @@ -37,7 +37,7 @@ namespace solver // ---------------------------------------------------------------------------------------- matrix_solver_t::matrix_solver_t(netlist_state_t &anetlist, const pstring &name, - const analog_net_t::list_t &nets, + const net_list_t &nets, const solver_parameters_t *params) : device_t(anetlist, name) , m_params(*params) @@ -67,7 +67,7 @@ namespace solver return &state().setup().get_connected_terminal(*term)->net(); } - void matrix_solver_t::setup_base(setup_t &setup, const analog_net_t::list_t &nets) + void matrix_solver_t::setup_base(setup_t &setup, const net_list_t &nets) { log().debug("New solver setup\n"); std::vector step_devices; diff --git a/src/lib/netlist/solver/nld_matrix_solver.h b/src/lib/netlist/solver/nld_matrix_solver.h index 3fd0e2fd6d9..55af6a34161 100644 --- a/src/lib/netlist/solver/nld_matrix_solver.h +++ b/src/lib/netlist/solver/nld_matrix_solver.h @@ -186,6 +186,7 @@ namespace solver using list_t = std::vector; using fptype = nl_fptype; using arena_type = plib::mempool_arena; + using net_list_t = plib::aligned_vector; // after every call to solve, update inputs must be called. // this can be done as well as a batch to ease parallel processing. @@ -266,7 +267,7 @@ namespace solver protected: matrix_solver_t(netlist_state_t &anetlist, const pstring &name, - const analog_net_t::list_t &nets, + const net_list_t &nets, const solver_parameters_t *params); virtual void vsolve_non_dynamic() = 0; @@ -289,7 +290,7 @@ namespace solver private: // base setup - called from constructor - void setup_base(setup_t &setup, const analog_net_t::list_t &nets) noexcept(false); + void setup_base(setup_t &setup, const net_list_t &nets) noexcept(false); void sort_terms(matrix_sort_type_e sort); diff --git a/src/lib/netlist/solver/nld_matrix_solver_ext.h b/src/lib/netlist/solver/nld_matrix_solver_ext.h index 275ef135c69..7541795c2a1 100644 --- a/src/lib/netlist/solver/nld_matrix_solver_ext.h +++ b/src/lib/netlist/solver/nld_matrix_solver_ext.h @@ -25,7 +25,7 @@ namespace solver using float_type = FT; matrix_solver_ext_t(netlist_state_t &anetlist, const pstring &name, - const analog_net_t::list_t &nets, + const net_list_t &nets, const solver_parameters_t *params, const std::size_t size) : matrix_solver_t(anetlist, name, nets, params) , m_new_V(size) diff --git a/src/lib/netlist/solver/nld_ms_direct.h b/src/lib/netlist/solver/nld_ms_direct.h index b32e4d2172b..8cfb6b65273 100644 --- a/src/lib/netlist/solver/nld_ms_direct.h +++ b/src/lib/netlist/solver/nld_ms_direct.h @@ -30,7 +30,7 @@ namespace solver using float_type = FT; matrix_solver_direct_t(netlist_state_t &anetlist, const pstring &name, - const analog_net_t::list_t &nets, + const matrix_solver_t::net_list_t &nets, const solver_parameters_t *params, std::size_t size); void reset() override { matrix_solver_t::reset(); } @@ -189,7 +189,7 @@ namespace solver template matrix_solver_direct_t::matrix_solver_direct_t(netlist_state_t &anetlist, const pstring &name, - const analog_net_t::list_t &nets, + const matrix_solver_t::net_list_t &nets, const solver_parameters_t *params, std::size_t size) : matrix_solver_ext_t(anetlist, name, nets, params, size) diff --git a/src/lib/netlist/solver/nld_ms_direct1.h b/src/lib/netlist/solver/nld_ms_direct1.h index e33846ad403..c9188a7dc9c 100644 --- a/src/lib/netlist/solver/nld_ms_direct1.h +++ b/src/lib/netlist/solver/nld_ms_direct1.h @@ -25,7 +25,7 @@ namespace solver using base_type = matrix_solver_direct_t; matrix_solver_direct1_t(netlist_state_t &anetlist, const pstring &name, - const analog_net_t::list_t &nets, + const matrix_solver_t::net_list_t &nets, const solver_parameters_t *params) : matrix_solver_direct_t(anetlist, name, nets, params, 1) {} diff --git a/src/lib/netlist/solver/nld_ms_direct2.h b/src/lib/netlist/solver/nld_ms_direct2.h index 365c1cac33e..0fb1345e1a6 100644 --- a/src/lib/netlist/solver/nld_ms_direct2.h +++ b/src/lib/netlist/solver/nld_ms_direct2.h @@ -29,7 +29,7 @@ namespace solver using float_type = FT; matrix_solver_direct2_t(netlist_state_t &anetlist, const pstring &name, - const analog_net_t::list_t &nets, + const matrix_solver_t::net_list_t &nets, const solver_parameters_t *params) : matrix_solver_direct_t(anetlist, name, nets, params, 2) {} diff --git a/src/lib/netlist/solver/nld_ms_gcr.h b/src/lib/netlist/solver/nld_ms_gcr.h index fb5c675dd14..a5ab9f6c283 100644 --- a/src/lib/netlist/solver/nld_ms_gcr.h +++ b/src/lib/netlist/solver/nld_ms_gcr.h @@ -36,7 +36,7 @@ namespace solver using fptype = typename base_type::fptype; matrix_solver_GCR_t(netlist_state_t &anetlist, const pstring &name, - const analog_net_t::list_t &nets, + const matrix_solver_t::net_list_t &nets, const solver_parameters_t *params, const std::size_t size) : matrix_solver_ext_t(anetlist, name, nets, params, size) , mat(static_cast(size)) diff --git a/src/lib/netlist/solver/nld_ms_gmres.h b/src/lib/netlist/solver/nld_ms_gmres.h index 837c0bc780e..47d00e7e2ef 100644 --- a/src/lib/netlist/solver/nld_ms_gmres.h +++ b/src/lib/netlist/solver/nld_ms_gmres.h @@ -35,7 +35,7 @@ namespace solver // This is already preconditioning. matrix_solver_GMRES_t(netlist_state_t &anetlist, const pstring &name, - analog_net_t::list_t &nets, + matrix_solver_t::net_list_t &nets, const solver_parameters_t *params, const std::size_t size) : matrix_solver_direct_t(anetlist, name, nets, params, size) diff --git a/src/lib/netlist/solver/nld_ms_sm.h b/src/lib/netlist/solver/nld_ms_sm.h index fd11a32a102..85c4731050e 100644 --- a/src/lib/netlist/solver/nld_ms_sm.h +++ b/src/lib/netlist/solver/nld_ms_sm.h @@ -55,7 +55,7 @@ namespace solver static constexpr const std::size_t storage_N = 100; matrix_solver_sm_t(netlist_state_t &anetlist, const pstring &name, - const analog_net_t::list_t &nets, + const matrix_solver_t::net_list_t &nets, const solver_parameters_t *params, const std::size_t size) : matrix_solver_ext_t(anetlist, name, nets, params, size) , m_cnt(0) diff --git a/src/lib/netlist/solver/nld_ms_sor.h b/src/lib/netlist/solver/nld_ms_sor.h index 6b1a21afd39..a828a1cd715 100644 --- a/src/lib/netlist/solver/nld_ms_sor.h +++ b/src/lib/netlist/solver/nld_ms_sor.h @@ -30,7 +30,7 @@ namespace solver using float_type = FT; matrix_solver_SOR_t(netlist_state_t &anetlist, const pstring &name, - analog_net_t::list_t &nets, + matrix_solver_t::net_list_t &nets, const solver_parameters_t *params, const std::size_t size) : matrix_solver_direct_t(anetlist, name, nets, params, size) , m_lp_fact(*this, "m_lp_fact", 0) diff --git a/src/lib/netlist/solver/nld_ms_sor_mat.h b/src/lib/netlist/solver/nld_ms_sor_mat.h index 2d29d0f01cd..f725213228c 100644 --- a/src/lib/netlist/solver/nld_ms_sor_mat.h +++ b/src/lib/netlist/solver/nld_ms_sor_mat.h @@ -30,7 +30,7 @@ namespace solver using float_type = FT; matrix_solver_SOR_mat_t(netlist_state_t &anetlist, const pstring &name, - const analog_net_t::list_t &nets, + const matrix_solver_t::net_list_t &nets, const solver_parameters_t *params, std::size_t size) : matrix_solver_direct_t(anetlist, name, nets, params, size) , m_omega(*this, "m_omega", static_cast(params->m_gs_sor)) diff --git a/src/lib/netlist/solver/nld_ms_w.h b/src/lib/netlist/solver/nld_ms_w.h index 598a4b9e516..fde53aac884 100644 --- a/src/lib/netlist/solver/nld_ms_w.h +++ b/src/lib/netlist/solver/nld_ms_w.h @@ -61,7 +61,7 @@ namespace solver static constexpr const std::size_t storage_N = 100; matrix_solver_w_t(netlist_state_t &anetlist, const pstring &name, - const analog_net_t::list_t &nets, + const matrix_solver_t::net_list_t &nets, const solver_parameters_t *params, const std::size_t size) : matrix_solver_ext_t(anetlist, name, nets, params, size) , m_cnt(0) @@ -79,7 +79,6 @@ namespace solver template void LE_compute_x(T & x); - template float_ext_type &A(const T1 &r, const T2 &c) { return m_A[r][c]; } template diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp index b38616945f9..c3a42f0721f 100644 --- a/src/lib/netlist/solver/nld_solver.cpp +++ b/src/lib/netlist/solver/nld_solver.cpp @@ -86,7 +86,7 @@ namespace devices // FIXME: should be created in device space template NETLIB_NAME(solver)::solver_ptr create_it(netlist_state_t &nl, pstring name, - analog_net_t::list_t &nets, + NETLIB_NAME(solver)::net_list_t &nets, solver::solver_parameters_t ¶ms, std::size_t size) { return plib::make_unique(nl, name, nets, ¶ms, size); @@ -96,7 +96,7 @@ namespace devices template NETLIB_NAME(solver)::solver_ptr NETLIB_NAME(solver)::create_solver(std::size_t size, const pstring &solvername, - analog_net_t::list_t &nets) + NETLIB_NAME(solver)::net_list_t &nets) { switch (m_params.m_method()) { @@ -133,7 +133,7 @@ namespace devices template NETLIB_NAME(solver)::solver_ptr NETLIB_NAME(solver)::create_solvers( const pstring &sname, - analog_net_t::list_t &nets) + net_list_t &nets) { std::size_t net_count = nets.size(); switch (net_count) @@ -200,7 +200,7 @@ namespace devices auto &n = dynamic_cast(*net); if (!already_processed(n)) { - groupspre.emplace_back(analog_net_t::list_t()); + groupspre.emplace_back(NETLIB_NAME(solver)::net_list_t()); process_net(netlist, n); } } @@ -210,7 +210,7 @@ namespace devices groups.push_back(g); } - std::vector groups; + std::vector groups; private: @@ -280,7 +280,7 @@ namespace devices } } - std::vector groupspre; + std::vector groupspre; }; void NETLIB_NAME(solver)::post_start() diff --git a/src/lib/netlist/solver/nld_solver.h b/src/lib/netlist/solver/nld_solver.h index f1395543524..4ff70d04606 100644 --- a/src/lib/netlist/solver/nld_solver.h +++ b/src/lib/netlist/solver/nld_solver.h @@ -49,6 +49,7 @@ namespace devices //using solver_ptr = device_arena::unique_ptr; using solver_ptr = host_arena::unique_ptr; + using net_list_t = solver::matrix_solver_t::net_list_t; private: logic_input_t m_fb_step; @@ -63,11 +64,11 @@ namespace devices template solver_ptr create_solver(std::size_t size, - const pstring &solvername, analog_net_t::list_t &nets); + const pstring &solvername, net_list_t &nets); template solver_ptr create_solvers( - const pstring &sname, analog_net_t::list_t &nets); + const pstring &sname, net_list_t &nets); }; } // namespace devices diff --git a/src/lib/netlist/tools/nl_convert.cpp b/src/lib/netlist/tools/nl_convert.cpp index ee6a9827eb3..490a275adc2 100644 --- a/src/lib/netlist/tools/nl_convert.cpp +++ b/src/lib/netlist/tools/nl_convert.cpp @@ -4,6 +4,7 @@ #include "plib/palloc.h" #include "plib/pstonum.h" #include "plib/putil.h" +#include "plib/pstrutil.h" #include "nl_convert.h"