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.cpp107
1 files changed, 107 insertions, 0 deletions
diff --git a/src/lib/netlist/devices/nld_7485.cpp b/src/lib/netlist/devices/nld_7485.cpp
new file mode 100644
index 00000000000..ba51756cac1
--- /dev/null
+++ b/src/lib/netlist/devices/nld_7485.cpp
@@ -0,0 +1,107 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+/*
+ * nld_7485.cpp
+ *
+ */
+
+#include "nld_7485.h"
+
+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_LTOUT(*this, "LTOUT")
+ , m_EQOUT(*this, "EQOUT")
+ , m_GTOUT(*this, "GTOUT")
+ {
+ }
+
+ NETLIB_UPDATEI();
+
+ void update_outputs(unsigned gt, unsigned lt, unsigned eq);
+
+ protected:
+ object_array_t<logic_input_t, 4> m_A;
+ object_array_t<logic_input_t, 4> m_B;
+ logic_input_t m_LTIN;
+ logic_input_t m_EQIN;
+ logic_input_t m_GTIN;
+ logic_output_t m_LTOUT;
+ logic_output_t m_EQOUT;
+ logic_output_t m_GTOUT;
+ };
+
+ 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("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]);
+
+ }
+ };
+
+ 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::int_fast32_t i = 3; i >= 0; i--)
+ {
+ 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)
+ NETLIB_DEVICE_IMPL(7485_dip)
+
+ } //namespace devices
+} // namespace netlist