diff options
Diffstat (limited to 'src/lib/netlist/devices/nld_74107.cpp')
-rw-r--r-- | src/lib/netlist/devices/nld_74107.cpp | 238 |
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 |