summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/devices/nld_7483.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/devices/nld_7483.cpp')
-rw-r--r--src/lib/netlist/devices/nld_7483.cpp151
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