diff options
Diffstat (limited to 'src/lib/netlist/devices/nld_7483.cpp')
-rw-r--r-- | src/lib/netlist/devices/nld_7483.cpp | 151 |
1 files changed, 67 insertions, 84 deletions
diff --git a/src/lib/netlist/devices/nld_7483.cpp b/src/lib/netlist/devices/nld_7483.cpp index a2c479a5488..866b8569284 100644 --- a/src/lib/netlist/devices/nld_7483.cpp +++ b/src/lib/netlist/devices/nld_7483.cpp @@ -1,30 +1,45 @@ -// license:GPL-2.0+ +// license:BSD-3-Clause // copyright-holders:Couriersud /* - * nld_7483.c + * nld_7483.cpp + * + * DM7483: 4-Bit Binary Adder with Fast Carry + * + * +--------------+ + * A4 |1 ++ 16| B4 + * S3 |2 15| S4 + * A3 |3 14| C4 + * B3 |4 7483 13| C0 + * VCC |5 12| GND + * S2 |6 11| B1 + * B2 |7 10| A1 + * A2 |8 9| S1 + * +--------------+ + * + * S = (A + B + C0) & 0x0f + * + * C4 = (A + B + C) > 15 ? 1 : 0 + * + * Naming conventions follow Fairchild Semiconductor datasheet * */ -#include "nld_7483.h" -#include "netlist/nl_base.h" -#include "nlid_system.h" +#include "nl_base.h" + +namespace netlist::devices { -namespace netlist -{ - namespace devices - { NETLIB_OBJECT(7483) { NETLIB_CONSTRUCTOR(7483) - , m_C0(*this, "C0") - , m_A1(*this, "A1", NETLIB_DELEGATE(7483, upd_a)) - , m_A2(*this, "A2", NETLIB_DELEGATE(7483, upd_a)) - , m_A3(*this, "A3", NETLIB_DELEGATE(7483, upd_a)) - , m_A4(*this, "A4", NETLIB_DELEGATE(7483, upd_a)) - , m_B1(*this, "B1", NETLIB_DELEGATE(7483, upd_b)) - , m_B2(*this, "B2", NETLIB_DELEGATE(7483, upd_b)) - , m_B3(*this, "B3", NETLIB_DELEGATE(7483, upd_b)) - , m_B4(*this, "B4", NETLIB_DELEGATE(7483, upd_b)) + , m_C0(*this, "C0", NETLIB_DELEGATE(c0)) + , m_A1(*this, "A1", NETLIB_DELEGATE(upd_a)) + , m_A2(*this, "A2", NETLIB_DELEGATE(upd_a)) + , m_A3(*this, "A3", NETLIB_DELEGATE(upd_a)) + , m_A4(*this, "A4", NETLIB_DELEGATE(upd_a)) + , m_B1(*this, "B1", NETLIB_DELEGATE(upd_b)) + , m_B2(*this, "B2", NETLIB_DELEGATE(upd_b)) + , m_B3(*this, "B3", NETLIB_DELEGATE(upd_b)) + , m_B4(*this, "B4", NETLIB_DELEGATE(upd_b)) , m_a(*this, "m_a", 0) , m_b(*this, "m_b", 0) , m_lastr(*this, "m_lastr", 0) @@ -36,12 +51,40 @@ namespace netlist , m_power_pins(*this) { } - NETLIB_RESETI(); - NETLIB_UPDATEI(); - NETLIB_HANDLERI(upd_a); - NETLIB_HANDLERI(upd_b); + NETLIB_RESETI() + { + m_lastr = 0; + } + + private: + NETLIB_HANDLERI(c0) + { + auto r = static_cast<uint8_t>(m_a + m_b + m_C0()); + + if (r != m_lastr) + { + m_lastr = r; + m_S1.push((r >> 0) & 1, NLTIME_FROM_NS(23)); + m_S2.push((r >> 1) & 1, NLTIME_FROM_NS(23)); + m_S3.push((r >> 2) & 1, NLTIME_FROM_NS(23)); + m_S4.push((r >> 3) & 1, NLTIME_FROM_NS(23)); + m_C4.push((r >> 4) & 1, NLTIME_FROM_NS(23)); + } + } + + NETLIB_HANDLERI(upd_a) + { + m_a = static_cast<uint8_t>((m_A1() << 0) | (m_A2() << 1) | (m_A3() << 2) | (m_A4() << 3)); + c0(); + } + + NETLIB_HANDLERI(upd_b) + { + m_b = static_cast<uint8_t>((m_B1() << 0) | (m_B2() << 1) | (m_B3() << 2) | (m_B4() << 3)); + c0(); + } + - protected: logic_input_t m_C0; logic_input_t m_A1; logic_input_t m_A2; @@ -64,66 +107,6 @@ namespace netlist nld_power_pins m_power_pins; }; - NETLIB_OBJECT_DERIVED(7483_dip, 7483) - { - NETLIB_CONSTRUCTOR_DERIVED(7483_dip, 7483) - { - register_subalias("1", m_A4); - register_subalias("2", m_S3); - register_subalias("3", m_A3); - register_subalias("4", m_B3); - register_subalias("5", "VCC"); - register_subalias("6", m_S2); - register_subalias("7", m_B2); - register_subalias("8", m_A2); - - register_subalias("9", m_S1); - register_subalias("10", m_A1); - register_subalias("11", m_B1); - register_subalias("12", "GND"); - register_subalias("13", m_C0); - register_subalias("14", m_C4); - register_subalias("15", m_S4); - register_subalias("16", m_B4); - } - //NETLIB_RESETI(); - //NETLIB_UPDATEI(); - }; - - NETLIB_RESET(7483) - { - m_lastr = 0; - } - - NETLIB_HANDLER(7483, upd_a) - { - m_a = static_cast<uint8_t>((m_A1() << 0) | (m_A2() << 1) | (m_A3() << 2) | (m_A4() << 3)); - NETLIB_NAME(7483)::update(); - } - - NETLIB_HANDLER(7483, upd_b) - { - m_b = static_cast<uint8_t>((m_B1() << 0) | (m_B2() << 1) | (m_B3() << 2) | (m_B4() << 3)); - NETLIB_NAME(7483)::update(); - } - - NETLIB_UPDATE(7483) - { - auto r = static_cast<uint8_t>(m_a + m_b + m_C0()); - - if (r != m_lastr) - { - m_lastr = r; - m_S1.push((r >> 0) & 1, NLTIME_FROM_NS(23)); - m_S2.push((r >> 1) & 1, NLTIME_FROM_NS(23)); - m_S3.push((r >> 2) & 1, NLTIME_FROM_NS(23)); - m_S4.push((r >> 3) & 1, NLTIME_FROM_NS(23)); - m_C4.push((r >> 4) & 1, NLTIME_FROM_NS(23)); - } - } - NETLIB_DEVICE_IMPL(7483, "TTL_7483", "+A1,+A2,+A3,+A4,+B1,+B2,+B3,+B4,+C0,@VCC,@GND") - NETLIB_DEVICE_IMPL(7483_dip, "TTL_7483_DIP", "") - } //namespace devices -} // namespace netlist +} // namespace netlist::devices |