From ab31af569fb543f4b81fe30c3c37f6c957b09c48 Mon Sep 17 00:00:00 2001 From: couriersud Date: Sun, 28 Jun 2020 13:14:16 +0200 Subject: netlist: include file refactoring. The purpose of this ongoing exercise is to remove unnecessary dependencies in header files. netlist implementations should only have access to what they need. The same applies to device implementations. Core stuff will be moved to the core subdirectory going forward. --- src/devices/machine/netlist.cpp | 17 +++-- src/devices/machine/netlist.h | 2 +- src/lib/netlist/devices/nlid_system.h | 1 + src/lib/netlist/devices/nlid_truthtable.cpp | 3 + src/lib/netlist/nl_base.cpp | 5 +- src/lib/netlist/nl_base.h | 78 +++------------------ src/lib/netlist/nl_config.h | 11 +++ src/lib/netlist/nl_factory.h | 3 +- src/lib/netlist/nl_setup.h | 71 +++++++------------- src/lib/netlist/nltypes.h | 93 +++++++++++++++++++++++--- src/lib/netlist/plib/mat_cr.h | 9 +-- src/lib/netlist/plib/palloc.h | 5 +- src/lib/netlist/plib/pconfig.h | 11 --- src/lib/netlist/plib/penum.h | 2 - src/lib/netlist/plib/pfmtlog.h | 7 +- src/lib/netlist/plib/pfunction.h | 1 - src/lib/netlist/plib/plists.h | 4 +- src/lib/netlist/plib/pmatrix2d.h | 2 + src/lib/netlist/plib/pmempool.h | 12 ++-- src/lib/netlist/plib/ppmf.h | 1 - src/lib/netlist/plib/ppreprocessor.cpp | 1 + src/lib/netlist/plib/pstate.h | 4 +- src/lib/netlist/plib/pstream.h | 9 +-- src/lib/netlist/plib/pstring.h | 26 ++++++- src/lib/netlist/plib/pstrutil.h | 12 ---- src/lib/netlist/plib/ptimed_queue.h | 3 +- src/lib/netlist/plib/ptypes.h | 44 ++++++++---- src/lib/netlist/plib/putil.h | 20 ------ src/lib/netlist/prg/nltool.cpp | 9 +-- src/lib/netlist/prg/nlwav.cpp | 2 +- src/lib/netlist/solver/nld_matrix_solver.cpp | 4 +- src/lib/netlist/solver/nld_matrix_solver.h | 5 +- src/lib/netlist/solver/nld_matrix_solver_ext.h | 2 +- src/lib/netlist/solver/nld_ms_direct.h | 4 +- src/lib/netlist/solver/nld_ms_direct1.h | 2 +- src/lib/netlist/solver/nld_ms_direct2.h | 2 +- src/lib/netlist/solver/nld_ms_gcr.h | 2 +- src/lib/netlist/solver/nld_ms_gmres.h | 2 +- src/lib/netlist/solver/nld_ms_sm.h | 2 +- src/lib/netlist/solver/nld_ms_sor.h | 2 +- src/lib/netlist/solver/nld_ms_sor_mat.h | 2 +- src/lib/netlist/solver/nld_ms_w.h | 3 +- src/lib/netlist/solver/nld_solver.cpp | 12 ++-- src/lib/netlist/solver/nld_solver.h | 5 +- src/lib/netlist/tools/nl_convert.cpp | 1 + 45 files changed, 260 insertions(+), 258 deletions(-) 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" -- cgit v1.2.3