diff options
author | 2020-05-21 21:36:52 +0200 | |
---|---|---|
committer | 2020-05-22 01:15:18 +0200 | |
commit | 5a43cc6432e86a7e6c90d98145151528fa07e9fb (patch) | |
tree | eb6cf5974b587081b31544f6c6e7eef5630a93a6 | |
parent | dae6a396c9c79e1ccc6587dc3be1764df62dc61c (diff) |
netlist: consolidate 9316-type counters. [Couriersud]
This needs more attention since for certain compilers there is a
considerable performance degregation. It looks like this is only
triggered if too many variants are declared in one cpp file and the
compiler stops inlining.
-rw-r--r-- | scripts/src/netlist.lua | 4 | ||||
-rw-r--r-- | src/lib/netlist/build/makefile | 2 | ||||
-rw-r--r-- | src/lib/netlist/devices/net_lib.cpp | 1 | ||||
-rw-r--r-- | src/lib/netlist/devices/net_lib.h | 2 | ||||
-rw-r--r-- | src/lib/netlist/devices/nld_74161.cpp | 145 | ||||
-rw-r--r-- | src/lib/netlist/devices/nld_74161.h | 47 | ||||
-rw-r--r-- | src/lib/netlist/devices/nld_9310.cpp | 227 | ||||
-rw-r--r-- | src/lib/netlist/devices/nld_9310.h | 67 | ||||
-rw-r--r-- | src/lib/netlist/devices/nld_9316.cpp | 106 | ||||
-rw-r--r-- | src/lib/netlist/devices/nld_9316.h | 67 | ||||
-rw-r--r-- | src/lib/netlist/nl_base.h | 28 | ||||
-rw-r--r-- | src/lib/netlist/nltypes.h | 19 | ||||
-rw-r--r-- | src/mame/machine/nl_hazelvid.cpp | 14 |
13 files changed, 162 insertions, 567 deletions
diff --git a/scripts/src/netlist.lua b/scripts/src/netlist.lua index 3a1929055ee..c6c60fe0390 100644 --- a/scripts/src/netlist.lua +++ b/scripts/src/netlist.lua @@ -162,8 +162,6 @@ project "netlist" MAME_DIR .. "src/lib/netlist/devices/nld_74125.h", MAME_DIR .. "src/lib/netlist/devices/nld_74153.cpp", MAME_DIR .. "src/lib/netlist/devices/nld_74153.h", - MAME_DIR .. "src/lib/netlist/devices/nld_74161.cpp", - MAME_DIR .. "src/lib/netlist/devices/nld_74161.h", MAME_DIR .. "src/lib/netlist/devices/nld_74164.cpp", MAME_DIR .. "src/lib/netlist/devices/nld_74164.h", MAME_DIR .. "src/lib/netlist/devices/nld_74165.cpp", @@ -192,8 +190,6 @@ project "netlist" MAME_DIR .. "src/lib/netlist/devices/nld_82S16.h", MAME_DIR .. "src/lib/netlist/devices/nld_82S115.cpp", MAME_DIR .. "src/lib/netlist/devices/nld_82S115.h", - MAME_DIR .. "src/lib/netlist/devices/nld_9310.cpp", - MAME_DIR .. "src/lib/netlist/devices/nld_9310.h", MAME_DIR .. "src/lib/netlist/devices/nld_9316.cpp", MAME_DIR .. "src/lib/netlist/devices/nld_9316.h", MAME_DIR .. "src/lib/netlist/devices/nld_9322.cpp", diff --git a/src/lib/netlist/build/makefile b/src/lib/netlist/build/makefile index ed2be27c651..46587cbd850 100644 --- a/src/lib/netlist/build/makefile +++ b/src/lib/netlist/build/makefile @@ -164,7 +164,6 @@ NLOBJS := \ $(NLOBJ)/devices/nld_74123.o \ $(NLOBJ)/devices/nld_74125.o \ $(NLOBJ)/devices/nld_74153.o \ - $(NLOBJ)/devices/nld_74161.o \ $(NLOBJ)/devices/nld_74164.o \ $(NLOBJ)/devices/nld_74165.o \ $(NLOBJ)/devices/nld_74166.o \ @@ -179,7 +178,6 @@ NLOBJS := \ $(NLOBJ)/devices/nld_74ls629.o \ $(NLOBJ)/devices/nld_82S16.o \ $(NLOBJ)/devices/nld_82S115.o \ - $(NLOBJ)/devices/nld_9310.o \ $(NLOBJ)/devices/nld_9316.o \ $(NLOBJ)/devices/nld_9322.o \ $(NLOBJ)/devices/nld_am2847.o \ diff --git a/src/lib/netlist/devices/net_lib.cpp b/src/lib/netlist/devices/net_lib.cpp index 9caf89afdc1..5e9cd5607e2 100644 --- a/src/lib/netlist/devices/net_lib.cpp +++ b/src/lib/netlist/devices/net_lib.cpp @@ -113,6 +113,7 @@ namespace devices LIB_ENTRY(74153) LIB_ENTRY(74153_dip) LIB_ENTRY(74161) + LIB_ENTRY(74161_fixme) LIB_ENTRY(74161_dip) LIB_ENTRY(74163) LIB_ENTRY(74163_dip) diff --git a/src/lib/netlist/devices/net_lib.h b/src/lib/netlist/devices/net_lib.h index decca40aac7..95a44cbe78a 100644 --- a/src/lib/netlist/devices/net_lib.h +++ b/src/lib/netlist/devices/net_lib.h @@ -56,7 +56,6 @@ #include "nld_74123.h" #include "nld_74125.h" #include "nld_74153.h" -#include "nld_74161.h" #include "nld_74164.h" #include "nld_74165.h" #include "nld_74166.h" @@ -81,7 +80,6 @@ #include "nld_74ls629.h" #include "nld_82S115.h" #include "nld_82S16.h" -#include "nld_9310.h" #include "nld_9316.h" #include "nld_9322.h" #include "nld_tms4800.h" diff --git a/src/lib/netlist/devices/nld_74161.cpp b/src/lib/netlist/devices/nld_74161.cpp deleted file mode 100644 index 4eb102aa05e..00000000000 --- a/src/lib/netlist/devices/nld_74161.cpp +++ /dev/null @@ -1,145 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Ryan Holtz -/* - * nld_74161.cpp - * - */ - -#include "nld_74161.h" -#include "netlist/nl_base.h" - -#include <array> - -namespace netlist -{ - namespace devices - { - - static constexpr const unsigned MAXCNT = 15; - - NETLIB_OBJECT(74161) - { - NETLIB_CONSTRUCTOR(74161) - , m_A(*this, "A") - , m_B(*this, "B") - , m_C(*this, "C") - , m_D(*this, "D") - , m_CLRQ(*this, "CLRQ") - , m_LOADQ(*this, "LOADQ") - , m_CLK(*this, "CLK") - , m_ENABLEP(*this, "ENABLEP") - , m_ENABLET(*this, "ENABLET") - , m_cnt(*this, "m_cnt", 0) - , m_last_CLK(*this, "m_last_CLK", 0) - , m_Q(*this, {"QA", "QB", "QC", "QD"}) - , m_RCO(*this, "RCO") - , m_power_pins(*this) - { - } - - NETLIB_RESETI() - { - m_cnt = 0; - m_last_CLK = 0; - } - NETLIB_UPDATEI(); - - friend class NETLIB_NAME(74161_dip); - private: - logic_input_t m_A; - logic_input_t m_B; - logic_input_t m_C; - logic_input_t m_D; - logic_input_t m_CLRQ; - logic_input_t m_LOADQ; - logic_input_t m_CLK; - logic_input_t m_ENABLEP; - logic_input_t m_ENABLET; - - state_var<unsigned> m_cnt; - state_var<unsigned> m_last_CLK; - - object_array_t<logic_output_t, 4> m_Q; - logic_output_t m_RCO; - - nld_power_pins m_power_pins; - }; - - NETLIB_OBJECT(74161_dip) - { - NETLIB_CONSTRUCTOR(74161_dip) - , A(*this, "A") - { - register_subalias("1", A.m_CLRQ); - register_subalias("2", A.m_CLK); - register_subalias("3", A.m_A); - register_subalias("4", A.m_B); - register_subalias("5", A.m_C); - register_subalias("6", A.m_D); - register_subalias("7", A.m_ENABLEP); - register_subalias("8", "A.GND"); - - register_subalias("9", A.m_LOADQ); - register_subalias("10", A.m_ENABLET); - register_subalias("11", A.m_Q[3]); - register_subalias("12", A.m_Q[2]); - register_subalias("13", A.m_Q[1]); - register_subalias("14", A.m_Q[0]); - register_subalias("15", A.m_RCO); - register_subalias("16", "A.VCC"); - } - - NETLIB_RESETI() { } - NETLIB_UPDATEI() { } - - private: - NETLIB_SUB(74161) A; - }; - - // FIXME: Timing - static constexpr const std::array<netlist_time, 4> delay = - { - NLTIME_FROM_NS(40), - NLTIME_FROM_NS(40), - NLTIME_FROM_NS(40), - NLTIME_FROM_NS(40) - }; - - NETLIB_UPDATE(74161) - { - netlist_sig_t tRippleCarryOut = 0; - if (!m_CLRQ()) - { - m_cnt = 0; - } - else if (m_CLK() && !m_last_CLK) - { - if (!m_LOADQ()) - { - m_cnt = (m_D() << 3) | (m_C() << 2) - | (m_B() << 1) | (m_A() << 0); - } - else if (m_ENABLET() && m_ENABLEP()) - { - ++m_cnt &= MAXCNT; - } - } - - if (m_ENABLET() && (m_cnt == MAXCNT)) - { - tRippleCarryOut = 1; - } - - m_last_CLK = m_CLK(); - - for (std::size_t i=0; i<4; i++) - m_Q[i].push((m_cnt >> i) & 1, delay[i]); - - m_RCO.push(tRippleCarryOut, NLTIME_FROM_NS(20)); //FIXME - } - - NETLIB_DEVICE_IMPL(74161, "TTL_74161", "+A,+B,+C,+D,+CLRQ,+LOADQ,+CLK,+ENABLEP,+ENABLET,@VCC,@GND") - NETLIB_DEVICE_IMPL(74161_dip, "TTL_74161_DIP", "") - - } //namespace devices -} // namespace netlist diff --git a/src/lib/netlist/devices/nld_74161.h b/src/lib/netlist/devices/nld_74161.h deleted file mode 100644 index 91025446891..00000000000 --- a/src/lib/netlist/devices/nld_74161.h +++ /dev/null @@ -1,47 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Ryan Holtz -/* - * nld_74161.h - * - * DM74161: Synchronous 4-Bit Binary Counter with Clock - * - * +--------------+ - * CLEAR |1 ++ 16| VCC - * CLK |2 15| RCO - * A |3 14| QA - * B |4 74161 13| QB - * C |5 12| QC - * D |6 11| QD - * ENABLEP |7 10| ENABLET - * GND |8 9| LOAD - * +--------------+ - * - * RCO: Ripple carry output - * - * Naming convention attempts to follow National Semiconductor datasheet - * - */ - -#ifndef NLD_74161_H_ -#define NLD_74161_H_ - -#include "netlist/nl_setup.h" - -#define TTL_74161(name, cA, cB, cC, cD, cCLRQ, cLOADQ, cCLK, cENABLEP, cENABLET) \ - NET_REGISTER_DEV(TTL_74161, name) \ - NET_CONNECT(name, GND, GND) \ - NET_CONNECT(name, VCC, VCC) \ - NET_CONNECT(name, A, cA) \ - NET_CONNECT(name, B, cB) \ - NET_CONNECT(name, C, cC) \ - NET_CONNECT(name, D, cD) \ - NET_CONNECT(name, CLRQ, cCLRQ) \ - NET_CONNECT(name, LOADQ, cLOADQ) \ - NET_CONNECT(name, CLK, cCLK) \ - NET_CONNECT(name, ENABLEP, cENABLEP) \ - NET_CONNECT(name, ENABLET, cENABLET) - -#define TTL_74161_DIP(name) \ - NET_REGISTER_DEV(TTL_74161_DIP, name) - -#endif /* NLD_74161_H_ */ diff --git a/src/lib/netlist/devices/nld_9310.cpp b/src/lib/netlist/devices/nld_9310.cpp deleted file mode 100644 index 9dd1f67332e..00000000000 --- a/src/lib/netlist/devices/nld_9310.cpp +++ /dev/null @@ -1,227 +0,0 @@ -// license:GPL-2.0+ -// copyright-holders:Couriersud -/* - * nld_9310.c - * - */ - -#include "nld_9310.h" -#include "netlist/nl_base.h" - -#define MAXCNT 9 - -namespace netlist -{ - namespace devices - { - - NETLIB_OBJECT(9310) - { - NETLIB_CONSTRUCTOR(9310) - , m_ENP(*this, "ENP") - , m_ENT(*this, "ENT") - , m_CLRQ(*this, "CLRQ") - , m_LOADQ(*this, "LOADQ") - , m_A(*this, "A", NETLIB_DELEGATE(9310, abcd)) - , m_B(*this, "B", NETLIB_DELEGATE(9310, abcd)) - , m_C(*this, "C", NETLIB_DELEGATE(9310, abcd)) - , m_D(*this, "D", NETLIB_DELEGATE(9310, abcd)) - , m_CLK(*this, "CLK", NETLIB_DELEGATE(9310, sub)) - , m_QA(*this, "QA") - , m_QB(*this, "QB") - , m_QC(*this, "QC") - , m_QD(*this, "QD") - , m_RC(*this, "RC") - , m_cnt(*this, "m_cnt", 0) - , m_loadq(*this, "m_loadq", 0) - , m_ent(*this, "m_ent", 0) - , m_power_pins(*this) - { - } - - NETLIB_RESETI() - { - m_CLK.set_state(logic_t::STATE_INP_LH); - m_cnt = 0; - m_loadq = 1; - m_ent = 1; - } - NETLIB_UPDATEI(); - - NETLIB_HANDLERI(abcd) { } // do nothing - - NETLIB_HANDLERI(sub) - { - auto cnt(m_cnt); - - if (m_loadq) - { - if (cnt < MAXCNT - 1) - { - ++cnt; - update_outputs(cnt); - } - else if (cnt == MAXCNT - 1) - { - cnt = MAXCNT; - m_RC.push(m_ent, NLTIME_FROM_NS(20)); - m_QA.push(1, NLTIME_FROM_NS(20)); - } - else // MAXCNT - { - m_RC.push(0, NLTIME_FROM_NS(20)); - cnt = 0; - update_outputs_all(cnt, NLTIME_FROM_NS(20)); - } - } - else - { - cnt = read_ABCD(); - m_RC.push(m_ent & (cnt == MAXCNT), NLTIME_FROM_NS(27)); - update_outputs_all(cnt, NLTIME_FROM_NS(22)); - } - m_cnt = cnt; - } - - friend class NETLIB_NAME(9310_dip); - private: - - unsigned read_ABCD() const - { - return (m_D() << 3) | (m_C() << 2) | (m_B() << 1) | (m_A() << 0); - } - - void update_outputs_all(const unsigned cnt, const netlist_time out_delay) - { - m_QA.push((cnt >> 0) & 1, out_delay); - m_QB.push((cnt >> 1) & 1, out_delay); - m_QC.push((cnt >> 2) & 1, out_delay); - m_QD.push((cnt >> 3) & 1, out_delay); - } - - void update_outputs(const unsigned cnt) - { - /* static */ const netlist_time out_delay = NLTIME_FROM_NS(20); - #if 0 - // for (int i=0; i<4; i++) - // m_Q[i], (cnt >> i) & 1, delay[i]); - m_QA.push((cnt >> 0) & 1, out_delay); - m_QB.push((cnt >> 1) & 1, out_delay); - m_QC.push((cnt >> 2) & 1, out_delay); - m_QD.push((cnt >> 3) & 1, out_delay); - #else - if ((cnt & 1) == 1) - m_QA.push(1, out_delay); - else - { - m_QA.push(0, out_delay); - switch (cnt) - { - case 0x00: - m_QB.push(0, out_delay); - m_QC.push(0, out_delay); - m_QD.push(0, out_delay); - break; - case 0x02: - case 0x06: - case 0x0A: - case 0x0E: - m_QB.push(1, out_delay); - break; - case 0x04: - case 0x0C: - m_QB.push(0, out_delay); - m_QC.push(1, out_delay); - break; - case 0x08: - m_QB.push(0, out_delay); - m_QC.push(0, out_delay); - m_QD.push(1, out_delay); - break; - } - - } - #endif - } - - logic_input_t m_ENP; - logic_input_t m_ENT; - logic_input_t m_CLRQ; - logic_input_t m_LOADQ; - logic_input_t m_A; - logic_input_t m_B; - logic_input_t m_C; - logic_input_t m_D; - logic_input_t m_CLK; - - logic_output_t m_QA; - logic_output_t m_QB; - logic_output_t m_QC; - logic_output_t m_QD; - logic_output_t m_RC; - - state_var<unsigned> m_cnt; - state_var<netlist_sig_t> m_loadq; - state_var<netlist_sig_t> m_ent; - nld_power_pins m_power_pins; - }; - - NETLIB_OBJECT(9310_dip) - { - NETLIB_CONSTRUCTOR(9310_dip) - , A(*this, "A") - { - register_subalias("1", A.m_CLRQ); - register_subalias("2", A.m_CLK); - register_subalias("3", A.m_A); - register_subalias("4", A.m_B); - register_subalias("5", A.m_C); - register_subalias("6", A.m_D); - register_subalias("7", A.m_ENP); - register_subalias("8", "A.GND"); - - register_subalias("9", A.m_LOADQ); - register_subalias("10", A.m_ENT); - register_subalias("11", A.m_QD); - register_subalias("12", A.m_QC); - register_subalias("13", A.m_QB); - register_subalias("14", A.m_QA); - register_subalias("15", A.m_RC); - register_subalias("16", "A.VCC"); - } - - NETLIB_RESETI() {} - NETLIB_UPDATEI() {} - private: - NETLIB_SUB(9310) A; - }; - - NETLIB_UPDATE(9310) - { - m_loadq = m_LOADQ(); - m_ent = m_ENT(); - const netlist_sig_t clrq = m_CLRQ(); - - if ((!m_loadq || (m_ent & m_ENP())) && clrq) - { - m_CLK.activate_lh(); - m_RC.push(m_ent & (m_cnt == MAXCNT), NLTIME_FROM_NS(27)); - } - else - { - m_CLK.inactivate(); - if (!clrq && (m_cnt>0)) - { - update_outputs_all(0, NLTIME_FROM_NS(36)); - m_cnt = 0; - //return; - } - m_RC.push(m_ent & (m_cnt == MAXCNT), NLTIME_FROM_NS(27)); - } - } - - NETLIB_DEVICE_IMPL(9310, "TTL_9310", "+CLK,+ENP,+ENT,+CLRQ,+LOADQ,+A,+B,+C,+D,@VCC,@GND") - NETLIB_DEVICE_IMPL(9310_dip, "TTL_9310_DIP", "") - - } //namespace devices -} // namespace netlist diff --git a/src/lib/netlist/devices/nld_9310.h b/src/lib/netlist/devices/nld_9310.h deleted file mode 100644 index fa6dc0a3351..00000000000 --- a/src/lib/netlist/devices/nld_9310.h +++ /dev/null @@ -1,67 +0,0 @@ -// license:GPL-2.0+ -// copyright-holders:Couriersud -/* - * nld_9310.h - * - * DM9310: Synchronous 4-Bit Counters - * - * FIXME: This should be merged with the 9316. The only difference is MAXCNT! - * - * +--------------+ - * CLEAR |1 ++ 16| VCC - * CLOCK |2 15| RC (Ripple Carry) - * A |3 14| QA - * B |4 9310 13| QB - * C |5 12| QC - * D |6 11| QD - * Enable P |7 10| Enable T - * GND |8 9| LOAD - * +--------------+ - * - * Counter Sequence - * - * +-------++----+----+----+----+----+ - * | COUNT || QD | QC | QB | QA | RC | - * +=======++====+====+====+====+====+ - * | 0 || 0 | 0 | 0 | 0 | 0 | - * | 1 || 0 | 0 | 0 | 1 | 0 | - * | 2 || 0 | 0 | 1 | 0 | 0 | - * | 3 || 0 | 0 | 1 | 1 | 0 | - * | 4 || 0 | 1 | 0 | 0 | 0 | - * | 5 || 0 | 1 | 0 | 1 | 0 | - * | 6 || 0 | 1 | 1 | 0 | 0 | - * | 7 || 0 | 1 | 1 | 1 | 0 | - * | 8 || 1 | 0 | 0 | 0 | 0 | - * | 9 || 1 | 0 | 0 | 1 | 0 | - * +-------++----+----+----+----+----+ - * - * Reset count function: Please refer to - * National Semiconductor datasheet (timing diagram) - * - * Naming conventions follow National Semiconductor datasheet - * - */ - -#ifndef NLD_9310_H_ -#define NLD_9310_H_ - -#include "netlist/nl_setup.h" - -#define TTL_9310(name, cCLK, cENP, cENT, cCLRQ, cLOADQ, cA, cB, cC, cD) \ - NET_REGISTER_DEV(TTL_9310, name) \ - NET_CONNECT(name, GND, GND) \ - NET_CONNECT(name, VCC, VCC) \ - NET_CONNECT(name, CLK, cCLK) \ - NET_CONNECT(name, ENP, cENP) \ - NET_CONNECT(name, ENT, cENT) \ - NET_CONNECT(name, CLRQ, cCLRQ) \ - NET_CONNECT(name, LOADQ,_LOADQ) \ - NET_CONNECT(name, A, cA) \ - NET_CONNECT(name, B, cB) \ - NET_CONNECT(name, C, cC) \ - NET_CONNECT(name, D, cD) - -#define TTL_9310_DIP(name) \ - NET_REGISTER_DEV(TTL_9310_DIP, name) - -#endif /* NLD_9310_H_ */ diff --git a/src/lib/netlist/devices/nld_9316.cpp b/src/lib/netlist/devices/nld_9316.cpp index f4f7dbee412..e337b850308 100644 --- a/src/lib/netlist/devices/nld_9316.cpp +++ b/src/lib/netlist/devices/nld_9316.cpp @@ -1,23 +1,33 @@ // license:GPL-2.0+ // copyright-holders:Couriersud /* - * nld_9316.c + * nld_9316.cpp * */ -#include "nld_9316.h" -#include "netlist/nl_base.h" +#include "nl_base.h" +#include "nl_factory.h" namespace netlist { namespace devices { - static constexpr const unsigned MAXCNT = 15; - // FIXME: Family needs to be set to LS for 74193. This needs some more // thought generally. - template <bool ASYNC> + template <unsigned N> + static constexpr unsigned rollover(unsigned v) { return v <= N ? v : 0; } + +#if 0 + template <> + constexpr unsigned rollover<7>(unsigned v) { return v & 7; } +#endif + + template <> + constexpr unsigned rollover<15>(unsigned v) { return v & 15; } + + + template <typename D> NETLIB_OBJECT(9316_base) { NETLIB_CONSTRUCTOR(9316_base) @@ -51,36 +61,35 @@ namespace netlist m_ent = m_ENT(); m_loadq = m_LOADQ(); - if (((m_loadq ^ 1) || (m_ent && m_ENP())) && (!ASYNC || CLRQ)) + if (((m_loadq ^ 1) || (m_ent && m_ENP())) && (!D::ASYNC::value() || CLRQ)) { m_CLK.activate_lh(); } else { m_CLK.inactivate(); - if (ASYNC && !CLRQ && (m_cnt>0)) + if (D::ASYNC::value() && !CLRQ && (m_cnt>0)) { m_cnt = 0; - m_Q.push(m_cnt, NLTIME_FROM_NS(36)); + m_Q.push(m_cnt, D::tCLR::value(0)); } } - m_RC.push(m_ent && (m_cnt == MAXCNT), NLTIME_FROM_NS(27)); + m_RC.push(m_ent && (m_cnt == D::MAXCNT::value()), D::tRC::value(0)); } - NETLIB_HANDLERI(clk) { - if (!ASYNC && !m_CLRQ()) + if (!D::ASYNC::value() && !m_CLRQ()) { m_cnt = 0; - m_Q.push(m_cnt, NLTIME_FROM_NS(36)); + m_Q.push(m_cnt, D::tCLR::value(0)); } else { - //const auto cnt = (m_LOADQ() ? (m_cnt + 1) & MAXCNT: m_abcd); - const auto cnt = (m_loadq ? (m_cnt + 1) & MAXCNT: m_abcd); - m_RC.push(m_ent && (cnt == MAXCNT), NLTIME_FROM_NS(27)); - m_Q.push(cnt, NLTIME_FROM_NS(20)); + //const auto cnt = (m_loadq ? (m_cnt + 1) & D::MAXCNT::value : m_abcd); + const auto cnt = (m_loadq ? rollover<D::MAXCNT::value()>(m_cnt + 1) : m_abcd); + m_RC.push(m_ent && (cnt == D::MAXCNT::value()), D::tRC::value(0)); + m_Q.push(cnt, D::tLDCNT::value(0)); m_cnt = static_cast<unsigned>(cnt); } } @@ -113,7 +122,7 @@ namespace netlist }; - template <bool ASYNC> + template <typename D> NETLIB_OBJECT(9316_dip_base) { NETLIB_CONSTRUCTOR(9316_dip_base) @@ -138,20 +147,71 @@ namespace netlist this->register_subalias("16", "A.VCC"); } private: - NETLIB_SUB(9316_base)<ASYNC> A; + NETLIB_SUB(9316_base)<D> A; + }; + + struct desc_9316 : public desc_base + { + using ASYNC = fdesc_const_t<bool, true>; + using MAXCNT = fdesc_const_t<unsigned, 15>; + using tRC = time_ns<27>; + using tCLR = time_ns<36>; + using tLDCNT = time_ns<20>; + }; + + struct desc_9310 : public desc_base + { + using ASYNC = fdesc_const_t<bool, true>; + using MAXCNT = fdesc_const_t<unsigned, 10>; + using tRC = time_ns<27>; + using tCLR = time_ns<36>; + using tLDCNT = time_ns<20>; + }; + + struct desc_74161 : public desc_base + { + using ASYNC = fdesc_const_t<bool, true>; + using MAXCNT = fdesc_const_t<unsigned, 15>; + using tRC = time_ns<28>; + using tCLR = time_ns<37>; + using tLDCNT = time_ns<21>; }; - using NETLIB_NAME(9316) = NETLIB_NAME(9316_base)<true>; - using NETLIB_NAME(74163) = NETLIB_NAME(9316_base)<false>; + struct desc_74163 : public desc_base + { + using ASYNC = fdesc_const_t<bool, false>; + using MAXCNT = fdesc_const_t<unsigned, 15>; + using tRC = time_ns<28>; + using tCLR = time_ns<37>; + using tLDCNT = time_ns<21>; + }; + + using NETLIB_NAME(9310) = NETLIB_NAME(9316_base)<desc_9310>; + using NETLIB_NAME(9316) = NETLIB_NAME(9316_base)<desc_9316>; + using NETLIB_NAME(74161) = NETLIB_NAME(9316_base)<desc_74161>; + using NETLIB_NAME(74161_fixme) = NETLIB_NAME(9316_base)<desc_74161>; + using NETLIB_NAME(74163) = NETLIB_NAME(9316_base)<desc_74163>; - using NETLIB_NAME(9316_dip) = NETLIB_NAME(9316_dip_base)<true>; - using NETLIB_NAME(74163_dip) = NETLIB_NAME(9316_dip_base)<false>; + using NETLIB_NAME(9310_dip) = NETLIB_NAME(9316_dip_base)<desc_9310>; + using NETLIB_NAME(9316_dip) = NETLIB_NAME(9316_dip_base)<desc_9316>; + using NETLIB_NAME(74161_dip) = NETLIB_NAME(9316_dip_base)<desc_74161>; + using NETLIB_NAME(74163_dip) = NETLIB_NAME(9316_dip_base)<desc_74163>; + + NETLIB_DEVICE_IMPL(9310, "TTL_9310", "+CLK,+ENP,+ENT,+CLRQ,+LOADQ,+A,+B,+C,+D,@VCC,@GND") + NETLIB_DEVICE_IMPL(9310_dip, "TTL_9310_DIP", "") NETLIB_DEVICE_IMPL(9316, "TTL_9316", "+CLK,+ENP,+ENT,+CLRQ,+LOADQ,+A,+B,+C,+D,@VCC,@GND") NETLIB_DEVICE_IMPL(9316_dip, "TTL_9316_DIP", "") +#if 1 + NETLIB_DEVICE_IMPL(74161, "TTL_74161", "+CLK,+ENP,+ENT,+CLRQ,+LOADQ,+A,+B,+C,+D,@VCC,@GND") + NETLIB_DEVICE_IMPL(74161_dip, "TTL_74161_DIP", "") + + // FIXME: This happens on copy/paste + NETLIB_DEVICE_IMPL(74161_fixme, "TTL_74161_FIXME", "+A,+B,+C,+D,+CLRQ,+LOADQ,+CLK,+ENP,+ENT,@VCC,@GND") NETLIB_DEVICE_IMPL(74163, "TTL_74163", "+CLK,+ENP,+ENT,+CLRQ,+LOADQ,+A,+B,+C,+D,@VCC,@GND") NETLIB_DEVICE_IMPL(74163_dip, "TTL_74163_DIP", "") +#endif } //namespace devices } // namespace netlist diff --git a/src/lib/netlist/devices/nld_9316.h b/src/lib/netlist/devices/nld_9316.h index 05bf8af8429..eb5f5a8aca0 100644 --- a/src/lib/netlist/devices/nld_9316.h +++ b/src/lib/netlist/devices/nld_9316.h @@ -44,8 +44,41 @@ * * Naming conventions follow National Semiconductor datasheet * - * TODO: DM74161 is compatible to DM9316 (both asynchronous clear) - * DM74163 has asynchronous clear (on L to H transition of clock) + * DM9310: Synchronous 4-Bit Counters + * + * +--------------+ + * CLEAR |1 ++ 16| VCC + * CLOCK |2 15| RC (Ripple Carry) + * A |3 14| QA + * B |4 9310 13| QB + * C |5 12| QC + * D |6 11| QD + * Enable P |7 10| Enable T + * GND |8 9| LOAD + * +--------------+ + * + * Counter Sequence + * + * +-------++----+----+----+----+----+ + * | COUNT || QD | QC | QB | QA | RC | + * +=======++====+====+====+====+====+ + * | 0 || 0 | 0 | 0 | 0 | 0 | + * | 1 || 0 | 0 | 0 | 1 | 0 | + * | 2 || 0 | 0 | 1 | 0 | 0 | + * | 3 || 0 | 0 | 1 | 1 | 0 | + * | 4 || 0 | 1 | 0 | 0 | 0 | + * | 5 || 0 | 1 | 0 | 1 | 0 | + * | 6 || 0 | 1 | 1 | 0 | 0 | + * | 7 || 0 | 1 | 1 | 1 | 0 | + * | 8 || 1 | 0 | 0 | 0 | 0 | + * | 9 || 1 | 0 | 0 | 1 | 0 | + * +-------++----+----+----+----+----+ + * + * Reset count function: Please refer to + * National Semiconductor datasheet (timing diagram) + * + * Naming conventions follow National Semiconductor datasheet + * */ #ifndef NLD_9316_H_ @@ -66,24 +99,28 @@ NET_CONNECT(name, B, cB) \ NET_CONNECT(name, C, cC) \ NET_CONNECT(name, D, cD) + +#define TTL_74161(...) \ + NET_REGISTER_DEVEXT(TTL_74161, __VA_ARGS__) -#define TTL_74163(name, cCLK, cENP, cENT, cCLRQ, cLOADQ, cA, cB, cC, cD) \ - NET_REGISTER_DEV(TTL_74163, name) \ - NET_CONNECT(name, GND, GND) \ - NET_CONNECT(name, VCC, VCC) \ - NET_CONNECT(name, CLK, cCLK) \ - NET_CONNECT(name, ENP, cENP) \ - NET_CONNECT(name, ENT, cENT) \ - NET_CONNECT(name, CLRQ, cCLRQ) \ - NET_CONNECT(name, LOADQ, cLOADQ) \ - NET_CONNECT(name, A, cA) \ - NET_CONNECT(name, B, cB) \ - NET_CONNECT(name, C, cC) \ - NET_CONNECT(name, D, cD) +#define TTL_74161_FIXME(...) \ + NET_REGISTER_DEVEXT(TTL_74161_FIXME, __VA_ARGS__) + +#define TTL_74163(...) \ + NET_REGISTER_DEVEXT(TTL_74163, __VA_ARGS__) + +#define TTL_9310(...) \ + NET_REGISTER_DEVEXT(TTL_9310, __VA_ARGS__) + +#define TTL_9310_DIP(name) \ + NET_REGISTER_DEV(TTL_9310_DIP, name) #define TTL_9316_DIP(name) \ NET_REGISTER_DEV(TTL_9316_DIP, name) +#define TTL_74161_DIP(name) \ + NET_REGISTER_DEV(TTL_74161_DIP, name) + #define TTL_74163_DIP(name) \ NET_REGISTER_DEV(TTL_74163_DIP, name) diff --git a/src/lib/netlist/nl_base.h b/src/lib/netlist/nl_base.h index 8f3a7683f0d..02032a68cc1 100644 --- a/src/lib/netlist/nl_base.h +++ b/src/lib/netlist/nl_base.h @@ -2046,34 +2046,9 @@ namespace netlist //using value_type = typename plib::fast_type_for_bits<N>::type; using value_type = std::uint32_t; -#if 0 - - value_type operator ()() - { -#if 0 - if (N <= 8) - return tobits(N, *this); - else -#endif - { - value_type r(0); - for (std::size_t i = 0; i < N; i++) - r = r | static_cast<value_type>((*this)[i]() << i); - return r; - } - } - - private: - template <typename T> - static constexpr value_type tobits(std::size_t n, T &a) - { - return (n == 0 ? 0 : (tobits(n-1, a) | static_cast<value_type>(a[n-1]() << (n-1)))); - } - -#else value_type operator ()() { - if (N == 1) return e<0>(); + if (N == 1) return e<0>() ; if (N == 2) return e<0>() | (e<1>() << 1); if (N == 3) return e<0>() | (e<1>() << 1) | (e<2>() << 2); if (N == 4) return e<0>() | (e<1>() << 1) | (e<2>() << 2) | (e<3>() << 3); @@ -2095,7 +2070,6 @@ namespace netlist private: template <std::size_t P> inline constexpr value_type e() const { return (*this)[P](); } -#endif }; template<std::size_t N> diff --git a/src/lib/netlist/nltypes.h b/src/lib/netlist/nltypes.h index 77ea077a089..49591355988 100644 --- a/src/lib/netlist/nltypes.h +++ b/src/lib/netlist/nltypes.h @@ -206,12 +206,29 @@ namespace netlist } }; + template<typename T, T V> + struct fintegral_constant + { + static constexpr const T value() noexcept { return V; } + typedef T value_type; + typedef fintegral_constant<T, V> type; + }; + + template <std::size_t V> + using fdesc_const = fintegral_constant<std::size_t, V>; + + template <typename T, T V> + using fdesc_const_t = fintegral_constant<T, V>; + /// \brief: used define a constant in device description struct /// /// See the 74125 implementation /// template <std::size_t V> - using desc_const = std::integral_constant<std::size_t, V>; + using desc_const = std::integral_constant<const std::size_t, V>; + + template <typename T, T V> + using desc_const_t = std::integral_constant<const T, V>; }; diff --git a/src/mame/machine/nl_hazelvid.cpp b/src/mame/machine/nl_hazelvid.cpp index 82cd5e1bda9..c0cba088d8d 100644 --- a/src/mame/machine/nl_hazelvid.cpp +++ b/src/mame/machine/nl_hazelvid.cpp @@ -31,11 +31,11 @@ NETLIST_START(hazelvid) MAINCLOCK(video_clk, 16632000.0) /* Character line counter, divide-by-9 */ - TTL_74161(u88, high, high, high, low, high, u87_6.Q, video_clk, high, high) + TTL_74161_FIXME(u88, high, high, high, low, high, u87_6.Q, video_clk, high, high) - TTL_7404_INVERT(u87_6, u88.RCO) + TTL_7404_INVERT(u87_6, u88.RC) - TTL_74175(u81, video_clk, u88.RCO, u81.Q1, low, u88.QC, high) + TTL_74175(u81, video_clk, u88.RC, u81.Q1, low, u88.QC, high) TTL_7404_INVERT(u87_5, u81.Q1) ALIAS(ndot, u87_5.Q) @@ -45,10 +45,10 @@ NETLIST_START(hazelvid) /* Character bucket counter */ /* least significant 4 bits */ - TTL_74161(u70, low, low, low, low, high, u59_5.Q, u81.Q2Q, high, high) + TTL_74161_FIXME(u70, low, low, low, low, high, u59_5.Q, u81.Q2Q, high, high) /* most significant 4 bits */ - TTL_74161(u69, low, low, low, low, high, u59_5.Q, u81.Q2Q, u70.RCO, u70.RCO) + TTL_74161_FIXME(u69, low, low, low, low, high, u59_5.Q, u81.Q2Q, u70.RC, u70.RC) /* Horizontal/Vertical timing signals */ /* signal lookup PROM */ @@ -71,7 +71,7 @@ NETLIST_START(hazelvid) ALIAS(char_line_clk, u83_1.Q) /* Character line counter */ - TTL_74161(u84, low, low, low, low, high, u83_3.Q, char_line_clk, high, high) + TTL_74161_FIXME(u84, low, low, low, low, high, u83_3.Q, char_line_clk, high, high) ALIAS(lc20, u84.QA) ALIAS(lc21, u84.QB) ALIAS(lc22, u84.QC) @@ -82,7 +82,7 @@ NETLIST_START(hazelvid) TTL_7410_NAND(u89_3, u90.QD, u90.QC, u90.QA) /* Character row counter */ - TTL_74161(u90, low, low, low, low, high, u89_3.Q, u92_3.Q, high, high) + TTL_74161_FIXME(u90, low, low, low, low, high, u89_3.Q, u92_3.Q, high, high) TTL_7404_INVERT(u92_3, u84.QD) TTL_7404_INVERT(u92_1, u90.QB) |