summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/devices/nld_7492.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/devices/nld_7492.cpp')
-rw-r--r--src/lib/netlist/devices/nld_7492.cpp135
1 files changed, 135 insertions, 0 deletions
diff --git a/src/lib/netlist/devices/nld_7492.cpp b/src/lib/netlist/devices/nld_7492.cpp
new file mode 100644
index 00000000000..1689ff0dd9d
--- /dev/null
+++ b/src/lib/netlist/devices/nld_7492.cpp
@@ -0,0 +1,135 @@
+// license:BSD-3-Clause
+// copyright-holders:Couriersud
+/*
+ * nld_7492.cpp
+ *
+ * SN7492: Divide-by-12 Counter
+ *
+ * +--------------+
+ * B |1 ++ 14| A
+ * NC |2 13| NC
+ * NC |3 12| QA
+ * NC |4 7492 11| QD
+ * VCC |5 10| GND
+ * R01 |6 9| QB
+ * R02 |7 8| QC
+ * +--------------+
+ *
+ * Counter Sequence
+ *
+ * +-------++----+----+----+----+
+ * | COUNT || QD | QC | QB | QA |
+ * +=======++====+====+====+====+
+ * | 0 || 0 | 0 | 0 | 0 |
+ * | 1 || 0 | 0 | 0 | 1 |
+ * | 2 || 0 | 0 | 1 | 0 |
+ * | 3 || 0 | 0 | 1 | 1 |
+ * | 4 || 0 | 1 | 0 | 0 |
+ * | 5 || 0 | 1 | 0 | 1 |
+ * | 6 || 1 | 0 | 0 | 0 |
+ * | 7 || 1 | 0 | 0 | 1 |
+ * | 8 || 1 | 0 | 1 | 0 |
+ * | 9 || 1 | 0 | 1 | 1 |
+ * | 10 || 1 | 1 | 0 | 0 |
+ * | 11 || 1 | 1 | 0 | 1 |
+ * +-------++----+----+----+----+
+ *
+ * Note A Output QA is connected to input B
+ *
+ * Reset Count Function table
+ *
+ * +-----+-----++----+----+----+----+
+ * | R01 | R02 || QD | QC | QB | QA |
+ * +=====+=====++====+====+====+====+
+ * | 1 | 1 || 0 | 0 | 0 | 0 |
+ * | 0 | X || COUNT |
+ * | X | 0 || COUNT |
+ * +-----+-----++----+----+----+----+
+ *
+ * Naming conventions follow Texas Instruments datasheet
+ *
+ */
+
+#include "nl_base.h"
+
+namespace netlist::devices {
+
+ static constexpr const std::array<const netlist_time, 4> delay =
+ {
+ NLTIME_FROM_NS(18),
+ NLTIME_FROM_NS(36) - NLTIME_FROM_NS(18),
+ NLTIME_FROM_NS(54) - NLTIME_FROM_NS(18),
+ NLTIME_FROM_NS(72) - NLTIME_FROM_NS(18)
+ };
+
+ NETLIB_OBJECT(7492)
+ {
+ NETLIB_CONSTRUCTOR(7492)
+ , m_A(*this, "A", NETLIB_DELEGATE(inputs))
+ , m_B(*this, "B", NETLIB_DELEGATE(inputs))
+ , m_R1(*this, "R1", NETLIB_DELEGATE(inputs))
+ , m_R2(*this, "R2", NETLIB_DELEGATE(inputs))
+ , m_cnt(*this, "m_cnt", 0)
+ , m_last_A(*this, "m_last_A", 0)
+ , m_last_B(*this, "m_last_B", 0)
+ , m_Q(*this, {"QA", "QB", "QC", "QD"})
+ , m_power_pins(*this)
+ {
+ }
+
+ private:
+
+ NETLIB_HANDLERI(inputs)
+ {
+ const netlist_sig_t new_A = m_A();
+ const netlist_sig_t new_B = m_B();
+
+ if (m_R1() & m_R2())
+ {
+ m_cnt = 0;
+ m_Q.push(0, delay);
+ }
+ else
+ {
+ if (m_last_A && !new_A) // High - Low
+ {
+ m_cnt ^= 1;
+ m_Q[0].push(m_cnt & 1, delay[0]);
+ }
+ if (m_last_B && !new_B) // High - Low
+ {
+ m_cnt += 2;
+ if (m_cnt == 6)
+ m_cnt = 8;
+ if (m_cnt == 14)
+ m_cnt = 0;
+ m_Q.push(m_cnt, delay);
+ }
+ }
+ m_last_A = new_A;
+ m_last_B = new_B;
+ }
+
+ NETLIB_RESETI()
+ {
+ m_cnt = 0;
+ m_last_A = 0;
+ m_last_B = 0;
+ }
+
+ logic_input_t m_A;
+ logic_input_t m_B;
+ logic_input_t m_R1;
+ logic_input_t m_R2;
+
+ state_var_u8 m_cnt;
+ state_var<netlist_sig_t> m_last_A;
+ state_var<netlist_sig_t> m_last_B;
+
+ object_array_t<logic_output_t, 4> m_Q;
+ nld_power_pins m_power_pins;
+ };
+
+ NETLIB_DEVICE_IMPL(7492, "TTL_7492", "+A,+B,+R1,+R2,@VCC,@GND")
+
+} // namespace netlist::devices