diff --git a/src/lib/netlist/build/makefile b/src/lib/netlist/build/makefile index 8f07a8b92d1..5f5352d0c69 100644 --- a/src/lib/netlist/build/makefile +++ b/src/lib/netlist/build/makefile @@ -26,7 +26,7 @@ DOC = $(SRC)/documentation TIDY_FLAGSX = -checks=*,-google*,-hicpp*,readability*,-fuchsia*,cert-*,-android-*, TIDY_FLAGSX += -llvm-header-guard,-cppcoreguidelines-pro-type-reinterpret-cast, -#TIDY_FLAGSX += -cppcoreguidelines-pro-bounds-pointer-arithmetic, +TIDY_FLAGSX += -cppcoreguidelines-pro-bounds-pointer-arithmetic, #TIDY_FLAGSX += -cppcoreguidelines-owning-memory, TIDY_FLAGSX += -modernize-use-default-member-init,-cppcoreguidelines-pro-bounds-constant-array-index, TIDY_FLAGSX += -modernize-pass-by-value,-cppcoreguidelines-pro-type-static-cast-downcast, @@ -39,7 +39,7 @@ TIDY_FLAGSX += -bugprone-too-small-loop-variable, TIDY_FLAGSX += -modernize-use-trailing-return-type, TIDY_FLAGSX += -cppcoreguidelines-pro-bounds-array-to-pointer-decay, TIDY_FLAGSX += -readability-magic-numbers,-readability-braces-around-statements, -#TIDY_FLAGSX += -readability-implicit-bool-conversion, +TIDY_FLAGSX += -readability-implicit-bool-conversion, TIDY_FLAGSX += -readability-named-parameter,-readability-function-size, TIDY_FLAGSX += -llvmlibc-restrict-system-libc-headers,-llvmlibc-implementation-in-namespace,-llvmlibc-callee-namespace, #TIDY_FLAGSX += -cppcoreguidelines-avoid-non-const-global-variables @@ -232,7 +232,7 @@ ALL_TIDY_FILES = $(ALL_OBJS:.o=.json) SOURCES = $(patsubst $(OBJ)%, $(SRC)%, $(ALL_OBJS:.o=.cpp)) ALLFILES = $(SOURCES) $(VSBUILDS) $(DOCS) -MAKEFILE_TARGETS_WITHOUT_INCLUDE := gcc9 clang clang-5 mingw doc native maketree +MAKEFILE_TARGETS_WITHOUT_INCLUDE := gcc9 clang clang-5 mingw doc native maketree tidy # git archive HEAD --prefix=project-name-version/ \ @@ -317,7 +317,7 @@ nvcc: $(MAKE) CC=/usr/local/cuda-10.2/bin/nvcc LD=/usr/local/cuda-10.2/bin/nvcc \ OBJ=obj/nvcc CEXTRAFLAGS="--std c++14 -x cu -DNVCCBUILD=102 --expt-extended-lambda \ --expt-relaxed-constexpr --default-stream per-thread --restrict \ - --ftemplate-depth 1024 \ + --ftemplate-depth 1024 \ -Xcompiler -O6 -Xcompiler -march=native -ccbin g++-8 " \ DEPENDCC=g++ diff --git a/src/lib/netlist/devices/nld_74123.cpp b/src/lib/netlist/devices/nld_74123.cpp index 5b667934f31..e3b73c86d86 100644 --- a/src/lib/netlist/devices/nld_74123.cpp +++ b/src/lib/netlist/devices/nld_74123.cpp @@ -35,16 +35,16 @@ namespace netlist , m_RI(*this, "RI", nlconst::magic(400.0)) // around 250 for HC series, 400 on LS/TTL, estimated from datasheets { - register_subalias("GND", m_RN.m_R.N()); - register_subalias("VCC", m_RP.m_R.P()); - register_subalias("C", m_RN.m_R.N()); - register_subalias("RC", m_RN.m_R.P()); + register_subalias("GND", m_RN.N()); + register_subalias("VCC", m_RP.P()); + register_subalias("C", m_RN.N()); + register_subalias("RC", m_RN.P()); - connect(m_RP_Q, m_RP.m_I); - connect(m_RN_Q, m_RN.m_I); + connect(m_RP_Q, m_RP.I()); + connect(m_RN_Q, m_RN.I()); - connect(m_RN.m_R.P(), m_RP.m_R.N()); - connect(m_CV, m_RN.m_R.P()); + connect(m_RN.P(), m_RP.N()); + connect(m_CV, m_RN.P()); m_RP.m_RON.set(m_RI()); m_RN.m_RON.set(m_RI()); @@ -102,7 +102,7 @@ namespace netlist if (m_state == 1) { - const nl_fptype vLow = m_KP * m_RP.m_R.P()(); + const nl_fptype vLow = m_KP * m_RP.P()(); if (m_CV() < vLow) { m_RN_Q.push(0, NLTIME_FROM_NS(10)); // R_OFF @@ -111,7 +111,7 @@ namespace netlist } if (m_state == 2) { - const nl_fptype vHigh = m_RP.m_R.P()() * (nlconst::one() - m_KP); + const nl_fptype vHigh = m_RP.P()() * (nlconst::one() - m_KP); if (m_CV() > vHigh) { m_RP_Q.push(0, NLTIME_FROM_NS(10)); // R_OFF @@ -172,20 +172,20 @@ namespace netlist register_subalias("3", m_A.m_CLRQ); register_subalias("4", m_A.m_QQ); register_subalias("5", m_B.m_Q); - register_subalias("6", m_B.m_RN.m_R.N()); - register_subalias("7", m_B.m_RN.m_R.P()); - register_subalias("8", m_A.m_RN.m_R.N()); - connect(m_A.m_RN.m_R.N(), m_B.m_RN.m_R.N()); + register_subalias("6", m_B.m_RN.N()); + register_subalias("7", m_B.m_RN.P()); + register_subalias("8", m_A.m_RN.N()); + connect(m_A.m_RN.N(), m_B.m_RN.N()); register_subalias("9", m_B.m_A); register_subalias("10", m_B.m_B); register_subalias("11", m_B.m_CLRQ); register_subalias("12", m_B.m_QQ); register_subalias("13", m_A.m_Q); - register_subalias("14", m_A.m_RN.m_R.N()); - register_subalias("15", m_A.m_RN.m_R.P()); - register_subalias("16", m_A.m_RP.m_R.P()); - connect(m_A.m_RP.m_R.P(), m_B.m_RP.m_R.P()); + register_subalias("14", m_A.m_RN.N()); + register_subalias("15", m_A.m_RN.P()); + register_subalias("16", m_A.m_RP.P()); + connect(m_A.m_RP.P(), m_B.m_RP.P()); } NETLIB_RESETI() {} NETLIB_UPDATEI() {} @@ -200,25 +200,25 @@ namespace netlist , m_A(*this, "A") , m_B(*this, "B") { - register_subalias("1", m_A.m_RN.m_R.N()); // C1 - register_subalias("2", m_A.m_RN.m_R.P()); // RC1 + register_subalias("1", m_A.m_RN.N()); // C1 + register_subalias("2", m_A.m_RN.P()); // RC1 register_subalias("3", m_A.m_CLRQ); register_subalias("4", m_A.m_B); register_subalias("5", m_A.m_A); register_subalias("6", m_A.m_Q); register_subalias("7", m_A.m_QQ); - register_subalias("8", m_A.m_RN.m_R.N()); - connect(m_A.m_RN.m_R.N(), m_B.m_RN.m_R.N()); + register_subalias("8", m_A.m_RN.N()); + connect(m_A.m_RN.N(), m_B.m_RN.N()); register_subalias("9", m_B.m_QQ); register_subalias("10", m_B.m_Q); register_subalias("11", m_B.m_A); register_subalias("12", m_B.m_B); register_subalias("13", m_B.m_CLRQ); - register_subalias("14", m_B.m_RN.m_R.P()); // RC2 - register_subalias("15", m_B.m_RN.m_R.N()); // C2 - register_subalias("16", m_A.m_RP.m_R.P()); - connect(m_A.m_RP.m_R.P(), m_B.m_RP.m_R.P()); + register_subalias("14", m_B.m_RN.P()); // RC2 + register_subalias("15", m_B.m_RN.N()); // C2 + register_subalias("16", m_A.m_RP.P()); + connect(m_A.m_RP.P(), m_B.m_RP.P()); } NETLIB_RESETI() { } NETLIB_UPDATEI() { } @@ -233,25 +233,25 @@ namespace netlist , m_A(*this, "A") , m_B(*this, "B") { - register_subalias("1", m_A.m_RN.m_R.N()); // C1 - register_subalias("2", m_A.m_RN.m_R.P()); // RC1 + register_subalias("1", m_A.m_RN.N()); // C1 + register_subalias("2", m_A.m_RN.P()); // RC1 register_subalias("3", m_A.m_CLRQ); register_subalias("4", m_A.m_A); register_subalias("5", m_A.m_B); register_subalias("6", m_A.m_Q); register_subalias("7", m_A.m_QQ); - register_subalias("8", m_A.m_RN.m_R.N()); - connect(m_A.m_RN.m_R.N(), m_B.m_RN.m_R.N()); + register_subalias("8", m_A.m_RN.N()); + connect(m_A.m_RN.N(), m_B.m_RN.N()); register_subalias("9", m_B.m_QQ); register_subalias("10", m_B.m_Q); register_subalias("11", m_B.m_B); register_subalias("12", m_B.m_A); register_subalias("13", m_B.m_CLRQ); - register_subalias("14", m_B.m_RN.m_R.P()); // RC2 - register_subalias("15", m_B.m_RN.m_R.N()); // C2 - register_subalias("16", m_A.m_RP.m_R.P()); - connect(m_A.m_RP.m_R.P(), m_B.m_RP.m_R.P()); + register_subalias("14", m_B.m_RN.P()); // RC2 + register_subalias("15", m_B.m_RN.N()); // C2 + register_subalias("16", m_A.m_RP.P()); + connect(m_A.m_RP.P(), m_B.m_RP.P()); } NETLIB_RESETI(); NETLIB_UPDATEI(); diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h index e7827f24935..97a3c68e2b8 100644 --- a/src/lib/netlist/devices/nlid_system.h +++ b/src/lib/netlist/devices/nlid_system.h @@ -395,10 +395,10 @@ namespace devices { public: NETLIB_CONSTRUCTOR(sys_dsw1) - , m_R(*this, "_R") - , m_I(*this, "I") , m_RON(*this, "RON", nlconst::one()) , m_ROFF(*this, "ROFF", nlconst::magic(1.0E20)) + , m_R(*this, "_R") + , m_I(*this, "I") , m_last_state(*this, "m_last_state", 0) { register_subalias("1", m_R.P()); @@ -428,13 +428,19 @@ namespace devices //NETLIB_UPDATE_PARAMI(); - // used by 74123 - analog::NETLIB_SUB(R_base) m_R; - logic_input_t m_I; + //FIXME: used by 74123 + + const terminal_t &P() const noexcept { return m_R.P(); } + const terminal_t &N() const noexcept { return m_R.N(); } + const logic_input_t &I() const noexcept { return m_I; } + param_fp_t m_RON; param_fp_t m_ROFF; private: + analog::NETLIB_SUB(R_base) m_R; + logic_input_t m_I; + state_var m_last_state; }; @@ -451,7 +457,6 @@ namespace devices , m_I(*this, "I") , m_GON(*this, "GON", nlconst::magic(1e9)) // FIXME: all switches should have some on value , m_GOFF(*this, "GOFF", nlconst::cgmin()) - , m_last_state(*this, "m_last_state", 0) , m_power_pins(*this) { // connect and register pins @@ -463,7 +468,6 @@ namespace devices NETLIB_RESETI() { - m_last_state = 1; m_R1.set_G(m_GOFF()); m_R2.set_G(m_GON()); } @@ -471,45 +475,40 @@ namespace devices NETLIB_UPDATEI() { const netlist_sig_t state = m_I(); - // FIXME: update should only be called if m_I changes - if (true || (state != m_last_state)) + + //printf("Here %d\n", state); + const nl_fptype G1 = (state != 0) ? m_GON() : m_GOFF(); + const nl_fptype G2 = (state != 0) ? m_GOFF() : m_GON(); + if (m_R1.solver() == m_R2.solver()) { - m_last_state = state; - //printf("Here %d\n", state); - const nl_fptype G1 = (state != 0) ? m_GON() : m_GOFF(); - const nl_fptype G2 = (state != 0) ? m_GOFF() : m_GON(); - if (m_R1.solver() == m_R2.solver()) + m_R1.change_state([this, &G1, &G2]() { - m_R1.change_state([this, &G1, &G2]() - { - m_R1.set_G(G1); - m_R2.set_G(G2); - }); - } - else + m_R1.set_G(G1); + m_R2.set_G(G2); + }); + } + else + { + m_R1.change_state([this, &G1]() { - m_R1.change_state([this, &G1]() - { - m_R1.set_G(G1); - }); - m_R2.change_state([this, &G2]() - { - m_R2.set_G(G2); - }); - } + m_R1.set_G(G1); + }); + m_R2.change_state([this, &G2]() + { + m_R2.set_G(G2); + }); } } //NETLIB_UPDATE_PARAMI(); + private: analog::NETLIB_SUB(R_base) m_R1; analog::NETLIB_SUB(R_base) m_R2; logic_input_t m_I; param_fp_t m_GON; param_fp_t m_GOFF; - private: - state_var m_last_state; nld_power_pins m_power_pins; }; @@ -550,13 +549,13 @@ namespace devices //NETLIB_UPDATE_PARAMI(); + private: analog_input_t m_IP; analog_input_t m_IN; logic_output_t m_Q; logic_output_t m_QQ; nld_power_pins m_power_pins; - private: state_var m_last_state; }; diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 53d9eb9cdfd..9bccb152c67 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -1053,13 +1053,13 @@ namespace netlist /// templatized generic device models do not have to do tons of /// template magic. /// - /// This function throws an exception if actually called. + /// 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) { plib::unused_var(v, ts_off_on, ts_on_off); - throw nl_exception("set_tristate on logic_output should never be called!"); + plib::terminate("set_tristate on logic_output should never be called!"); } private: logic_net_t m_my_net; diff --git a/src/lib/netlist/plib/penum.h b/src/lib/netlist/plib/penum.h index 1e0042f7dd2..ff15c9252c0 100644 --- a/src/lib/netlist/plib/penum.h +++ b/src/lib/netlist/plib/penum.h @@ -33,7 +33,6 @@ namespace plib struct ename : public plib::penum_base { \ enum E { __VA_ARGS__ }; \ constexpr ename (const E &v) : m_v(v) { } \ - constexpr ename (E && v) : m_v(v) { } \ template explicit constexpr ename(const T &val) { m_v = static_cast(val); } \ template explicit constexpr ename(T && val) { m_v = static_cast(val); } \ bool set_from_string (const pstring &s) { \