From 3b899b86e67e3a5cc093d2dd9c0dcaeed197c806 Mon Sep 17 00:00:00 2001 From: couriersud Date: Wed, 6 Feb 2019 10:24:34 +0100 Subject: netlist: Refactoring after adding clang-tidy support to netlist makefile - convert macros to c++ code. - order of device creation should not depend on std lib. - some state saving cleanup. - added support for clang-tidy to makefile. - modifications triggered by clang-tidy-9. --- src/lib/netlist/plib/pdynlib.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src/lib/netlist/plib/pdynlib.cpp') diff --git a/src/lib/netlist/plib/pdynlib.cpp b/src/lib/netlist/plib/pdynlib.cpp index 13827eaf24c..f30ddc5d59a 100644 --- a/src/lib/netlist/plib/pdynlib.cpp +++ b/src/lib/netlist/plib/pdynlib.cpp @@ -91,6 +91,8 @@ dynlib::dynlib(const pstring libname) dynlib::dynlib(const pstring path, const pstring libname) : m_isLoaded(false), m_lib(nullptr) { + // FIXME: implement path search + plib::unused_var(path); // printf("win: loading <%s>\n", libname.c_str()); #ifdef _WIN32 TCHAR *buffer = tstring_from_utf8(libname.c_str()); @@ -148,4 +150,4 @@ void *dynlib::getsym_p(const pstring name) #endif } -} +} // namespace plib -- cgit v1.2.3-70-g09d2 From cf73ccc764d574284bef4ce95ee5bc3e9089f053 Mon Sep 17 00:00:00 2001 From: couriersud Date: Thu, 21 Feb 2019 22:59:17 +0100 Subject: netlist: memory management. [Couriersud] Memory management in plib is now alignment-aware. All allocations respect c++11 alignas. Selected classes like parray and aligned_vector also provide hints (__builtin_assume_aligned) to g++ and clang. The alignment optimizations have little impact on the current use cases. They only become effective on bigger data processing. What has a measurable impact is memory pooling. This speeds up netlist games like breakout and pong by about 5%. Tested with linux, macosx and windows cross builds. All features are disabled since I can not rule out they may temporarily break more exotic builds. --- src/devices/machine/netlist.cpp | 10 +- src/lib/netlist/devices/nlid_truthtable.cpp | 4 +- src/lib/netlist/devices/nlid_truthtable.h | 2 +- src/lib/netlist/nl_base.cpp | 8 +- src/lib/netlist/nl_base.h | 20 +-- src/lib/netlist/nl_factory.cpp | 2 +- src/lib/netlist/nl_factory.h | 10 +- src/lib/netlist/nl_setup.cpp | 16 +-- src/lib/netlist/nl_setup.h | 18 +-- src/lib/netlist/plib/palloc.h | 193 +++++++++++++++++++++++++-- src/lib/netlist/plib/parray.h | 17 ++- src/lib/netlist/plib/pconfig.h | 15 ++- src/lib/netlist/plib/pdynlib.cpp | 8 +- src/lib/netlist/plib/pmempool.h | 45 ++++--- src/lib/netlist/plib/pstate.h | 3 +- src/lib/netlist/plib/pstream.cpp | 12 +- src/lib/netlist/plib/pstream.h | 14 +- src/lib/netlist/prg/nltool.cpp | 6 +- src/lib/netlist/prg/nlwav.cpp | 16 +-- src/lib/netlist/solver/nld_matrix_solver.cpp | 8 +- src/lib/netlist/solver/nld_matrix_solver.h | 16 +-- src/lib/netlist/solver/nld_ms_gcr.h | 3 +- src/lib/netlist/solver/nld_ms_gmres.h | 2 +- src/lib/netlist/solver/nld_solver.cpp | 36 +++-- src/lib/netlist/solver/nld_solver.h | 3 + src/lib/netlist/tools/nl_convert.cpp | 2 +- src/lib/netlist/tools/nl_convert.h | 8 +- 27 files changed, 358 insertions(+), 139 deletions(-) (limited to 'src/lib/netlist/plib/pdynlib.cpp') diff --git a/src/devices/machine/netlist.cpp b/src/devices/machine/netlist.cpp index 1eccdd3f291..7beb745cbf2 100644 --- a/src/devices/machine/netlist.cpp +++ b/src/devices/machine/netlist.cpp @@ -218,7 +218,7 @@ public: { } - virtual std::unique_ptr stream(const pstring &name) override; + virtual plib::unique_ptr stream(const pstring &name) override; private: device_t &m_dev; pstring m_name; @@ -229,7 +229,7 @@ class netlist_data_memregions_t : public netlist::source_t public: netlist_data_memregions_t(device_t &dev); - virtual std::unique_ptr stream(const pstring &name) override; + virtual plib::unique_ptr stream(const pstring &name) override; private: device_t &m_dev; @@ -240,7 +240,7 @@ private: // memregion source support // ---------------------------------------------------------------------------------------- -std::unique_ptr netlist_source_memregion_t::stream(const pstring &name) +plib::unique_ptr netlist_source_memregion_t::stream(const pstring &name) { //memory_region *mem = static_cast(setup().setup().exec()).machine().root_device().memregion(m_name.c_str()); memory_region *mem = m_dev.machine().root_device().memregion(m_name.c_str()); @@ -252,7 +252,7 @@ netlist_data_memregions_t::netlist_data_memregions_t(device_t &dev) { } -std::unique_ptr netlist_data_memregions_t::stream(const pstring &name) +plib::unique_ptr netlist_data_memregions_t::stream(const pstring &name) { //memory_region *mem = static_cast(setup().setup().exec()).parent().memregion(name.c_str()); memory_region *mem = m_dev.memregion(name.c_str()); @@ -264,7 +264,7 @@ std::unique_ptr netlist_data_memregions_t::stream(const pstring { // This should be the last data provider being called - last resort fatalerror("data named %s not found in device rom regions\n", name.c_str()); - return std::unique_ptr(nullptr); + return plib::unique_ptr(nullptr); } } diff --git a/src/lib/netlist/devices/nlid_truthtable.cpp b/src/lib/netlist/devices/nlid_truthtable.cpp index b37fd31abf6..cadbdf0b7bb 100644 --- a/src/lib/netlist/devices/nlid_truthtable.cpp +++ b/src/lib/netlist/devices/nlid_truthtable.cpp @@ -464,9 +464,9 @@ netlist_base_factory_truthtable_t::netlist_base_factory_truthtable_t(const pstri ENTRYY(n, 4, s); ENTRYY(n, 5, s); ENTRYY(n, 6, s); \ ENTRYY(n, 7, s); ENTRYY(n, 8, s) -std::unique_ptr tt_factory_create(tt_desc &desc, const pstring &sourcefile) +plib::unique_ptr tt_factory_create(tt_desc &desc, const pstring &sourcefile) { - std::unique_ptr ret; + plib::unique_ptr ret; switch (desc.ni * 100 + desc.no) { diff --git a/src/lib/netlist/devices/nlid_truthtable.h b/src/lib/netlist/devices/nlid_truthtable.h index abc6b108ce5..a4b9e1e238e 100644 --- a/src/lib/netlist/devices/nlid_truthtable.h +++ b/src/lib/netlist/devices/nlid_truthtable.h @@ -225,7 +225,7 @@ namespace devices }; /* the returned element is still missing a pointer to the family ... */ - std::unique_ptr tt_factory_create(tt_desc &desc, const pstring &sourcefile); + plib::unique_ptr tt_factory_create(tt_desc &desc, const pstring &sourcefile); } //namespace devices } // namespace netlist diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index bb2e2daafdd..3d6a8cf04b0 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -236,7 +236,7 @@ detail::terminal_type detail::core_terminal_t::type() const // netlist_t // ---------------------------------------------------------------------------------------- -netlist_t::netlist_t(const pstring &aname, std::unique_ptr callbacks) +netlist_t::netlist_t(const pstring &aname, plib::unique_ptr callbacks) : m_state(plib::make_unique(aname, std::move(callbacks), plib::make_unique(*this))) // FIXME, ugly but needed to have netlist_state_t constructed first @@ -256,8 +256,8 @@ netlist_t::netlist_t(const pstring &aname, std::unique_ptr callback // ---------------------------------------------------------------------------------------- netlist_state_t::netlist_state_t(const pstring &aname, - std::unique_ptr &&callbacks, - std::unique_ptr &&setup) + plib::unique_ptr &&callbacks, + plib::unique_ptr &&setup) : m_name(aname) , m_state() , m_callbacks(std::move(callbacks)) // Order is important here @@ -1035,7 +1035,7 @@ nl_double param_model_t::model_value(const pstring &entity) } -std::unique_ptr param_data_t::stream() +plib::unique_ptr param_data_t::stream() { return device().setup().get_data_stream(Value()); } diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 5975eaa4011..7f65a33e6bf 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -30,7 +30,7 @@ #include "nl_time.h" //============================================================ -// MACROS / New Syntax999 +// MACROS / New Syntax //============================================================ /*! Construct a netlist device name */ @@ -1070,7 +1070,7 @@ namespace netlist { } - std::unique_ptr stream(); + plib::unique_ptr stream(); protected: void changed() override { } }; @@ -1276,8 +1276,8 @@ namespace netlist /* need to preserve order of device creation ... */ using devices_collection_type = std::vector>>; netlist_state_t(const pstring &aname, - std::unique_ptr &&callbacks, - std::unique_ptr &&setup); + plib::unique_ptr &&callbacks, + plib::unique_ptr &&setup); COPYASSIGNMOVE(netlist_state_t, delete) @@ -1371,7 +1371,7 @@ namespace netlist } /* sole use is to manage lifetime of family objects */ - std::vector>> m_family_cache; + std::vector>> m_family_cache; setup_t &setup() NL_NOEXCEPT { return *m_setup; } const setup_t &setup() const NL_NOEXCEPT { return *m_setup; } @@ -1387,11 +1387,11 @@ namespace netlist void reset(); pstring m_name; - std::unique_ptr m_lib; // external lib needs to be loaded as long as netlist exists + plib::unique_ptr m_lib; // external lib needs to be loaded as long as netlist exists plib::state_manager_t m_state; - std::unique_ptr m_callbacks; + plib::unique_ptr m_callbacks; log_type m_log; - std::unique_ptr m_setup; + plib::unique_ptr m_setup; nets_collection_type m_nets; /* sole use is to manage lifetime of net objects */ @@ -1409,7 +1409,7 @@ namespace netlist { public: - explicit netlist_t(const pstring &aname, std::unique_ptr callbacks); + explicit netlist_t(const pstring &aname, plib::unique_ptr callbacks); COPYASSIGNMOVE(netlist_t, delete) @@ -1454,7 +1454,7 @@ namespace netlist void print_stats() const; private: - std::unique_ptr m_state; + plib::unique_ptr m_state; devices::NETLIB_NAME(solver) * m_solver; /* mostly rw */ diff --git a/src/lib/netlist/nl_factory.cpp b/src/lib/netlist/nl_factory.cpp index 793a0b4d1bc..c9d5ea7e29f 100644 --- a/src/lib/netlist/nl_factory.cpp +++ b/src/lib/netlist/nl_factory.cpp @@ -52,7 +52,7 @@ namespace netlist { namespace factory { } - void list_t::register_device(std::unique_ptr &&factory) + void list_t::register_device(plib::unique_ptr &&factory) { for (auto & e : *this) if (e->name() == factory->name()) diff --git a/src/lib/netlist/nl_factory.h b/src/lib/netlist/nl_factory.h index 3ed98b19152..cd7e74944eb 100644 --- a/src/lib/netlist/nl_factory.h +++ b/src/lib/netlist/nl_factory.h @@ -25,7 +25,7 @@ NETLIB_DEVICE_IMPL_BASE(ns, chip, chip, p_name, p_def_param) \ #define NETLIB_DEVICE_IMPL_BASE(ns, p_alias, chip, p_name, p_def_param) \ - static std::unique_ptr NETLIB_NAME(p_alias ## _c) \ + static plib::unique_ptr NETLIB_NAME(p_alias ## _c) \ (const pstring &classname) \ { \ return plib::make_unique>(p_name, classname, p_def_param, pstring(__FILE__)); \ @@ -91,7 +91,7 @@ namespace factory { } }; - class list_t : public std::vector> + class list_t : public std::vector> { public: explicit list_t(log_type &alog); @@ -106,7 +106,7 @@ namespace factory { register_device(plib::make_unique>(name, classname, def_param)); } - void register_device(std::unique_ptr &&factory); + void register_device(plib::unique_ptr &&factory); element_t * factory_by_name(const pstring &devname); @@ -124,10 +124,10 @@ namespace factory { // factory_creator_ptr_t // ----------------------------------------------------------------------------- - using constructor_ptr_t = std::unique_ptr (*)(const pstring &classname); + using constructor_ptr_t = plib::unique_ptr (*)(const pstring &classname); template - std::unique_ptr constructor_t(const pstring &name, const pstring &classname, + plib::unique_ptr constructor_t(const pstring &name, const pstring &classname, const pstring &def_param) { return plib::make_unique>(name, classname, def_param); diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index b9196852878..b892fb4571c 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -219,7 +219,7 @@ namespace netlist return false; } - bool nlparse_t::parse_stream(std::unique_ptr &&istrm, const pstring &name) + bool nlparse_t::parse_stream(plib::unique_ptr &&istrm, const pstring &name) { return parser_t(std::move(plib::ppreprocessor(&m_defines).process(std::move(istrm))), *this).parse(name); } @@ -986,7 +986,7 @@ const logic_family_desc_t *setup_t::family_from_model(const pstring &model) // Sources // ---------------------------------------------------------------------------------------- -std::unique_ptr setup_t::get_data_stream(const pstring &name) +plib::unique_ptr setup_t::get_data_stream(const pstring &name) { for (auto &source : m_sources) { @@ -998,7 +998,7 @@ std::unique_ptr setup_t::get_data_stream(const pstring &name) } } log().warning(MW_1_DATA_1_NOT_FOUND, name); - return std::unique_ptr(nullptr); + return plib::unique_ptr(nullptr); } @@ -1146,19 +1146,19 @@ bool source_t::parse(nlparse_t &setup, const pstring &name) } } -std::unique_ptr source_string_t::stream(const pstring &name) +plib::unique_ptr source_string_t::stream(const pstring &name) { plib::unused_var(name); return plib::make_unique(m_str.c_str(), std::strlen(m_str.c_str())); } -std::unique_ptr source_mem_t::stream(const pstring &name) +plib::unique_ptr source_mem_t::stream(const pstring &name) { plib::unused_var(name); return plib::make_unique(m_str.c_str(), std::strlen(m_str.c_str())); } -std::unique_ptr source_file_t::stream(const pstring &name) +plib::unique_ptr source_file_t::stream(const pstring &name) { plib::unused_var(name); return plib::make_unique(m_filename); @@ -1175,10 +1175,10 @@ bool source_proc_t::parse(nlparse_t &setup, const pstring &name) return false; } -std::unique_ptr source_proc_t::stream(const pstring &name) +plib::unique_ptr source_proc_t::stream(const pstring &name) { plib::unused_var(name); - std::unique_ptr p(nullptr); + plib::unique_ptr p(nullptr); return p; } diff --git a/src/lib/netlist/nl_setup.h b/src/lib/netlist/nl_setup.h index 448df3490da..5e445fc6a32 100644 --- a/src/lib/netlist/nl_setup.h +++ b/src/lib/netlist/nl_setup.h @@ -180,7 +180,7 @@ namespace netlist DATA }; - using list_t = std::vector>; + using list_t = std::vector>; source_t(const type_t type = SOURCE) : m_type(type) @@ -195,7 +195,7 @@ namespace netlist type_t type() const { return m_type; } protected: - virtual std::unique_ptr stream(const pstring &name) = 0; + virtual plib::unique_ptr stream(const pstring &name) = 0; private: const type_t m_type; @@ -224,7 +224,7 @@ namespace netlist void register_frontier(const pstring &attach, const double r_IN, const double r_OUT); /* register a source */ - void register_source(std::unique_ptr &&src) + void register_source(plib::unique_ptr &&src) { m_sources.push_back(std::move(src)); } @@ -251,7 +251,7 @@ namespace netlist bool device_exists(const pstring &name) const; /* FIXME: used by source_t - need a different approach at some time */ - bool parse_stream(std::unique_ptr &&istrm, const pstring &name); + bool parse_stream(plib::unique_ptr &&istrm, const pstring &name); void add_define(pstring def, pstring val) { @@ -328,7 +328,7 @@ namespace netlist void register_dynamic_log_devices(); void resolve_inputs(); - std::unique_ptr get_data_stream(const pstring &name); + plib::unique_ptr get_data_stream(const pstring &name); factory::list_t &factory() { return m_factory; } @@ -404,7 +404,7 @@ namespace netlist } protected: - std::unique_ptr stream(const pstring &name) override; + plib::unique_ptr stream(const pstring &name) override; private: pstring m_str; @@ -420,7 +420,7 @@ namespace netlist } protected: - std::unique_ptr stream(const pstring &name) override; + plib::unique_ptr stream(const pstring &name) override; private: pstring m_filename; @@ -435,7 +435,7 @@ namespace netlist } protected: - std::unique_ptr stream(const pstring &name) override; + plib::unique_ptr stream(const pstring &name) override; private: pstring m_str; @@ -454,7 +454,7 @@ namespace netlist bool parse(nlparse_t &setup, const pstring &name) override; protected: - std::unique_ptr stream(const pstring &name) override; + plib::unique_ptr stream(const pstring &name) override; private: void (*m_setup_func)(nlparse_t &); diff --git a/src/lib/netlist/plib/palloc.h b/src/lib/netlist/plib/palloc.h index c70aaa392d7..45c19ef7b3a 100644 --- a/src/lib/netlist/plib/palloc.h +++ b/src/lib/netlist/plib/palloc.h @@ -8,45 +8,124 @@ #ifndef PALLOC_H_ #define PALLOC_H_ +#include "pconfig.h" #include "pstring.h" #include "ptypes.h" #include +#include #include #include #include +#if defined(_WIN32) || defined(_WIN64) || defined(_MSC_VER) +#include +#endif + namespace plib { //============================================================ // Memory allocation //============================================================ +#if (USE_ALIGNED_OPTIMIZATIONS) + static inline void *paligned_alloc( size_t alignment, size_t size ) + { +#if defined(_WIN32) || defined(_WIN64) || defined(_MSC_VER) + return _aligned_malloc(size, alignment); +#elif defined(__APPLE__) + void* p; + if (::posix_memalign(&p, alignment, size) != 0) { + p = nullptr; + } + return p; +#else + return aligned_alloc(alignment, size); +#endif + } + + static inline void pfree( void *ptr ) + { + free(ptr); + } + + template + inline C14CONSTEXPR T *assume_aligned_ptr(T *p) noexcept + { + return reinterpret_cast(__builtin_assume_aligned(p, ALIGN)); + } + + template + inline C14CONSTEXPR const T *assume_aligned_ptr(const T *p) noexcept + { + return reinterpret_cast(__builtin_assume_aligned(p, ALIGN)); + } +#else + static inline void *paligned_alloc( size_t alignment, size_t size ) + { + unused_var(alignment); + return ::operator new(size); + } + + static inline void pfree( void *ptr ) + { + ::operator delete(ptr); + } + + template + inline C14CONSTEXPR T *assume_aligned_ptr(T *p) noexcept + { + return p; + } + + template + inline C14CONSTEXPR const T *assume_aligned_ptr(const T *p) noexcept + { + return p; + } +#endif template - T *palloc(Args&&... args) + inline T *pnew(Args&&... args) { - return new T(std::forward(args)...); + auto *p = paligned_alloc(alignof(T), sizeof(T)); + return new(p) T(std::forward(args)...); } template - void pfree(T *ptr) + inline void pdelete(T *ptr) { - delete ptr; + ptr->~T(); + pfree(ptr); } template - T* palloc_array(const std::size_t num) + inline T* pnew_array(const std::size_t num) { return new T[num](); } template - void pfree_array(T *ptr) + inline void pdelete_array(T *ptr) { delete [] ptr; } - template > + template + struct pdefault_deleter + { + constexpr pdefault_deleter() noexcept = default; + + template::value>::type> + pdefault_deleter(const pdefault_deleter&) noexcept { } + + void operator()(T *p) const + { + pdelete(p); + } + }; + + template > class owned_ptr { public: @@ -142,19 +221,113 @@ namespace plib { bool m_is_owned; }; + template + using unique_ptr = std::unique_ptr>; + template - std::unique_ptr make_unique(Args&&... args) + plib::unique_ptr make_unique(Args&&... args) { - return std::unique_ptr(new T(std::forward(args)...)); + return plib::unique_ptr(pnew(std::forward(args)...)); } template static owned_ptr make_owned(Args&&... args) { - owned_ptr a(new T(std::forward(args)...), true); + owned_ptr a(pnew(std::forward(args)...), true); return std::move(a); } + template + class aligned_allocator + { + public: + using value_type = T; + + static_assert(ALIGN >= alignof(T) && (ALIGN % alignof(T)) == 0, + "ALIGN must be greater than alignof(T) and a multiple"); + + aligned_allocator() = default; + + aligned_allocator(const aligned_allocator&) = default; + aligned_allocator& operator=(const aligned_allocator&) = delete; + + template + aligned_allocator(const aligned_allocator& rhs) noexcept + { + unused_var(rhs); + } + + template struct rebind + { + using other = aligned_allocator; + }; + + T* allocate(std::size_t n) + { + return reinterpret_cast(paligned_alloc(ALIGN, sizeof(T) * n)); + } + + void deallocate(T* p, std::size_t n) noexcept + { + unused_var(n); + pfree(p); + } + + template + friend bool operator==(const aligned_allocator& lhs, + const aligned_allocator& rhs) noexcept; + + template friend class aligned_allocator; + }; + + template + /*friend*/ inline bool operator==(const aligned_allocator& lhs, + const aligned_allocator& rhs) noexcept + { + unused_var(lhs, rhs); + return A1 == A2; + } + template + /*friend*/ inline bool operator!=(const aligned_allocator& lhs, + const aligned_allocator& rhs) noexcept + { + return !(lhs == rhs); + } + + // FIXME: needs to be somewhere else +#if 0 + template + using aligned_vector = std::vector>; + //using aligned_vector = std::vector>; +#else + template + class aligned_vector : public std::vector> + { + public: + using base = std::vector>; + + using reference = typename base::reference; + using const_reference = typename base::const_reference; + using size_type = typename base::size_type; + + using base::base; + + reference operator[](size_type i) noexcept + { + return assume_aligned_ptr(this->data())[i]; + } + constexpr const_reference operator[](size_type i) const noexcept + { + return assume_aligned_ptr(this->data())[i]; + } + + }; + + +#endif + + + } // namespace plib #endif /* PALLOC_H_ */ diff --git a/src/lib/netlist/plib/parray.h b/src/lib/netlist/plib/parray.h index 662c2e9550e..e09639163f0 100644 --- a/src/lib/netlist/plib/parray.h +++ b/src/lib/netlist/plib/parray.h @@ -10,6 +10,7 @@ #include "pconfig.h" #include "pexception.h" +#include "palloc.h" #include #include @@ -30,7 +31,7 @@ namespace plib { struct sizeabs { static constexpr const std::size_t ABS = 0; - using container = typename std::vector ; + using container = typename std::vector>; }; /** @@ -102,11 +103,17 @@ namespace plib { return m_a[i]; } #else - reference operator[](size_type i) noexcept { return m_a[i]; } - constexpr const_reference operator[](size_type i) const noexcept { return m_a[i]; } + reference operator[](size_type i) noexcept + { + return assume_aligned_ptr(&m_a[0])[i]; + } + constexpr const_reference operator[](size_type i) const noexcept + { + return assume_aligned_ptr(&m_a[0])[i]; + } #endif - FT * data() noexcept { return m_a.data(); } - const FT * data() const noexcept { return m_a.data(); } + FT * data() noexcept { return assume_aligned_ptr(m_a.data()); } + const FT * data() const noexcept { return assume_aligned_ptr(m_a.data()); } private: PALIGNAS_VECTOROPT() diff --git a/src/lib/netlist/plib/pconfig.h b/src/lib/netlist/plib/pconfig.h index cc92a42c827..9f61fc0b01f 100644 --- a/src/lib/netlist/plib/pconfig.h +++ b/src/lib/netlist/plib/pconfig.h @@ -33,12 +33,23 @@ #define PHAS_INT128 (0) #endif +/* + * Set this to one if you want to use aligned storage optimizations. + */ + +#ifndef USE_ALIGNED_OPTIMIZATIONS +#define USE_ALIGNED_OPTIMIZATIONS (0) +#endif + /* * Standard alignment macros */ -#define PALIGNAS_CACHELINE() PALIGNAS(64) -#define PALIGNAS_VECTOROPT() PALIGNAS(64) +#define PALIGN_CACHELINE (64) +#define PALIGN_VECTOROPT (16) + +#define PALIGNAS_CACHELINE() PALIGNAS(PALIGN_CACHELINE) +#define PALIGNAS_VECTOROPT() PALIGNAS(PALIGN_VECTOROPT) /* Breaks mame build on windows due to -Wattribute */ #if defined(_WIN32) && defined(__GNUC__) diff --git a/src/lib/netlist/plib/pdynlib.cpp b/src/lib/netlist/plib/pdynlib.cpp index f30ddc5d59a..c0c89de208d 100644 --- a/src/lib/netlist/plib/pdynlib.cpp +++ b/src/lib/netlist/plib/pdynlib.cpp @@ -25,7 +25,7 @@ CHAR *astring_from_utf8(const char *utf8string) // convert UTF-16 to "ANSI code page" string char_count = WideCharToMultiByte(CP_ACP, 0, wstring, -1, nullptr, 0, nullptr, nullptr); - result = palloc_array(char_count); + result = pnew_array(char_count); if (result != nullptr) WideCharToMultiByte(CP_ACP, 0, wstring, -1, result, char_count, nullptr, nullptr); @@ -39,7 +39,7 @@ WCHAR *wstring_from_utf8(const char *utf8string) // convert MAME string (UTF-8) to UTF-16 char_count = MultiByteToWideChar(CP_UTF8, 0, utf8string, -1, nullptr, 0); - result = palloc_array(char_count); + result = pnew_array(char_count); if (result != nullptr) MultiByteToWideChar(CP_UTF8, 0, utf8string, -1, result, char_count); @@ -72,7 +72,7 @@ dynlib::dynlib(const pstring libname) m_isLoaded = true; //else // fprintf(stderr, "win: library <%s> not found!\n", libname.c_str()); - pfree_array(buffer); + pdelete_array(buffer); #elif defined(EMSCRIPTEN) //no-op #else @@ -106,7 +106,7 @@ dynlib::dynlib(const pstring path, const pstring libname) { //printf("win: library <%s> not found!\n", libname.c_str()); } - pfree_array(buffer); + pdelete_array(buffer); #elif defined(EMSCRIPTEN) //no-op #else diff --git a/src/lib/netlist/plib/pmempool.h b/src/lib/netlist/plib/pmempool.h index 80e30ada324..c55d66d8847 100644 --- a/src/lib/netlist/plib/pmempool.h +++ b/src/lib/netlist/plib/pmempool.h @@ -34,7 +34,6 @@ namespace plib { void operator()(T *p) const { - p->~T(); P::free(p); } }; @@ -83,7 +82,7 @@ namespace plib { block * new_block(std::size_t min_bytes) { - auto *b = new block(this, min_bytes); + auto *b = plib::pnew(this, min_bytes); m_blocks.push_back(b); return b; } @@ -123,22 +122,27 @@ namespace plib { } } - void *alloc(size_t size, size_t align) + template + void *alloc(size_t size) { + size_t align = ALIGN; if (align < m_min_align) align = m_min_align; - size_t rs = (size + align - 1) & ~(align - 1); + size_t rs = size + align; for (auto &b : m_blocks) { if (b->m_free > rs) { b->m_free -= rs; b->m_num_alloc++; - auto ret = reinterpret_cast(b->m_data + b->m_cur); + auto *ret = reinterpret_cast(b->m_data + b->m_cur); auto capacity(rs); - std::align(align, size, ret, capacity); + ret = std::align(align, size, ret, capacity); + if (ret == nullptr) + printf("Oh no\n"); sinfo().insert({ ret, info(b, b->m_cur)}); + rs -= (capacity - size); b->m_cur += rs; return ret; @@ -148,17 +152,24 @@ namespace plib { block *b = new_block(rs); b->m_num_alloc = 1; b->m_free = m_min_alloc - rs; - auto ret = reinterpret_cast(b->m_data + b->m_cur); + auto *ret = reinterpret_cast(b->m_data + b->m_cur); auto capacity(rs); - std::align(align, size, ret, capacity); + ret = std::align(align, size, ret, capacity); + if (ret == nullptr) + printf("Oh no\n"); sinfo().insert({ ret, info(b, b->m_cur)}); + rs -= (capacity - size); b->m_cur += rs; return ret; } } - static void free(void *ptr) + template + static void free(T *ptr) { + /* call destructor */ + ptr->~T(); + auto it = sinfo().find(ptr); if (it == sinfo().end()) plib::terminate("mempool::free - pointer not found\n"); @@ -182,7 +193,7 @@ namespace plib { template poolptr make_poolptr(Args&&... args) { - auto mem = this->alloc(sizeof(T), alignof(T)); + auto *mem = this->alloc(sizeof(T)); auto *obj = new (mem) T(std::forward(args)...); poolptr a(obj, true); return std::move(a); @@ -208,6 +219,7 @@ namespace plib { ~mempool_default() = default; +#if 0 void *alloc(size_t size) { plib::unused_var(m_min_alloc); // -Wunused-private-field fires without @@ -216,9 +228,11 @@ namespace plib { return ::operator new(size); } - static void free(void *ptr) +#endif + template + static void free(T *ptr) { - ::operator delete(ptr); + plib::pdelete(ptr); } template @@ -227,12 +241,13 @@ namespace plib { template poolptr make_poolptr(Args&&... args) { - auto mem(alloc(sizeof(T))); - auto *obj = new (mem) T(std::forward(args)...); + plib::unused_var(m_min_alloc); // -Wunused-private-field fires without + plib::unused_var(m_min_align); + + auto *obj = plib::pnew(std::forward(args)...); poolptr a(obj, true); return std::move(a); } - }; diff --git a/src/lib/netlist/plib/pstate.h b/src/lib/netlist/plib/pstate.h index cdb6ea94dc8..d837a6d2931 100644 --- a/src/lib/netlist/plib/pstate.h +++ b/src/lib/netlist/plib/pstate.h @@ -10,6 +10,7 @@ #include "pstring.h" #include "ptypes.h" +#include "palloc.h" #include #include @@ -63,7 +64,7 @@ public: struct entry_t { - using list_t = std::vector>; + using list_t = std::vector>; entry_t(const pstring &stname, const datatype_t &dt, const void *owner, const std::size_t count, void *ptr) diff --git a/src/lib/netlist/plib/pstream.cpp b/src/lib/netlist/plib/pstream.cpp index f9dd224e92f..8f80f317f98 100644 --- a/src/lib/netlist/plib/pstream.cpp +++ b/src/lib/netlist/plib/pstream.cpp @@ -270,13 +270,13 @@ pimemstream::pos_type pimemstream::vtell() const pomemstream::pomemstream() : postream(FLAG_SEEKABLE), m_pos(0), m_capacity(1024), m_size(0) { - m_mem = palloc_array(m_capacity); + m_mem = pnew_array(m_capacity); } pomemstream::~pomemstream() { if (m_mem != nullptr) - pfree_array(m_mem); + pdelete_array(m_mem); } void pomemstream::vwrite(const value_type *buf, const pos_type n) @@ -286,13 +286,13 @@ void pomemstream::vwrite(const value_type *buf, const pos_type n) while (m_pos + n >= m_capacity) m_capacity *= 2; char *o = m_mem; - m_mem = palloc_array(m_capacity); + m_mem = pnew_array(m_capacity); if (m_mem == nullptr) { throw out_of_mem_e("pomemstream::vwrite"); } std::copy(o, o + m_pos, m_mem); - pfree_array(o); + pdelete_array(o); } std::copy(buf, buf + n, m_mem + m_pos); @@ -309,13 +309,13 @@ void pomemstream::vseek(const pos_type n) while (m_size >= m_capacity) m_capacity *= 2; char *o = m_mem; - m_mem = palloc_array(m_capacity); + m_mem = pnew_array(m_capacity); if (m_mem == nullptr) { throw out_of_mem_e("pomemstream::vseek"); } std::copy(o, o + m_pos, m_mem); - pfree_array(o); + pdelete_array(o); } } diff --git a/src/lib/netlist/plib/pstream.h b/src/lib/netlist/plib/pstream.h index 80619137c51..d5b2bfa4809 100644 --- a/src/lib/netlist/plib/pstream.h +++ b/src/lib/netlist/plib/pstream.h @@ -447,7 +447,7 @@ private: template struct constructor_helper { - std::unique_ptr operator()(T &&s) { return std::move(plib::make_unique(std::move(s))); } + plib::unique_ptr operator()(T &&s) { return std::move(plib::make_unique(std::move(s))); } }; // NOLINTNEXTLINE(cppcoreguidelines-special-member-functions) @@ -489,20 +489,20 @@ public: } private: - std::unique_ptr m_strm; + plib::unique_ptr m_strm; putf8string m_linebuf; }; template <> struct constructor_helper { - std::unique_ptr operator()(putf8_reader &&s) { return std::move(s.m_strm); } + plib::unique_ptr operator()(putf8_reader &&s) { return std::move(s.m_strm); } }; template <> -struct constructor_helper> +struct constructor_helper> { - std::unique_ptr operator()(std::unique_ptr &&s) { return std::move(s); } + plib::unique_ptr operator()(plib::unique_ptr &&s) { return std::move(s); } }; @@ -626,11 +626,11 @@ public: { std::size_t sz = 0; read(sz); - auto buf = plib::palloc_array::mem_t>(sz+1); + auto buf = plib::pnew_array::mem_t>(sz+1); m_strm.read(reinterpret_cast(buf), sz); buf[sz] = 0; s = pstring(buf); - plib::pfree_array(buf); + plib::pdelete_array(buf); } template diff --git a/src/lib/netlist/prg/nltool.cpp b/src/lib/netlist/prg/nltool.cpp index ea7e1426626..076d004528c 100644 --- a/src/lib/netlist/prg/nltool.cpp +++ b/src/lib/netlist/prg/nltool.cpp @@ -126,13 +126,13 @@ public: { } - std::unique_ptr stream(const pstring &file) override; + plib::unique_ptr stream(const pstring &file) override; private: pstring m_folder; }; -std::unique_ptr netlist_data_folder_t::stream(const pstring &file) +plib::unique_ptr netlist_data_folder_t::stream(const pstring &file) { pstring name = m_folder + "/" + file; try @@ -145,7 +145,7 @@ std::unique_ptr netlist_data_folder_t::stream(const pstring &fil if (dynamic_cast(&e) == nullptr ) throw; } - return std::unique_ptr(nullptr); + return plib::unique_ptr(nullptr); } class netlist_tool_callbacks_t : public netlist::callbacks_t diff --git a/src/lib/netlist/prg/nlwav.cpp b/src/lib/netlist/prg/nlwav.cpp index 96cf9342058..24c84c73739 100644 --- a/src/lib/netlist/prg/nlwav.cpp +++ b/src/lib/netlist/prg/nlwav.cpp @@ -166,7 +166,7 @@ public: return success; } - void process(std::vector> &is) + void process(std::vector> &is) { std::vector readers; for (auto &i : is) @@ -431,7 +431,7 @@ public: private: void convert_wav(); void convert_vcd(vcdwriter::format_e format); - std::vector> m_instrms; + std::vector> m_instrms; plib::postream *m_outstrm; }; @@ -440,8 +440,8 @@ void nlwav_app::convert_wav() double dt = 1.0 / static_cast(opt_rate()); - std::unique_ptr wo = plib::make_unique(*m_outstrm, m_instrms.size(), opt_rate(), opt_amp()); - std::unique_ptr ago = plib::make_unique(m_instrms.size(), dt, aggregator::callback_type(&wavwriter::process, wo.get())); + plib::unique_ptr wo = plib::make_unique(*m_outstrm, m_instrms.size(), opt_rate(), opt_amp()); + plib::unique_ptr ago = plib::make_unique(m_instrms.size(), dt, aggregator::callback_type(&wavwriter::process, wo.get())); aggregator::callback_type agcb = log_processor::callback_type(&aggregator::process, ago.get()); log_processor lp(m_instrms.size(), agcb); @@ -462,7 +462,7 @@ void nlwav_app::convert_wav() void nlwav_app::convert_vcd(vcdwriter::format_e format) { - std::unique_ptr wo = plib::make_unique(*m_outstrm, opt_args(), + plib::unique_ptr wo = plib::make_unique(*m_outstrm, opt_args(), format, opt_high(), opt_low()); log_processor::callback_type agcb = log_processor::callback_type(&vcdwriter::process, wo.get()); @@ -510,11 +510,11 @@ int nlwav_app::execute() return 0; } - m_outstrm = (opt_out() == "-" ? &pout_strm : plib::palloc(opt_out())); + m_outstrm = (opt_out() == "-" ? &pout_strm : plib::pnew(opt_out())); for (auto &oi: opt_args()) { - std::unique_ptr fin = (oi == "-" ? + plib::unique_ptr fin = (oi == "-" ? plib::make_unique() : plib::make_unique(oi)); m_instrms.push_back(std::move(fin)); @@ -534,7 +534,7 @@ int nlwav_app::execute() } if (opt_out() != "-") - plib::pfree(m_outstrm); + plib::pdelete(m_outstrm); return 0; } diff --git a/src/lib/netlist/solver/nld_matrix_solver.cpp b/src/lib/netlist/solver/nld_matrix_solver.cpp index 36c8f2fb551..951733874fd 100644 --- a/src/lib/netlist/solver/nld_matrix_solver.cpp +++ b/src/lib/netlist/solver/nld_matrix_solver.cpp @@ -336,9 +336,9 @@ void matrix_solver_t::setup_matrix() * This should reduce cache misses ... */ - auto **touched = plib::palloc_array(iN); + auto **touched = plib::pnew_array(iN); for (std::size_t k=0; k(iN); + touched[k] = plib::pnew_array(iN); for (std::size_t k = 0; k < iN; k++) { @@ -397,8 +397,8 @@ void matrix_solver_t::setup_matrix() } for (std::size_t k=0; k m_nzrd; /* non zero right of the diagonal for elimination, may include RHS element */ std::vector m_nzbd; /* non zero below of the diagonal for elimination */ - - - /* state */ nl_double m_last_V; nl_double m_DD_n_m_1; @@ -113,10 +111,10 @@ public: private: std::vector m_connected_net_idx; - std::vector m_go; - std::vector m_gt; - std::vector m_Idr; - std::vector m_connected_net_V; + plib::aligned_vector m_go; + plib::aligned_vector m_gt; + plib::aligned_vector m_Idr; + plib::aligned_vector m_connected_net_V; std::vector m_terms; }; @@ -218,11 +216,11 @@ protected: template void build_LE_RHS(T &child); - std::vector> m_terms; + std::vector> m_terms; std::vector m_nets; std::vector> m_inps; - std::vector> m_rails_temp; + std::vector> m_rails_temp; const solver_parameters_t &m_params; diff --git a/src/lib/netlist/solver/nld_ms_gcr.h b/src/lib/netlist/solver/nld_ms_gcr.h index 8d1351435c8..d2caa944434 100644 --- a/src/lib/netlist/solver/nld_ms_gcr.h +++ b/src/lib/netlist/solver/nld_ms_gcr.h @@ -65,7 +65,8 @@ private: plib::parray RHS; plib::parray new_V; - std::array, storage_N> m_term_cr; + std::array, storage_N> m_term_cr; +// std::array, storage_N> m_term_cr; mat_type mat; diff --git a/src/lib/netlist/solver/nld_ms_gmres.h b/src/lib/netlist/solver/nld_ms_gmres.h index 3cd88dea429..dcb3726f5f2 100644 --- a/src/lib/netlist/solver/nld_ms_gmres.h +++ b/src/lib/netlist/solver/nld_ms_gmres.h @@ -51,7 +51,7 @@ namespace devices using mattype = typename plib::matrix_compressed_rows_t::index_type; - plib::parray, SIZE> m_term_cr; + plib::parray, SIZE> m_term_cr; plib::mat_precondition_ILU m_ops; //plib::mat_precondition_diag m_ops; plib::gmres_t m_gmres; diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp index 6ce9a093c84..44d51793690 100644 --- a/src/lib/netlist/solver/nld_solver.cpp +++ b/src/lib/netlist/solver/nld_solver.cpp @@ -175,6 +175,25 @@ poolptr NETLIB_NAME(solver)::create_solver(std::size_t size, co } } +template +poolptr NETLIB_NAME(solver)::create_solver_x(std::size_t size, const pstring &solvername) +{ + if (SIZE > 0) + { + if (size == SIZE) + return create_solver(size, solvername); + else + return this->create_solver_x(size, solvername); + } + else + { + if (size * 2 > -SIZE ) + return create_solver(size, solvername); + else + return this->create_solver_x(size, solvername); + } +}; + struct net_splitter { @@ -230,9 +249,6 @@ struct net_splitter void NETLIB_NAME(solver)::post_start() { - const bool use_specific = true; - plib::unused_var(use_specific); - m_params.m_pivot = m_pivot(); m_params.m_accuracy = m_accuracy(); /* FIXME: Throw when negative */ @@ -283,18 +299,11 @@ void NETLIB_NAME(solver)::post_start() { #if 1 case 1: - if (use_specific) - ms = pool().make_poolptr>(state(), sname, &m_params); - else - ms = create_solver(1, sname); + ms = pool().make_poolptr>(state(), sname, &m_params); break; case 2: - if (use_specific) - ms = pool().make_poolptr>(state(), sname, &m_params); - else - ms = create_solver(2, sname); + ms = pool().make_poolptr>(state(), sname, &m_params); break; -#if 1 case 3: ms = create_solver(3, sname); break; @@ -319,6 +328,7 @@ void NETLIB_NAME(solver)::post_start() case 10: ms = create_solver(10, sname); break; +#if 0 case 11: ms = create_solver(11, sname); break; @@ -341,7 +351,7 @@ void NETLIB_NAME(solver)::post_start() ms = create_solver(49, sname); break; #endif -#if 0 +#if 1 case 86: ms = create_solver(86, sname); break; diff --git a/src/lib/netlist/solver/nld_solver.h b/src/lib/netlist/solver/nld_solver.h index 247abc9097b..c4a9eba6971 100644 --- a/src/lib/netlist/solver/nld_solver.h +++ b/src/lib/netlist/solver/nld_solver.h @@ -105,6 +105,9 @@ private: template poolptr create_solver(std::size_t size, const pstring &solvername); + + template + poolptr create_solver_x(std::size_t size, const pstring &solvername); }; } //namespace devices diff --git a/src/lib/netlist/tools/nl_convert.cpp b/src/lib/netlist/tools/nl_convert.cpp index 95e05d27857..f4616cb7774 100644 --- a/src/lib/netlist/tools/nl_convert.cpp +++ b/src/lib/netlist/tools/nl_convert.cpp @@ -81,7 +81,7 @@ void nl_convert_base_t::add_ext_alias(const pstring &alias) m_ext_alias.push_back(alias); } -void nl_convert_base_t::add_device(std::unique_ptr dev) +void nl_convert_base_t::add_device(plib::unique_ptr dev) { for (auto & d : m_devs) if (d->name() == dev->name()) diff --git a/src/lib/netlist/tools/nl_convert.h b/src/lib/netlist/tools/nl_convert.h index 7dd0e56c5ee..73c98301af5 100644 --- a/src/lib/netlist/tools/nl_convert.h +++ b/src/lib/netlist/tools/nl_convert.h @@ -124,14 +124,14 @@ private: private: - void add_device(std::unique_ptr dev); + void add_device(plib::unique_ptr dev); plib::postringstream m_buf; - std::vector> m_devs; - std::unordered_map > m_nets; + std::vector> m_devs; + std::unordered_map > m_nets; std::vector m_ext_alias; - std::unordered_map> m_pins; + std::unordered_map> m_pins; static unit_t m_units[]; pstring m_numberchars; -- cgit v1.2.3-70-g09d2 From 66154af0f202bc373cde7e2f5af014e067558b94 Mon Sep 17 00:00:00 2001 From: couriersud Date: Fri, 22 Feb 2019 21:46:43 +0100 Subject: netlist: fix visibility issues and more issues reported by tidy. (nw) --- src/lib/netlist/analog/nld_bjt.cpp | 6 +-- src/lib/netlist/analog/nlid_fourterm.h | 8 ++-- src/lib/netlist/analog/nlid_twoterm.cpp | 2 +- src/lib/netlist/analog/nlid_twoterm.h | 12 ++--- src/lib/netlist/build/makefile | 6 +-- src/lib/netlist/devices/nld_4066.cpp | 2 +- src/lib/netlist/devices/nld_7493.cpp | 8 ++-- src/lib/netlist/devices/nld_legacy.cpp | 4 +- src/lib/netlist/devices/nlid_proxy.h | 2 - src/lib/netlist/devices/nlid_system.h | 21 ++++----- src/lib/netlist/nl_base.cpp | 2 +- src/lib/netlist/nl_base.h | 67 ++++++++++++++-------------- src/lib/netlist/nl_lists.h | 13 +++--- src/lib/netlist/nl_setup.cpp | 14 +++--- src/lib/netlist/nl_setup.h | 4 +- src/lib/netlist/plib/palloc.h | 25 +++++++++-- src/lib/netlist/plib/parray.h | 2 +- src/lib/netlist/plib/pconfig.h | 2 +- src/lib/netlist/plib/pdynlib.cpp | 6 +-- src/lib/netlist/plib/pdynlib.h | 8 ++-- src/lib/netlist/plib/pexception.cpp | 2 +- src/lib/netlist/plib/pexception.h | 2 +- src/lib/netlist/plib/pfmtlog.cpp | 6 ++- src/lib/netlist/plib/pfunction.cpp | 2 +- src/lib/netlist/plib/plists.h | 3 +- src/lib/netlist/plib/pmempool.h | 8 ++-- src/lib/netlist/plib/poptions.cpp | 12 ++--- src/lib/netlist/plib/poptions.h | 32 ++++++------- src/lib/netlist/plib/pparser.h | 10 ++--- src/lib/netlist/plib/ppmf.h | 1 + src/lib/netlist/plib/pstate.h | 2 +- src/lib/netlist/plib/pstream.h | 3 +- src/lib/netlist/plib/pstring.h | 7 ++- src/lib/netlist/plib/vector_ops.h | 11 +++-- src/lib/netlist/prg/nltool.cpp | 4 +- src/lib/netlist/prg/nlwav.cpp | 24 +++++----- src/lib/netlist/solver/nld_matrix_solver.cpp | 12 ++--- src/lib/netlist/solver/nld_solver.cpp | 4 +- src/lib/netlist/solver/nld_solver.h | 3 +- src/lib/netlist/tools/nl_convert.cpp | 2 +- src/lib/netlist/tools/nl_convert.h | 2 +- 41 files changed, 192 insertions(+), 174 deletions(-) (limited to 'src/lib/netlist/plib/pdynlib.cpp') diff --git a/src/lib/netlist/analog/nld_bjt.cpp b/src/lib/netlist/analog/nld_bjt.cpp index 7f8e57a8511..fb8aeafda1c 100644 --- a/src/lib/netlist/analog/nld_bjt.cpp +++ b/src/lib/netlist/analog/nld_bjt.cpp @@ -209,6 +209,7 @@ NETLIB_OBJECT_DERIVED(QBJT_switch, QBJT) NETLIB_UPDATE_PARAMI(); NETLIB_UPDATE_TERMINALSI(); +private: nld_twoterm m_RB; nld_twoterm m_RC; @@ -216,9 +217,6 @@ NETLIB_OBJECT_DERIVED(QBJT_switch, QBJT) nld_twoterm m_BC_dummy; -protected: - - nl_double m_gB; // base conductance / switch on nl_double m_gC; // collector conductance / switch on nl_double m_V; // internal voltage source @@ -261,10 +259,10 @@ protected: NETLIB_UPDATE_PARAMI(); NETLIB_UPDATE_TERMINALSI(); +private: generic_diode m_gD_BC; generic_diode m_gD_BE; -private: nld_twoterm m_D_CB; // gcc, gce - gcc, gec - gcc, gcc - gce | Ic nld_twoterm m_D_EB; // gee, gec - gee, gce - gee, gee - gec | Ie nld_twoterm m_D_EC; // 0, -gec, -gcc, 0 | 0 diff --git a/src/lib/netlist/analog/nlid_fourterm.h b/src/lib/netlist/analog/nlid_fourterm.h index 46ee7d6e54a..2d0d1ec174f 100644 --- a/src/lib/netlist/analog/nlid_fourterm.h +++ b/src/lib/netlist/analog/nlid_fourterm.h @@ -66,6 +66,7 @@ namespace netlist { NETLIB_NAME(VCCS)::reset(); } + terminal_t m_OP; terminal_t m_ON; @@ -91,14 +92,14 @@ namespace netlist { NETLIB_IS_DYNAMIC(true) - param_double_t m_cur_limit; /* current limit */ - protected: //NETLIB_UPDATEI(); NETLIB_RESETI(); NETLIB_UPDATE_PARAMI(); NETLIB_UPDATE_TERMINALSI(); + private: + param_double_t m_cur_limit; /* current limit */ nl_double m_vi; }; @@ -185,13 +186,14 @@ namespace netlist { param_double_t m_RO; - protected: + private: //NETLIB_UPDATEI(); //NETLIB_UPDATE_PARAMI(); terminal_t m_OP2; terminal_t m_ON2; + }; } // namespace analog diff --git a/src/lib/netlist/analog/nlid_twoterm.cpp b/src/lib/netlist/analog/nlid_twoterm.cpp index 84cf5ed7b53..832b343ac15 100644 --- a/src/lib/netlist/analog/nlid_twoterm.cpp +++ b/src/lib/netlist/analog/nlid_twoterm.cpp @@ -20,7 +20,7 @@ namespace netlist // generic_diode // ---------------------------------------------------------------------------------------- -generic_diode::generic_diode(device_t &dev, pstring name) +generic_diode::generic_diode(device_t &dev, const pstring &name) : m_Vd(dev, name + ".m_Vd", 0.7) , m_Id(dev, name + ".m_Id", 0.0) , m_G(dev, name + ".m_G", 1e-15) diff --git a/src/lib/netlist/analog/nlid_twoterm.h b/src/lib/netlist/analog/nlid_twoterm.h index 65451a03c6c..546e8193734 100644 --- a/src/lib/netlist/analog/nlid_twoterm.h +++ b/src/lib/netlist/analog/nlid_twoterm.h @@ -141,7 +141,6 @@ NETLIB_OBJECT_DERIVED(R, R_base) { } - param_double_t m_R; protected: @@ -150,6 +149,7 @@ protected: NETLIB_UPDATE_PARAMI(); private: + param_double_t m_R; /* protect set_R ... it's a recipe to desaster when used to bypass the parameter */ using NETLIB_NAME(R_base)::set_R; }; @@ -267,13 +267,13 @@ public: NETLIB_TIMESTEPI(); NETLIB_RESETI(); - param_double_t m_L; - protected: //NETLIB_UPDATEI(); NETLIB_UPDATE_PARAMI(); private: + param_double_t m_L; + nl_double m_GParallel; nl_double m_G; nl_double m_I; @@ -286,7 +286,7 @@ private: class generic_diode { public: - generic_diode(device_t &dev, pstring name); + generic_diode(device_t &dev, const pstring &name); void update_diode(const double nVd); @@ -383,12 +383,12 @@ public: NETLIB_UPDATE_TERMINALSI(); NETLIB_RESETI(); - diode_model_t m_model; - protected: //NETLIB_UPDATEI(); NETLIB_UPDATE_PARAMI(); +private: + diode_model_t m_model; generic_diode m_D; }; diff --git a/src/lib/netlist/build/makefile b/src/lib/netlist/build/makefile index 289f7a906a2..40d75f32fd8 100644 --- a/src/lib/netlist/build/makefile +++ b/src/lib/netlist/build/makefile @@ -21,12 +21,12 @@ TIDY_FLAGSX += -modernize-use-default-member-init,-cppcoreguidelines-pro-bounds- TIDY_FLAGSX += -modernize-pass-by-value,-cppcoreguidelines-pro-type-static-cast-downcast, #TIDY_FLAGSX += -cppcoreguidelines-special-member-functions, #TIDY_FLAGSX += -cppcoreguidelines-pro-bounds-array-to-pointer-decay, -TIDY_FLAGSX += -performance-unnecessary-value-param,-cppcoreguidelines-avoid-magic-numbers, +TIDY_FLAGSX += performance-unnecessary-value-param,-cppcoreguidelines-avoid-magic-numbers, TIDY_FLAGSX += -cppcoreguidelines-macro-usage, -TIDY_FLAGSX += -cppcoreguidelines-non-private-member-variables-in-classes,-misc-non-private-member-variables-in-classes, +TIDY_FLAGSX += cppcoreguidelines-non-private-member-variables-in-classes,-misc-non-private-member-variables-in-classes, #TIDY_FLAGSX += -cppcoreguidelines-avoid-c-arrays,-modernize-avoid-c-arrays, #TIDY_FLAGSX += -modernize-use-using, -TIDY_FLAGSX += -performance-unnecessary-copy-initialization, +TIDY_FLAGSX += performance-unnecessary-copy-initialization, TIDY_FLAGSX += -bugprone-macro-parentheses,-misc-macro-parentheses space := diff --git a/src/lib/netlist/devices/nld_4066.cpp b/src/lib/netlist/devices/nld_4066.cpp index 9b7672e00c2..0c7511ca438 100644 --- a/src/lib/netlist/devices/nld_4066.cpp +++ b/src/lib/netlist/devices/nld_4066.cpp @@ -29,7 +29,7 @@ namespace netlist NETLIB_RESETI(); NETLIB_UPDATEI(); - public: + private: NETLIB_SUB(vdd_vss) m_supply; analog::NETLIB_SUB(R_base) m_R; diff --git a/src/lib/netlist/devices/nld_7493.cpp b/src/lib/netlist/devices/nld_7493.cpp index 261fe4ff927..f9eca065dc6 100644 --- a/src/lib/netlist/devices/nld_7493.cpp +++ b/src/lib/netlist/devices/nld_7493.cpp @@ -119,10 +119,10 @@ namespace netlist { m_CLKA.inactivate(); m_CLKB.inactivate(); - m_QA.push_force(0, NLTIME_FROM_NS(40)); - m_QB.push_force(0, NLTIME_FROM_NS(40)); - m_QC.push_force(0, NLTIME_FROM_NS(40)); - m_QD.push_force(0, NLTIME_FROM_NS(40)); + m_QA.push(0, NLTIME_FROM_NS(40)); + m_QB.push(0, NLTIME_FROM_NS(40)); + m_QC.push(0, NLTIME_FROM_NS(40)); + m_QD.push(0, NLTIME_FROM_NS(40)); m_a = m_bcd = 0; } } diff --git a/src/lib/netlist/devices/nld_legacy.cpp b/src/lib/netlist/devices/nld_legacy.cpp index df0bbc111cb..ed695a91417 100644 --- a/src/lib/netlist/devices/nld_legacy.cpp +++ b/src/lib/netlist/devices/nld_legacy.cpp @@ -25,7 +25,7 @@ namespace netlist NETLIB_RESETI(); NETLIB_UPDATEI(); - protected: + private: logic_input_t m_S; logic_input_t m_R; @@ -49,7 +49,7 @@ namespace netlist NETLIB_RESETI(); NETLIB_UPDATEI(); - protected: + private: logic_input_t m_I; logic_output_t m_Q; diff --git a/src/lib/netlist/devices/nlid_proxy.h b/src/lib/netlist/devices/nlid_proxy.h index 09a5da48c25..a6967a87a9f 100644 --- a/src/lib/netlist/devices/nlid_proxy.h +++ b/src/lib/netlist/devices/nlid_proxy.h @@ -90,8 +90,6 @@ namespace netlist logic_output_t *out_proxied, detail::core_terminal_t &proxy_out); logic_input_t m_I; - - private: }; NETLIB_OBJECT_DERIVED(d_to_a_proxy, base_d_to_a_proxy) diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h index e58b15ed03b..02e8453c6e7 100644 --- a/src/lib/netlist/devices/nlid_system.h +++ b/src/lib/netlist/devices/nlid_system.h @@ -72,9 +72,9 @@ namespace netlist public: logic_output_t m_Q; - - param_double_t m_freq; netlist_time m_inc; + private: + param_double_t m_freq; }; // ----------------------------------------------------------------------------- @@ -96,7 +96,7 @@ namespace netlist //NETLIB_RESETI(); NETLIB_UPDATE_PARAMI(); - protected: + private: logic_input_t m_feedback; logic_output_t m_Q; @@ -154,7 +154,7 @@ namespace netlist NETLIB_HANDLERI(clk2); NETLIB_HANDLERI(clk2_pow2); - protected: + private: param_double_t m_freq; param_str_t m_pattern; @@ -187,7 +187,7 @@ namespace netlist NETLIB_RESETI() { m_Q.initial(0); } NETLIB_UPDATE_PARAMI() { m_Q.push(m_IN() & 1, netlist_time::from_nsec(1)); } - protected: + private: logic_output_t m_Q; param_logic_t m_IN; @@ -206,7 +206,7 @@ namespace netlist NETLIB_RESETI() { m_Q.initial(0.0); } NETLIB_UPDATE_PARAMI() { m_Q.push(m_IN()); } - protected: + private: analog_output_t m_Q; param_double_t m_IN; }; @@ -358,16 +358,17 @@ namespace netlist register_subalias("2", m_R.m_N); } + NETLIB_RESETI(); + //NETLIB_UPDATE_PARAMI(); + NETLIB_UPDATEI(); + analog::NETLIB_SUB(R_base) m_R; logic_input_t m_I; param_double_t m_RON; param_double_t m_ROFF; - NETLIB_RESETI(); - //NETLIB_UPDATE_PARAMI(); - NETLIB_UPDATEI(); - private: + state_var m_last_state; }; diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index 3d6a8cf04b0..8ba7ad7b5f8 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -361,7 +361,7 @@ void netlist_state_t::reset() std::vector t; log().verbose("Using default startup strategy"); for (auto &n : m_nets) - for (auto & term : n->m_core_terms) + for (auto & term : n->core_terms()) if (term->m_delegate.has_object()) { if (!plib::container::contains(t, &term->m_delegate)) diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 7f65a33e6bf..dccfb32f896 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -773,7 +773,7 @@ namespace netlist void rebuild_list(); /* rebuild m_list after a load */ void move_connections(net_t &dest_net); - std::vector m_core_terms; // save post-start m_list ... + std::vector &core_terms() { return m_core_terms; } #if USE_COPY_INSTEAD_OF_REFERENCE void update_inputs() { @@ -786,34 +786,20 @@ namespace netlist /* nothing needs to be done */ } #endif - protected: - state_var m_new_Q; - state_var m_cur_Q; - state_var m_in_queue; /* 0: not in queue, 1: in queue, 2: last was taken */ - - state_var m_next_scheduled_time; - - private: - plib::linkedlist_t m_list_active; - core_terminal_t * m_railterminal; - - template - void process(const T mask, netlist_sig_t sig); - }; - class logic_net_t : public detail::net_t - { - public: - - logic_net_t(netlist_state_t &nl, const pstring &aname, detail::core_terminal_t *mr = nullptr); + protected: + /* only used for logic nets */ netlist_sig_t Q() const noexcept { return m_cur_Q; } + + /* only used for logic nets */ void initial(const netlist_sig_t val) noexcept { m_cur_Q = m_new_Q = val; update_inputs(); } + /* only used for logic nets */ void set_Q_and_push(const netlist_sig_t newQ, const netlist_time delay) NL_NOEXCEPT { if (newQ != m_new_Q) @@ -822,15 +808,8 @@ namespace netlist push_to_queue(delay); } } - void set_Q_and_push_force(const netlist_sig_t newQ, const netlist_time delay) NL_NOEXCEPT - { - if (newQ != m_new_Q || is_queued()) - { - m_new_Q = newQ; - push_to_queue(delay); - } - } + /* only used for logic nets */ void set_Q_time(const netlist_sig_t newQ, const netlist_time at) NL_NOEXCEPT { if (newQ != m_new_Q) @@ -845,10 +824,34 @@ namespace netlist /* internal state support * FIXME: get rid of this and implement export/import in MAME */ + /* only used for logic nets */ netlist_sig_t *Q_state_ptr() { return m_cur_Q.ptr(); } - protected: private: + state_var m_new_Q; + state_var m_cur_Q; + state_var m_in_queue; /* 0: not in queue, 1: in queue, 2: last was taken */ + state_var m_next_scheduled_time; + + core_terminal_t * m_railterminal; + plib::linkedlist_t m_list_active; + std::vector m_core_terms; // save post-start m_list ... + + template + void process(const T mask, netlist_sig_t sig); + }; + + class logic_net_t : public detail::net_t + { + public: + + logic_net_t(netlist_state_t &nl, const pstring &aname, detail::core_terminal_t *mr = nullptr); + + using detail::net_t::Q; + using detail::net_t::initial; + using detail::net_t::set_Q_and_push; + using detail::net_t::set_Q_time; + using detail::net_t::Q_state_ptr; }; @@ -892,11 +895,6 @@ namespace netlist m_my_net.set_Q_and_push(newQ, delay); // take the shortcut } - void push_force(const netlist_sig_t newQ, const netlist_time delay) NL_NOEXCEPT - { - m_my_net.set_Q_and_push_force(newQ, delay); // take the shortcut - } - void set_Q_time(const netlist_sig_t newQ, const netlist_time at) NL_NOEXCEPT { m_my_net.set_Q_time(newQ, at); // take the shortcut @@ -1462,6 +1460,7 @@ namespace netlist netlist_time m_time; devices::NETLIB_NAME(mainclock) * m_mainclock; + PALIGNAS_CACHELINE() detail::queue_t m_queue; // performance diff --git a/src/lib/netlist/nl_lists.h b/src/lib/netlist/nl_lists.h index 39f4343be30..5443cd86c86 100644 --- a/src/lib/netlist/nl_lists.h +++ b/src/lib/netlist/nl_lists.h @@ -54,6 +54,7 @@ namespace netlist { constexpr pqentry_t() noexcept : m_exec_time(), m_object(nullptr) { } constexpr pqentry_t(const Time t, const Element o) noexcept : m_exec_time(t), m_object(o) { } +#if 0 ~pqentry_t() = default; constexpr pqentry_t(const pqentry_t &e) noexcept = default; constexpr pqentry_t(pqentry_t &&e) noexcept = default; @@ -65,7 +66,7 @@ namespace netlist std::swap(m_exec_time, other.m_exec_time); std::swap(m_object, other.m_object); } - +#endif struct QueueOp { inline static constexpr bool less(const pqentry_t &lhs, const pqentry_t &rhs) noexcept @@ -110,7 +111,7 @@ namespace netlist std::size_t capacity() const noexcept { return m_list.capacity() - 1; } bool empty() const noexcept { return (m_end == &m_list[1]); } - void push(T e) noexcept + void push(T && e) noexcept { /* Lock */ lock_guard_type lck(m_lock); @@ -120,7 +121,7 @@ namespace netlist *(i+1) = *(i); m_prof_sortmove.inc(); } - *(i+1) = e; + *(i+1) = std::move(e); ++m_end; m_prof_call.inc(); } @@ -129,7 +130,7 @@ namespace netlist const T &top() const noexcept { return *(m_end-1); } template - void remove(const R elem) noexcept + void remove(const R &elem) noexcept { /* Lock */ lock_guard_type lck(m_lock); @@ -145,7 +146,7 @@ namespace netlist } } - void retime(T elem) noexcept + void retime(T && elem) noexcept { /* Lock */ lock_guard_type lck(m_lock); @@ -155,7 +156,7 @@ namespace netlist { if (QueueOp::equal(*i, elem)) // partial equal! { - *i = elem; + *i = std::move(elem); while (QueueOp::less(*(i-1), *i)) { std::swap(*(i-1), *i); diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index b892fb4571c..3ac1b604bc4 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -462,14 +462,14 @@ devices::nld_base_proxy *setup_t::get_d_a_proxy(detail::core_terminal_t &out) m_proxy_cnt++; /* connect all existing terminals to new net */ - for (auto & p : out.net().m_core_terms) + for (auto & p : out.net().core_terms()) { p->clear_net(); // de-link from all nets ... if (!connect(new_proxy->proxy_term(), *p)) log().fatal(MF_2_CONNECTING_1_TO_2, new_proxy->proxy_term().name(), (*p).name()); } - out.net().m_core_terms.clear(); // clear the list + out.net().core_terms().clear(); // clear the list out.net().add_terminal(new_proxy->in()); out_cast.set_proxy(proxy); @@ -505,14 +505,14 @@ devices::nld_base_proxy *setup_t::get_a_d_proxy(detail::core_terminal_t &inp) if (inp.has_net()) { - for (auto & p : inp.net().m_core_terms) + for (auto & p : inp.net().core_terms()) { p->clear_net(); // de-link from all nets ... if (!connect(ret->proxy_term(), *p)) log().fatal(MF_2_CONNECTING_1_TO_2, ret->proxy_term().name(), (*p).name()); } - inp.net().m_core_terms.clear(); // clear the list + inp.net().core_terms().clear(); // clear the list } ret->out().net().add_terminal(inp); m_netlist.nlstate().add_dev(new_proxy->name(), std::move(new_proxy)); @@ -667,7 +667,7 @@ bool setup_t::connect_input_input(detail::core_terminal_t &t1, detail::core_term ret = connect(t2, t1.net().railterminal()); if (!ret) { - for (auto & t : t1.net().m_core_terms) + for (auto & t : t1.net().core_terms()) { if (t->is_type(detail::terminal_type::TERMINAL)) ret = connect(t2, *t); @@ -682,7 +682,7 @@ bool setup_t::connect_input_input(detail::core_terminal_t &t1, detail::core_term ret = connect(t1, t2.net().railterminal()); if (!ret) { - for (auto & t : t2.net().m_core_terms) + for (auto & t : t2.net().core_terms()) { if (t->is_type(detail::terminal_type::TERMINAL)) ret = connect(t1, *t); @@ -1123,7 +1123,7 @@ void setup_t::prepare_to_run() solver->post_start(); for (auto &n : netlist().nets()) - for (auto & term : n->m_core_terms) + for (auto & term : n->core_terms()) { //core_device_t *dev = reinterpret_cast(term->m_delegate.object()); core_device_t *dev = &term->device(); diff --git a/src/lib/netlist/nl_setup.h b/src/lib/netlist/nl_setup.h index 5e445fc6a32..50536d9da3b 100644 --- a/src/lib/netlist/nl_setup.h +++ b/src/lib/netlist/nl_setup.h @@ -253,7 +253,7 @@ namespace netlist /* FIXME: used by source_t - need a different approach at some time */ bool parse_stream(plib::unique_ptr &&istrm, const pstring &name); - void add_define(pstring def, pstring val) + void add_define(const pstring &def, const pstring &val) { m_defines.insert({ def, plib::ppreprocessor::define_t(def, val)}); } @@ -444,7 +444,7 @@ namespace netlist class source_proc_t : public source_t { public: - source_proc_t(pstring name, void (*setup_func)(nlparse_t &)) + source_proc_t(const pstring &name, void (*setup_func)(nlparse_t &)) : source_t(), m_setup_func(setup_func), m_setup_func_name(name) diff --git a/src/lib/netlist/plib/palloc.h b/src/lib/netlist/plib/palloc.h index 45c19ef7b3a..6380a4cef07 100644 --- a/src/lib/netlist/plib/palloc.h +++ b/src/lib/netlist/plib/palloc.h @@ -40,18 +40,26 @@ namespace plib { } return p; #else - return aligned_alloc(alignment, size); + return aligned_alloc(alignment, size); #endif } static inline void pfree( void *ptr ) { + // NOLINTNEXTLINE(cppcoreguidelines-no-malloc) free(ptr); } + static constexpr bool is_pow2(std::size_t v) noexcept { return !(v & (v-1)); } + template inline C14CONSTEXPR T *assume_aligned_ptr(T *p) noexcept { + static_assert(ALIGN >= alignof(T), "Alignment must be greater or equal to alignof(T)"); + static_assert(is_pow2(ALIGN), "Alignment must be a power of 2"); + //auto t = reinterpret_cast(p); + //if (t & (ALIGN-1)) + // printf("alignment error!"); return reinterpret_cast(__builtin_assume_aligned(p, ALIGN)); } @@ -246,10 +254,14 @@ namespace plib { static_assert(ALIGN >= alignof(T) && (ALIGN % alignof(T)) == 0, "ALIGN must be greater than alignof(T) and a multiple"); - aligned_allocator() = default; + aligned_allocator() noexcept = default; + ~aligned_allocator() noexcept = default; + + aligned_allocator(const aligned_allocator&) noexcept = default; + aligned_allocator& operator=(const aligned_allocator&) noexcept = delete; - aligned_allocator(const aligned_allocator&) = default; - aligned_allocator& operator=(const aligned_allocator&) = delete; + aligned_allocator(aligned_allocator&&) noexcept = default; + aligned_allocator& operator=(aligned_allocator&&) = delete; template aligned_allocator(const aligned_allocator& rhs) noexcept @@ -308,6 +320,8 @@ namespace plib { using reference = typename base::reference; using const_reference = typename base::const_reference; + using pointer = typename base::pointer; + using const_pointer = typename base::const_pointer; using size_type = typename base::size_type; using base::base; @@ -321,6 +335,9 @@ namespace plib { return assume_aligned_ptr(this->data())[i]; } + pointer data() noexcept { return assume_aligned_ptr(base::data()); } + const_pointer data() const noexcept { return assume_aligned_ptr(base::data()); } + }; diff --git a/src/lib/netlist/plib/parray.h b/src/lib/netlist/plib/parray.h index e09639163f0..9fe4ab972eb 100644 --- a/src/lib/netlist/plib/parray.h +++ b/src/lib/netlist/plib/parray.h @@ -8,9 +8,9 @@ #ifndef PARRAY_H_ #define PARRAY_H_ +#include "palloc.h" #include "pconfig.h" #include "pexception.h" -#include "palloc.h" #include #include diff --git a/src/lib/netlist/plib/pconfig.h b/src/lib/netlist/plib/pconfig.h index 9f61fc0b01f..9754643678a 100644 --- a/src/lib/netlist/plib/pconfig.h +++ b/src/lib/netlist/plib/pconfig.h @@ -46,7 +46,7 @@ */ #define PALIGN_CACHELINE (64) -#define PALIGN_VECTOROPT (16) +#define PALIGN_VECTOROPT (32) #define PALIGNAS_CACHELINE() PALIGNAS(PALIGN_CACHELINE) #define PALIGNAS_VECTOROPT() PALIGNAS(PALIGN_VECTOROPT) diff --git a/src/lib/netlist/plib/pdynlib.cpp b/src/lib/netlist/plib/pdynlib.cpp index c0c89de208d..91e1b5cf73a 100644 --- a/src/lib/netlist/plib/pdynlib.cpp +++ b/src/lib/netlist/plib/pdynlib.cpp @@ -58,7 +58,7 @@ WCHAR *wstring_from_utf8(const char *utf8string) #endif namespace plib { -dynlib::dynlib(const pstring libname) +dynlib::dynlib(const pstring &libname) : m_isLoaded(false), m_lib(nullptr) { #ifdef _WIN32 @@ -88,7 +88,7 @@ dynlib::dynlib(const pstring libname) #endif } -dynlib::dynlib(const pstring path, const pstring libname) +dynlib::dynlib(const pstring &path, const pstring &libname) : m_isLoaded(false), m_lib(nullptr) { // FIXME: implement path search @@ -141,7 +141,7 @@ bool dynlib::isLoaded() const return m_isLoaded; } -void *dynlib::getsym_p(const pstring name) +void *dynlib::getsym_p(const pstring &name) { #ifdef _WIN32 return (void *) GetProcAddress((HMODULE) m_lib, name.c_str()); diff --git a/src/lib/netlist/plib/pdynlib.h b/src/lib/netlist/plib/pdynlib.h index fe9db58d6f2..1454c053298 100644 --- a/src/lib/netlist/plib/pdynlib.h +++ b/src/lib/netlist/plib/pdynlib.h @@ -18,8 +18,8 @@ namespace plib { class dynlib : public nocopyassignmove { public: - explicit dynlib(const pstring libname); - dynlib(const pstring path, const pstring libname); + explicit dynlib(const pstring &libname); + dynlib(const pstring &path, const pstring &libname); ~dynlib(); COPYASSIGNMOVE(dynlib, delete) @@ -27,12 +27,12 @@ public: bool isLoaded() const; template - T getsym(const pstring name) + T getsym(const pstring &name) { return reinterpret_cast(getsym_p(name)); } private: - void *getsym_p(const pstring name); + void *getsym_p(const pstring &name); bool m_isLoaded; void *m_lib; diff --git a/src/lib/netlist/plib/pexception.cpp b/src/lib/netlist/plib/pexception.cpp index 93f1c24c08c..8d6907d66f2 100644 --- a/src/lib/netlist/plib/pexception.cpp +++ b/src/lib/netlist/plib/pexception.cpp @@ -23,7 +23,7 @@ namespace plib { // terminate //============================================================ - void terminate(pstring msg) noexcept + void terminate(const pstring &msg) noexcept { std::cerr << msg.c_str() << "\n"; std::terminate(); diff --git a/src/lib/netlist/plib/pexception.h b/src/lib/netlist/plib/pexception.h index 98d993d689b..44daf53d591 100644 --- a/src/lib/netlist/plib/pexception.h +++ b/src/lib/netlist/plib/pexception.h @@ -23,7 +23,7 @@ namespace plib { * * \note could be enhanced by setting a termination handler */ - [[noreturn]] void terminate(pstring msg) noexcept; + [[noreturn]] void terminate(const pstring &msg) noexcept; //============================================================ // exception base diff --git a/src/lib/netlist/plib/pfmtlog.cpp b/src/lib/netlist/plib/pfmtlog.cpp index e4e7c3d1c5c..0d911800247 100644 --- a/src/lib/netlist/plib/pfmtlog.cpp +++ b/src/lib/netlist/plib/pfmtlog.cpp @@ -9,13 +9,13 @@ #include "palloc.h" #include +#include #include -#include #include +#include #include #include #include -#include namespace plib { @@ -28,6 +28,8 @@ pfmt &pfmt::format_element(const char *l, const unsigned cfmt_spec, ...) std::array buf; std::size_t sl; + buf[0] = 0; + m_arg++; pstring search("{"); diff --git a/src/lib/netlist/plib/pfunction.cpp b/src/lib/netlist/plib/pfunction.cpp index c6a6287a8aa..6a2179e0e6f 100644 --- a/src/lib/netlist/plib/pfunction.cpp +++ b/src/lib/netlist/plib/pfunction.cpp @@ -84,7 +84,7 @@ void pfunction::compile_postfix(const std::vector &inputs, throw plib::pexception(plib::pfmt("nld_function: stack count different to one on <{2}>")(expr)); } -static int get_prio(pstring v) +static int get_prio(const pstring &v) { if (v == "(" || v == ")") return 1; diff --git a/src/lib/netlist/plib/plists.h b/src/lib/netlist/plib/plists.h index c11ee6fabdc..0a1345d5e1f 100644 --- a/src/lib/netlist/plib/plists.h +++ b/src/lib/netlist/plib/plists.h @@ -205,7 +205,8 @@ public: iter_t& operator=(const iter_t &rhs) { iter_t t(rhs); std::swap(*this, t); return *this; } iter_t& operator=(iter_t &&rhs) noexcept { std::swap(*this, rhs); return *this; } iter_t& operator++() noexcept {p = p->next();return *this;} - iter_t operator++(int) noexcept {const iter_t tmp(*this); operator++(); return tmp;} + // NOLINTNEXTLINE(cert-dcl21-cpp) + iter_t operator++(int) & noexcept {const iter_t tmp(*this); operator++(); return tmp;} ~iter_t() = default; diff --git a/src/lib/netlist/plib/pmempool.h b/src/lib/netlist/plib/pmempool.h index c55d66d8847..166c6f3d483 100644 --- a/src/lib/netlist/plib/pmempool.h +++ b/src/lib/netlist/plib/pmempool.h @@ -139,8 +139,8 @@ namespace plib { auto *ret = reinterpret_cast(b->m_data + b->m_cur); auto capacity(rs); ret = std::align(align, size, ret, capacity); - if (ret == nullptr) - printf("Oh no\n"); + // FIXME: if (ret == nullptr) + // printf("Oh no\n"); sinfo().insert({ ret, info(b, b->m_cur)}); rs -= (capacity - size); b->m_cur += rs; @@ -155,8 +155,8 @@ namespace plib { auto *ret = reinterpret_cast(b->m_data + b->m_cur); auto capacity(rs); ret = std::align(align, size, ret, capacity); - if (ret == nullptr) - printf("Oh no\n"); + // FIXME: if (ret == nullptr) + // printf("Oh no\n"); sinfo().insert({ ret, info(b, b->m_cur)}); rs -= (capacity - size); b->m_cur += rs; diff --git a/src/lib/netlist/plib/poptions.cpp b/src/lib/netlist/plib/poptions.cpp index 2a58eaab0f4..4a3d32c4723 100644 --- a/src/lib/netlist/plib/poptions.cpp +++ b/src/lib/netlist/plib/poptions.cpp @@ -14,13 +14,13 @@ namespace plib { Options ***************************************************************************/ - option_base::option_base(options &parent, pstring help) + option_base::option_base(options &parent, const pstring &help) : m_help(help) { parent.register_option(this); } - option::option(options &parent, pstring ashort, pstring along, pstring help, bool has_argument) + option::option(options &parent, const pstring &ashort, const pstring &along, const pstring &help, bool has_argument) : option_base(parent, help), m_short(ashort), m_long(along), m_has_argument(has_argument), m_specified(false) { @@ -174,7 +174,7 @@ namespace plib { return argc; } - pstring options::split_paragraphs(pstring text, unsigned width, unsigned indent, + pstring options::split_paragraphs(const pstring &text, unsigned width, unsigned indent, unsigned firstline_indent) { auto paragraphs = psplit(text,"\n"); @@ -197,7 +197,7 @@ namespace plib { return ret; } - pstring options::help(pstring description, pstring usage, + pstring options::help(const pstring &description, const pstring &usage, unsigned width, unsigned indent) const { pstring ret; @@ -272,7 +272,7 @@ namespace plib { return ret; } - option *options::getopt_short(pstring arg) const + option *options::getopt_short(const pstring &arg) const { for (auto & optbase : m_opts) { @@ -282,7 +282,7 @@ namespace plib { } return nullptr; } - option *options::getopt_long(pstring arg) const + option *options::getopt_long(const pstring &arg) const { for (auto & optbase : m_opts) { diff --git a/src/lib/netlist/plib/poptions.h b/src/lib/netlist/plib/poptions.h index 23319604052..086fe32fc8a 100644 --- a/src/lib/netlist/plib/poptions.h +++ b/src/lib/netlist/plib/poptions.h @@ -24,7 +24,7 @@ class options; class option_base { public: - option_base(options &parent, pstring help); + option_base(options &parent, const pstring &help); virtual ~option_base() = default; COPYASSIGNMOVE(option_base, delete) @@ -37,7 +37,7 @@ private: class option_group : public option_base { public: - option_group(options &parent, pstring group, pstring help) + option_group(options &parent, const pstring &group, const pstring &help) : option_base(parent, help), m_group(group) { } pstring group() const { return m_group; } @@ -48,7 +48,7 @@ private: class option_example : public option_base { public: - option_example(options &parent, pstring group, pstring help) + option_example(options &parent, const pstring &group, const pstring &help) : option_base(parent, help), m_example(group) { } pstring example() const { return m_example; } @@ -60,7 +60,7 @@ private: class option : public option_base { public: - option(options &parent, pstring ashort, pstring along, pstring help, bool has_argument); + option(options &parent, const pstring &ashort, const pstring &along, const pstring &help, bool has_argument); /* no_argument options will be called with "" argument */ @@ -88,7 +88,7 @@ private: class option_str : public option { public: - option_str(options &parent, pstring ashort, pstring along, pstring defval, pstring help) + option_str(options &parent, const pstring &ashort, const pstring &along, const pstring &defval, const pstring &help) : option(parent, ashort, along, help, true), m_val(defval) {} @@ -104,7 +104,7 @@ private: class option_str_limit_base : public option { public: - option_str_limit_base(options &parent, pstring ashort, pstring along, std::vector &&limit, pstring help) + option_str_limit_base(options &parent, const pstring &ashort, const pstring &along, std::vector &&limit, const pstring &help) : option(parent, ashort, along, help, true) , m_limit(limit) { @@ -122,7 +122,7 @@ template class option_str_limit : public option_str_limit_base { public: - option_str_limit(options &parent, pstring ashort, pstring along, const T &defval, std::vector &&limit, pstring help) + option_str_limit(options &parent, const pstring &ashort, const pstring &along, const T &defval, std::vector &&limit, const pstring &help) : option_str_limit_base(parent, ashort, along, std::move(limit), help), m_val(defval) { } @@ -152,7 +152,7 @@ private: class option_bool : public option { public: - option_bool(options &parent, pstring ashort, pstring along, pstring help) + option_bool(options &parent, const pstring &ashort, const pstring &along, const pstring &help) : option(parent, ashort, along, help, false), m_val(false) {} @@ -169,8 +169,8 @@ template class option_num : public option { public: - option_num(options &parent, pstring ashort, pstring along, T defval, - pstring help, + option_num(options &parent, const pstring &ashort, const pstring &along, T defval, + const pstring &help, T minval = std::numeric_limits::min(), T maxval = std::numeric_limits::max() ) : option(parent, ashort, along, help, true) @@ -198,7 +198,7 @@ private: class option_vec : public option { public: - option_vec(options &parent, pstring ashort, pstring along, pstring help) + option_vec(options &parent, const pstring &ashort, const pstring &along, const pstring &help) : option(parent, ashort, along, help, true) {} @@ -214,7 +214,7 @@ private: class option_args : public option_vec { public: - option_args(options &parent, pstring help) + option_args(options &parent, const pstring &help) : option_vec(parent, "", "", help) {} }; @@ -229,13 +229,13 @@ public: void register_option(option_base *opt); int parse(int argc, char **argv); - pstring help(pstring description, pstring usage, + pstring help(const pstring &description, const pstring &usage, unsigned width = 72, unsigned indent = 20) const; pstring app() const { return m_app; } private: - static pstring split_paragraphs(pstring text, unsigned width, unsigned indent, + static pstring split_paragraphs(const pstring &text, unsigned width, unsigned indent, unsigned firstline_indent); void check_consistency(); @@ -251,8 +251,8 @@ private: return nullptr; } - option *getopt_short(pstring arg) const; - option *getopt_long(pstring arg) const; + option *getopt_short(const pstring &arg) const; + option *getopt_long(const pstring &arg) const; std::vector m_opts; pstring m_app; diff --git a/src/lib/netlist/plib/pparser.h b/src/lib/netlist/plib/pparser.h index 9803fae9cb8..24b096519bf 100644 --- a/src/lib/netlist/plib/pparser.h +++ b/src/lib/netlist/plib/pparser.h @@ -98,18 +98,18 @@ public: void require_token(const token_id_t &token_num); void require_token(const token_t &tok, const token_id_t &token_num); - token_id_t register_token(pstring token) + token_id_t register_token(const pstring &token) { token_id_t ret(m_tokens.size()); m_tokens.emplace(token, ret); return ret; } - ptokenizer & identifier_chars(pstring s) { m_identifier_chars = s; return *this; } - ptokenizer & number_chars(pstring st, pstring rem) { m_number_chars_start = st; m_number_chars = rem; return *this; } + ptokenizer & identifier_chars(pstring s) { m_identifier_chars = std::move(s); return *this; } + ptokenizer & number_chars(pstring st, pstring rem) { m_number_chars_start = std::move(st); m_number_chars = std::move(rem); return *this; } ptokenizer & string_char(pstring::value_type c) { m_string = c; return *this; } - ptokenizer & whitespace(pstring s) { m_whitespace = s; return *this; } - ptokenizer & comment(pstring start, pstring end, pstring line) + ptokenizer & whitespace(pstring s) { m_whitespace = std::move(s); return *this; } + ptokenizer & comment(const pstring &start, const pstring &end, const pstring &line) { m_tok_comment_start = register_token(start); m_tok_comment_end = register_token(end); diff --git a/src/lib/netlist/plib/ppmf.h b/src/lib/netlist/plib/ppmf.h index 4dcceee454f..32b151b357b 100644 --- a/src/lib/netlist/plib/ppmf.h +++ b/src/lib/netlist/plib/ppmf.h @@ -95,6 +95,7 @@ namespace plib { if (PHAS_PMF_INTERNAL == 1) { // apply the "this" delta to the object first + // NOLINTNEXTLINE(clang-analyzer-core.UndefinedBinaryOperatorResult) auto o_p_delta = reinterpret_cast(reinterpret_cast(object) + m_this_delta); // if the low bit of the vtable index is clear, then it is just a raw function pointer diff --git a/src/lib/netlist/plib/pstate.h b/src/lib/netlist/plib/pstate.h index d837a6d2931..ac75ca6b69e 100644 --- a/src/lib/netlist/plib/pstate.h +++ b/src/lib/netlist/plib/pstate.h @@ -8,9 +8,9 @@ #ifndef PSTATE_H_ #define PSTATE_H_ +#include "palloc.h" #include "pstring.h" #include "ptypes.h" -#include "palloc.h" #include #include diff --git a/src/lib/netlist/plib/pstream.h b/src/lib/netlist/plib/pstream.h index d5b2bfa4809..29f79e0dd4a 100644 --- a/src/lib/netlist/plib/pstream.h +++ b/src/lib/netlist/plib/pstream.h @@ -530,7 +530,8 @@ public: void write(const pstring &text) const { - putf8string conv_utf8(text); + // NOLINTNEXTLINE(performance-unnecessary-copy-initialization) + const putf8string conv_utf8(text); m_strm->write(reinterpret_cast(conv_utf8.c_str()), conv_utf8.mem_t_size()); } diff --git a/src/lib/netlist/plib/pstring.h b/src/lib/netlist/plib/pstring.h index bc056424531..76ad11b0f91 100644 --- a/src/lib/netlist/plib/pstring.h +++ b/src/lib/netlist/plib/pstring.h @@ -46,7 +46,8 @@ public: explicit constexpr pstring_const_iterator(const typename string_type::const_iterator &x) noexcept : p(x) { } pstring_const_iterator& operator++() noexcept { p += static_cast(traits_type::codelen(&(*p))); return *this; } - pstring_const_iterator operator++(int) noexcept { pstring_const_iterator tmp(*this); operator++(); return tmp; } + // NOLINTNEXTLINE(cert-dcl21-cpp) + pstring_const_iterator operator++(int) & noexcept { pstring_const_iterator tmp(*this); operator++(); return tmp; } constexpr bool operator==(const pstring_const_iterator& rhs) const noexcept { return p == rhs.p; } constexpr bool operator!=(const pstring_const_iterator& rhs) const noexcept { return p != rhs.p; } @@ -207,10 +208,8 @@ public: static const size_type npos = static_cast(-1); -protected: - string_type m_str; - private: + string_type m_str; }; struct pu8_traits diff --git a/src/lib/netlist/plib/vector_ops.h b/src/lib/netlist/plib/vector_ops.h index f5a9e336d0d..0de931b40da 100644 --- a/src/lib/netlist/plib/vector_ops.h +++ b/src/lib/netlist/plib/vector_ops.h @@ -43,7 +43,8 @@ namespace plib template T vec_mult (const std::size_t n, const V1 & v1, const V2 & v2 ) { - PALIGNAS_VECTOROPT() T value[8] = {0}; + using b8 = T[8]; + PALIGNAS_VECTOROPT() b8 value = {0}; for (std::size_t i = 0; i < n ; i++ ) { value[i & 7] += v1[i] * v2[i]; @@ -54,7 +55,8 @@ namespace plib template T vec_mult2 (const std::size_t n, const VT &v) { - PALIGNAS_VECTOROPT() T value[8] = {0}; + using b8 = T[8]; + PALIGNAS_VECTOROPT() b8 value = {0}; for (std::size_t i = 0; i < n ; i++ ) { value[i & 7] += v[i] * v[i]; @@ -67,7 +69,7 @@ namespace plib { if (n<8) { - PALIGNAS_VECTOROPT() T value(0); + T value(0); for (std::size_t i = 0; i < n ; i++ ) value += v[i]; @@ -75,7 +77,8 @@ namespace plib } else { - PALIGNAS_VECTOROPT() T value[8] = {0}; + using b8 = T[8]; + PALIGNAS_VECTOROPT() b8 value = {0}; for (std::size_t i = 0; i < n ; i++ ) value[i & 7] += v[i]; diff --git a/src/lib/netlist/prg/nltool.cpp b/src/lib/netlist/prg/nltool.cpp index 076d004528c..a751bbd2965 100644 --- a/src/lib/netlist/prg/nltool.cpp +++ b/src/lib/netlist/prg/nltool.cpp @@ -120,7 +120,7 @@ NETLIST_END() class netlist_data_folder_t : public netlist::source_t { public: - netlist_data_folder_t(pstring folder) + netlist_data_folder_t(const pstring &folder) : netlist::source_t(netlist::source_t::DATA) , m_folder(folder) { @@ -311,7 +311,7 @@ struct input_t double m_value; }; -static std::vector read_input(const netlist::setup_t &setup, pstring fname) +static std::vector read_input(const netlist::setup_t &setup, const pstring &fname) { std::vector ret; if (fname != "") diff --git a/src/lib/netlist/prg/nlwav.cpp b/src/lib/netlist/prg/nlwav.cpp index 24c84c73739..bd30e93d7e6 100644 --- a/src/lib/netlist/prg/nlwav.cpp +++ b/src/lib/netlist/prg/nlwav.cpp @@ -363,17 +363,17 @@ public: } } - std::size_t m_channels; - double m_last_time; - private: - void write(pstring line) + void write(const pstring &line) { auto p = static_cast(line.c_str()); std::size_t len = std::strlen(p); m_fo.write(p, len); } + std::size_t m_channels; + double m_last_time; + plib::postream &m_fo; std::vector m_ids; pstring m_buf; @@ -410,6 +410,14 @@ public: "convert all files starting with \"log_V\" into a multichannel wav file"), m_outstrm(nullptr) {} + + int execute() override; + pstring usage() override; + +private: + void convert_wav(); + void convert_vcd(vcdwriter::format_e format); + plib::option_str_limit opt_fmt; plib::option_str opt_out; plib::option_num opt_rate; @@ -423,14 +431,8 @@ public: plib::option_bool opt_help; plib::option_example opt_ex1; plib::option_example opt_ex2; - - int execute() override; - pstring usage() override; - plib::pstdin pin_strm; -private: - void convert_wav(); - void convert_vcd(vcdwriter::format_e format); + std::vector> m_instrms; plib::postream *m_outstrm; }; diff --git a/src/lib/netlist/solver/nld_matrix_solver.cpp b/src/lib/netlist/solver/nld_matrix_solver.cpp index 951733874fd..dc03255a056 100644 --- a/src/lib/netlist/solver/nld_matrix_solver.cpp +++ b/src/lib/netlist/solver/nld_matrix_solver.cpp @@ -111,7 +111,7 @@ void matrix_solver_t::setup_base(analog_net_t::list_t &nets) net->set_solver(this); - for (auto &p : net->m_core_terms) + for (auto &p : net->core_terms()) { log().debug("{1} {2} {3}\n", p->name(), net->name(), net->isRailNet()); switch (p->type()) @@ -159,7 +159,7 @@ void matrix_solver_t::setup_base(analog_net_t::list_t &nets) break; } } - log().debug("added net with {1} populated connections\n", net->m_core_terms.size()); + log().debug("added net with {1} populated connections\n", net->core_terms().size()); } /* now setup the matrix */ @@ -336,9 +336,7 @@ void matrix_solver_t::setup_matrix() * This should reduce cache misses ... */ - auto **touched = plib::pnew_array(iN); - for (std::size_t k=0; k(iN); + std::vector> touched(iN, std::vector(iN)); for (std::size_t k = 0; k < iN; k++) { @@ -395,10 +393,6 @@ void matrix_solver_t::setup_matrix() state().save(*this, m_terms[k]->gt(),"GT" + num, this->name(), m_terms[k]->count()); state().save(*this, m_terms[k]->Idr(),"IDR" + num, this->name(), m_terms[k]->count()); } - - for (std::size_t k=0; km_core_terms) + for (auto &p : n->core_terms()) { if (p->is_type(detail::terminal_type::TERMINAL)) { @@ -399,7 +399,7 @@ void NETLIB_NAME(solver)::post_start() for (auto &n : grp) { log().verbose("Net {1}", n->name()); - for (const auto &pcore : n->m_core_terms) + for (const auto &pcore : n->core_terms()) { log().verbose(" {1}", pcore->name()); } diff --git a/src/lib/netlist/solver/nld_solver.h b/src/lib/netlist/solver/nld_solver.h index c4a9eba6971..164b7663f98 100644 --- a/src/lib/netlist/solver/nld_solver.h +++ b/src/lib/netlist/solver/nld_solver.h @@ -76,7 +76,7 @@ NETLIB_OBJECT(solver) NETLIB_RESETI(); // NETLIB_UPDATE_PARAMI(); -protected: +private: logic_input_t m_fb_step; logic_output_t m_Q_step; @@ -96,7 +96,6 @@ protected: param_logic_t m_log_stats; -private: std::vector> m_mat_solvers; std::vector m_mat_solvers_all; std::vector m_mat_solvers_timestepping; diff --git a/src/lib/netlist/tools/nl_convert.cpp b/src/lib/netlist/tools/nl_convert.cpp index f4616cb7774..16a3cfd6960 100644 --- a/src/lib/netlist/tools/nl_convert.cpp +++ b/src/lib/netlist/tools/nl_convert.cpp @@ -105,7 +105,7 @@ void nl_convert_base_t::add_device(const pstring &atype, const pstring &aname) add_device(plib::make_unique(atype, aname)); } -void nl_convert_base_t::add_term(pstring netname, pstring termname) +void nl_convert_base_t::add_term(const pstring &netname, const pstring &termname) { net_t * net = nullptr; auto idx = m_nets.find(netname); diff --git a/src/lib/netlist/tools/nl_convert.h b/src/lib/netlist/tools/nl_convert.h index 73c98301af5..b031ef72618 100644 --- a/src/lib/netlist/tools/nl_convert.h +++ b/src/lib/netlist/tools/nl_convert.h @@ -43,7 +43,7 @@ protected: void add_device(const pstring &atype, const pstring &aname, double aval); void add_device(const pstring &atype, const pstring &aname); - void add_term(pstring netname, pstring termname); + void add_term(const pstring &netname, const pstring &termname); void dump_nl(); -- cgit v1.2.3-70-g09d2 From 17fcc38a25415059e6b20d5d9b1f8c5e4ef81333 Mon Sep 17 00:00:00 2001 From: couriersud Date: Fri, 1 Mar 2019 07:47:51 +0100 Subject: netlist: memory code refactoring. (nw) --- src/devices/machine/netlist.cpp | 6 +- src/devices/machine/netlist.h | 2 +- src/lib/netlist/devices/nlid_system.h | 2 +- src/lib/netlist/devices/nlid_truthtable.cpp | 2 +- src/lib/netlist/nl_base.cpp | 22 +- src/lib/netlist/nl_base.h | 16 +- src/lib/netlist/nl_factory.cpp | 2 +- src/lib/netlist/nl_factory.h | 6 +- src/lib/netlist/nl_setup.cpp | 14 +- src/lib/netlist/nltypes.h | 6 +- src/lib/netlist/plib/palloc.h | 378 ++++++++++++++++------------ src/lib/netlist/plib/pconfig.h | 2 +- src/lib/netlist/plib/pdynlib.cpp | 8 +- src/lib/netlist/plib/pmatrix2d.h | 7 +- src/lib/netlist/plib/pmempool.h | 60 ++--- src/lib/netlist/plib/pstream.cpp | 44 +--- src/lib/netlist/plib/pstream.h | 22 +- src/lib/netlist/plib/ptypes.h | 4 +- src/lib/netlist/prg/nltool.cpp | 2 +- src/lib/netlist/solver/nld_matrix_solver.h | 2 +- src/lib/netlist/solver/nld_solver.cpp | 10 +- src/lib/netlist/solver/nld_solver.h | 6 +- 22 files changed, 308 insertions(+), 315 deletions(-) (limited to 'src/lib/netlist/plib/pdynlib.cpp') diff --git a/src/devices/machine/netlist.cpp b/src/devices/machine/netlist.cpp index 7beb745cbf2..280973440a9 100644 --- a/src/devices/machine/netlist.cpp +++ b/src/devices/machine/netlist.cpp @@ -422,11 +422,11 @@ public: struct channel { - netlist::poolptr m_param_name; + netlist::pool_owned_ptr m_param_name; netlist::param_double_t *m_param; stream_sample_t *m_buffer; - netlist::poolptr m_param_mult; - netlist::poolptr m_param_offset; + netlist::pool_owned_ptr m_param_mult; + netlist::pool_owned_ptr m_param_offset; }; channel m_channels[MAX_INPUT_CHANNELS]; netlist::netlist_time m_inc; diff --git a/src/devices/machine/netlist.h b/src/devices/machine/netlist.h index db27b2860df..9ec58f614bc 100644 --- a/src/devices/machine/netlist.h +++ b/src/devices/machine/netlist.h @@ -159,7 +159,7 @@ private: netlist::netlist_time m_rem; netlist::netlist_time m_old; - netlist::poolptr m_netlist; + netlist::pool_owned_ptr m_netlist; func_type m_setup_func; }; diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h index 95712fc3416..324ceb93c38 100644 --- a/src/lib/netlist/devices/nlid_system.h +++ b/src/lib/netlist/devices/nlid_system.h @@ -335,7 +335,7 @@ namespace netlist param_int_t m_N; param_str_t m_func; analog_output_t m_Q; - std::vector> m_I; + std::vector> m_I; std::vector m_vals; plib::pfunction m_compiled; diff --git a/src/lib/netlist/devices/nlid_truthtable.cpp b/src/lib/netlist/devices/nlid_truthtable.cpp index 622aee0e0c7..2221d855880 100644 --- a/src/lib/netlist/devices/nlid_truthtable.cpp +++ b/src/lib/netlist/devices/nlid_truthtable.cpp @@ -224,7 +224,7 @@ namespace netlist : netlist_base_factory_truthtable_t(name, classname, def_param, sourcefile) { } - poolptr Create(netlist_state_t &anetlist, const pstring &name) override + pool_owned_ptr Create(netlist_state_t &anetlist, const pstring &name) override { using tt_type = nld_truthtable_t; truthtable_parser desc_s(m_NO, m_NI, &m_ttbl.m_initialized, diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index 55560151e21..55e952ad723 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -82,15 +82,15 @@ public: m_R_low = 1.0; m_R_high = 130.0; } - poolptr create_d_a_proxy(netlist_state_t &anetlist, const pstring &name, logic_output_t *proxied) const override; - poolptr create_a_d_proxy(netlist_state_t &anetlist, const pstring &name, logic_input_t *proxied) const override; + pool_owned_ptr create_d_a_proxy(netlist_state_t &anetlist, const pstring &name, logic_output_t *proxied) const override; + pool_owned_ptr create_a_d_proxy(netlist_state_t &anetlist, const pstring &name, logic_input_t *proxied) const override; }; -poolptr logic_family_ttl_t::create_d_a_proxy(netlist_state_t &anetlist, const pstring &name, logic_output_t *proxied) const +pool_owned_ptr logic_family_ttl_t::create_d_a_proxy(netlist_state_t &anetlist, const pstring &name, logic_output_t *proxied) const { return pool().make_poolptr(anetlist, name, proxied); } -poolptr logic_family_ttl_t::create_a_d_proxy(netlist_state_t &anetlist, const pstring &name, logic_input_t *proxied) const +pool_owned_ptr logic_family_ttl_t::create_a_d_proxy(netlist_state_t &anetlist, const pstring &name, logic_input_t *proxied) const { return pool().make_poolptr(anetlist, name, proxied); } @@ -109,16 +109,16 @@ public: m_R_low = 10.0; m_R_high = 10.0; } - poolptr create_d_a_proxy(netlist_state_t &anetlist, const pstring &name, logic_output_t *proxied) const override; - poolptr create_a_d_proxy(netlist_state_t &anetlist, const pstring &name, logic_input_t *proxied) const override; + pool_owned_ptr create_d_a_proxy(netlist_state_t &anetlist, const pstring &name, logic_output_t *proxied) const override; + pool_owned_ptr create_a_d_proxy(netlist_state_t &anetlist, const pstring &name, logic_input_t *proxied) const override; }; -poolptr logic_family_cd4xxx_t::create_d_a_proxy(netlist_state_t &anetlist, const pstring &name, logic_output_t *proxied) const +pool_owned_ptr logic_family_cd4xxx_t::create_d_a_proxy(netlist_state_t &anetlist, const pstring &name, logic_output_t *proxied) const { return pool().make_poolptr(anetlist, name, proxied); } -poolptr logic_family_cd4xxx_t::create_a_d_proxy(netlist_state_t &anetlist, const pstring &name, logic_input_t *proxied) const +pool_owned_ptr logic_family_cd4xxx_t::create_a_d_proxy(netlist_state_t &anetlist, const pstring &name, logic_input_t *proxied) const { return pool().make_poolptr(anetlist, name, proxied); } @@ -578,7 +578,7 @@ core_device_t::core_device_t(core_device_t &owner, const pstring &name) set_logic_family(owner.logic_family()); if (logic_family() == nullptr) set_logic_family(family_TTL()); - state().add_dev(this->name(), poolptr(this, false)); + state().add_dev(this->name(), pool_owned_ptr(this, false)); } void core_device_t::set_default_delegate(detail::core_terminal_t &term) @@ -894,7 +894,7 @@ logic_output_t::logic_output_t(core_device_t &dev, const pstring &aname) , m_my_net(dev.state(), name() + ".net", this) { this->set_net(&m_my_net); - state().register_net(poolptr(&m_my_net, false)); + state().register_net(pool_owned_ptr(&m_my_net, false)); set_logic_family(dev.logic_family()); state().setup().register_term(*this); } @@ -923,7 +923,7 @@ analog_output_t::analog_output_t(core_device_t &dev, const pstring &aname) : analog_t(dev, aname, STATE_OUT) , m_my_net(dev.state(), name() + ".net", this) { - state().register_net(poolptr(&m_my_net, false)); + state().register_net(pool_owned_ptr(&m_my_net, false)); this->set_net(&m_my_net); //net().m_cur_Analog = NL_FCONST(0.0); diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 66fc49d7e5e..4a48dc892b3 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -139,7 +139,7 @@ class NETLIB_NAME(name) : public device_t #define NETLIB_TIMESTEP(chip) void NETLIB_NAME(chip) :: timestep(const nl_double step) #define NETLIB_SUB(chip) nld_ ## chip -#define NETLIB_SUBXX(ns, chip) poolptr< ns :: nld_ ## chip > +#define NETLIB_SUBXX(ns, chip) pool_owned_ptr< ns :: nld_ ## chip > #define NETLIB_HANDLER(chip, name) void NETLIB_NAME(chip) :: name() NL_NOEXCEPT #define NETLIB_UPDATE(chip) NETLIB_HANDLER(chip, update) @@ -243,9 +243,9 @@ namespace netlist virtual ~logic_family_desc_t() noexcept = default; - virtual poolptr create_d_a_proxy(netlist_state_t &anetlist, const pstring &name, + virtual pool_owned_ptr create_d_a_proxy(netlist_state_t &anetlist, const pstring &name, logic_output_t *proxied) const = 0; - virtual poolptr create_a_d_proxy(netlist_state_t &anetlist, const pstring &name, + virtual pool_owned_ptr create_a_d_proxy(netlist_state_t &anetlist, const pstring &name, logic_input_t *proxied) const = 0; double fixed_V() const { return m_fixed_V; } @@ -1187,7 +1187,7 @@ namespace netlist const setup_t &setup() const; template - void register_sub(const pstring &name, poolptr &dev, const Args&... args) + void register_sub(const pstring &name, pool_owned_ptr &dev, const Args&... args) { //dev.reset(plib::palloc(*this, name, args...)); dev = pool().make_poolptr(*this, name, args...); @@ -1275,10 +1275,10 @@ namespace netlist { public: - using nets_collection_type = std::vector>; + using nets_collection_type = std::vector>; /* need to preserve order of device creation ... */ - using devices_collection_type = std::vector>>; + using devices_collection_type = std::vector>>; netlist_state_t(const pstring &aname, plib::unique_ptr &&callbacks, plib::unique_ptr &&setup); @@ -1330,7 +1330,7 @@ namespace netlist std::size_t find_net_id(const detail::net_t *net) const; template - void register_net(poolptr &&net) { m_nets.push_back(std::move(net)); } + void register_net(pool_owned_ptr &&net) { m_nets.push_back(std::move(net)); } template inline std::vector get_device_list() @@ -1346,7 +1346,7 @@ namespace netlist } template - void add_dev(const pstring &name, poolptr &&dev) + void add_dev(const pstring &name, pool_owned_ptr &&dev) { for (auto & d : m_devices) if (d.first == name) diff --git a/src/lib/netlist/nl_factory.cpp b/src/lib/netlist/nl_factory.cpp index c9d5ea7e29f..1f0ac35c6c4 100644 --- a/src/lib/netlist/nl_factory.cpp +++ b/src/lib/netlist/nl_factory.cpp @@ -76,7 +76,7 @@ namespace netlist { namespace factory // factory_lib_entry_t: factory class to wrap macro based chips/elements // ----------------------------------------------------------------------------- - poolptr library_element_t::Create(netlist_state_t &anetlist, const pstring &name) + pool_owned_ptr library_element_t::Create(netlist_state_t &anetlist, const pstring &name) { return pool().make_poolptr(anetlist, name); } diff --git a/src/lib/netlist/nl_factory.h b/src/lib/netlist/nl_factory.h index 23cfe522f8a..271bf72bf90 100644 --- a/src/lib/netlist/nl_factory.h +++ b/src/lib/netlist/nl_factory.h @@ -55,7 +55,7 @@ namespace factory { COPYASSIGNMOVE(element_t, default) - virtual poolptr Create(netlist_state_t &anetlist, const pstring &name) = 0; + virtual pool_owned_ptr Create(netlist_state_t &anetlist, const pstring &name) = 0; virtual void macro_actions(nlparse_t &nparser, const pstring &name) { plib::unused_var(nparser); @@ -85,7 +85,7 @@ namespace factory { const pstring &def_param, const pstring &sourcefile) : element_t(name, classname, def_param, sourcefile) { } - poolptr Create(netlist_state_t &anetlist, const pstring &name) override + pool_owned_ptr Create(netlist_state_t &anetlist, const pstring &name) override { return pool().make_poolptr(anetlist, name); } @@ -147,7 +147,7 @@ namespace factory { { } - poolptr Create(netlist_state_t &anetlist, const pstring &name) override; + pool_owned_ptr Create(netlist_state_t &anetlist, const pstring &name) override; void macro_actions(nlparse_t &nparser, const pstring &name) override; diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index 3ac1b604bc4..5dc9a9d2516 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -935,17 +935,17 @@ class logic_family_std_proxy_t : public logic_family_desc_t { public: logic_family_std_proxy_t() = default; - poolptr create_d_a_proxy(netlist_state_t &anetlist, + pool_owned_ptr create_d_a_proxy(netlist_state_t &anetlist, const pstring &name, logic_output_t *proxied) const override; - poolptr create_a_d_proxy(netlist_state_t &anetlist, const pstring &name, logic_input_t *proxied) const override; + pool_owned_ptr create_a_d_proxy(netlist_state_t &anetlist, const pstring &name, logic_input_t *proxied) const override; }; -poolptr logic_family_std_proxy_t::create_d_a_proxy(netlist_state_t &anetlist, +pool_owned_ptr logic_family_std_proxy_t::create_d_a_proxy(netlist_state_t &anetlist, const pstring &name, logic_output_t *proxied) const { return pool().make_poolptr(anetlist, name, proxied); } -poolptr logic_family_std_proxy_t::create_a_d_proxy(netlist_state_t &anetlist, const pstring &name, logic_input_t *proxied) const +pool_owned_ptr logic_family_std_proxy_t::create_a_d_proxy(netlist_state_t &anetlist, const pstring &name, logic_input_t *proxied) const { return pool().make_poolptr(anetlist, name, proxied); } @@ -1010,7 +1010,7 @@ void setup_t::delete_empty_nets() { netlist().nets().erase( std::remove_if(netlist().nets().begin(), netlist().nets().end(), - [](poolptr &x) + [](pool_owned_ptr &x) { if (x->num_cons() == 0) { @@ -1038,7 +1038,7 @@ void setup_t::prepare_to_run() if ( factory().is_class(e.second) || factory().is_class(e.second)) { - m_netlist.nlstate().add_dev(e.first, poolptr(e.second->Create(netlist(), e.first))); + m_netlist.nlstate().add_dev(e.first, pool_owned_ptr(e.second->Create(netlist(), e.first))); } } @@ -1055,7 +1055,7 @@ void setup_t::prepare_to_run() if ( !factory().is_class(e.second) && !factory().is_class(e.second)) { - auto dev = poolptr(e.second->Create(netlist(), e.first)); + auto dev = pool_owned_ptr(e.second->Create(netlist(), e.first)); m_netlist.nlstate().add_dev(dev->name(), std::move(dev)); } } diff --git a/src/lib/netlist/nltypes.h b/src/lib/netlist/nltypes.h index 1ddc29adfae..9abe8beebef 100644 --- a/src/lib/netlist/nltypes.h +++ b/src/lib/netlist/nltypes.h @@ -84,18 +84,18 @@ namespace netlist #if (USE_MEMPOOL) using nlmempool = plib::mempool; #else - using nlmempool = plib::mempool_default; + using nlmempool = plib::aligned_arena; #endif /*! Owned pointer type for pooled allocations. * */ template - using poolptr = nlmempool::poolptr; + using pool_owned_ptr = nlmempool::owned_pool_ptr; inline nlmempool &pool() { - static nlmempool static_pool(655360, 16); + static nlmempool static_pool; return static_pool; } diff --git a/src/lib/netlist/plib/palloc.h b/src/lib/netlist/plib/palloc.h index d7b00262f7f..f10fd548817 100644 --- a/src/lib/netlist/plib/palloc.h +++ b/src/lib/netlist/plib/palloc.h @@ -17,6 +17,7 @@ #include #include #include +#include #if defined(_WIN32) || defined(_WIN64) || defined(_MSC_VER) #include @@ -25,127 +26,65 @@ namespace plib { //============================================================ - // Memory allocation + // Standard arena_deleter //============================================================ -#if (USE_ALIGNED_ALLOCATION) - static inline void *paligned_alloc( size_t alignment, size_t size ) + template + struct arena_deleter { -#if defined(_WIN32) || defined(_WIN64) || defined(_MSC_VER) - return _aligned_malloc(size, alignment); -#elif defined(__APPLE__) - void* p; - if (::posix_memalign(&p, alignment, size) != 0) { - p = nullptr; + //using arena_storage_type = P *; + using arena_storage_type = typename std::conditional::type; + template + typename std::enable_if::type getref(X *x) { return *x;} + template + typename std::enable_if::type::is_stateless, X&>::type + getref(X &x, Y y = nullptr) + { + unused_var(y); + return x; } - return p; -#else - return aligned_alloc(alignment, size); -#endif - } - - static inline void pfree( void *ptr ) - { - // NOLINTNEXTLINE(cppcoreguidelines-no-malloc) - free(ptr); - } - -#else - static inline void *paligned_alloc( size_t alignment, size_t size ) - { - unused_var(alignment); - return ::operator new(size); - } - - static inline void pfree( void *ptr ) - { - ::operator delete(ptr); - } -#endif - - template - /*inline */ C14CONSTEXPR T *assume_aligned_ptr(T *p) noexcept - { - static_assert(ALIGN >= alignof(T), "Alignment must be greater or equal to alignof(T)"); - static_assert(is_pow2(ALIGN), "Alignment must be a power of 2"); - //auto t = reinterpret_cast(p); - //if (t & (ALIGN-1)) - // printf("alignment error!"); -#if (USE_ALIGNED_HINTS) - return reinterpret_cast(__builtin_assume_aligned(p, ALIGN)); -#else - return p; -#endif - } - - template - constexpr const T *assume_aligned_ptr(const T *p) noexcept - { - static_assert(ALIGN >= alignof(T), "Alignment must be greater or equal to alignof(T)"); - static_assert(is_pow2(ALIGN), "Alignment must be a power of 2"); -#if (USE_ALIGNED_HINTS) - return reinterpret_cast(__builtin_assume_aligned(p, ALIGN)); -#else - return p; -#endif - } - - template - inline T *pnew(Args&&... args) - { - auto *p = paligned_alloc(alignof(T), sizeof(T)); - return new(p) T(std::forward(args)...); - } - template - inline void pdelete(T *ptr) - { - ptr->~T(); - pfree(ptr); - } + constexpr arena_deleter(arena_storage_type a = arena_storage_type()) noexcept + : m_a(a) { } - template - inline T* pnew_array(const std::size_t num) - { - return new T[num](); - } - - template - inline void pdelete_array(T *ptr) - { - delete [] ptr; - } - - template - struct pdefault_deleter - { - constexpr pdefault_deleter() noexcept = default; - - template::value>::type> - pdefault_deleter(const pdefault_deleter&) noexcept { } + arena_deleter(const arena_deleter &rhs) noexcept : m_a(rhs.m_a) { } - void operator()(T *p) const + void operator()(T *p) //const { - pdelete(p); + /* call destructor */ + p->~T(); + getref(m_a).deallocate(p); } + //private: + arena_storage_type m_a; }; - template > + //============================================================ + // owned_ptr: smart pointer with ownership information + //============================================================ + + template class owned_ptr { public: + + using pointer = SC *; + using element_type = SC; + using deleter_type = D; + owned_ptr() - : m_ptr(nullptr), m_is_owned(true) { } + : m_ptr(nullptr), m_deleter(), m_is_owned(true) { } template friend class owned_ptr; - owned_ptr(SC *p, bool owned) noexcept + owned_ptr(pointer p, bool owned) noexcept : m_ptr(p), m_deleter(), m_is_owned(owned) { } - owned_ptr(SC *p, bool owned, D deleter) noexcept + owned_ptr(pointer p, bool owned, D deleter) noexcept : m_ptr(p), m_deleter(deleter), m_is_owned(owned) { } @@ -168,10 +107,10 @@ namespace plib { } owned_ptr(owned_ptr &&r) noexcept + : m_ptr(r.m_ptr) + , m_deleter(r.m_deleter) + , m_is_owned(r.m_is_owned) { - m_is_owned = r.m_is_owned; - m_ptr = r.m_ptr; - m_deleter = r.m_deleter; r.m_is_owned = false; r.m_ptr = nullptr; } @@ -183,7 +122,7 @@ namespace plib { m_deleter(m_ptr); m_is_owned = r.m_is_owned; m_ptr = r.m_ptr; - m_deleter = r.m_deleter; + m_deleter = std::move(r.m_deleter); r.m_is_owned = false; r.m_ptr = nullptr; return *this; @@ -191,10 +130,10 @@ namespace plib { template owned_ptr(owned_ptr &&r) noexcept + : m_ptr(static_cast(r.get())) + , m_deleter(r.m_deleter) + , m_is_owned(r.is_owned()) { - m_ptr = static_cast(r.get()); - m_is_owned = r.is_owned(); - m_deleter = r.m_deleter; r.release(); } @@ -208,9 +147,9 @@ namespace plib { m_is_owned = false; m_ptr = nullptr; } - SC * release() + pointer release() { - SC *tmp = m_ptr; + pointer tmp = m_ptr; m_is_owned = false; m_ptr = nullptr; return tmp; @@ -218,97 +157,216 @@ namespace plib { bool is_owned() const { return m_is_owned; } - SC * operator ->() const { return m_ptr; } - SC & operator *() const { return *m_ptr; } - SC * get() const { return m_ptr; } + pointer operator ->() const noexcept { return m_ptr; } + typename std::add_lvalue_reference::type operator *() const noexcept { return *m_ptr; } + pointer get() const noexcept { return m_ptr; } + + deleter_type& get_deleter() noexcept { return m_deleter; } + const deleter_type& get_deleter() const noexcept { return m_deleter; } + private: - SC *m_ptr; + pointer m_ptr; D m_deleter; bool m_is_owned; }; - template - using unique_ptr = std::unique_ptr>; - - template - plib::unique_ptr make_unique(Args&&... args) - { - return plib::unique_ptr(pnew(std::forward(args)...)); - } - - template - static owned_ptr make_owned(Args&&... args) - { - owned_ptr a(pnew(std::forward(args)...), true); - return std::move(a); - } - //============================================================ - // Aligned allocator for use with containers + // Arena allocator for use with containers //============================================================ - template - class aligned_allocator + template + class arena_allocator { public: using value_type = T; static constexpr const std::size_t align_size = ALIGN; + using arena_type = ARENA; static_assert(align_size >= alignof(T) && (align_size % alignof(T)) == 0, "ALIGN must be greater than alignof(T) and a multiple"); - aligned_allocator() noexcept = default; - ~aligned_allocator() noexcept = default; + arena_allocator() noexcept + : m_a(arena_type::instance()) + { } + + ~arena_allocator() noexcept = default; - aligned_allocator(const aligned_allocator&) noexcept = default; - aligned_allocator& operator=(const aligned_allocator&) noexcept = delete; + arena_allocator(const arena_allocator &rhs) noexcept : m_a(rhs.m_a) { printf("copy called\n"); }//= default; + arena_allocator& operator=(const arena_allocator&) noexcept = delete; - aligned_allocator(aligned_allocator&&) noexcept = default; - aligned_allocator& operator=(aligned_allocator&&) = delete; + arena_allocator(arena_allocator&&) noexcept = default; + arena_allocator& operator=(arena_allocator&&) = delete; + + arena_allocator(arena_type & a) noexcept : m_a(a) + { + } template - aligned_allocator(const aligned_allocator& rhs) noexcept + arena_allocator(const arena_allocator& rhs) noexcept + : m_a(rhs.m_a) { - unused_var(rhs); } template struct rebind { - using other = aligned_allocator; + using other = arena_allocator; }; T* allocate(std::size_t n) { - return reinterpret_cast(paligned_alloc(ALIGN, sizeof(T) * n)); + return reinterpret_cast(m_a.allocate(ALIGN, sizeof(T) * n)); } void deallocate(T* p, std::size_t n) noexcept { unused_var(n); - pfree(p); + m_a.deallocate(p); } - template - friend bool operator==(const aligned_allocator& lhs, - const aligned_allocator& rhs) noexcept; + template + friend bool operator==(const arena_allocator& lhs, + const arena_allocator& rhs) noexcept; - template friend class aligned_allocator; + template friend class arena_allocator; + private: + arena_type &m_a; }; - template - /*friend*/ inline bool operator==(const aligned_allocator& lhs, - const aligned_allocator& rhs) noexcept + template + inline bool operator==(const arena_allocator& lhs, + const arena_allocator& rhs) noexcept { - unused_var(lhs, rhs); - return A1 == A2; + return A1 == A2 && rhs.m_a == lhs.m_a; } - template - /*friend*/ inline bool operator!=(const aligned_allocator& lhs, - const aligned_allocator& rhs) noexcept + template + inline bool operator!=(const arena_allocator& lhs, + const arena_allocator& rhs) noexcept { return !(lhs == rhs); } + //============================================================ + // Memory allocation + //============================================================ + + struct aligned_arena + { + static constexpr const bool is_stateless = true; + template + using allocator_type = arena_allocator; + + template + using owned_pool_ptr = plib::owned_ptr>; + + static inline aligned_arena &instance() + { + static aligned_arena s_arena; + return s_arena; + } + + static inline void *allocate( size_t alignment, size_t size ) + { + #if (USE_ALIGNED_ALLOCATION) + #if defined(_WIN32) || defined(_WIN64) || defined(_MSC_VER) + return _aligned_malloc(size, alignment); + #elif defined(__APPLE__) + void* p; + if (::posix_memalign(&p, alignment, size) != 0) { + p = nullptr; + } + return p; + #else + return aligned_alloc(alignment, size); + #endif + #else + unused_var(alignment); + return ::operator new(size); + #endif + } + + static inline void deallocate( void *ptr ) + { + #if (USE_ALIGNED_ALLOCATION) + // NOLINTNEXTLINE(cppcoreguidelines-no-malloc) + free(ptr); + #else + ::operator delete(ptr); + #endif + } + + template + owned_pool_ptr make_poolptr(Args&&... args) + { + auto *mem = allocate(alignof(T), sizeof(T)); + return owned_pool_ptr(new (mem) T(std::forward(args)...), true, arena_deleter(*this)); + } + + }; + + template + /*inline */ C14CONSTEXPR T *assume_aligned_ptr(T *p) noexcept + { + static_assert(ALIGN >= alignof(T), "Alignment must be greater or equal to alignof(T)"); + static_assert(is_pow2(ALIGN), "Alignment must be a power of 2"); + //auto t = reinterpret_cast(p); + //if (t & (ALIGN-1)) + // printf("alignment error!"); +#if (USE_ALIGNED_HINTS) + return reinterpret_cast(__builtin_assume_aligned(p, ALIGN)); +#else + return p; +#endif + } + + template + constexpr const T *assume_aligned_ptr(const T *p) noexcept + { + static_assert(ALIGN >= alignof(T), "Alignment must be greater or equal to alignof(T)"); + static_assert(is_pow2(ALIGN), "Alignment must be a power of 2"); +#if (USE_ALIGNED_HINTS) + return reinterpret_cast(__builtin_assume_aligned(p, ALIGN)); +#else + return p; +#endif + } + + // FIXME: remove + template + inline T *pnew(Args&&... args) + { + auto *p = aligned_arena::allocate(alignof(T), sizeof(T)); + return new(p) T(std::forward(args)...); + } + + template + inline void pdelete(T *ptr) + { + ptr->~T(); + aligned_arena::deallocate(ptr); + } + + + template + using unique_ptr = std::unique_ptr>; + + template + plib::unique_ptr make_unique(Args&&... args) + { + return plib::unique_ptr(pnew(std::forward(args)...)); + } + +#if 0 + template + static owned_ptr make_owned(Args&&... args) + { + return owned_ptr(pnew(std::forward(args)...), true); + } +#endif + + + template + using aligned_allocator = aligned_arena::allocator_type; + //============================================================ // traits to determine alignment size and stride size // from types supporting alignment @@ -321,14 +379,7 @@ namespace plib { { static constexpr const std::size_t align_size = alignof(std::max_align_t); static constexpr const std::size_t value_size = sizeof(typename T::value_type); -#if 0 - static constexpr const std::size_t stride_size = - ((value_size % align_size) == 0 ? 1 //T is a multiple of align_size - : ((align_size % value_size) != 0 ? align_size // align_size is not a multiple of T - : align_size / value_size)); -#else static constexpr const std::size_t stride_size = lcm(align_size, value_size) / value_size; -#endif }; template @@ -336,14 +387,7 @@ namespace plib { { static constexpr const std::size_t align_size = T::align_size; static constexpr const std::size_t value_size = sizeof(typename T::value_type); -#if 0 - static constexpr const std::size_t stride_size = - ((value_size % align_size) == 0 ? 1 //T is a multiple of align_size - : ((align_size % value_size) != 0 ? align_size // align_size is not a multiple of T - : align_size / value_size)); -#else static constexpr const std::size_t stride_size = lcm(align_size, value_size) / value_size; -#endif }; //============================================================ diff --git a/src/lib/netlist/plib/pconfig.h b/src/lib/netlist/plib/pconfig.h index c521f24e5f8..6616669f619 100644 --- a/src/lib/netlist/plib/pconfig.h +++ b/src/lib/netlist/plib/pconfig.h @@ -38,7 +38,7 @@ */ #ifndef USE_ALIGNED_OPTIMIZATIONS -#define USE_ALIGNED_OPTIMIZATIONS (0) +#define USE_ALIGNED_OPTIMIZATIONS (1) #endif #define USE_ALIGNED_ALLOCATION (USE_ALIGNED_OPTIMIZATIONS) diff --git a/src/lib/netlist/plib/pdynlib.cpp b/src/lib/netlist/plib/pdynlib.cpp index 91e1b5cf73a..0d32bead51d 100644 --- a/src/lib/netlist/plib/pdynlib.cpp +++ b/src/lib/netlist/plib/pdynlib.cpp @@ -25,7 +25,7 @@ CHAR *astring_from_utf8(const char *utf8string) // convert UTF-16 to "ANSI code page" string char_count = WideCharToMultiByte(CP_ACP, 0, wstring, -1, nullptr, 0, nullptr, nullptr); - result = pnew_array(char_count); + result = new CHAR[char_count]; if (result != nullptr) WideCharToMultiByte(CP_ACP, 0, wstring, -1, result, char_count, nullptr, nullptr); @@ -39,7 +39,7 @@ WCHAR *wstring_from_utf8(const char *utf8string) // convert MAME string (UTF-8) to UTF-16 char_count = MultiByteToWideChar(CP_UTF8, 0, utf8string, -1, nullptr, 0); - result = pnew_array(char_count); + result = new WCHAR[char_count]; if (result != nullptr) MultiByteToWideChar(CP_UTF8, 0, utf8string, -1, result, char_count); @@ -72,7 +72,7 @@ dynlib::dynlib(const pstring &libname) m_isLoaded = true; //else // fprintf(stderr, "win: library <%s> not found!\n", libname.c_str()); - pdelete_array(buffer); + delete [] buffer; #elif defined(EMSCRIPTEN) //no-op #else @@ -106,7 +106,7 @@ dynlib::dynlib(const pstring &path, const pstring &libname) { //printf("win: library <%s> not found!\n", libname.c_str()); } - pdelete_array(buffer); + delete [] buffer; #elif defined(EMSCRIPTEN) //no-op #else diff --git a/src/lib/netlist/plib/pmatrix2d.h b/src/lib/netlist/plib/pmatrix2d.h index 52228548cbf..eab533688d7 100644 --- a/src/lib/netlist/plib/pmatrix2d.h +++ b/src/lib/netlist/plib/pmatrix2d.h @@ -22,21 +22,22 @@ namespace plib { - template> + template> class pmatrix2d { public: using value_type = T; + using allocator_type = A; static constexpr const std::size_t align_size = align_traits::align_size; static constexpr const std::size_t stride_size = align_traits::stride_size; pmatrix2d() - : m_N(0), m_M(0), m_stride(8) + : m_N(0), m_M(0), m_stride(8), m_v() { } pmatrix2d(std::size_t N, std::size_t M) - : m_N(N), m_M(M) + : m_N(N), m_M(M), m_v() { m_stride = ((M + stride_size-1) / stride_size) * stride_size; m_v.resize(N * m_stride); diff --git a/src/lib/netlist/plib/pmempool.h b/src/lib/netlist/plib/pmempool.h index 00e78b09fb6..5449595c86c 100644 --- a/src/lib/netlist/plib/pmempool.h +++ b/src/lib/netlist/plib/pmempool.h @@ -23,21 +23,6 @@ namespace plib { - template - struct pool_deleter - { - constexpr pool_deleter() noexcept = default; - - template::value>::type> - pool_deleter(const pool_deleter&) noexcept { } - - void operator()(T *p) const - { - P::free(p); - } - }; - //============================================================ // Memory pool //============================================================ @@ -100,8 +85,11 @@ namespace plib { std::vector m_blocks; public: + static constexpr const bool is_stateless = false; + template + using allocator_type = arena_allocator; - mempool(size_t min_alloc, size_t min_align) + mempool(size_t min_alloc = (1<<21), size_t min_align = 16) : m_min_alloc(min_alloc), m_min_align(min_align) { } @@ -122,10 +110,8 @@ namespace plib { } } - template - void *alloc(size_t size) + void *allocate(size_t align, size_t size) { - size_t align = ALIGN; if (align < m_min_align) align = m_min_align; @@ -164,11 +150,8 @@ namespace plib { } } - template - static void free(T *ptr) + static void deallocate(void *ptr) { - /* call destructor */ - ptr->~T(); auto it = sinfo().find(ptr); if (it == sinfo().end()) @@ -188,19 +171,18 @@ namespace plib { } template - using poolptr = plib::owned_ptr>; + using owned_pool_ptr = plib::owned_ptr>; template - poolptr make_poolptr(Args&&... args) + owned_pool_ptr make_poolptr(Args&&... args) { - auto *mem = this->alloc(sizeof(T)); - auto *obj = new (mem) T(std::forward(args)...); - poolptr a(obj, true); - return std::move(a); + auto *mem = this->allocate(alignof(T), sizeof(T)); + return owned_pool_ptr(new (mem) T(std::forward(args)...), true, arena_deleter(this)); } }; +#if 0 class mempool_default { private: @@ -210,7 +192,11 @@ namespace plib { public: - mempool_default(size_t min_alloc, size_t min_align) + static constexpr const bool is_stateless = true; + template + using allocator_type = arena_allocator; + + mempool_default(size_t min_alloc = 16, size_t min_align = (1 << 21)) : m_min_alloc(min_alloc), m_min_align(min_align) { } @@ -219,24 +205,22 @@ namespace plib { ~mempool_default() = default; -#if 0 - void *alloc(size_t size) + void *allocate(size_t alignment, size_t size) { plib::unused_var(m_min_alloc); // -Wunused-private-field fires without plib::unused_var(m_min_align); + plib::unused_var(alignment); return ::operator new(size); } -#endif - template - static void free(T *ptr) + static void deallocate(void *ptr) { - plib::pdelete(ptr); + ::operator delete(ptr); } template - using poolptr = plib::owned_ptr>; + using poolptr = plib::owned_ptr>; template poolptr make_poolptr(Args&&... args) @@ -249,7 +233,7 @@ namespace plib { return std::move(a); } }; - +#endif } // namespace plib diff --git a/src/lib/netlist/plib/pstream.cpp b/src/lib/netlist/plib/pstream.cpp index 8f80f317f98..a7acdaafb52 100644 --- a/src/lib/netlist/plib/pstream.cpp +++ b/src/lib/netlist/plib/pstream.cpp @@ -268,55 +268,25 @@ pimemstream::pos_type pimemstream::vtell() const // ----------------------------------------------------------------------------- pomemstream::pomemstream() -: postream(FLAG_SEEKABLE), m_pos(0), m_capacity(1024), m_size(0) +: postream(FLAG_SEEKABLE), m_pos(0), m_mem(1024) { - m_mem = pnew_array(m_capacity); -} - -pomemstream::~pomemstream() -{ - if (m_mem != nullptr) - pdelete_array(m_mem); + m_mem.clear(); } void pomemstream::vwrite(const value_type *buf, const pos_type n) { - if (m_pos + n >= m_capacity) - { - while (m_pos + n >= m_capacity) - m_capacity *= 2; - char *o = m_mem; - m_mem = pnew_array(m_capacity); - if (m_mem == nullptr) - { - throw out_of_mem_e("pomemstream::vwrite"); - } - std::copy(o, o + m_pos, m_mem); - pdelete_array(o); - } + if (m_pos + n >= m_mem.size()) + m_mem.resize(m_pos + n); - std::copy(buf, buf + n, m_mem + m_pos); + std::copy(buf, buf + n, &m_mem[0] + m_pos); m_pos += n; - m_size = std::max(m_pos, m_size); } void pomemstream::vseek(const pos_type n) { m_pos = n; - m_size = std::max(m_pos, m_size); - if (m_size >= m_capacity) - { - while (m_size >= m_capacity) - m_capacity *= 2; - char *o = m_mem; - m_mem = pnew_array(m_capacity); - if (m_mem == nullptr) - { - throw out_of_mem_e("pomemstream::vseek"); - } - std::copy(o, o + m_pos, m_mem); - pdelete_array(o); - } + if (m_pos>=m_mem.size()) + m_mem.resize(m_pos); } pstream::pos_type pomemstream::vtell() const diff --git a/src/lib/netlist/plib/pstream.h b/src/lib/netlist/plib/pstream.h index ec15c0258c6..93497eb1423 100644 --- a/src/lib/netlist/plib/pstream.h +++ b/src/lib/netlist/plib/pstream.h @@ -179,18 +179,15 @@ public: pomemstream(pomemstream &&src) noexcept : postream(std::move(src)) , m_pos(src.m_pos) - , m_capacity(src.m_capacity) - , m_size(src.m_size) - , m_mem(src.m_mem) + , m_mem(std::move(src.m_mem)) { - src.m_mem = nullptr; } pomemstream &operator=(pomemstream &&src) = delete; - ~pomemstream() override; + ~pomemstream() override = default; - char *memory() const { return m_mem; } - pos_type size() const { return m_size; } + const char *memory() const { return m_mem.data(); } + pos_type size() const { return m_mem.size(); } protected: /* write n bytes to stream */ @@ -200,9 +197,7 @@ protected: private: pos_type m_pos; - pos_type m_capacity; - pos_type m_size; - char *m_mem; + std::vector m_mem; }; class postringstream : public postream @@ -626,11 +621,10 @@ public: { std::size_t sz = 0; read(sz); - auto buf = plib::pnew_array::mem_t>(sz+1); - m_strm.read(reinterpret_cast(buf), sz); + std::vector::mem_t> buf(sz+1); + m_strm.read(buf.data(), sz); buf[sz] = 0; - s = pstring(buf); - plib::pdelete_array(buf); + s = pstring(buf.data()); } template diff --git a/src/lib/netlist/plib/ptypes.h b/src/lib/netlist/plib/ptypes.h index 7d3c064b35d..bda62099150 100644 --- a/src/lib/netlist/plib/ptypes.h +++ b/src/lib/netlist/plib/ptypes.h @@ -120,8 +120,8 @@ namespace plib static_assert(std::is_integral::value, "gcd: N must be an integer"); return m == 0 ? plib::abs(n) - : n == 0 ? plib::abs(m) - : gcd(n, m % n); + : n == 0 ? plib::abs(m) + : gcd(n, m % n); } template diff --git a/src/lib/netlist/prg/nltool.cpp b/src/lib/netlist/prg/nltool.cpp index f9e25346493..784161a71a8 100644 --- a/src/lib/netlist/prg/nltool.cpp +++ b/src/lib/netlist/prg/nltool.cpp @@ -625,7 +625,7 @@ void tool_app_t::listdevices() nt.setup().prepare_to_run(); - std::vector> devs; + std::vector> devs; for (auto & f : list) { diff --git a/src/lib/netlist/solver/nld_matrix_solver.h b/src/lib/netlist/solver/nld_matrix_solver.h index a7473eb6315..f76660e1cb9 100644 --- a/src/lib/netlist/solver/nld_matrix_solver.h +++ b/src/lib/netlist/solver/nld_matrix_solver.h @@ -254,7 +254,7 @@ namespace devices std::vector> m_terms; std::vector m_nets; - std::vector> m_inps; + std::vector> m_inps; std::vector> m_rails_temp; diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp index 9d7b8e7dbb2..4734cc3624d 100644 --- a/src/lib/netlist/solver/nld_solver.cpp +++ b/src/lib/netlist/solver/nld_solver.cpp @@ -111,13 +111,13 @@ namespace devices } template - poolptr create_it(netlist_state_t &nl, pstring name, solver_parameters_t ¶ms, std::size_t size) + pool_owned_ptr create_it(netlist_state_t &nl, pstring name, solver_parameters_t ¶ms, std::size_t size) { return pool().make_poolptr(nl, name, ¶ms, size); } template - poolptr NETLIB_NAME(solver)::create_solver(std::size_t size, const pstring &solvername) + pool_owned_ptr NETLIB_NAME(solver)::create_solver(std::size_t size, const pstring &solvername) { if (m_method() == "SOR_MAT") { @@ -161,12 +161,12 @@ namespace devices else { log().fatal(MF_1_UNKNOWN_SOLVER_TYPE, m_method()); - return poolptr(); + return pool_owned_ptr(); } } template - poolptr NETLIB_NAME(solver)::create_solver_x(std::size_t size, const pstring &solvername) + pool_owned_ptr NETLIB_NAME(solver)::create_solver_x(std::size_t size, const pstring &solvername) { if (SIZE > 0) { @@ -291,7 +291,7 @@ namespace devices log().verbose("Found {1} net groups in {2} nets\n", splitter.groups.size(), state().nets().size()); for (auto & grp : splitter.groups) { - poolptr ms; + pool_owned_ptr ms; std::size_t net_count = grp.size(); pstring sname = plib::pfmt("Solver_{1}")(m_mat_solvers.size()); diff --git a/src/lib/netlist/solver/nld_solver.h b/src/lib/netlist/solver/nld_solver.h index 190ae9a9ab5..c9ec967a72a 100644 --- a/src/lib/netlist/solver/nld_solver.h +++ b/src/lib/netlist/solver/nld_solver.h @@ -102,17 +102,17 @@ namespace devices param_logic_t m_log_stats; - std::vector> m_mat_solvers; + std::vector> m_mat_solvers; std::vector m_mat_solvers_all; std::vector m_mat_solvers_timestepping; solver_parameters_t m_params; template - poolptr create_solver(std::size_t size, const pstring &solvername); + pool_owned_ptr create_solver(std::size_t size, const pstring &solvername); template - poolptr create_solver_x(std::size_t size, const pstring &solvername); + pool_owned_ptr create_solver_x(std::size_t size, const pstring &solvername); }; } //namespace devices -- cgit v1.2.3-70-g09d2