From 324f9d44d5c4293645e7bb8f42e7d95d5ac1e604 Mon Sep 17 00:00:00 2001 From: couriersud Date: Sat, 21 May 2022 17:16:50 +0200 Subject: netlist: More c++, less macros, added support for cspell (#9794) - More c++, less macros * Significantly reduced the use of unused_var and replaced it with [[maybe_unused]] * use enum class in ppmf.h - Changes to testing code in ptest.h * Catch exceptions in more places * The verbosity of the output can now be controlled * Display of test stats totals - added support for cspell - fixed various typos - fixed SUBTARGET=nl build - fixed more file permissions - srcclean and add fix_permissions target to netlist makefile --- scripts/target/mame/nl.lua | 11 ++ src/lib/netlist/analog/nld_generic_models.h | 15 +- src/lib/netlist/analog/nlid_twoterm.h | 3 +- src/lib/netlist/build/cspell.json | 76 ++++++++ src/lib/netlist/build/makefile | 64 +++++-- src/lib/netlist/buildVS/netlist.sln | 0 src/lib/netlist/buildVS/netlistlib.vcxproj | 0 src/lib/netlist/buildVS/netlistlib.vcxproj.filters | 0 src/lib/netlist/buildVS/nltool.vcxproj | 0 src/lib/netlist/buildVS/nltool.vcxproj.filters | 0 src/lib/netlist/buildVS/nlwav.vcxproj | 0 src/lib/netlist/buildVS/nlwav.vcxproj.filters | 0 src/lib/netlist/core/base_objects.h | 5 +- src/lib/netlist/core/core_device.h | 3 +- src/lib/netlist/core/exec.h | 5 +- src/lib/netlist/core/logic.h | 5 +- src/lib/netlist/core/nets.h | 16 +- src/lib/netlist/core/queue.h | 6 +- src/lib/netlist/devices/nld_74123.cpp | 2 +- src/lib/netlist/devices/nld_74164.cpp | 2 +- src/lib/netlist/devices/nlid_proxy.cpp | 9 +- src/lib/netlist/macro/nlm_ttl74xx_lib.cpp | 6 +- src/lib/netlist/nl_base.cpp | 15 +- src/lib/netlist/nl_config.h | 26 ++- src/lib/netlist/nl_errstr.h | 8 +- src/lib/netlist/nl_factory.h | 2 - src/lib/netlist/nl_interface.h | 4 +- src/lib/netlist/nl_parser.cpp | 3 +- src/lib/netlist/nl_setup.cpp | 26 ++- src/lib/netlist/nl_setup.h | 12 +- src/lib/netlist/nltypes.h | 3 +- src/lib/netlist/plib/gmres.h | 20 +- src/lib/netlist/plib/palloc.h | 18 +- src/lib/netlist/plib/pchrono.h | 2 +- src/lib/netlist/plib/pconfig.h | 36 ++-- src/lib/netlist/plib/pdynlib.cpp | 3 +- src/lib/netlist/plib/pdynlib.h | 7 +- src/lib/netlist/plib/pexception.cpp | 2 +- src/lib/netlist/plib/pexception.h | 2 +- src/lib/netlist/plib/pmath.h | 2 +- src/lib/netlist/plib/pomp.h | 4 +- src/lib/netlist/plib/poptions.cpp | 3 +- src/lib/netlist/plib/ppmf.cpp | 8 +- src/lib/netlist/plib/ppmf.h | 112 ++++++----- src/lib/netlist/plib/ppreprocessor.h | 4 +- src/lib/netlist/plib/prandom.h | 3 +- src/lib/netlist/plib/pstonum.h | 2 +- src/lib/netlist/plib/pstream.h | 9 +- src/lib/netlist/plib/ptests.h | 210 ++++++++++++++++----- src/lib/netlist/plib/ptime.h | 3 +- src/lib/netlist/plib/ptypes.h | 45 +++-- src/lib/netlist/prg/nltool.cpp | 4 +- src/lib/netlist/prg/nlwav.cpp | 2 + src/lib/netlist/solver/nld_matrix_solver.cpp | 3 +- src/lib/netlist/solver/nld_matrix_solver.h | 9 +- src/lib/netlist/solver/nld_matrix_solver_ext.h | 4 +- src/lib/netlist/solver/nld_solver.cpp | 6 +- src/lib/netlist/tests/test_pmfp.cpp | 20 +- src/lib/netlist/tests/test_pmfp_multibase.cpp | 5 +- src/lib/netlist/tests/test_precommit.cpp | 26 +++ src/lib/netlist/tools/nl_convert.cpp | 21 +-- src/lib/netlist/tools/nl_convert.h | 2 +- 62 files changed, 590 insertions(+), 334 deletions(-) create mode 100644 src/lib/netlist/build/cspell.json mode change 100755 => 100644 src/lib/netlist/buildVS/netlist.sln mode change 100755 => 100644 src/lib/netlist/buildVS/netlistlib.vcxproj mode change 100755 => 100644 src/lib/netlist/buildVS/netlistlib.vcxproj.filters mode change 100755 => 100644 src/lib/netlist/buildVS/nltool.vcxproj mode change 100755 => 100644 src/lib/netlist/buildVS/nltool.vcxproj.filters mode change 100755 => 100644 src/lib/netlist/buildVS/nlwav.vcxproj mode change 100755 => 100644 src/lib/netlist/buildVS/nlwav.vcxproj.filters create mode 100644 src/lib/netlist/tests/test_precommit.cpp diff --git a/scripts/target/mame/nl.lua b/scripts/target/mame/nl.lua index 633788cf3bb..a53bb46e7c5 100644 --- a/scripts/target/mame/nl.lua +++ b/scripts/target/mame/nl.lua @@ -33,6 +33,7 @@ CPUS["M680X0"] = true CPUS["F8"] = true CPUS["CCPU"] = true CPUS["MCS40"] = true +CPUS["TMS9900"] = true -------------------------------------------------- -- Specify all the sound cores necessary for the @@ -108,6 +109,7 @@ MACHINES["PIT8253"] = true --MACHINES["BANKDEV"] = true MACHINES["F3853"] = true MACHINES["MB14241"] = true +MACHINES["STEPPERS"] = true -------------------------------------------------- -- specify available bus cores @@ -421,6 +423,15 @@ files{ MAME_DIR .. "src/mame/drivers/segattl.cpp", MAME_DIR .. "src/mame/drivers/taitottl.cpp", MAME_DIR .. "src/mame/drivers/usbilliards.cpp", + + MAME_DIR .. "src/mame/drivers/jpmsru.cpp", + MAME_DIR .. "src/mame/audio/nl_jpmsru.cpp", + + MAME_DIR .. "src/mame/audio/fruitsamples.cpp", + MAME_DIR .. "src/mame/audio/fruitsamples.h", + MAME_DIR .. "src/mame/video/awpvid.cpp", + MAME_DIR .. "src/mame/video/awpvid.h", + } end diff --git a/src/lib/netlist/analog/nld_generic_models.h b/src/lib/netlist/analog/nld_generic_models.h index 80650b4a218..aaac759b3f9 100644 --- a/src/lib/netlist/analog/nld_generic_models.h +++ b/src/lib/netlist/analog/nld_generic_models.h @@ -66,9 +66,8 @@ namespace netlist::analog //return m_h * cap + m_gmin; } - nl_fptype Ieq(nl_fptype cap, nl_fptype v) const noexcept + nl_fptype Ieq(nl_fptype cap, [[maybe_unused]] nl_fptype v) const noexcept { - plib::unused_var(v); //return -m_h * 0.5 * ((cap + m_c) * m_v + (cap - m_c) * v) ; return -m_h * nlconst::half() * (cap + m_c) * m_v; //return -m_h * cap * m_v; @@ -109,15 +108,13 @@ namespace netlist::analog static capacitor_e type() noexcept { return capacitor_e::CONSTANT_CAPACITY; } nl_fptype G(nl_fptype cap) const noexcept { return cap * m_h + m_gmin; } - nl_fptype Ieq(nl_fptype cap, nl_fptype v) const noexcept + nl_fptype Ieq(nl_fptype cap, [[maybe_unused]] nl_fptype v) const noexcept { - plib::unused_var(v); return - G(cap) * m_v; } - void timestep(nl_fptype cap, nl_fptype v, nl_fptype step) noexcept + void timestep([[maybe_unused]] nl_fptype cap, nl_fptype v, nl_fptype step) noexcept { - plib::unused_var(cap); m_h = plib::reciprocal(step); m_v = v; } @@ -135,9 +132,10 @@ namespace netlist::analog struct generic_capacitor_const { public: - generic_capacitor_const(core_device_t &dev, const pstring &name) + generic_capacitor_const( /*[[maybe_unused]]*/ core_device_t &dev, /*[[maybe_unused]]*/ const pstring &name) : m_gmin(nlconst::zero()) { + // gcc 7.2 (mingw) and 7.5 (ubuntu) don't accept maybe_unused here plib::unused_var(dev, name); } @@ -163,13 +161,12 @@ namespace netlist::analog struct generic_capacitor_const { public: - generic_capacitor_const(core_device_t &dev, const pstring &name) + generic_capacitor_const( [[maybe_unused]] core_device_t &dev, [[maybe_unused]] const pstring &name) : m_gmin(nlconst::zero()) , m_vn(0) , m_in(0) , m_trn(0.0) { - plib::unused_var(dev, name); } // Returns { G, Ieq } diff --git a/src/lib/netlist/analog/nlid_twoterm.h b/src/lib/netlist/analog/nlid_twoterm.h index 43e1902c5e7..1cbf750eaa3 100644 --- a/src/lib/netlist/analog/nlid_twoterm.h +++ b/src/lib/netlist/analog/nlid_twoterm.h @@ -58,9 +58,8 @@ namespace netlist::analog return b ? *h : d2; } template<> - inline core_device_t &bselect(bool b, netlist_state_t &d1, core_device_t &d2) + inline core_device_t &bselect(bool b, [[maybe_unused]] netlist_state_t &d1, core_device_t &d2) { - plib::unused_var(d1); if (b) throw nl_exception("bselect with netlist and b==true"); return d2; diff --git a/src/lib/netlist/build/cspell.json b/src/lib/netlist/build/cspell.json new file mode 100644 index 00000000000..d1035e868d4 --- /dev/null +++ b/src/lib/netlist/build/cspell.json @@ -0,0 +1,76 @@ +{ +"words" : [ + "MAME", + "netlist", + "netlists", + "datasheet", + "cmos", + "opamp", + "opamps", + "mosfet", + "mosfets", + "Chebyshev", + "Fairchild", + "Schmitt", + "Transconductance", + "nmos", + "pmos", + "retriggerable", // not in leo + "presettable", // not in leo + "misformatted", // not in leo + "monostable", + "demultiplexer", + "demultiplexers", + "behavioural", + "highpass", + "nltool", + "nvcc", + "Couriersud", + "plib", // FIXME: Remove everything below here again + "ppmf" +], +"languageSettings": [ + // This one works with Python + { + "languageId": "python", + "includeRegExpList": [ + "/#.*/", + "/('''|\"\"\")[^\\1]+?\\1/g", + "strings" + ] + }, + // This one works with JavaScript, Typescript, etc + { + "languageId": "javascript,typescript", + "includeRegExpList": [ + "CStyleComment", + "strings" + ] + }, + // Use with cpp or c files + { + "languageId": "cpp,c,h", + // Turn off compound words, because it is only checking strings. + "allowCompoundWords": false, + // Only check comments and strings + "includeRegExpList": [ + "CStyleComment", + "string" + ], + "ignoreRegExpList": [ + "/#include.*/", // Exclude includes, because they are also strings + "/#pragma.*/", // Exclude pragmas, they may include strings + "/\/\/ NOLINT:.*/", // Exclude clang-tidy instructions + "/\/\/\/ \\\\file.*/", // Doxygen + "/\/\/\/ \\\\addtogroup.*/", // Doxygen + "/`[^`]+`/", // Markup code formatt + "/} \/\/ namespace.*/", // Namespace comments + "/[A-Z][A-Z][A-Z][^\\s]*/", // Identifiers starting with at least 3 capital letters + // Project specific exclusions start here + "/\/\/ copyright-holders.*/", + "/\/\/- Pinalias:/", + "/\/\/#.*/" // commented source code + ] + } +] +} diff --git a/src/lib/netlist/build/makefile b/src/lib/netlist/build/makefile index b44ed3e727e..fab68ed5a0b 100644 --- a/src/lib/netlist/build/makefile +++ b/src/lib/netlist/build/makefile @@ -111,7 +111,7 @@ TIDY_DB = $(OBJ)/compile_commands.json #LTO decreases performance :-( #LTO = -flto=4 -fuse-linker-plugin -Wodr -CCOREFLAGS = -g -O3 -std=c++17 -I$(SRC) +CCOREFLAGS = -g -O3 -std=c++17 -I$(SRC) -I$(SRC)/.. CFLAGS = $(LTO) $(CCOREFLAGS) $(CEXTRAFLAGS) LDFLAGS = $(LTO) -g -O3 -std=c++17 $(LDEXTRAFLAGS) @@ -172,6 +172,16 @@ CORESOURCES := \ MAINSOURCES = $(SRC)/prg/nltool.cpp $(SRC)/prg/nlwav.cpp +HEADERS = $(wildcard $(SRC)/analog/*.h) +HEADERS += $(wildcard $(SRC)/core/*.h) +HEADERS += $(wildcard $(SRC)/devices/*.h) +HEADERS += $(wildcard $(SRC)/solver/*.h) +HEADERS += $(wildcard $(SRC)/tools/*.h) +HEADERS += $(wildcard $(SRC)/*.h) +HEADERS += $(wildcard $(SRC)/generated/*.h) + +PHEADERS = $(wildcard $(SRC)/plib/*.h) + PSOURCES := \ $(PSRC)/pstring.cpp \ $(PSRC)/pdynlib.cpp \ @@ -191,15 +201,18 @@ TESTOBJS = $(patsubst $(SRC)%, $(OBJ)%, $(TESTSOURCES:.cpp=.o)) MAINOBJS = $(patsubst $(SRC)%, $(OBJ)%, $(MAINSOURCES:.cpp=.o)) POBJS = $(patsubst $(SRC)%, $(OBJ)%, $(PSOURCES:.cpp=.o)) -OBJS = $(POBJS) $(NLOBJS) $(NLDEVOBJS) $(TESTOBJS) +OBJS = $(TESTOBJS) $(POBJS) $(NLOBJS) $(NLDEVOBJS) $(TESTOBJS) + +VSFILES = \ + $(VSBUILD)/netlistlib.vcxproj \ + $(VSBUILD)/netlistlib.vcxproj.filters \ + $(VSBUILD)/nltool.vcxproj \ + $(VSBUILD)/nltool.vcxproj.filters \ + $(VSBUILD)/nlwav.vcxproj \ + $(VSBUILD)/nlwav.vcxproj.filters \ + $(VSBUILD)/netlist.sln \ -VSBUILDS = \ - $(VSBUILD/netlistlib.vcxproj) \ - $(VSBUILD/netlistlib.vcxproj.user \ - $(VSBUILD/nltool.vcxproj \ - $(VSBUILD/netlistlib.vcxproj.filters \ - $(VSBUILD/nltool.vcxproj.filters \ - $(VSBUILD/netlist.sln \ +OTHERFILES = makefile DOCS = \ doxygen.conf \ @@ -213,7 +226,8 @@ ALL_OBJS = $(OBJS) $(MAINOBJS) ALL_TIDY_FILES = $(ALL_OBJS:.o=.json) ALLSOURCES = $(DEVSOURCES) $(CORESOURCES) $(TESTSOURCES) $(MAINSOURCES) $(PSOURCES) -ALLFILES = $(ALLSOURCES) $(VSBUILDS) $(DOCS) +ALLHEADERS = $(HEADERS) $(PHEADERS) +ALLFILES = $(ALLSOURCES) $(VSFILES) $(DOCS) $(OTHERFILES) MAKEFILE_TARGETS_WITHOUT_INCLUDE := \ clang clang-5 clang-libc gcc9 mingw native nvcc \ @@ -270,10 +284,10 @@ maketree: $(sort $(BUILD_DIRS)) #------------------------------------------------- native: - $(MAKE) CEXTRAFLAGS="-march=native -msse4.2 -Wall -Wpedantic -Wsign-compare -Wextra " + $(MAKE) CEXTRAFLAGS="-march=native -msse4.2 -Wall -Wpedantic -Wsign-compare -Wextra" gcc9: - $(MAKE) CC=g++-9 LD=g++-9 CEXTRAFLAGS="-march=native -Wall -pedantic -Wpedantic -fext-numeric-literals -Wsign-compare -Wextra" EXTRALIBS="-lquadmath" + $(MAKE) CC=g++-9 LD=g++-9 CEXTRAFLAGS="-march=native -Wall -pedantic -Wpedantic -fext-numeric-literals -Wsign-compare -Wextra" EXTRALIBS="-lquadmath" OBJ=obj/gcc9 emsdk: emmake $(MAKE) CC=emcc LD=emcc CEXTRAFLAGS="-fexceptions" LDEXTRAFLAGS="-fexceptions --emrun" OBJ=obj/emsdk EXESUFFIX=.html @@ -311,7 +325,7 @@ clang-libc: nvcc: $(MAKE) CC=/usr/local/cuda-11.3/bin/nvcc LD=/usr/local/cuda-11.3/bin/nvcc \ - OBJ=obj/nvcc CEXTRAFLAGS="--std c++17 -x cu -DNVCCBUILD=113 --expt-extended-lambda \ + OBJ=obj/nvcc CEXTRAFLAGS="--std c++17 -x cu --expt-extended-lambda \ --expt-relaxed-constexpr --default-stream per-thread --restrict \ --ftemplate-depth 1024 \ -Xcompiler -O6 -Xcompiler -march=native -ccbin g++-9 " \ @@ -322,6 +336,12 @@ mingw: -DWIN32_LEAN_AND_MEAN" LDEXTRAFLAGS="-Wl,--subsystem,console \ -municode" LIBS= MD=@mkdir.exe SHELL=sh.exe DOXYGEN=doxygen.exe $(PARAMS) +mingw-cross: + ${MAKE} CC="x86_64-w64-mingw32-g++-posix" LD="x86_64-w64-mingw32-g++-posix" \ + CEXTRAFLAGS="-DUNICODE -D_UNICODE -D_WIN32_WINNT=0x0501 -DWIN32_LEAN_AND_MEAN" \ + LDEXTRAFLAGS="-Wl,--subsystem,console -municode" OBJ=obj/mingw-cross \ + EXESUFFIX=.exe LIBS= + #------------------------------------------------- # regression tests #------------------------------------------------- @@ -343,6 +363,10 @@ doc: ./nltool$(EXESUFFIX) -c docheader > ../documentation/devsyn.dox.h $(DOXYGEN) doxygen.conf +NLOBJS = $(patsubst $(SRC)%, $(OBJ)%, $(CORESOURCES:.cpp=.o)) +cspell: + cd .. && cspell -c build/cspell.json --no-color --relative $(patsubst $(SRC)/%, %, $(ALLHEADERS) $(ALLSOURCES)) | sed -e "s/ - Unknown/: error: Unknown/g" + #------------------------------------------------- # depends #------------------------------------------------- @@ -383,6 +407,20 @@ $(SRC)/generated/nlm_modules_lib.cpp: $(MODULESOURCES) .PHONY: generated generated: $(SRC)/generated/lib_entries.hxx $(SRC)/generated/nld_devinc.h $(SRC)/generated/nlm_modules_lib.cpp +#------------------------------------------------- +# fix permissions, source management +#------------------------------------------------- + +fix_permissions: + @find .. -executable -and -not -type d -print | grep -v /build | xargs -r chmod a-x + @chmod a-x $(ALLFILES) + @find .. -print | xargs setfacl -b + +srcclean: $(ALLSOURCES) $(ALLHEADERS) + @../../../../srcclean -u $(ALLSOURCES) $(ALLHEADERS) + +precommit: fix_permissions srcclean + #------------------------------------------------- # clang tidy #------------------------------------------------- diff --git a/src/lib/netlist/buildVS/netlist.sln b/src/lib/netlist/buildVS/netlist.sln old mode 100755 new mode 100644 diff --git a/src/lib/netlist/buildVS/netlistlib.vcxproj b/src/lib/netlist/buildVS/netlistlib.vcxproj old mode 100755 new mode 100644 diff --git a/src/lib/netlist/buildVS/netlistlib.vcxproj.filters b/src/lib/netlist/buildVS/netlistlib.vcxproj.filters old mode 100755 new mode 100644 diff --git a/src/lib/netlist/buildVS/nltool.vcxproj b/src/lib/netlist/buildVS/nltool.vcxproj old mode 100755 new mode 100644 diff --git a/src/lib/netlist/buildVS/nltool.vcxproj.filters b/src/lib/netlist/buildVS/nltool.vcxproj.filters old mode 100755 new mode 100644 diff --git a/src/lib/netlist/buildVS/nlwav.vcxproj b/src/lib/netlist/buildVS/nlwav.vcxproj old mode 100755 new mode 100644 diff --git a/src/lib/netlist/buildVS/nlwav.vcxproj.filters b/src/lib/netlist/buildVS/nlwav.vcxproj.filters old mode 100755 new mode 100644 diff --git a/src/lib/netlist/core/base_objects.h b/src/lib/netlist/core/base_objects.h index a9f8d41dfd0..2610dbdf72c 100644 --- a/src/lib/netlist/core/base_objects.h +++ b/src/lib/netlist/core/base_objects.h @@ -201,7 +201,7 @@ namespace netlist::detail { /// Going forward setting this to 8 will allow 8-bit signal /// busses to be used in netlist, e.g. for more complex memory /// arrangements. - /// Mimimum value is 2 here to support tristate output on proxies. + /// Minimum value is 2 here to support tristate output on proxies. static constexpr const unsigned int INP_BITS = 2; static constexpr const unsigned int INP_MASK = (1 << INP_BITS) - 1; @@ -264,9 +264,8 @@ namespace netlist::detail { state_var_sig m_Q; #else - void set_copied_input(const netlist_sig_t &val) const noexcept { plib::unused_var(val); } // NOLINT: static means more message elsewhere + void set_copied_input([[maybe_unused]] const netlist_sig_t &val) const noexcept { } // NOLINT: static means more message elsewhere #endif - void set_delegate(const nldelegate &delegate) noexcept { m_delegate = delegate; } const nldelegate &delegate() const noexcept { return m_delegate; } void run_delegate() const noexcept { return m_delegate(); } diff --git a/src/lib/netlist/core/core_device.h b/src/lib/netlist/core/core_device.h index 5b402ab102a..2cefb3d4c58 100644 --- a/src/lib/netlist/core/core_device.h +++ b/src/lib/netlist/core/core_device.h @@ -85,7 +85,8 @@ namespace netlist log_type & log(); public: - virtual void timestep(timestep_type ts_type, nl_fptype st) noexcept { plib::unused_var(ts_type, st); } + virtual void timestep([[maybe_unused]] timestep_type ts_type, + [[maybe_unused]] nl_fptype st) noexcept { } virtual void update_terminals() noexcept { } virtual void update_param() noexcept {} diff --git a/src/lib/netlist/core/exec.h b/src/lib/netlist/core/exec.h index 2099f04b065..cab482ff218 100644 --- a/src/lib/netlist/core/exec.h +++ b/src/lib/netlist/core/exec.h @@ -70,11 +70,10 @@ namespace netlist // only used by nltool to create static c-code devices::nld_solver *solver() const noexcept { return m_solver; } - // force late type resolution + // FIXME: force late type resolution template - nl_fptype gmin(X *solv = nullptr) const noexcept + nl_fptype gmin([[maybe_unused]] X *solv = nullptr) const noexcept { - plib::unused_var(solv); return static_cast(m_solver)->gmin(); } diff --git a/src/lib/netlist/core/logic.h b/src/lib/netlist/core/logic.h index 51ddf0b9d18..350acc2995d 100644 --- a/src/lib/netlist/core/logic.h +++ b/src/lib/netlist/core/logic.h @@ -140,10 +140,9 @@ namespace netlist /// /// This function terminates if actually called. /// - [[noreturn]] static void set_tristate(netlist_sig_t v, - netlist_time ts_off_on, netlist_time ts_on_off) + [[noreturn]] static void set_tristate([[maybe_unused]] netlist_sig_t v, + [[maybe_unused]] netlist_time ts_off_on, [[maybe_unused]] netlist_time ts_on_off) { - plib::unused_var(v, ts_off_on, ts_on_off); plib::terminate("set_tristate on logic_output should never be called!"); } private: diff --git a/src/lib/netlist/core/nets.h b/src/lib/netlist/core/nets.h index 921e4670ba4..f3f4080b86b 100644 --- a/src/lib/netlist/core/nets.h +++ b/src/lib/netlist/core/nets.h @@ -17,11 +17,9 @@ #include "../plib/plists.h" #include "../plib/pstring.h" -// Enable the setting below to avoid queue pushes were at execution -// no action will be taken. This is academically cleaner, but slower than -// allowing this to happen and filter it during during "process". - -#define AVOID_NOOP_QUEUE_PUSHES (0) +#ifndef AVOID_NOOP_QUEUE_PUSHES +#error AVOID_NOOP_QUEUE_PUSHES not defined +#endif namespace netlist { @@ -72,12 +70,12 @@ namespace netlist m_next_scheduled_time = exec().time() + delay; #if (AVOID_NOOP_QUEUE_PUSHES) - m_in_queue = (m_list_active.empty() ? queue_status::DELAYED_DUE_TO_INACTIVE - : (m_new_Q != m_cur_Q ? queue_status::QUEUED : queue_status::DELIVERED)); + m_in_queue = (m_list_active.empty() ? queue_status::DELAYED_DUE_TO_INACTIVE + : (m_new_Q != m_cur_Q ? queue_status::QUEUED : queue_status::DELIVERED)); if (m_in_queue == queue_status::QUEUED) exec().qpush(m_next_scheduled_time, this); - else - update_inputs(); + else + update_inputs(); #else m_in_queue = m_list_active.empty() ? queue_status::DELAYED_DUE_TO_INACTIVE : queue_status::QUEUED; if (m_in_queue == queue_status::QUEUED) diff --git a/src/lib/netlist/core/queue.h b/src/lib/netlist/core/queue.h index 6286f407fc5..ea76c6851bc 100644 --- a/src/lib/netlist/core/queue.h +++ b/src/lib/netlist/core/queue.h @@ -76,9 +76,8 @@ namespace netlist::detail manager.save_item(this, &m_times[0], module + "." + "times", m_times.size()); manager.save_item(this, &m_net_ids[0], module + "." + "names", m_net_ids.size()); } - void on_pre_save(plib::state_manager_t &manager) override + void on_pre_save([[maybe_unused]] plib::state_manager_t &manager) override { - plib::unused_var(manager); m_qsize = this->size(); for (std::size_t i = 0; i < m_qsize; i++ ) { @@ -86,9 +85,8 @@ namespace netlist::detail m_net_ids[i] = m_get_id(this->listptr()[i].object()); } } - void on_post_load(plib::state_manager_t &manager) override + void on_post_load([[maybe_unused]] plib::state_manager_t &manager) override { - plib::unused_var(manager); this->clear(); for (std::size_t i = 0; i < m_qsize; i++ ) { diff --git a/src/lib/netlist/devices/nld_74123.cpp b/src/lib/netlist/devices/nld_74123.cpp index b7f4749d5b0..8f415cfa660 100644 --- a/src/lib/netlist/devices/nld_74123.cpp +++ b/src/lib/netlist/devices/nld_74123.cpp @@ -250,7 +250,7 @@ namespace netlist::devices { { return ((in[0]() ^ 1) | (in[1]() ^ 1)) & in[2](); // (~A1 | ~A2) & B } - template static constexpr netlist_sig_t clear(const T &in) { plib::unused_var(in); return 1;} + template static constexpr netlist_sig_t clear( [[maybe_unused]] const T &in) { return 1; } }; struct desc_9602 : public desc_74123 diff --git a/src/lib/netlist/devices/nld_74164.cpp b/src/lib/netlist/devices/nld_74164.cpp index c2df89bcd50..878e333df0f 100644 --- a/src/lib/netlist/devices/nld_74164.cpp +++ b/src/lib/netlist/devices/nld_74164.cpp @@ -26,7 +26,7 @@ *********************************************************************** Function Table: +-------------------------+----------------+ - | Inputs | Qutputs* | + | Inputs | Outputs* | +-------+-------+---------+----------------+ | Clear | Clock | A B | QA QB ... QH | +-------+-------+---------+----------------+ diff --git a/src/lib/netlist/devices/nlid_proxy.cpp b/src/lib/netlist/devices/nlid_proxy.cpp index d4b0080ca60..9fb8ddc1bae 100644 --- a/src/lib/netlist/devices/nlid_proxy.cpp +++ b/src/lib/netlist/devices/nlid_proxy.cpp @@ -1,9 +1,10 @@ // license:BSD-3-Clause // copyright-holders:Couriersud -/* - * nlid_proxy.cpp - * - */ + +/// +/// \file nlid_proxy.cpp +/// +/// #include "nlid_proxy.h" #include "core/setup.h" diff --git a/src/lib/netlist/macro/nlm_ttl74xx_lib.cpp b/src/lib/netlist/macro/nlm_ttl74xx_lib.cpp index bb95592825c..ad005764b0c 100644 --- a/src/lib/netlist/macro/nlm_ttl74xx_lib.cpp +++ b/src/lib/netlist/macro/nlm_ttl74xx_lib.cpp @@ -1411,7 +1411,7 @@ NETLIST_END() //- Package: DIP //- NamingConvention: Naming conventions follow National Semiconductor datasheet //- FunctionTable: -//- pdf.datasheetcatalog.com/datasheet/nationalsemiconductor/DS006367.PDF +//- http://pdf.datasheetcatalog.com/datasheet/nationalsemiconductor/DS006367.PDF //- //- +------+-----+---+---++---+----+ //- | CLRQ | CLK | J | K || Q | QQ | @@ -2658,7 +2658,7 @@ static NETLIST_START(TTL_9312_DIP) ) NETLIST_END() -// FIXME: Documenation +// FIXME: Documentation static NETLIST_START(TTL_9314_DIP) TTL_9314(A) @@ -2750,7 +2750,7 @@ static NETLIST_START(TTL_9321_DIP) NETLIST_END() -//FIXME: Documenation +//FIXME: Documentation static NETLIST_START(TTL_9334_DIP) TTL_9334(A) diff --git a/src/lib/netlist/nl_base.cpp b/src/lib/netlist/nl_base.cpp index e349fb77746..bdd9b1ac52c 100644 --- a/src/lib/netlist/nl_base.cpp +++ b/src/lib/netlist/nl_base.cpp @@ -216,7 +216,7 @@ namespace netlist ENTRY_EX(config::use_float_matrix::value) ENTRY_EX(config::use_long_double_matrix::value) ENTRY(NL_DEBUG) - ENTRY(NVCCBUILD) + ENTRY(__NVCC__) ENTRY(__cplusplus) ENTRY(__VERSION__) @@ -275,7 +275,7 @@ namespace netlist void netlist_t::reset() { - log().debug("Searching for mainclock\n"); + log().debug("Searching for main clock\n"); m_mainclock = m_state.get_single_device("mainclock"); log().debug("Searching for solver\n"); @@ -447,7 +447,7 @@ namespace netlist { auto *ep = entry.second.get(); auto *stats = ep->stats(); - // Factor of 3 offers best performace increase + // Factor of 3 offers best performance increase if (stats->m_stat_inc_active() > 3 * stats->m_stat_total_time.count() && stats->m_stat_inc_active() > trigger) log().verbose("HINT({}, NO_DEACTIVATE) // {} {} {}", ep->name(), @@ -725,7 +725,7 @@ namespace netlist // NOLINTNEXTLINE(readability-implicit-bool-conversion) if (!(gt && go && Idr) && (gt || go || Idr)) { - throw nl_exception("Inconsistent nullptrs for terminal {}", name()); + throw nl_exception("Either all pointers must be set or none for terminal {}", name()); } m_gt = gt; @@ -768,11 +768,10 @@ namespace netlist // logic_output_t // ---------------------------------------------------------------------------------------- - logic_output_t::logic_output_t(device_t &dev, const pstring &aname, bool dummy) + logic_output_t::logic_output_t(device_t &dev, const pstring &aname, [[maybe_unused]] bool dummy) : logic_t(dev, aname, STATE_OUT, nldelegate()) , m_my_net(dev.state(), name() + ".net", this) { - plib::unused_var(dummy); this->set_net(&m_my_net); state().register_net(device_arena::owned_ptr(&m_my_net, false)); state().setup().register_term(*this); @@ -829,7 +828,7 @@ namespace netlist // Parameters ... // ---------------------------------------------------------------------------------------- - // deviceless, it's the responsibility of the owner to register! + // device-less, it's the responsibility of the owner to register! param_t::param_t(const pstring &name) : device_object_t(nullptr, name) { @@ -880,7 +879,7 @@ namespace netlist param_str_t::param_str_t(netlist_state_t &state, const pstring &name, const pstring &val) : param_t(name) { - // deviceless parameter, no registration, owner is responsible + // device-less parameter, no registration, owner is responsible m_param = plib::make_unique(val); *m_param = state.setup().get_initial_param_val(this->name(),val); } diff --git a/src/lib/netlist/nl_config.h b/src/lib/netlist/nl_config.h index 41b16c78bc4..2ea84f37ba7 100644 --- a/src/lib/netlist/nl_config.h +++ b/src/lib/netlist/nl_config.h @@ -44,7 +44,6 @@ /// again. Compiling in all solvers may increase compile /// time significantly. /// - #ifndef NL_USE_ACADEMIC_SOLVERS #define NL_USE_ACADEMIC_SOLVERS (1) #endif @@ -58,33 +57,40 @@ /// By default it is disabled since it is not as fast as /// the default approach. It is up to 20% slower. /// - #ifndef NL_USE_COPY_INSTEAD_OF_REFERENCE -#define NL_USE_COPY_INSTEAD_OF_REFERENCE (0)//FIXME: Move to config struct later +#define NL_USE_COPY_INSTEAD_OF_REFERENCE (0) // FIXME: Move to config struct later #endif /// \brief Use backward Euler integration /// /// This will use backward Euler instead of trapezoidal integration. /// -/// FIXME: Longterm this will become a runtime setting. Only the capacitor model +/// FIXME: Long term this will become a runtime setting. Only the capacitor model /// currently has a trapezoidal version and there is no support currently for /// variable capacitors. /// The change will have impact on timings since trapezoidal improves timing /// accuracy. - #ifndef NL_USE_BACKWARD_EULER -#define NL_USE_BACKWARD_EULER (1) +#define NL_USE_BACKWARD_EULER (1) // FIXME: Move to config struct later #endif -/// \brief Use the __float128 type for matrix calculations. +/// \brief Compile matrix solvers using the __float128 type. /// /// Defaults to \ref PUSE_FLOAT128 - #ifndef NL_USE_FLOAT128 #define NL_USE_FLOAT128 PUSE_FLOAT128 #endif +/// \brief Avoid unnecessary queue pushes +/// +/// Enable the setting below to avoid queue pushes were at execution +/// no action will be taken. This is academically cleaner, but slower than +/// allowing this to happen and filter it during during "process". +/// This is used in core/nets.h +#ifndef AVOID_NOOP_QUEUE_PUSHES +#define AVOID_NOOP_QUEUE_PUSHES (0) // FIXME: Move to config struct later +#endif + //============================================================ // DEBUGGING //============================================================ @@ -149,8 +155,8 @@ namespace netlist /// \brief Resolution as clocks per second for timing /// - /// Uses 100 pico second resolution. This is aligned to MAME's - /// attotime resolution. + /// Uses 100 picosecond resolution. This is aligned to MAME's + /// `attotime` resolution. /// /// The table below shows the maximum run times depending on /// time type size and resolution. diff --git a/src/lib/netlist/nl_errstr.h b/src/lib/netlist/nl_errstr.h index b8f9340bad9..bca9d5c93ce 100644 --- a/src/lib/netlist/nl_errstr.h +++ b/src/lib/netlist/nl_errstr.h @@ -53,7 +53,7 @@ namespace netlist PERRMSGV(MF_TT_LINE_WITHOUT_HEAD, 0, "TT_LINE found without TT_HEAD") PERRMSGV(MF_LOCAL_SOURCE_NOT_FOUND_1, 1, "Local source not found: <{1}>") PERRMSGV(MF_EXTERNAL_SOURCE_IS_LOCAL_1, 1, "External lib entry appears as a local one: <{1}>") - PERRMSGV(MF_TRUTHTABLE_NOT_FOUND_1, 1, "Truthtable not found: <{1}>") + PERRMSGV(MF_TRUTHTABLE_NOT_FOUND_1, 1, "Truth table not found: <{1}>") // nl_setup.cpp @@ -99,7 +99,7 @@ namespace netlist PERRMSGV(MW_CONNECTING_1_TO_ITSELF, 1, "Connecting net {1} to itself.") PERRMSGV(MI_CONNECTING_1_TO_2_SAME_NET, 3, "Connecting terminals {1} and {2} which are already both on net {3}. " "It is ok if you read this warning and it relates to pin which is connected internally to GND and the schematics " - "show an external connection as well. Onde example is the CD4538. In other cases this warning may indicate " + "show an external connection as well. One example is the CD4538. In other cases this warning may indicate " "an error in your netlist.") PERRMSGV(ME_NC_PIN_1_WITH_CONNECTIONS, 1, "Found NC (not connected) terminal {1} with connections") PERRMSGV(MI_ANALOG_OUTPUT_1_WITHOUT_CONNECTIONS,1, "Found analog output {1} without connections") @@ -119,7 +119,7 @@ namespace netlist "but has been forced to act as a logic output. Parameter " " FORCE_TRISTATE_LOGIC for device {2} needs to be disabled!.") - PERRMSGV(MI_REMOVE_DEVICE_1_CONNECTED_ONLY_TO_RAILS_2_3, 3, "Found device {1} connected only to railterminals {2}/{3}." + PERRMSGV(MI_REMOVE_DEVICE_1_CONNECTED_ONLY_TO_RAILS_2_3, 3, "Found device {1} connected only to rail terminals {2}/{3}." " This may reflect the schematic - but as well be an error. Please review.") PERRMSGV(MW_DATA_1_NOT_FOUND, 1, "unable to find data {1} in sources collection") @@ -140,7 +140,7 @@ namespace netlist // nld_matrix_solver.cpp PERRMSGV(MF_UNHANDLED_ELEMENT_1_FOUND, 1, "setup_base:unhandled element <{1}> found") - PERRMSGV(MF_FOUND_TERM_WITH_MISSING_OTHERNET, 1, "found term with missing othernet {1}") + PERRMSGV(MF_FOUND_TERM_WITH_MISSING_OTHERNET, 1, "found term with missing other net {1}") PERRMSGV(MW_NEWTON_LOOPS_EXCEEDED_INVOCATION_3, 3, "NEWTON_LOOPS exceeded resolution invoked {1} times on net {2} at {3} us") PERRMSGV(MW_NEWTON_LOOPS_EXCEEDED_ON_NET_2, 2, "NEWTON_LOOPS exceeded resolution failed on net {1} ... reschedule at {2} us") diff --git a/src/lib/netlist/nl_factory.h b/src/lib/netlist/nl_factory.h index 38db6446403..a5981ef8e54 100644 --- a/src/lib/netlist/nl_factory.h +++ b/src/lib/netlist/nl_factory.h @@ -129,7 +129,6 @@ namespace factory { const pstring &name, std::tuple& args, std::index_sequence) { return plib::make_unique(pool, anetlist, name, std::forward(std::get(args))...); - //return anetlist.make_pool_object(anetlist, name, std::forward(std::get(args))...); } dev_uptr make_device(device_arena &pool, @@ -144,7 +143,6 @@ namespace factory { const pstring &name) override { return make_device(pool, anetlist, name, m_args); - //return pool.make_unique(anetlist, name); } static uptr create(const pstring &name, properties &&props, Args&&... args) diff --git a/src/lib/netlist/nl_interface.h b/src/lib/netlist/nl_interface.h index c601b6a41fe..8916c55fc74 100644 --- a/src/lib/netlist/nl_interface.h +++ b/src/lib/netlist/nl_interface.h @@ -33,6 +33,7 @@ namespace netlist /// The following code is an example on how to add the device to /// the netlist factory. /// + /// ``` /// const pstring pin(m_in); /// pstring dname = pstring("OUT_") + pin; /// @@ -48,7 +49,7 @@ namespace netlist /// /// parser.factory().add(dname, /// netlist::factory::properties("-", PSOURCELOC()), 1e-6, std::forward(lambda)); - /// + /// ``` template NETLIB_OBJECT(analog_callback) @@ -160,7 +161,6 @@ namespace netlist if (m_buffer != nullptr) { const nl_fptype v = (*m_buffer)[m_pos]; - //m_params[i]->set(v * m_param_mults[i]() + m_param_offsets[i]()); m_param_setter(v * m_param_mult() + m_param_offset()); } } diff --git a/src/lib/netlist/nl_parser.cpp b/src/lib/netlist/nl_parser.cpp index 0716d5bbfc2..cbca285718e 100644 --- a/src/lib/netlist/nl_parser.cpp +++ b/src/lib/netlist/nl_parser.cpp @@ -576,9 +576,8 @@ bool source_token_t::parse(nlparse_t &setup, const pstring &name) return false; } -plib::istream_uptr source_token_t::stream(const pstring &name) +plib::istream_uptr source_token_t::stream([[maybe_unused]] const pstring &name) { - plib::unused_var(name); return plib::istream_uptr(); } diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index 6ccc5fdc86a..a757456f6bf 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -135,7 +135,7 @@ namespace netlist } pstring paramfq = name + "." + tp; - log().debug("Defparam: {1}\n", paramfq); + log().debug("Default parameter: {1}\n", paramfq); register_param(paramfq, *ptok); @@ -496,12 +496,12 @@ pstring setup_t::termtype_as_str(detail::core_terminal_t &in) pstring setup_t::get_initial_param_val(const pstring &name, const pstring &def) const { - // when get_intial_param_val is called the parameter is already registered - // and the value (valstr()) is set to the default value, e.g. "74XX" - // If thus $(IC5E.A.MODEL) is given for name=="IC5E.A.MODEL" valstr() below + // When `get_intial_param_val` is called the parameter `` is already registered + // and the value `(valstr())` is set to the default value, e.g. "74XX" + // If thus `$(IC5E.A.MODEL)` is given for `name=="IC5E.A.MODEL"` `valstr()` below // will return the default. // FIXME: It may be more explicit and stable to test if pattern==name and return - // def in this case. + // `def` in this case. auto i = m_abstract.m_param_values.find(name); auto found_pat(false); @@ -839,7 +839,7 @@ void setup_t::merge_nets(detail::net_t &thisnet, detail::net_t &othernet) if (othernet.is_rail_net()) { - log().debug("othernet is railnet\n"); + log().debug("other net is a rail net\n"); merge_nets(othernet, thisnet); } else @@ -1704,25 +1704,22 @@ bool source_netlist_t::parse(nlparse_t &setup, const pstring &name) return (!strm.empty()) ? setup.parse_stream(std::move(strm), name) : false; } -plib::istream_uptr source_string_t::stream(const pstring &name) +plib::istream_uptr source_string_t::stream([[maybe_unused]] const pstring &name) { - plib::unused_var(name); plib::istream_uptr ret(std::make_unique(putf8string(m_str)), name); ret->imbue(std::locale::classic()); return ret; } -plib::istream_uptr source_mem_t::stream(const pstring &name) +plib::istream_uptr source_mem_t::stream( [[maybe_unused]] const pstring &name) { - plib::unused_var(name); plib::istream_uptr ret(std::make_unique(m_str, std::ios_base::binary), name); ret->imbue(std::locale::classic()); return ret; } -plib::istream_uptr source_file_t::stream(const pstring &name) +plib::istream_uptr source_file_t::stream( [[maybe_unused]] const pstring &name) { - plib::unused_var(name); auto f = std::make_unique(plib::filesystem::u8path(m_filename)); if (f->is_open()) { @@ -1732,7 +1729,7 @@ plib::istream_uptr source_file_t::stream(const pstring &name) return plib::istream_uptr(); } -plib::istream_uptr source_pattern_t::stream(const pstring &name) +plib::istream_uptr source_pattern_t::stream( [[maybe_unused]] const pstring &name) { pstring filename = plib::pfmt(m_pattern)(m_force_lowercase ? plib::lcase(name) : name); auto f = std::make_unique(plib::filesystem::u8path(filename)); @@ -1756,9 +1753,8 @@ bool source_proc_t::parse(nlparse_t &setup, const pstring &name) return false; } -plib::istream_uptr source_proc_t::stream(const pstring &name) +plib::istream_uptr source_proc_t::stream( [[maybe_unused]] const pstring &name) { - plib::unused_var(name); return plib::istream_uptr(); } diff --git a/src/lib/netlist/nl_setup.h b/src/lib/netlist/nl_setup.h index a4e9e626521..14c011fe2e2 100644 --- a/src/lib/netlist/nl_setup.h +++ b/src/lib/netlist/nl_setup.h @@ -37,7 +37,7 @@ #define DIPPINS(pin1, ...) \ setup.register_dip_alias_arr( # pin1 ", " # __VA_ARGS__); -// to be used to reference new library truthtable devices +// to be used to reference new library truth table devices #define NET_REGISTER_DEV(type, name) \ setup.register_dev(# type, # name); @@ -69,9 +69,8 @@ void NETLIST_NAME(name)(netlist::nlparse_t &setup); #define NETLIST_START(name) \ -void NETLIST_NAME(name)(netlist::nlparse_t &setup) \ +void NETLIST_NAME(name)([[maybe_unused]] netlist::nlparse_t &setup) \ { \ - plib::unused_var(setup); #define NETLIST_END() } @@ -105,7 +104,7 @@ void NETLIST_NAME(name)(netlist::nlparse_t &setup) \ setup.register_frontier(# attach, PSTRINGIFY_VA(r_in), PSTRINGIFY_VA(r_out)); // ----------------------------------------------------------------------------- -// truthtable defines +// truth table defines // ----------------------------------------------------------------------------- #define TRUTHTABLE_START(cname, in, out, pdef_params) \ @@ -139,7 +138,7 @@ namespace netlist { // ----------------------------------------------------------------------------- - // truthtable desc + // truth table desc // ----------------------------------------------------------------------------- struct tt_desc @@ -186,7 +185,7 @@ namespace netlist void register_link(const pstring &sin, const pstring &sout); void register_link_arr(const pstring &terms); - // also called from devices for latebinding connected terminals + // also called from devices for late binding connected terminals void register_link_fqn(const pstring &sin, const pstring &sout); void register_param(const pstring ¶m, const pstring &value); @@ -268,7 +267,6 @@ namespace netlist plib::psource_collection_t m_sources; detail::abstract_t & m_abstract; - //std::unordered_map m_source_cache; log_type &m_log; unsigned m_frontier_cnt; }; diff --git a/src/lib/netlist/nltypes.h b/src/lib/netlist/nltypes.h index 6d6fd2eb530..2c0ec0c1ad2 100644 --- a/src/lib/netlist/nltypes.h +++ b/src/lib/netlist/nltypes.h @@ -202,9 +202,8 @@ namespace netlist template struct times_ns1 { - static constexpr netlist_time value(std::size_t N = 0) + static constexpr netlist_time value([[maybe_unused]] std::size_t N = 0) { - plib::unused_var(N); return NLTIME_FROM_NS(value0); } }; diff --git a/src/lib/netlist/plib/gmres.h b/src/lib/netlist/plib/gmres.h index 1beb4b20041..91a06371b33 100644 --- a/src/lib/netlist/plib/gmres.h +++ b/src/lib/netlist/plib/gmres.h @@ -81,12 +81,11 @@ namespace plib template struct mat_precondition_diag { - mat_precondition_diag(std::size_t size, int dummy = 0) + mat_precondition_diag(std::size_t size, [[maybe_unused]] int dummy = 0) : m_mat(size) , m_diag(size) , nzcol(size) { - plib::unused_var(dummy); } template @@ -120,19 +119,19 @@ namespace plib // ILUT: 265% FT v(0.0); #if 0 - // doesn't works, Mame perforamnce drops significantly% + // doesn't works, Mame performance drops significantly% // 136% for (std::size_t j = m_mat.row_idx[i]; j< m_mat.row_idx[i+1]; j++) v += m_mat.A[j] * m_mat.A[j]; m_diag[i] = reciprocal(std::sqrt(v)); #elif 0 - // works halfway, i.e. Mame perforamnce 50% + // works halfway, i.e. Mame performance 50% // 147% - lowest average solution time with 7.094 for (std::size_t j = m_mat.row_idx[i]; j< m_mat.row_idx[i+1]; j++) v += m_mat.A[j] * m_mat.A[j]; m_diag[i] = m_mat.A[m_mat.diag[i]] / v; #elif 0 - // works halfway, i.e. Mame perforamnce 50% + // works halfway, i.e. Mame performance 50% // sum over column i // 344% - lowest average solution time with 3.06 std::size_t nzcolp = 0; @@ -145,7 +144,7 @@ namespace plib } m_diag[i] = m_mat.A[m_mat.diag[i]] / v; #elif 0 - // works halfway, i.e. Mame perforamnce 50% + // works halfway, i.e. Mame performance 50% // 151% for (std::size_t j = m_mat.row_idx[i]; j< m_mat.row_idx[i+1]; j++) v += plib::abs(m_mat.A[j]); @@ -175,10 +174,9 @@ namespace plib template struct mat_precondition_none { - mat_precondition_none(std::size_t size, int dummy = 0) + mat_precondition_none(std::size_t size, [[maybe_unused]] int dummy = 0) : m_mat(size) { - plib::unused_var(dummy); } template @@ -198,9 +196,8 @@ namespace plib } template - void solve_inplace(V &v) + void solve_inplace([[maybe_unused]] V &v) { - plib::unused_var(v); } plib::pmatrix_cr m_mat; @@ -344,9 +341,8 @@ namespace plib } template - bool do_k(OPS &ops, VT &x, std::size_t &itr_used, FT rho_delta, bool dummy) + bool do_k(OPS &ops, VT &x, std::size_t &itr_used, FT rho_delta, [[maybe_unused]] bool dummy) { - plib::unused_var(dummy); if (do_k(ops, x, itr_used, rho_delta, do_khelper::value)) return true; diff --git a/src/lib/netlist/plib/palloc.h b/src/lib/netlist/plib/palloc.h index 6c197aa9238..f565e02d7b6 100644 --- a/src/lib/netlist/plib/palloc.h +++ b/src/lib/netlist/plib/palloc.h @@ -90,15 +90,17 @@ namespace plib { { using arena_storage_type = P; - constexpr arena_deleter_base(arena_storage_type *a = nullptr) noexcept + constexpr arena_deleter_base( /*[[maybe_unused]]*/ arena_storage_type *a = nullptr) noexcept { + // gcc 7.2 (mingw) and 7.5 (ubuntu) don't accept maybe_unused here plib::unused_var(a); } template::value>::type> - arena_deleter_base(const arena_deleter_base &rhs) noexcept + arena_deleter_base( /*[[maybe_unused]]*/ const arena_deleter_base &rhs) noexcept { + // gcc 7.2 (mingw) and 7.5 (ubuntu) don't accept maybe_unused here plib::unused_var(rhs); } @@ -454,9 +456,8 @@ namespace plib { #endif } - bool operator ==(const aligned_arena &rhs) const noexcept + bool operator ==([[maybe_unused]] const aligned_arena &rhs) const noexcept { - plib::unused_var(rhs); return true; } @@ -464,10 +465,9 @@ namespace plib { struct std_arena : public arena_base { - static inline void *allocate( size_t alignment, size_t size ) + static inline void *allocate([[maybe_unused]] size_t alignment, size_t size ) { inc_alloc_stat(size); - unused_var(alignment); return ::operator new(size); } @@ -477,9 +477,8 @@ namespace plib { ::operator delete(ptr); } - bool operator ==(const aligned_arena &rhs) const noexcept + bool operator ==([[maybe_unused]] const aligned_arena &rhs) const noexcept { - plib::unused_var(rhs); return true; } }; @@ -636,9 +635,8 @@ namespace plib { ~paged_arena() = default; - static void *allocate(size_t align, size_t size) + static void *allocate([[maybe_unused]] size_t align, size_t size) { - plib::unused_var(align); //size = ((size + PG_SIZE - 1) / PG_SIZE) * PG_SIZE; return arena().allocate(PG_SIZE, size); } diff --git a/src/lib/netlist/plib/pchrono.h b/src/lib/netlist/plib/pchrono.h index be391502946..629d7573239 100644 --- a/src/lib/netlist/plib/pchrono.h +++ b/src/lib/netlist/plib/pchrono.h @@ -110,7 +110,7 @@ namespace plib { #if PUSE_ACCURATE_STATS && PHAS_RDTSCP // // kills performance completely, but is accurate - // cpuid serializes, but clobbers ebx and ecx + // `cpuid` serializes, but clobbers ebx and ecx // struct exact_ticks : public base_ticks diff --git a/src/lib/netlist/plib/pconfig.h b/src/lib/netlist/plib/pconfig.h index be56ad86507..d0dded12358 100644 --- a/src/lib/netlist/plib/pconfig.h +++ b/src/lib/netlist/plib/pconfig.h @@ -83,8 +83,8 @@ #define PALIGNAS_VECTOROPT() #endif -// FIXME: Breaks mame build on windows mingw due to -Wattribute -// also triggers -Wattribute on ARM +// FIXME: Breaks mame build on windows mingw due to `-Wattribute` +// also triggers `-Wattribute` on ARM // This is fixed on mingw version 10 // FIXME: no error on cross-compile - need further checks #if defined(__GNUC__) && ((defined(_WIN32) && __GNUC__ < 10) || defined(__arm__) || defined(__ARMEL__)) @@ -115,30 +115,16 @@ // //============================================================ -#if (NVCCBUILD > 0) - #if NVCCBUILD >= 101 - #define NVCC_CONSTEXPR constexpr - #else - #define NVCC_CONSTEXPR constexpr - #endif - #if NVCCBUILD < 113 - #if __cplusplus != 201402L - #error nvcc - use c++14 to compile - #endif - #endif +#if defined(_MSC_VER) + // Ok +#elif __cplusplus == 201103L + #error c++11 not supported - you need c++17 +#elif __cplusplus == 201402L + #error c++14 not supported - you need c++17 +#elif __cplusplus == 201703L + // Ok #else - #define NVCC_CONSTEXPR constexpr - #if __cplusplus == 201103L - #error c++11 not supported - you need c++14 - #elif __cplusplus == 201402L - // Ok - #elif __cplusplus == 201703L - // Ok - #elif defined(_MSC_VER) - // Ok - #else - #error "C++ version not supported" - #endif + #error "C++ version not supported" #endif diff --git a/src/lib/netlist/plib/pdynlib.cpp b/src/lib/netlist/plib/pdynlib.cpp index 7e9ea3ea73f..52fc5effb96 100644 --- a/src/lib/netlist/plib/pdynlib.cpp +++ b/src/lib/netlist/plib/pdynlib.cpp @@ -40,11 +40,10 @@ dynlib::dynlib(const pstring &libname) // printf("library <%s> not found: %s\n", libname.c_str(), dlerror()); } -dynlib::dynlib(const pstring &path, const pstring &libname) +dynlib::dynlib( [[maybe_unused]] const pstring &path, const pstring &libname) : m_lib(nullptr) { // FIXME: implement path search - plib::unused_var(path); // printf("win: loading <%s>\n", libname.c_str()); #ifdef _WIN32 if (!libname.empty()) diff --git a/src/lib/netlist/plib/pdynlib.h b/src/lib/netlist/plib/pdynlib.h index 04a6a354a69..4e8ce023d6f 100644 --- a/src/lib/netlist/plib/pdynlib.h +++ b/src/lib/netlist/plib/pdynlib.h @@ -7,14 +7,13 @@ /// /// \file pdynlib.h /// +/// Dynamic loading of libraries +/// #include "pstring.h" #include "ptypes.h" namespace plib { - // ---------------------------------------------------------------------------------------- - // pdynlib: dynamic loading of libraries ... - // ---------------------------------------------------------------------------------------- class dynlib_base { @@ -46,7 +45,7 @@ namespace plib { { public: explicit dynlib(const pstring &libname); - dynlib(const pstring &path, const pstring &libname); + dynlib(/*[[maybe_unused]]*/ const pstring &path, const pstring &libname); ~dynlib() override; diff --git a/src/lib/netlist/plib/pexception.cpp b/src/lib/netlist/plib/pexception.cpp index 86e7e732b45..bd2d81847a6 100644 --- a/src/lib/netlist/plib/pexception.cpp +++ b/src/lib/netlist/plib/pexception.cpp @@ -104,7 +104,7 @@ namespace plib { bool fpsignalenabler::m_enable = false; // NOLINT - //FIXME: mingw needs to be compiled with "-fnon-call-exceptions" + //FIXME: mingw needs to be compiled with `-fnon-call-exceptions` fpsignalenabler::fpsignalenabler(unsigned fpexceptions) { diff --git a/src/lib/netlist/plib/pexception.h b/src/lib/netlist/plib/pexception.h index d07122b7ebb..3b896f2b3dd 100644 --- a/src/lib/netlist/plib/pexception.h +++ b/src/lib/netlist/plib/pexception.h @@ -83,7 +83,7 @@ namespace plib { }; // FIXME: currently only a stub for later use. More use could be added by - // using “-fnon-call-exceptions" and sigaction to enable c++ exception supported. + // using `-fnon-call-exceptions` and sigaction to enable c++ exception supported. // class fpexception_e : public pexception diff --git a/src/lib/netlist/plib/pmath.h b/src/lib/netlist/plib/pmath.h index d28090079e3..311a928a597 100644 --- a/src/lib/netlist/plib/pmath.h +++ b/src/lib/netlist/plib/pmath.h @@ -15,7 +15,7 @@ #include #include -// quadmath.h included by ptypes.h +// `quadmath.h` included by `ptypes.h` namespace plib { diff --git a/src/lib/netlist/plib/pomp.h b/src/lib/netlist/plib/pomp.h index 27b4cc74c2a..d698d6ea34f 100644 --- a/src/lib/netlist/plib/pomp.h +++ b/src/lib/netlist/plib/pomp.h @@ -55,12 +55,10 @@ void for_static_np(const I start, const I end, const T &what) noexcept(noexcept( } -inline void set_num_threads(const std::size_t threads) noexcept +inline void set_num_threads([[maybe_unused]] const std::size_t threads) noexcept { #if PHAS_OPENMP && PUSE_OPENMP omp_set_num_threads(threads); -#else - plib::unused_var(threads); #endif } diff --git a/src/lib/netlist/plib/poptions.cpp b/src/lib/netlist/plib/poptions.cpp index 5b4b2228df1..b7e0b595114 100644 --- a/src/lib/netlist/plib/poptions.cpp +++ b/src/lib/netlist/plib/poptions.cpp @@ -26,9 +26,8 @@ namespace plib { return 0; } - int option_bool::parse(const pstring &argument) + int option_bool::parse([[maybe_unused]] const pstring &argument) { - unused_var(argument); m_val = true; return 0; } diff --git a/src/lib/netlist/plib/ppmf.cpp b/src/lib/netlist/plib/ppmf.cpp index 8100b94ade0..05493f98d2f 100644 --- a/src/lib/netlist/plib/ppmf.cpp +++ b/src/lib/netlist/plib/ppmf.cpp @@ -15,7 +15,7 @@ namespace plib { - void mfp_raw::convert_to_generic(generic_function &func, mfp_generic_class *&object) const + void mfp_raw::convert_to_generic(generic_function &func, mfp_generic_class *&object) const { // apply the "this" delta to the object first // NOLINTNEXTLINE(clang-analyzer-core.UndefinedBinaryOperatorResult,cppcoreguidelines-pro-type-reinterpret-cast) @@ -42,7 +42,7 @@ namespace plib { object = o_p_delta; } - void mfp_raw::convert_to_generic(generic_function &func, mfp_generic_class *&object) const + void mfp_raw::convert_to_generic(generic_function &func, mfp_generic_class *&object) const { // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) object = reinterpret_cast(reinterpret_cast(object) + (m_this_delta >> 1)); @@ -64,9 +64,9 @@ namespace plib { } } - struct unknown_base_equiv_novtdisp { mfp_raw::generic_function fptr; int thisdisp, vptrdisp; }; + struct unknown_base_equiv_novtdisp { mfp_raw::generic_function fptr; int thisdisp, vptrdisp; }; - void mfp_raw::convert_to_generic(generic_function &func, mfp_generic_class *&object) const + void mfp_raw::convert_to_generic(generic_function &func, mfp_generic_class *&object) const { //printf("%lx, %lx, %lx, %lx %lx\n", m_function, m_this_delta, m_vptr_offs, m_vt_index, m_size); diff --git a/src/lib/netlist/plib/ppmf.h b/src/lib/netlist/plib/ppmf.h index 31818f9f12c..b188ca0cd81 100644 --- a/src/lib/netlist/plib/ppmf.h +++ b/src/lib/netlist/plib/ppmf.h @@ -20,7 +20,7 @@ /// Use the same approach as MAME for deriving the function pointer. /// This is compiler-dependent as well /// -/// Benchmarks for ./nltool -c run -t 10 -n pongf src/mame/machine/nl_pongf.cpp +/// Benchmarks for `./nltool -c run -t 10 -n pongf src/mame/machine/nl_pongf.cpp` /// /// PMF_TYPE_INTERNAL: 215% 215% 564% 580% /// PMF_TYPE_GNUC_PMF: 163% 196% 516% 490% @@ -31,7 +31,7 @@ /// \brief Enable experimental code on Visual Studio builds and VS clang llvm builds /// /// This enables experimental code which uses optimized builds the -/// PPMF_TYPE_INTERNAL_MSC path also for complex (struct/union) return types. +/// ppmf_type::INTERNAL_MSC path also for complex (struct/union) return types. /// This currently depends on whether the code can adequately determine on /// x64 builds if the return type is returned through registers or passed as a /// second argument as a pointer to the member function. @@ -46,7 +46,9 @@ /// /// This code path is disabled by default currently. /// +#if !defined(PPMF_EXPERIMENTAL) #define PPMF_EXPERIMENTAL 0 +#endif /// brief Enable using MAME delegates as a replacement for ppmf. /// @@ -54,7 +56,9 @@ /// as a replacement to ppmf. Enable this setting if you want to use the nltool /// test suite (nltool -c tests) to produce comparisons to ppmf. /// +#if !defined(PPMF_USE_MAME_DELEGATES) #define PPMF_USE_MAME_DELEGATES 0 +#endif #if PPMF_USE_MAME_DELEGATES @@ -87,39 +91,43 @@ namespace plib { //#define PPMF_FORCE_TYPE 0 -#define PPMF_TYPE_PMF 0 -#define PPMF_TYPE_GNUC_PMF_CONV 1 -#define PPMF_TYPE_INTERNAL_ITANIUM 2 -#define PPMF_TYPE_INTERNAL_ARM 3 -#define PPMF_TYPE_INTERNAL_MSC 4 - #ifndef PPMF_FORCE_TYPE #define PPMF_FORCE_TYPE -1 #endif namespace plib { - struct ppmf_internal + enum class ppmf_type + { + PMF, + GNUC_PMF_CONV, + INTERNAL_ITANIUM, + INTERNAL_ARM, + INTERNAL_MSC + }; + + + struct ppmf_internal_selector { using ci = compile_info; - enum { value = - (PPMF_FORCE_TYPE >= 0) ? PPMF_FORCE_TYPE : + constexpr static ppmf_type value = + (PPMF_FORCE_TYPE >= 0) ? static_cast(PPMF_FORCE_TYPE) : (ci::type() == ci_compiler::CLANG && !ci::m64() - && ci::os() == ci_os::WINDOWS) ? PPMF_TYPE_PMF : - (ci::mingw() && !ci::m64() && ci::version() >= 407) ? PPMF_TYPE_PMF : - (ci::mingw() && !ci::m64()) ? PPMF_TYPE_PMF : // Dropped support for mingw32 < 407 PPMF_TYPE_INTERNAL_ITANIUM : - (ci::env() == ci_env::MSVC && ci::m64()) ? PPMF_TYPE_INTERNAL_MSC : + && ci::os() == ci_os::WINDOWS) ? ppmf_type::PMF : + (ci::mingw() && !ci::m64() && ci::version::full() >= typed_version<4,7>::full()) ? ppmf_type::PMF : + (ci::mingw() && !ci::m64()) ? ppmf_type::PMF : // Dropped support for mingw32 < 407 ppmf_type::INTERNAL_ITANIUM : + (ci::env() == ci_env::MSVC && ci::m64()) ? ppmf_type::INTERNAL_MSC : ((ci::type() == ci_compiler::CLANG || ci::type() == ci_compiler::GCC) && (ci::arch() == ci_arch::MIPS || ci::arch() == ci_arch::ARM - || ci::os() == ci_os::EMSCRIPTEN)) ? PPMF_TYPE_INTERNAL_ARM : - (ci::type() == ci_compiler::CLANG || ci::type() == ci_compiler::GCC) ? PPMF_TYPE_INTERNAL_ITANIUM : - PPMF_TYPE_PMF - }; + || ci::os() == ci_os::EMSCRIPTEN)) ? ppmf_type::INTERNAL_ARM : + (ci::type() == ci_compiler::CLANG || ci::type() == ci_compiler::GCC) ? ppmf_type::INTERNAL_ITANIUM : + ppmf_type::PMF + ; }; - static_assert(!(compile_info::type() == ci_compiler::CLANG && (PPMF_FORCE_TYPE) == (PPMF_TYPE_GNUC_PMF_CONV)), "clang does not support PPMF_TYPE_GNUC_PMF_CONV"); - static_assert(!(compile_info::type() == ci_compiler::NVCC && (PPMF_FORCE_TYPE) == (PPMF_TYPE_GNUC_PMF_CONV)), "nvcc does not support PPMF_TYPE_GNUC_PMF_CONV"); + static_assert(!(compile_info::type() == ci_compiler::CLANG && ppmf_internal_selector::value == (ppmf_type::GNUC_PMF_CONV)), "clang does not support ppmf_type::GNUC_PMF_CONV"); + static_assert(!(compile_info::env() == ci_env::NVCC && ppmf_internal_selector::value == (ppmf_type::GNUC_PMF_CONV)), "nvcc does not support ppmf_type::GNUC_PMF_CONV"); template struct mfp_traits @@ -138,11 +146,11 @@ namespace plib { /// /// The following class was derived from the MAME delegate.h code. /// - template + template class mfp_raw; template <> - class mfp_raw + class mfp_raw { public: // construct from any member function pointer @@ -156,14 +164,14 @@ namespace plib { // actual state uintptr_t m_function; // first item can be one of two things: - // if even, it's a pointer to the function - // if odd, it's the byte offset into the vtable - // or a byte offset into the function descriptors on IA64 + // if even, it's a pointer to the function + // if odd, it's the byte offset into the vtable + // or a byte offset into the function descriptors on IA64 ptrdiff_t m_this_delta; // delta to apply to the 'this' pointer }; template <> - class mfp_raw + class mfp_raw { public: // construct from any member function pointer @@ -178,12 +186,12 @@ namespace plib { // actual state uintptr_t m_function; // first item can pointer to the function or a byte offset into the vtable ptrdiff_t m_this_delta; // delta to apply to the 'this' pointer after right shifting by one bit - // m_function is the byte offset into the vtable - // On IA64 it may also be a byte offset into the function descriptors + // m_function is the byte offset into the vtable + // On IA64 it may also be a byte offset into the function descriptors }; template <> - class mfp_raw + class mfp_raw { public: // construct from any member function pointer @@ -214,11 +222,11 @@ namespace plib { std::is_same_v, compile_info::int128_type> || std::is_same_v, compile_info::uint128_type> >; - template + template struct mfp_helper { protected: - static_assert(PMFINTERNAL >= PPMF_TYPE_INTERNAL_ITANIUM && PMFINTERNAL <= PPMF_TYPE_INTERNAL_MSC, "Invalid PMF type"); + static_assert(PMFINTERNAL >= ppmf_type::INTERNAL_ITANIUM && PMFINTERNAL <= ppmf_type::INTERNAL_MSC, "Invalid PMF type"); using traits = mfp_traits; using generic_member_function = typename traits::template specific_member_function; @@ -262,7 +270,7 @@ namespace plib { }; template - struct mfp_helper + struct mfp_helper { protected: using traits = mfp_traits; @@ -292,9 +300,9 @@ namespace plib { static R stub(const generic_member_function* funci, mfp_generic_class* obji, Targs&&... args) noexcept(true); }; -#if NVCCBUILD == 0 +#if !defined(__NVCC__) template - struct mfp_helper + struct mfp_helper { protected: using traits = mfp_traits; @@ -319,15 +327,15 @@ namespace plib { }; #endif - template + template using pmfp_helper_select = std::conditional< pmf_is_register_return_type::value - || PMFINTERNAL != PPMF_TYPE_INTERNAL_MSC || (PPMF_EXPERIMENTAL), - mfp_helper, mfp_helper>; + || PMFINTERNAL != ppmf_type::INTERNAL_MSC || (PPMF_EXPERIMENTAL), + mfp_helper, mfp_helper>; - template class pmfp_base; + template class pmfp_base; - template + template class pmfp_base : public pmfp_helper_select::type { public: @@ -377,7 +385,7 @@ namespace plib { }; template - using pmfp = pmfp_base; + using pmfp = pmfp_base; /// /// \brief Class to support delegate late binding @@ -424,7 +432,7 @@ namespace plib { }; template - mfp_raw::mfp_raw(MemberFunctionType mftp) + mfp_raw::mfp_raw(MemberFunctionType mftp) : m_function(0), m_this_delta(0) { static_assert(sizeof(*this) >= sizeof(MemberFunctionType), "size mismatch"); @@ -433,7 +441,7 @@ namespace plib { } template - mfp_raw::mfp_raw(MemberFunctionType mftp) + mfp_raw::mfp_raw(MemberFunctionType mftp) : m_function(0), m_this_delta(0) { static_assert(sizeof(*this) >= sizeof(MemberFunctionType), "size mismatch"); @@ -441,7 +449,7 @@ namespace plib { } template - mfp_raw::mfp_raw(MemberFunctionType mftp) + mfp_raw::mfp_raw(MemberFunctionType mftp) : m_function(0), m_this_delta(0), m_vptr_index(0), m_vt_index(0), m_size(0) { static_assert(sizeof(*this) >= sizeof(MemberFunctionType), "size mismatch"); @@ -449,7 +457,7 @@ namespace plib { m_size = sizeof(mftp); //NOLINT } - template + template mfp_helper::mfp_helper() : m_obj(nullptr) { @@ -458,7 +466,7 @@ namespace plib { std::fill(s, s + sizeof(m_resolved), 0); } - template + template template void mfp_helper::bind(O *object, F *mftp) { @@ -478,7 +486,7 @@ namespace plib { } template - mfp_helper::mfp_helper() + mfp_helper::mfp_helper() : m_obj(nullptr) , m_stub(nullptr) { @@ -489,7 +497,7 @@ namespace plib { template template - void mfp_helper::bind(O *object, F *mftp) + void mfp_helper::bind(O *object, F *mftp) { reinterpret_copy(*mftp, this->m_resolved); // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) @@ -499,7 +507,7 @@ namespace plib { template template - R mfp_helper::stub(const generic_member_function* funci, mfp_generic_class* obji, Targs&&... args) noexcept(true) + R mfp_helper::stub(const generic_member_function* funci, mfp_generic_class* obji, Targs&&... args) noexcept(true) { // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) auto* obj = reinterpret_cast(obji); @@ -508,9 +516,9 @@ namespace plib { return (obj->*(*func))(std::forward(args)...); } -#if NVCCBUILD == 0 +#if !defined(__NVCC__) template - mfp_helper::mfp_helper() + mfp_helper::mfp_helper() : m_obj(nullptr) { // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) @@ -520,7 +528,7 @@ namespace plib { template template - void mfp_helper::bind(O *object, F *mftp) + void mfp_helper::bind(O *object, F *mftp) { // NOLINTNEXTLINE(cppcoreguidelines-pro-type-reinterpret-cast) member_abi_function t = reinterpret_cast>(object->*(*mftp)); diff --git a/src/lib/netlist/plib/ppreprocessor.h b/src/lib/netlist/plib/ppreprocessor.h index 8fd8db1ac44..1e21e72a5b0 100644 --- a/src/lib/netlist/plib/ppreprocessor.h +++ b/src/lib/netlist/plib/ppreprocessor.h @@ -52,8 +52,8 @@ namespace plib { /// /// \param filename a filename or identifier identifying the stream. /// - /// FIXME: this is sub-optimal. Refactor input_context into pinput_context - /// and pass this to ppreprocessor. + /// FIXME: this is sub-optimal. Refactor input_context into `pinput`_context + /// and pass this to `ppreprocessor`. /// template pstring process(T &&istrm, const pstring &filename) diff --git a/src/lib/netlist/plib/prandom.h b/src/lib/netlist/plib/prandom.h index 03e066f94cd..062e0507705 100644 --- a/src/lib/netlist/plib/prandom.h +++ b/src/lib/netlist/plib/prandom.h @@ -145,9 +145,8 @@ namespace plib } template - void save_state(ST &st) + void save_state([[maybe_unused]] ST &st) { - plib::unused_var(st); /* no state to save */ } diff --git a/src/lib/netlist/plib/pstonum.h b/src/lib/netlist/plib/pstonum.h index 7b3492c29d0..18c67ca2b86 100644 --- a/src/lib/netlist/plib/pstonum.h +++ b/src/lib/netlist/plib/pstonum.h @@ -85,7 +85,7 @@ namespace plib template<> struct pstonum_helper { - // FIXME: use strtoflt128 from quadmath.h + // FIXME: use `strtoflt128` from `quadmath.h` template FLOAT128 operator()(std::locale loc, const S &arg, bool *err) { diff --git a/src/lib/netlist/plib/pstream.h b/src/lib/netlist/plib/pstream.h index 0d1545e58b3..30c9f2b5c08 100644 --- a/src/lib/netlist/plib/pstream.h +++ b/src/lib/netlist/plib/pstream.h @@ -16,7 +16,6 @@ #include #include -#include #include #include #include @@ -26,7 +25,7 @@ namespace plib { - /// \brief wrapper around isteam read + /// \brief wrapper around istream read /// template static S & istream_read(S &is, T * data, size_t len) @@ -37,7 +36,7 @@ namespace plib { return is.read(reinterpret_cast(data), gsl::narrow(len * sizeof(T))); } - /// \brief wrapper around osteam write + /// \brief wrapper around ostream write /// template static S & ostream_write(S &os, const T * data, size_t len) @@ -366,7 +365,7 @@ class ifstream : public std::ifstream { public: - using filename_type = std::conditional=900), + using filename_type = std::conditional=9), pstring_t, pstring_t>::type; template @@ -387,7 +386,7 @@ public: class ofstream : public std::ofstream { public: - using filename_type = std::conditional=900), + using filename_type = std::conditional=9), pstring_t, pstring_t>::type; template diff --git a/src/lib/netlist/plib/ptests.h b/src/lib/netlist/plib/ptests.h index 1aac62997f4..856cbacf735 100644 --- a/src/lib/netlist/plib/ptests.h +++ b/src/lib/netlist/plib/ptests.h @@ -15,6 +15,8 @@ #include #include #include +#include +#include #if defined(__clang__) #pragma clang diagnostic ignored "-Wglobal-constructors" @@ -35,43 +37,80 @@ #define PTEST(name, desc) PINT_TEST(name, desc) #define PTEST_F(name, desc) PINT_TEST_F(name, desc, name) -#define PRUN_ALL_TESTS() plib::testing::run_all_tests() +#define PRUN_ALL_TESTS(loglevel) plib::testing::run_all_tests(loglevel) #define PINT_TEST(name, desc) PINT_TEST_F(name, desc, plib::testing::Test) +#define PINT_TESTNAME(name, desc) name ## _ ## desc +#define PINT_LOCATION() ::plib::testing::test_location(__FILE__, __LINE__) +#define PINT_SET_LAST(loc) this->m_parameters->m_last_source = loc + +#define PINT_REGISTER(name, desc) \ + extern const plib::testing::reg_entry PINT_TESTNAME(name, desc ## _reg); \ + const plib::testing::reg_entry PINT_TESTNAME(name, desc ## _reg)(#name, #desc, PINT_LOCATION()); \ + #define PINT_TEST_F(name, desc, base) \ - class name ## _ ## desc : public base \ + class PINT_TESTNAME(name, desc) : public base \ { public:\ void desc (); \ void run() override { desc (); } \ }; \ - extern const plib::testing::reg_entry name ## _ ## desc ## _reg; \ - const plib::testing::reg_entry name ## _ ## desc ## _reg(#name, #desc); \ - void name ## _ ## desc :: desc () + PINT_REGISTER(name, desc) \ + void PINT_TESTNAME(name, desc) :: desc () #define PINT_EXPECT(comp, exp1, exp2) \ - if (!plib::testing::internal_assert(plib::testing::comp_ ## comp (), # exp1, # exp2, exp1, exp2)) \ - std::cout << __FILE__ << ":" << __LINE__ << ":1: error: test failed\n" + if (true) \ + { \ + ::plib::testing::test_location source = PINT_LOCATION(); PINT_SET_LAST(source); \ + m_parameters->m_num_tests++; \ + if (!this->internal_assert(plib::testing::comp_ ## comp (), # exp1, # exp2, exp1, exp2)) \ + this->test_error(source) << "test failed" << std::endl; \ + } else do {} while (0) #define PINT_EXPECT_THROW(exp, excep) \ - if (const char *ptest_f = __FILE__) \ + if (true) \ { \ - try { exp; std::cout << ptest_f << ":" << __LINE__ << ":1: error: no " #excep " exception thrown\n";} \ - catch (excep &) { std::cout << "\tOK: got " #excep " for " # exp "\n";} \ - catch (std::exception &ptest_e) { std::cout << ptest_f << ":" << __LINE__ << ":1: error: unexpected exception thrown: " << ptest_e.what() << "\n"; } \ - catch (...) { std::cout << ptest_f << ":" << __LINE__ << ":1: error: unexpected exception thrown\n"; } \ + ::plib::testing::test_location source = PINT_LOCATION(); PINT_SET_LAST(source); \ + m_parameters->m_num_tests++; \ + try { exp; this->test_error(source) << "no " #excep " exception thrown" << std::endl;} \ + catch (excep &) { this->test_ok() << "got " #excep " for " # exp "" << std::endl;} \ + catch (std::exception &ptest_e) { this->test_error(source) << "unexpected exception thrown: " << ptest_e.what() << std::endl; } \ + catch (...) { this->test_error(source) << "unexpected exception thrown" << std::endl; } \ } else do {} while (0) #define PINT_EXPECT_NO_THROW(exp) \ - if (const char *ptest_f = __FILE__) \ + if (true) \ { \ - try { exp; std::cout << "\tOK: got no exception for " # exp "\n";} \ - catch (std::exception &ptest_e) { std::cout << ptest_f << ":" << __LINE__ << ":1: error: unexpected exception thrown: " << ptest_e.what() << "\n"; } \ - catch (...) { std::cout << ptest_f << ":" << __LINE__ << ":1: error: unexpected exception thrown\n"; } \ + ::plib::testing::test_location source = PINT_LOCATION(); PINT_SET_LAST(source); \ + m_parameters->m_num_tests++; \ + try { exp; this->test_ok() << "got no exception for " # exp << std::endl;} \ + catch (std::exception &ptest_e) { this->test_error(source) << "unexpected exception thrown: " << ptest_e.what() << std::endl; } \ + catch (...) { this->test_error(source) << "unexpected exception thrown" << std::endl; } \ } else do {} while (0) namespace plib::testing { + enum class loglevel + { + INFO, + WARNING, + ERROR + }; + + using test_location = std::pair; + + struct test_parameters + { + loglevel m_loglevel = loglevel::INFO; + std::size_t m_num_errors = 0; + std::size_t m_num_tests = 0; + test_location m_last_source = {"", 0 }; + }; + + static std::ostream &stream_error(std::ostream &os, test_location loc) + { + return os << loc.first << ":" << loc.second << ":1: error: "; + } class Test { @@ -87,13 +126,54 @@ namespace plib::testing virtual void run() {} virtual void SetUp() {} virtual void TearDown() {} + + void set_parameters(test_parameters *params) + { + m_parameters = params; + } + protected: + std::ostream & test_ok() { return output(loglevel::INFO) << "\tOK: "; } + std::ostream & test_fail() { return output(loglevel::WARNING) << "\tFAIL: "; } + std::ostream & test_error(const test_location & loc) + { + return stream_error(output(loglevel::ERROR), loc); + } + + template + bool internal_assert(C comp, + const char* exp1, const char* exp2, + const T1& val1, const T2& val2); + test_parameters *m_parameters = nullptr; + private: + std::ostream &output(loglevel ll) + { + if (ll == loglevel::ERROR) + m_parameters->m_num_errors++; + return (ll >= m_parameters->m_loglevel) ? std::cout : m_nulstream; + } + std::ostringstream m_nulstream; }; + template + bool Test::internal_assert(C comp, + const char* exp1, const char* exp2, + const T1& val1, const T2& val2) + { + if (comp(val1, val2)) + { + test_ok() << exp1 << " " << C::opstr() << " " << exp2 << std::endl; + return true; + } + test_fail() << exp1 << " " << C::opstr() << " " << exp2 + << " <" << val1 << ">,<" << val2 << ">" << std::endl; + return false; + } + struct reg_entry_base { using list_t = std::vector; - reg_entry_base(const std::string &n, const std::string &d) - : name(n), desc(d) + reg_entry_base(const char *n, const char *d, test_location l) + : name(n), desc(d), location(l) { registry().push_back(this); } @@ -107,8 +187,9 @@ namespace plib::testing virtual Test *create() const { return nullptr; } - std::string name; - std::string desc; + const char *name; + const char *desc; + test_location location; public: static list_t & registry() { @@ -125,36 +206,81 @@ namespace plib::testing Test *create() const override { return new T(); } // NOLINT }; - template - bool internal_assert(C comp, - const char* exp1, const char* exp2, - const T1& val1, const T2& val2) + template + std::pair catch_exception(L lambda) { - if (comp(val1, val2)) + try { + lambda(); + } + catch (std::exception &ptest_e) { - std::cout << "\tOK: " << exp1 << " " << C::opstr() << " " << exp2 << "\n"; - return true; + return { true, ptest_e.what() }; } - std::cout << "\tFAIL: " << exp1 << " " << C::opstr() << " " << exp2 - << " <" << val1 << ">,<" << val2 << ">\n"; - return false; + catch (...) + { + return { true, "" }; + } + return { false, "" }; } - static inline int run_all_tests() + static inline int run_all_tests(loglevel ll) { - std::cout << "======================================\n"; - std::cout << "Running " << reg_entry_base::registry().size() << " tests\n"; - std::cout << "======================================\n"; - for (auto &e : reg_entry_base::registry()) + std::cout << "================================================" << std::endl; + std::cout << "Running " << reg_entry_base::registry().size() << " test groups" << std::endl; + std::cout << "================================================" << std::endl; + + auto &list = reg_entry_base::registry(); + + std::sort(list.begin(), list.end(), [](reg_entry_base *a, reg_entry_base *b) { + return (a->name < b->name); + }); + + std::size_t total_errors(0); + std::size_t total_tests(0); + + for (auto &e : list) { - std::cout << e->name << "::" << e->desc << ":\n"; - Test *t = e->create(); - t->SetUp(); - t->run(); - t->TearDown(); - delete t; + test_parameters params; + params.m_loglevel = ll; + params.m_last_source = e->location; + + std::cout << e->name << "::" << e->desc << ":" << std::endl; + Test *t = nullptr; + + std::pair r; + if ((r = catch_exception([&]{ + t = e->create(); + t->set_parameters(¶ms); + })).first) + { + stream_error(std::cout, e->location) << "unexpected exception thrown during instantiation" << (r.second != "" ? ": " + r.second : "") << std::endl; + total_errors++; + } + else if ((r = catch_exception([&]{ t->SetUp(); })).first) + { + stream_error(std::cout, e->location) << "unexpected exception thrown during Setup" << (r.second != "" ? ": " + r.second : "") << std::endl; + total_errors++; + } + else if ((r = catch_exception([&]{ t->run(); })).first) + { + stream_error(std::cout, params.m_last_source) << "unexpected exception thrown during run after this line" << (r.second != "" ? ": " + r.second : "") << std::endl; + total_errors++; + } + else if ((r = catch_exception([&]{ t->TearDown(); })).first) + { + stream_error(std::cout, e->location) << "unexpected exception thrown during Teardown" << (r.second != "" ? ": " + r.second : "") << std::endl; + total_errors++; + } + + total_errors += params.m_num_errors; + total_tests += params.m_num_tests; + if (t != nullptr) + delete t; } - return 0; + std::cout << "================================================" << std::endl; + std::cout << "Found " << total_errors << " errors in " << total_tests << " tests from " << reg_entry_base::registry().size() << " test groups" << std::endl; + std::cout << "================================================" << std::endl; + return (total_errors ? 1 : 0); } #define DEF_COMP(name, op) \ diff --git a/src/lib/netlist/plib/ptime.h b/src/lib/netlist/plib/ptime.h index 3d5c912f812..cb597aa590f 100644 --- a/src/lib/netlist/plib/ptime.h +++ b/src/lib/netlist/plib/ptime.h @@ -60,10 +60,9 @@ namespace plib } template , ptime>::value, int>> - constexpr explicit ptime(const ptime &rhs, T dummy = 0) noexcept + constexpr explicit ptime(const ptime &rhs,[[maybe_unused]] T dummy = 0) noexcept : m_time(static_cast(rhs.m_time)) { - plib::unused_var(dummy); } template diff --git a/src/lib/netlist/plib/ptypes.h b/src/lib/netlist/plib/ptypes.h index 12e2a73f826..7f09a083793 100644 --- a/src/lib/netlist/plib/ptypes.h +++ b/src/lib/netlist/plib/ptypes.h @@ -81,8 +81,7 @@ namespace plib UNKNOWN, CLANG, GCC, - MSC, - NVCC + MSC }; enum class ci_cpp_stdlib @@ -115,7 +114,18 @@ namespace plib enum class ci_env { DEFAULT, - MSVC + MSVC, + NVCC + }; + + // on ubuntu system may define major and minor as macros + // That's why we use vmajor, .. here + template + struct typed_version + { + using vmajor = std::integral_constant; + using vminor = std::integral_constant; + using full = std::integral_constant; }; struct compile_info @@ -144,21 +154,18 @@ namespace plib static constexpr int128_type int128_max() { return int128_type(); } static constexpr uint128_type uint128_max() { return uint128_type(); } #endif - #if (NVCCBUILD > 0) - using type = std::integral_constant; - using version = std::integral_constant; - #elif defined(__clang__) + #if defined(__clang__) using type = std::integral_constant; - using version = std::integral_constant; + using version = typed_version<__clang_major__, __clang_minor__>; #elif defined(__GNUC__) using type = std::integral_constant; - using version = std::integral_constant; + using version = typed_version< __GNUC__, __GNUC_MINOR__ >; #elif defined(_MSC_VER) using type = std::integral_constant; - using version = std::integral_constant; + using version = typed_version<_MSC_VER / 100, _MSC_VER % 100>; #else using type = std::integral_constant; - using version = std::integral_constant; + using version = typed_version<0, 0>; #endif #if defined(_LIBCPP_VERSION) using cpp_stdlib = std::integral_constant; @@ -212,9 +219,9 @@ namespace plib using mingw = std::integral_constant; #endif #if defined(__APPLE__) - using clang_noexcept_issue = std::integral_constant; + using clang_noexcept_issue = std::integral_constant; #else - using clang_noexcept_issue = std::integral_constant; + using clang_noexcept_issue = std::integral_constant; #endif #if defined(__ia64__) using abi_vtable_function_descriptors = std::integral_constant; @@ -223,8 +230,18 @@ namespace plib #endif #if defined(_MSC_VER) using env = std::integral_constant; + using env_version = typed_version<_MSC_VER / 100, _MSC_VER % 100>; + #elif defined(__NVCC__) || defined(__CUDACC__) + using env = std::integral_constant; + using env_version = typed_version<__CUDA_API_VER_MAJOR__, __CUDA_API_VER_MINOR__>; + #if defined(__CUDA_ARCH__) + using cuda_arch = std::integral_constant; + #else + using cuda_arch = std::integral_constant; + #endif #else using env = std::integral_constant; + using env_version = version; #endif }; @@ -336,7 +353,7 @@ namespace plib /// @tparam Ts unsused parameters /// template - inline void unused_var(Ts&&...) noexcept {} // NOLINT(readability-named-parameter) + inline void unused_var(Ts&&...) noexcept {} // NOLINT(readability-named-parameter) // FIXME: remove unused var completely /// \brief copy type S to type D byte by byte /// diff --git a/src/lib/netlist/prg/nltool.cpp b/src/lib/netlist/prg/nltool.cpp index 7d27cc50366..4fced7acf27 100644 --- a/src/lib/netlist/prg/nltool.cpp +++ b/src/lib/netlist/prg/nltool.cpp @@ -1319,7 +1319,9 @@ int tool_app_t::execute() convert(); else if (cmd == "tests") { - return PRUN_ALL_TESTS(); + return PRUN_ALL_TESTS(opt_verb() ? ::plib::testing::loglevel::INFO + : opt_quiet() ? ::plib::testing::loglevel::ERROR + : ::plib::testing::loglevel::WARNING); } else { diff --git a/src/lib/netlist/prg/nlwav.cpp b/src/lib/netlist/prg/nlwav.cpp index 05d524fa1e2..9a8d627028d 100644 --- a/src/lib/netlist/prg/nlwav.cpp +++ b/src/lib/netlist/prg/nlwav.cpp @@ -825,6 +825,7 @@ int nlwav_app::execute() PMAIN(nlwav_app) +// spell-checker:disable // // Der Daten-Abschnitt enth??lt die Abtastwerte: // Offset L??nge Inhalt Beschreibung @@ -846,3 +847,4 @@ PMAIN(nlwav_app) // 32 (0x20) 2 Frame-Gr????e = ????????((???+???7)???/???8) (Division ohne Rest) // 34 (0x22) 2 Anzahl der Datenbits pro Samplewert je Kanal (z. B. 12) // +// spell-checker:enable diff --git a/src/lib/netlist/solver/nld_matrix_solver.cpp b/src/lib/netlist/solver/nld_matrix_solver.cpp index fb239221cbf..62d15d32127 100644 --- a/src/lib/netlist/solver/nld_matrix_solver.cpp +++ b/src/lib/netlist/solver/nld_matrix_solver.cpp @@ -503,11 +503,10 @@ namespace netlist::solver return netlist_time::from_fp(m_params.m_max_timestep); } - netlist_time matrix_solver_t::solve(netlist_time_ext now, const char *source) + netlist_time matrix_solver_t::solve(netlist_time_ext now, [[maybe_unused]] const char *source) { auto delta = static_cast(now - m_last_step()); PFDEBUG(printf("solve %.10f\n", delta.as_double());) - plib::unused_var(source); // We are already up to date. Avoid oscillations. // FIXME: Make this a parameter! diff --git a/src/lib/netlist/solver/nld_matrix_solver.h b/src/lib/netlist/solver/nld_matrix_solver.h index 3bac5e3795c..ea9f038bf8d 100644 --- a/src/lib/netlist/solver/nld_matrix_solver.h +++ b/src/lib/netlist/solver/nld_matrix_solver.h @@ -263,8 +263,7 @@ namespace netlist::solver // this should only occur outside of execution and thus // using time should be safe. - const netlist_time new_timestep = solve(exec().time(), "solve_now"); - plib::unused_var(new_timestep); + [[maybe_unused]] const netlist_time new_timestep = solve(exec().time(), "solve_now"); update_inputs(); @@ -280,8 +279,7 @@ namespace netlist::solver // We only need to update the net first if this is a time stepping net if (timestep_device_count() > 0) { - const netlist_time new_timestep = solve(exec().time(), "change_state"); - plib::unused_var(new_timestep); + [[maybe_unused]] const netlist_time new_timestep = solve(exec().time(), "change_state"); update_inputs(); } f(); @@ -298,9 +296,8 @@ namespace netlist::solver virtual void log_stats(); - virtual std::pair create_solver_code(solver::static_compile_target target) + virtual std::pair create_solver_code([[maybe_unused]] solver::static_compile_target target) { - plib::unused_var(target); return { "", plib::pfmt("/* solver doesn't support static compile */\n\n") }; } diff --git a/src/lib/netlist/solver/nld_matrix_solver_ext.h b/src/lib/netlist/solver/nld_matrix_solver_ext.h index f0bef62b0a9..b54cd9e1cdd 100644 --- a/src/lib/netlist/solver/nld_matrix_solver_ext.h +++ b/src/lib/netlist/solver/nld_matrix_solver_ext.h @@ -55,15 +55,13 @@ namespace netlist::solver plib::pmatrix2d m_mat_ptr; template - void log_fill(const T &fill, M &mat) + void log_fill(const T &fill,[[maybe_unused]] M &mat) { const std::size_t iN = fill.size(); // FIXME: Not yet working, mat_cr.h needs some more work #if 0 auto mat_GE = dynamic_cast *>(&mat); -#else - plib::unused_var(mat); #endif std::vector levL(iN, 0); std::vector levU(iN, 0); diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp index 29b2f66f80e..9f31872b472 100644 --- a/src/lib/netlist/solver/nld_solver.cpp +++ b/src/lib/netlist/solver/nld_solver.cpp @@ -150,15 +150,13 @@ namespace netlist::devices plib::omp::set_num_threads(nthreads); plib::omp::for_static(static_cast(0), solvers.size(), [&solvers, now](std::size_t i) { - const netlist_time ts = solvers[i]->ptr->solve(now); - plib::unused_var(ts); + [[maybe_unused]] const netlist_time ts = solvers[i]->ptr->solve(now); }); } else for (auto & solver : solvers) { - const netlist_time ts = solver->ptr->solve(now); - plib::unused_var(ts); + [[maybe_unused]] const netlist_time ts = solver->ptr->solve(now); } for (auto & solver : solvers) diff --git a/src/lib/netlist/tests/test_pmfp.cpp b/src/lib/netlist/tests/test_pmfp.cpp index 1f526806b6b..1d80e80bc16 100644 --- a/src/lib/netlist/tests/test_pmfp.cpp +++ b/src/lib/netlist/tests/test_pmfp.cpp @@ -15,13 +15,15 @@ #include #include -/// plib::late_pmfp> a(&nld_7493::printer); +/// `plib::late_pmfp> a(&nld_7493::printer);` /// // Store the a object somewhere /// /// // After full construction ... /// +/// ``` /// auto dele = a(this); /// dele(pstring("Hello World!")); +/// ``` class test_late_pmfp : public plib::testing::Test { @@ -52,23 +54,23 @@ PTEST_F(test_late_pmfp, late_pmfp) PTEST(test_compile, compile) { #if !PPMF_USE_MAME_DELEGATES - plib::pmfp_base mfp_PPMF_TYPE_PMF; - plib::pmfp_base mfp_PPMF_TYPE_INTERNAL_ITANIUM; - plib::pmfp_base mfp_PPMF_TYPE_INTERNAL_ARM; - plib::pmfp_base mfp_PPMF_TYPE_INTERNAL_MSC; + plib::pmfp_base mfp_PPMF_TYPE_PMF; + plib::pmfp_base mfp_PPMF_TYPE_INTERNAL_ITANIUM; + plib::pmfp_base mfp_PPMF_TYPE_INTERNAL_ARM; + plib::pmfp_base mfp_PPMF_TYPE_INTERNAL_MSC; PEXPECT_TRUE(mfp_PPMF_TYPE_PMF.isnull()); PEXPECT_TRUE(mfp_PPMF_TYPE_INTERNAL_ITANIUM.isnull()); PEXPECT_TRUE(mfp_PPMF_TYPE_INTERNAL_ARM.isnull()); PEXPECT_TRUE(mfp_PPMF_TYPE_INTERNAL_MSC.isnull()); #endif -#if defined(__GNUC__) && !defined(__clang__) && (NVCCBUILD == 0) - plib::pmfp_base mfp_PPMF_TYPE_GNUC_PMF_CONV; +#if defined(__GNUC__) && !defined(__clang__) && !defined(__NVCC__) + plib::pmfp_base mfp_PPMF_TYPE_GNUC_PMF_CONV; PEXPECT_TRUE(mfp_PPMF_TYPE_GNUC_PMF_CONV.isnull()); #else - PEXPECT_NE("PPMF_TYPE_GNUC_PMF_CONV not supported on this build", ""); + PEXPECT_NE("ppmf_type::GNUC_PMF_CONV not supported on this build", ""); #endif #if defined(__EMSCRIPTEN__) - PEXPECT_EQ(plib::ppmf_internal::value,PPMF_TYPE_INTERNAL_ARM); + PEXPECT_EQ(plib::ppmf_internal_selector::value,plib::ppmf_type::INTERNAL_ARM); #endif } diff --git a/src/lib/netlist/tests/test_pmfp_multibase.cpp b/src/lib/netlist/tests/test_pmfp_multibase.cpp index 01aba2876e5..83f14b94ce0 100644 --- a/src/lib/netlist/tests/test_pmfp_multibase.cpp +++ b/src/lib/netlist/tests/test_pmfp_multibase.cpp @@ -29,9 +29,8 @@ operator << (std::basic_ostream& os, const std::pair &p) template typename std::enable_if_t, T>::value, std::basic_ostream&> -operator << (std::basic_ostream& os, const T &p) +operator << ([[maybe_unused]] std::basic_ostream& os, [[maybe_unused]] const T &p) { - plib::unused_var(p); os << std::string(typeid(T).name()); return os; } @@ -350,7 +349,7 @@ PTEST_F(pmfp_test_complex_return, multibase_test) PEXPECT_EQ(static_cast(ts17.run_ft(17)), 17); // FIXME: no operator << for INT128 yet PEXPECT_EQ(sizeof(INT128), 16u); } -#endif +#endif PEXPECT_EQ(ts17.run_ft(17), 17); PEXPECT_EQ(ts17.run_ft(17), 17); PEXPECT_EQ(ts17.run_ft(17), 17); diff --git a/src/lib/netlist/tests/test_precommit.cpp b/src/lib/netlist/tests/test_precommit.cpp new file mode 100644 index 00000000000..b0f1dfa98eb --- /dev/null +++ b/src/lib/netlist/tests/test_precommit.cpp @@ -0,0 +1,26 @@ +// license:BSD-3-Clause +// copyright-holders:Couriersud + +/// +/// \file test_pmfp.cpp +/// +/// tests for plib::pmfp +/// + +#include "plib/pconfig.h" +#include "plib/ppmf.h" +#include "netlist/nl_config.h" + +#include "plib/ptests.h" + +PTEST(test_precommit, precommit) +{ + PEXPECT_EQ(PPMF_EXPERIMENTAL, 0); + PEXPECT_EQ(PPMF_USE_MAME_DELEGATES, 0); + + PEXPECT_EQ(NL_USE_COPY_INSTEAD_OF_REFERENCE, 0); + PEXPECT_EQ(NL_USE_BACKWARD_EULER, 1); + PEXPECT_EQ(PUSE_FLOAT128, 0); + PEXPECT_EQ(NL_USE_FLOAT128, PUSE_FLOAT128); + PEXPECT_EQ(AVOID_NOOP_QUEUE_PUSHES, 0); +} diff --git a/src/lib/netlist/tools/nl_convert.cpp b/src/lib/netlist/tools/nl_convert.cpp index d1ef69bc6b0..31d2a657dcc 100644 --- a/src/lib/netlist/tools/nl_convert.cpp +++ b/src/lib/netlist/tools/nl_convert.cpp @@ -348,7 +348,7 @@ void nl_convert_spice_t::convert(const pstring &contents) pstring line = ""; - // process linecontinuation + // process line continuation for (const auto &i : spnl) { @@ -365,7 +365,7 @@ void nl_convert_spice_t::convert(const pstring &contents) after_linecontinuation.push_back(line); spnl.clear(); // no longer needed - // Process subcircuits + // Process sub circuits std::vector> subckts; std::vector nl; @@ -463,7 +463,7 @@ void nl_convert_spice_t::process_line(const pstring &line) else if (tt[0] == ".MODEL") { pstring mod(rem(tt,2)); - // Filter out ngspice X=X model declarations + // Filter out `ngspice` X=X model declarations if (tt[1] != mod) out("NET_MODEL(\"{} {}\")\n", m_subckt + tt[1], mod); } @@ -477,13 +477,12 @@ void nl_convert_spice_t::process_line(const pstring &line) case 'Q': { // check for fourth terminal ... should be numeric net - // including "0" or start with "N" (ltspice) + // including "0" or start with "N" (`ltspice`) pstring model; pstring pins ="CBE"; bool err(false); - auto nval = plib::pstonum_ne(tt[4], err); - plib::unused_var(nval); + [[maybe_unused]] auto nval = plib::pstonum_ne(tt[4], err); if ((!err || plib::startsWith(tt[4], "N")) && tt.size() > 5) model = tt[5]; @@ -525,7 +524,7 @@ void nl_convert_spice_t::process_line(const pstring &line) add_term(tt[1], tt[0] + ".1"); add_term(tt[2], tt[0] + ".2"); break; - case 'B': // arbitrary behavioural current source - needs manual work afterwords + case 'B': // arbitrary behavioural current source - needs manual work afterwards add_device("CS", tt[0], "/*" + rem(tt, 3) + "*/"); add_term(tt[1], tt[0] + ".P"); add_term(tt[2], tt[0] + ".N"); @@ -562,7 +561,7 @@ void nl_convert_spice_t::process_line(const pstring &line) add_term(nextnet, devname, 1); add_term(net2[0], devname, 2); add_term(net2[1], devname, 3); - //add_device_extra(devname, "PARAM({}, {})", devname + ".G", tt[scoeff+i]); + //# add_device_extra(devname, "PARAM({}, {})", devname + ".G", tt[scoeff+i]); lastnet = nextnet; } } @@ -597,7 +596,7 @@ void nl_convert_spice_t::process_line(const pstring &line) pstring extranetname = devname + "net"; m_replace.push_back({tt[sce+i], devname + ".IP", extranetname }); add_term(extranetname, devname + ".IN"); - //add_device_extra(devname, "PARAM({}, {})", devname + ".G", tt[scoeff+i]); + //# add_device_extra(devname, "PARAM({}, {})", devname + ".G", tt[scoeff+i]); } } break; @@ -735,7 +734,7 @@ nl_convert_eagle_t::tokenizer::tokenizer(nl_convert_eagle_t &convert) this->identifier_chars("abcdefghijklmnopqrstuvwvxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890_.-") .number_chars(".0123456789", "0123456789eE-.") //FIXME: processing of numbers .whitespace(pstring("") + ' ' + static_cast(9) + static_cast(10) + static_cast(13)) - // FIXME: gnetlist doesn't print comments + // FIXME: netlist doesn't print comments .comment("/*", "*/", "//") .string_char('\''); m_tok_ADD = register_token("ADD"); @@ -878,7 +877,7 @@ nl_convert_rinf_t::tokenizer::tokenizer(nl_convert_rinf_t &convert) this->identifier_chars(".abcdefghijklmnopqrstuvwvxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890_-") .number_chars("0123456789", "0123456789eE-.") //FIXME: processing of numbers .whitespace(pstring("") + ' ' + static_cast(9) + static_cast(10) + static_cast(13)) - // FIXME: gnetlist doesn't print comments + // FIXME: netlist doesn't print comments .comment("","","//") // FIXME:needs to be confirmed .string_char('"'); m_tok_HEA = register_token(".HEA"); diff --git a/src/lib/netlist/tools/nl_convert.h b/src/lib/netlist/tools/nl_convert.h index 6ef62ffe73c..2b5a4ec8aeb 100644 --- a/src/lib/netlist/tools/nl_convert.h +++ b/src/lib/netlist/tools/nl_convert.h @@ -72,7 +72,7 @@ protected: struct replace_t { - pstring m_ce; // controlling element - must be twoterm + pstring m_ce; // controlling element - must be a two terminal element pstring m_repterm; // replace with terminal pstring m_net; // connect to net }; -- cgit v1.2.3