summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/devices/nld_74107.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/devices/nld_74107.cpp')
-rw-r--r--src/lib/netlist/devices/nld_74107.cpp238
1 files changed, 119 insertions, 119 deletions
diff --git a/src/lib/netlist/devices/nld_74107.cpp b/src/lib/netlist/devices/nld_74107.cpp
index 8bc6ca4bc7a..1501be4763e 100644
--- a/src/lib/netlist/devices/nld_74107.cpp
+++ b/src/lib/netlist/devices/nld_74107.cpp
@@ -1,155 +1,155 @@
-// license:GPL-2.0+
+// license:BSD-3-Clause
// copyright-holders:Couriersud
/*
- * nld_74107.c
+ * nld_74107.cpp
+ *
+ * DM74107: DUAL J-K FLIP-FLOPS WITH CLEAR
+ *
+ * +--------------+
+ * 1J |1 ++ 14| VCC
+ * 1QQ |2 13| 1CLRQ
+ * 1Q |3 12| 1CLK
+ * 1K |4 74107 11| 2K
+ * 2Q |5 10| 2CLRQ
+ * 2QQ |6 9| 2CLK
+ * GND |7 8| 2J
+ * +--------------+
+ *
+ *
+ * Function table 107
+ *
+ * +-----+-----+-----+---++---+-----+
+ * | CLRQ| CLK | J | K || Q | QQ |
+ * +=====+=====+=====+===++===+=====+
+ * | 0 | X | X | X || 0 | 1 |
+ * | 1 | * | 0 | 0 || Q0| Q0Q |
+ * | 1 | * | 1 | 0 || 1 | 0 |
+ * | 1 | * | 0 | 1 || 0 | 1 |
+ * | 1 | * | 1 | 1 || TOGGLE |
+ * +-----+-----+-----+---++---+-----+
+ * _
+ * * = _| |_
+ *
+ * This is positive triggered, J and K
+ * are latched during clock high and
+ * transferred when CLK falls. The
+ * datasheet requires J and K to be
+ * stable during clock high.
+ *
+ * Function table 107A
+ *
+ * +-----+-----+-----+---++---+-----+
+ * | CLRQ| CLK | J | K || Q | QQ |
+ * +=====+=====+=====+===++===+=====+
+ * | 0 | X | X | X || 0 | 1 |
+ * | 1 | F | 0 | 0 || Q0| Q0Q |
+ * | 1 | F | 1 | 0 || 1 | 0 |
+ * | 1 | F | 0 | 1 || 0 | 1 |
+ * | 1 | F | 1 | 1 || TOGGLE |
+ * | 1 | 1 | X | X || Q0| Q0Q |
+ * +-----+-----+-----+---++---+-----+
+ *
+ * THe 107A is negative triggered.
+ *
+ * Naming conventions follow Texas instruments datasheet
+ *
+ * TODO: Currently, only the 107A is implemented.
+ * The 107 uses the same model, but different timings.
+ * The requirement that J and K must be stable during
+ * clock high indicates that the chip may exhibit undefined
+ * behaviour.
*
*/
-#include "nld_74107.h"
-#include "netlist/nl_base.h"
-#include "nlid_system.h"
-
-namespace netlist
-{
- namespace devices
- {
+#include "nl_base.h"
- static constexpr const netlist_time delay_107[2] = { NLTIME_FROM_NS(16), NLTIME_FROM_NS(25) };
- static constexpr const netlist_time delay_107A[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(15) };
+namespace netlist::devices {
- NETLIB_OBJECT(74107A)
+ template <typename D>
+ NETLIB_OBJECT(74107_base)
{
- NETLIB_CONSTRUCTOR(74107A)
- , m_clk(*this, "CLK", NETLIB_DELEGATE(74107A, clk))
+ NETLIB_CONSTRUCTOR(74107_base)
+ , m_clk(*this, "CLK", NETLIB_DELEGATE(clk))
+ , m_J(*this, "J", NETLIB_DELEGATE(other))
+ , m_K(*this, "K", NETLIB_DELEGATE(other))
+ , m_clrQ(*this, "CLRQ", NETLIB_DELEGATE(other))
, m_Q(*this, "Q")
, m_QQ(*this, "QQ")
- , m_J(*this, "J")
- , m_K(*this, "K")
- , m_clrQ(*this, "CLRQ")
, m_power_pins(*this)
{
- m_delay[0] = delay_107A[0];
- m_delay[1] = delay_107A[1];
}
- friend class NETLIB_NAME(74107_dip);
- friend class NETLIB_NAME(74107);
- //friend class NETLIB_NAME(74107A_dip);
-
- NETLIB_RESETI();
- NETLIB_UPDATEI();
- NETLIB_HANDLERI(clk);
-
private:
- logic_input_t m_clk;
-
- logic_output_t m_Q;
- logic_output_t m_QQ;
-
- netlist_time m_delay[2];
-
- logic_input_t m_J;
- logic_input_t m_K;
- logic_input_t m_clrQ;
-
- nld_power_pins m_power_pins;
- void newstate(const netlist_sig_t state)
+ NETLIB_RESETI()
{
- m_Q.push(state, m_delay[state]);
- m_QQ.push(state ^ 1, m_delay[state ^ 1]);
+ m_clk.set_state(logic_t::STATE_INP_HL);
+ //m_Q.initial(0);
+ //m_QQ.initial(1);
}
- };
- NETLIB_OBJECT_DERIVED(74107, 74107A)
- {
- public:
- NETLIB_CONSTRUCTOR_DERIVED(74107, 74107A)
+ NETLIB_HANDLERI(other)
{
- m_delay[0] = delay_107[0];
- m_delay[1] = delay_107[1];
+ if (!m_clrQ())
+ {
+ m_clk.inactivate();
+ newstate(0);
+ }
+ else if (m_J() | m_K())
+ m_clk.activate_hl();
}
- };
- NETLIB_OBJECT(74107_dip)
- {
- NETLIB_CONSTRUCTOR(74107_dip)
- , m_A(*this, "A")
- , m_B(*this, "B")
+ NETLIB_HANDLERI(clk)
{
- register_subalias("1", m_A.m_J);
- register_subalias("2", m_A.m_QQ);
- register_subalias("3", m_A.m_Q);
-
- register_subalias("4", m_A.m_K);
- register_subalias("5", m_B.m_Q);
- register_subalias("6", m_B.m_QQ);
-
- register_subalias("7", "A.GND");
-
- register_subalias("8", m_B.m_J);
- register_subalias("9", m_B.m_clk);
- register_subalias("10", m_B.m_clrQ);
+ const netlist_sig_t J(m_J());
+ const netlist_sig_t K(m_K());
+ const netlist_sig_t t(m_Q.net().Q());
+ /*
+ * J K Q1 Q2 F t Q
+ * 0 0 0 1 0 0 0
+ * 0 1 0 0 0 0 0
+ * 1 0 0 0 1 0 1
+ * 1 1 1 0 0 0 1
+ * 0 0 0 1 0 1 1
+ * 0 1 0 0 0 1 0
+ * 1 0 0 0 1 1 1
+ * 1 1 1 0 0 1 0
+ */
+ if ((J & K) ^ 1)
+ m_clk.inactivate();
+ newstate(((t ^ 1) & J) | (t & (K ^ 1)));
+ }
- register_subalias("11", m_B.m_K);
- register_subalias("12", m_A.m_clk);
- register_subalias("13", m_A.m_clrQ);
+ void newstate(const netlist_sig_t state) noexcept
+ {
+ m_Q.push(state, D::delay::value(state));
+ m_QQ.push(state ^ 1, D::delay::value(state ^ 1));
+ }
- register_subalias("14", "A.VCC" );
+ logic_input_t m_clk;
- connect("A.GND", "B.GND");
- connect("A.VCC", "B.VCC");
+ logic_input_t m_J;
+ logic_input_t m_K;
+ logic_input_t m_clrQ;
- }
- //NETLIB_RESETI();
- //NETLIB_UPDATEI();
+ logic_output_t m_Q;
+ logic_output_t m_QQ;
- private:
- NETLIB_SUB(74107) m_A;
- NETLIB_SUB(74107) m_B;
+ nld_power_pins m_power_pins;
};
- NETLIB_RESET(74107A)
+ struct desc_74107 : public desc_base
{
- m_clk.set_state(logic_t::STATE_INP_HL);
- //m_Q.initial(0);
- //m_QQ.initial(1);
- }
-
- NETLIB_HANDLER(74107A, clk)
+ using delay = times_ns2<16, 25>;
+ };
+ struct desc_74107A : public desc_base
{
- const netlist_sig_t t(m_Q.net().Q());
- /*
- * J K Q1 Q2 F t Q
- * 0 0 0 1 0 0 0
- * 0 1 0 0 0 0 0
- * 1 0 0 0 1 0 1
- * 1 1 1 0 0 0 1
- * 0 0 0 1 0 1 1
- * 0 1 0 0 0 1 0
- * 1 0 0 0 1 1 1
- * 1 1 1 0 0 1 0
- */
- if ((m_J() & m_K()) ^ 1)
- m_clk.inactivate();
- newstate(((t ^ 1) & m_J()) | (t & (m_K() ^ 1)));
- }
+ using delay = times_ns2<15, 15>;
+ };
- NETLIB_UPDATE(74107A)
- {
- if (!m_clrQ())
- {
- m_clk.inactivate();
- newstate(0);
- }
- else if (m_J() | m_K())
- m_clk.activate_hl();
- }
+ using NETLIB_NAME(74107) = NETLIB_NAME(74107_base)<desc_74107>;
+ using NETLIB_NAME(74107A) = NETLIB_NAME(74107_base)<desc_74107A>;
-#if (!USE_TRUTHTABLE_74107)
NETLIB_DEVICE_IMPL(74107, "TTL_74107", "+CLK,+J,+K,+CLRQ,@VCC,@GND")
- NETLIB_DEVICE_IMPL(74107_dip, "TTL_74107_DIP", "")
-#endif
NETLIB_DEVICE_IMPL(74107A, "TTL_74107A", "+CLK,+J,+K,+CLRQ,@VCC,@GND")
- } //namespace devices
-} // namespace netlist
+} // namespace netlist::devices