summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author couriersud <couriersud@gmx.org>2020-05-21 21:36:52 +0200
committer couriersud <couriersud@gmx.org>2020-05-22 01:15:18 +0200
commit5a43cc6432e86a7e6c90d98145151528fa07e9fb (patch)
treeeb6cf5974b587081b31544f6c6e7eef5630a93a6
parentdae6a396c9c79e1ccc6587dc3be1764df62dc61c (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.lua4
-rw-r--r--src/lib/netlist/build/makefile2
-rw-r--r--src/lib/netlist/devices/net_lib.cpp1
-rw-r--r--src/lib/netlist/devices/net_lib.h2
-rw-r--r--src/lib/netlist/devices/nld_74161.cpp145
-rw-r--r--src/lib/netlist/devices/nld_74161.h47
-rw-r--r--src/lib/netlist/devices/nld_9310.cpp227
-rw-r--r--src/lib/netlist/devices/nld_9310.h67
-rw-r--r--src/lib/netlist/devices/nld_9316.cpp106
-rw-r--r--src/lib/netlist/devices/nld_9316.h67
-rw-r--r--src/lib/netlist/nl_base.h28
-rw-r--r--src/lib/netlist/nltypes.h19
-rw-r--r--src/mame/machine/nl_hazelvid.cpp14
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)