summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/devices/nld_7485.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/devices/nld_7485.cpp')
-rw-r--r--src/lib/netlist/devices/nld_7485.cpp143
1 files changed, 63 insertions, 80 deletions
diff --git a/src/lib/netlist/devices/nld_7485.cpp b/src/lib/netlist/devices/nld_7485.cpp
index 7cf166a807d..6d53854b4be 100644
--- a/src/lib/netlist/devices/nld_7485.cpp
+++ b/src/lib/netlist/devices/nld_7485.cpp
@@ -3,24 +3,37 @@
/*
* nld_7485.cpp
*
+ * FIXME: Truth table candidate
+ *
+ * DM7485: 4-bit Magnitude Comparators
+ *
+ * +------------+
+ * B3 |1 ++ 16| VCC
+ * LTIN |2 15| A3
+ * EQIN |3 14| B2
+ * GTIN |4 7485 13| A2
+ * GTOUT |5 12| A1
+ * EQOUT |6 11| B1
+ * LTOUT |7 10| A0
+ * GND |8 9| B0
+ * +------------+
+ *
+ * Naming convention attempts to follow Texas Instruments datasheet
+ *
*/
-#include "nld_7485.h"
-#include "netlist/nl_base.h"
-#include "nlid_system.h"
+#include "nl_base.h"
+
+namespace netlist::devices {
-namespace netlist
-{
- namespace devices
- {
NETLIB_OBJECT(7485)
{
NETLIB_CONSTRUCTOR(7485)
- , m_A(*this, {{"A0", "A1", "A2", "A3"}})
- , m_B(*this, {{"B0", "B1", "B2", "B3"}})
- , m_LTIN(*this, "LTIN")
- , m_EQIN(*this, "EQIN")
- , m_GTIN(*this, "GTIN")
+ , m_A(*this, {"A0", "A1", "A2", "A3"}, NETLIB_DELEGATE(inputs))
+ , m_B(*this, {"B0", "B1", "B2", "B3"}, NETLIB_DELEGATE(inputs))
+ , m_LTIN(*this, "LTIN", NETLIB_DELEGATE(inputs))
+ , m_EQIN(*this, "EQIN", NETLIB_DELEGATE(inputs))
+ , m_GTIN(*this, "GTIN", NETLIB_DELEGATE(inputs))
, m_LTOUT(*this, "LTOUT")
, m_EQOUT(*this, "EQOUT")
, m_GTOUT(*this, "GTOUT")
@@ -28,11 +41,45 @@ namespace netlist
{
}
- NETLIB_UPDATEI();
+ private:
+ // FIXME: Timing
+ NETLIB_HANDLERI(inputs)
+ {
+ for (std::size_t i = 4; i-- > 0; )
+ {
+ if (m_A[i]() > m_B[i]())
+ {
+ update_outputs(1, 0, 0);
+ return;
+ }
+
+ if (m_A[i]() < m_B[i]())
+ {
+ update_outputs(0, 1, 0);
+ return;
+ }
+ }
- void update_outputs(unsigned gt, unsigned lt, unsigned eq);
+ // must be == if we got here
+ if (m_EQIN())
+ update_outputs(0, 0, 1);
+ else if (m_GTIN() && m_LTIN())
+ update_outputs(0, 0, 0);
+ else if (m_GTIN())
+ update_outputs(1, 0, 0);
+ else if (m_LTIN())
+ update_outputs(0, 1, 0);
+ else
+ update_outputs(1, 1, 0);
+ }
+
+ void update_outputs(unsigned gt, unsigned lt, unsigned eq)
+ {
+ m_GTOUT.push(gt, NLTIME_FROM_NS(23));
+ m_LTOUT.push(lt, NLTIME_FROM_NS(23));
+ m_EQOUT.push(eq, NLTIME_FROM_NS(23));
+ }
- protected:
object_array_t<logic_input_t, 4> m_A;
object_array_t<logic_input_t, 4> m_B;
logic_input_t m_LTIN;
@@ -44,70 +91,6 @@ namespace netlist
nld_power_pins m_power_pins;
};
- NETLIB_OBJECT_DERIVED(7485_dip, 7485)
- {
- NETLIB_CONSTRUCTOR_DERIVED(7485_dip, 7485)
- {
- register_subalias("1", m_B[3]);
- register_subalias("2", m_LTIN);
- register_subalias("3", m_EQIN);
- register_subalias("4", m_GTIN);
- register_subalias("5", m_GTOUT);
- register_subalias("6", m_EQOUT);
- register_subalias("7", m_LTOUT);
- register_subalias("8", "GND");
-
- register_subalias("9", m_B[0]);
- register_subalias("10", m_A[0]);
- register_subalias("11", m_B[1]);
- register_subalias("12", m_A[1]);
- register_subalias("13", m_A[2]);
- register_subalias("14", m_B[2]);
- register_subalias("15", m_A[3]);
- register_subalias("16", "VCC");
-
- }
- };
-
- void NETLIB_NAME(7485)::update_outputs(unsigned gt, unsigned lt, unsigned eq)
- {
- m_GTOUT.push(gt, NLTIME_FROM_NS(23));
- m_LTOUT.push(lt, NLTIME_FROM_NS(23));
- m_EQOUT.push(eq, NLTIME_FROM_NS(23));
- }
-
- // FIXME: Timing
- NETLIB_UPDATE(7485)
- {
- for (std::size_t i = 4; i-- > 0; )
- {
- if (m_A[i]() > m_B[i]())
- {
- update_outputs(1, 0, 0);
- return;
- }
- else if (m_A[i]() < m_B[i]())
- {
- update_outputs(0, 1, 0);
- return;
- }
- }
-
- // must be == if we got here
- if (m_EQIN())
- update_outputs(0, 0, 1);
- else if (m_GTIN() && m_LTIN())
- update_outputs(0, 0, 0);
- else if (m_GTIN())
- update_outputs(1, 0, 0);
- else if (m_LTIN())
- update_outputs(0, 1, 0);
- else
- update_outputs(1, 1, 0);
- }
-
NETLIB_DEVICE_IMPL(7485, "TTL_7485", "+A0,+A1,+A2,+A3,+B0,+B1,+B2,+B3,+LTIN,+EQIN,+GTIN,@VCC,@GND")
- NETLIB_DEVICE_IMPL(7485_dip, "TTL_7485_DIP", "")
- } //namespace devices
-} // namespace netlist
+} // namespace netlist::devices