diff options
Diffstat (limited to 'src/lib/netlist/devices/nld_7450.cpp')
-rw-r--r-- | src/lib/netlist/devices/nld_7450.cpp | 149 |
1 files changed, 64 insertions, 85 deletions
diff --git a/src/lib/netlist/devices/nld_7450.cpp b/src/lib/netlist/devices/nld_7450.cpp index 818dad40853..df420de69ea 100644 --- a/src/lib/netlist/devices/nld_7450.cpp +++ b/src/lib/netlist/devices/nld_7450.cpp @@ -1,111 +1,90 @@ - // license:GPL-2.0+ +// license:BSD-3-Clause // copyright-holders:Couriersud /* - * nld_7450.c + * nld_7450.cpp + * + * DM7450: DUAL 2-WIDE 2-INPUT AND-OR-INVERT GATES (ONE GATE EXPANDABLE) + * + * +--------------+ + * 1A |1 ++ 14| VCC + * 2A |2 13| 1B + * 2B |3 12| 1XQ + * 2C |4 7450 11| 1X + * 2D |5 10| 1D + * 2Y |6 9| 1C + * GND |7 8| 1Y + * +--------------+ + * _________________ + * Y = (A & B) | (C & D) + * + * Naming conventions follow Texas Instruments datasheet * */ -#include "nld_7450.h" -#include "netlist/nl_base.h" -#include "nlid_system.h" +#include "nl_base.h" + +namespace netlist::devices { + + static constexpr const std::array<netlist_time, 2> times = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(22) }; + + // FIXME: timing, see 74107 for example, use template -namespace netlist -{ - namespace devices - { NETLIB_OBJECT(7450) { NETLIB_CONSTRUCTOR(7450) - , m_A(*this, "A") - , m_B(*this, "B") - , m_C(*this, "C") - , m_D(*this, "D") + , m_A(*this, "A", NETLIB_DELEGATE(inputs)) + , m_B(*this, "B", NETLIB_DELEGATE(inputs)) + , m_C(*this, "C", NETLIB_DELEGATE(inputs)) + , m_D(*this, "D", NETLIB_DELEGATE(inputs)) , m_Q(*this, "Q") , m_power_pins(*this) { } - //NETLIB_RESETI(); - NETLIB_UPDATEI(); - - public: - logic_input_t m_A; - logic_input_t m_B; - logic_input_t m_C; - logic_input_t m_D; - logic_output_t m_Q; - nld_power_pins m_power_pins; - }; - - NETLIB_OBJECT(7450_dip) - { - NETLIB_CONSTRUCTOR(7450_dip) - , m_A(*this, "A") - , m_B(*this, "B") - { - register_subalias("1", m_A.m_A); - register_subalias("2", m_B.m_A); - register_subalias("3", m_B.m_B); - register_subalias("4", m_B.m_C); - register_subalias("5", m_B.m_D); - register_subalias("6", m_B.m_Q); - register_subalias("7", "A.GND"); - - register_subalias("8", m_A.m_Q); - register_subalias("9", m_A.m_C); - register_subalias("10", m_A.m_D); - //register_subalias("11", m_1.m_X1); - //register_subalias("12", m_1.m_X1Q); - register_subalias("13", m_A.m_B); - register_subalias("14", "A.VCC"); - connect("A.GND", "B.GND"); - connect("A.VCC", "B.VCC"); - - } //NETLIB_RESETI(); - //NETLIB_UPDATEI(); - - NETLIB_SUB(7450) m_A; - NETLIB_SUB(7450) m_B; - }; - - NETLIB_UPDATE(7450) - { - m_A.activate(); - m_B.activate(); - m_C.activate(); - m_D.activate(); - auto t1 = m_A() & m_B(); - auto t2 = m_C() & m_D(); - - const netlist_time times[2] = { NLTIME_FROM_NS(15), NLTIME_FROM_NS(22) }; - uint_fast8_t res = 0; - if (t1 ^ 1) + private: + NETLIB_HANDLERI(inputs) { - if (t2 ^ 1) + m_A.activate(); + m_B.activate(); + m_C.activate(); + m_D.activate(); + auto t1 = m_A() & m_B(); + auto t2 = m_C() & m_D(); + + uint_fast8_t res = 0; + if (t1 ^ 1) { - res = 1; + if (t2 ^ 1) + { + res = 1; + } + else + { + m_A.inactivate(); + m_B.inactivate(); + } } else { - m_A.inactivate(); - m_B.inactivate(); - } - } - else - { - if (t2 ^ 1) - { - m_C.inactivate(); - m_D.inactivate(); + if (t2 ^ 1) + { + m_C.inactivate(); + m_D.inactivate(); + } } + m_Q.push(res, times[res]);// ? 22000 : 15000); } - m_Q.push(res, times[res]);// ? 22000 : 15000); - } + + logic_input_t m_A; + logic_input_t m_B; + logic_input_t m_C; + logic_input_t m_D; + logic_output_t m_Q; + nld_power_pins m_power_pins; + }; NETLIB_DEVICE_IMPL(7450, "TTL_7450_ANDORINVERT", "+A,+B,+C,+D,@VCC,@GND") - NETLIB_DEVICE_IMPL(7450_dip, "TTL_7450_DIP", "") - } //namespace devices -} // namespace netlist +} // namespace netlist::devices |