summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/devices/nld_9316.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/devices/nld_9316.cpp')
-rw-r--r--src/lib/netlist/devices/nld_9316.cpp217
1 files changed, 88 insertions, 129 deletions
diff --git a/src/lib/netlist/devices/nld_9316.cpp b/src/lib/netlist/devices/nld_9316.cpp
index 8977f9d0364..54dcb7cc39e 100644
--- a/src/lib/netlist/devices/nld_9316.cpp
+++ b/src/lib/netlist/devices/nld_9316.cpp
@@ -1,141 +1,100 @@
-// license:GPL-2.0+
+// license:BSD-3-Clause
// copyright-holders:Couriersud
/*
- * nld_9316.c
+ * nld_9316.cpp
+ *
+ * DM9316: Synchronous 4-Bit Counters
+ *
+ * +--------------+
+ * /CLEAR |1 ++ 16| VCC
+ * CLOCK |2 15| RC (Ripple Carry)
+ * A |3 14| QA
+ * B |4 9316 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 |
+ * | 10 || 1 | 0 | 1 | 0 | 0 |
+ * | 11 || 1 | 0 | 1 | 1 | 0 |
+ * | 12 || 1 | 1 | 0 | 0 | 0 |
+ * | 13 || 1 | 1 | 0 | 1 | 0 |
+ * | 14 || 1 | 1 | 1 | 0 | 0 |
+ * | 15 || 1 | 1 | 1 | 1 | 1 |
+ * +-------++----+----+----+----+----+
+ *
+ * Reset count function: Please refer to
+ * National Semiconductor datasheet (timing diagram)
+ *
+ * Naming conventions follow National Semiconductor datasheet
+ *
+ * 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
*
*/
-#include "nld_9316.h"
-#include "netlist/nl_base.h"
-#include "nlid_system.h"
-
-namespace netlist
-{
- namespace devices
- {
-
- static constexpr const unsigned MAXCNT = 15;
-
- NETLIB_OBJECT(9316)
- {
- NETLIB_CONSTRUCTOR(9316)
- , m_CLK(*this, "CLK", NETLIB_DELEGATE(9316, clk))
- , m_ENT(*this, "ENT")
- , m_RC(*this, "RC")
- , m_LOADQ(*this, "LOADQ")
- , m_ENP(*this, "ENP")
- , m_CLRQ(*this, "CLRQ")
- , m_ABCD(*this, {{"A", "B", "C", "D"}}, NETLIB_DELEGATE(9316, abcd))
- , m_Q(*this, {{ "QA", "QB", "QC", "QD" }})
- , m_cnt(*this, "m_cnt", 0)
- , m_abcd(*this, "m_abcd", 0)
- , m_loadq(*this, "m_loadq", 0)
- , m_ent(*this, "m_ent", 0)
- , m_power_pins(*this)
- {
- }
-
- private:
- NETLIB_RESETI()
- {
- m_CLK.set_state(logic_t::STATE_INP_LH);
- m_cnt = 0;
- m_abcd = 0;
- }
-
- NETLIB_UPDATEI()
- {
- const auto CLRQ(m_CLRQ());
- m_ent = m_ENT();
- m_loadq = m_LOADQ();
-
- if (((m_loadq ^ 1) || (m_ent && m_ENP())) && CLRQ)
- {
- m_CLK.activate_lh();
- }
- else
- {
- m_CLK.inactivate();
- if (!CLRQ && (m_cnt>0))
- {
- update_outputs_all(0, NLTIME_FROM_NS(36));
- m_cnt = 0;
- }
- }
- m_RC.push(m_ent && (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
- }
-
-
- NETLIB_HANDLERI(clk)
- {
- auto cnt = (m_loadq ? (m_cnt + 1) & MAXCNT: m_abcd);
- m_RC.push(m_ent && (cnt == MAXCNT), NLTIME_FROM_NS(27));
- update_outputs_all(cnt, NLTIME_FROM_NS(20));
- m_cnt = cnt;
- }
-
- NETLIB_HANDLERI(abcd)
- {
- m_abcd = static_cast<unsigned>((m_ABCD[0]() << 0) | (m_ABCD[1]() << 1) | (m_ABCD[2]() << 2) | (m_ABCD[3]() << 3));
- }
-
- logic_input_t m_CLK;
- logic_input_t m_ENT;
-
- logic_output_t m_RC;
-
- logic_input_t m_LOADQ;
-
- logic_input_t m_ENP;
- logic_input_t m_CLRQ;
-
- object_array_t<logic_input_t, 4> m_ABCD;
- object_array_t<logic_output_t, 4> m_Q;
-
- /* counter state */
- state_var<unsigned> m_cnt;
- /* cached pins */
- state_var<unsigned> m_abcd;
- state_var_sig m_loadq;
- state_var_sig m_ent;
- nld_power_pins m_power_pins;
+#include "nl_base.h"
+#include "nl_factory.h"
- void update_outputs_all(unsigned cnt, netlist_time out_delay) noexcept
- {
- m_Q[0].push((cnt >> 0) & 1, out_delay);
- m_Q[1].push((cnt >> 1) & 1, out_delay);
- m_Q[2].push((cnt >> 2) & 1, out_delay);
- m_Q[3].push((cnt >> 3) & 1, out_delay);
- }
- };
+#include "nld_9316_base.hxx"
- NETLIB_OBJECT_DERIVED(9316_dip, 9316)
- {
- NETLIB_CONSTRUCTOR_DERIVED(9316_dip, 9316)
- {
- register_subalias("1", "CLRQ");
- register_subalias("2", "CLK");
- register_subalias("3", "A");
- register_subalias("4", "B");
- register_subalias("5", "C");
- register_subalias("6", "D");
- register_subalias("7", "ENP");
- register_subalias("8", "GND");
+// FIXME: All detail can be found in nld_9316_base.hxx
+// At least gcc-7.x needs the implementations of the base device
+// in different compilation units. If created in the same file
+// performance degrades horrible.
- register_subalias("9", "LOADQ");
- register_subalias("10", "ENT");
- register_subalias("11", "QD");
- register_subalias("12", "QC");
- register_subalias("13", "QB");
- register_subalias("14", "QA");
- register_subalias("15", "RC");
- register_subalias("16", "VCC");
- }
- };
+// FIXME: this file could be created programmatically
+namespace netlist::devices {
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", "")
- } //namespace devices
-} // namespace netlist
+} // namespace netlist::devices