summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/devices/nld_9322.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/devices/nld_9322.cpp')
-rw-r--r--src/lib/netlist/devices/nld_9322.cpp102
1 files changed, 102 insertions, 0 deletions
diff --git a/src/lib/netlist/devices/nld_9322.cpp b/src/lib/netlist/devices/nld_9322.cpp
new file mode 100644
index 00000000000..afecca03e63
--- /dev/null
+++ b/src/lib/netlist/devices/nld_9322.cpp
@@ -0,0 +1,102 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+/*
+ * nld_9322.cpp
+ *
+ */
+
+#include "nld_9322.h"
+
+namespace netlist
+{
+ namespace devices
+ {
+ NETLIB_OBJECT(9322_selector)
+ {
+ NETLIB_CONSTRUCTOR(9322_selector)
+ , m_A(*this, "A")
+ , m_B(*this, "B")
+ , m_Y(*this, "Y")
+ {
+ }
+
+ void update_outputs(const netlist_sig_t strobe, const netlist_sig_t select);
+
+ public:
+ logic_input_t m_A;
+ logic_input_t m_B;
+ logic_output_t m_Y;
+ };
+
+ // FIXME: Timing
+ void NETLIB_NAME(9322_selector)::update_outputs(const netlist_sig_t strobe, const netlist_sig_t select)
+ {
+ if (strobe)
+ m_Y.push(0, NLTIME_FROM_NS(21));
+ else if (select)
+ m_Y.push(m_B(), NLTIME_FROM_NS(14));
+ else
+ m_Y.push(m_A(), NLTIME_FROM_NS(14));
+ }
+
+ NETLIB_OBJECT(9322)
+ {
+ NETLIB_CONSTRUCTOR(9322)
+ , m_1(*this, "1")
+ , m_2(*this, "2")
+ , m_3(*this, "3")
+ , m_4(*this, "4")
+ , m_SELECT(*this, "SELECT")
+ , m_STROBE(*this, "STROBE")
+ {
+ }
+
+ NETLIB_UPDATEI();
+
+ protected:
+ NETLIB_SUB(9322_selector) m_1;
+ NETLIB_SUB(9322_selector) m_2;
+ NETLIB_SUB(9322_selector) m_3;
+ NETLIB_SUB(9322_selector) m_4;
+
+ logic_input_t m_SELECT;
+ logic_input_t m_STROBE;
+ };
+
+ NETLIB_OBJECT_DERIVED(9322_dip, 9322)
+ {
+ NETLIB_CONSTRUCTOR_DERIVED(9322_dip, 9322)
+ {
+ register_subalias("1", m_SELECT);
+ register_subalias("2", m_1.m_A);
+ register_subalias("3", m_1.m_B);
+ register_subalias("4", m_1.m_Y);
+ register_subalias("5", m_2.m_A);
+ register_subalias("6", m_2.m_B);
+ register_subalias("7", m_2.m_Y);
+
+ register_subalias("9", m_3.m_Y);
+ register_subalias("10", m_3.m_B);
+ register_subalias("11", m_3.m_A);
+ register_subalias("12", m_4.m_Y);
+ register_subalias("13", m_4.m_B);
+ register_subalias("14", m_4.m_A);
+ register_subalias("15", m_STROBE);
+ }
+ };
+
+ NETLIB_UPDATE(9322)
+ {
+ const netlist_sig_t strobe = m_STROBE();
+ const netlist_sig_t select = m_SELECT();
+ m_1.update_outputs(strobe, select);
+ m_2.update_outputs(strobe, select);
+ m_3.update_outputs(strobe, select);
+ m_4.update_outputs(strobe, select);
+ }
+
+ NETLIB_DEVICE_IMPL(9322)
+ NETLIB_DEVICE_IMPL(9322_dip)
+
+ } //namespace devices
+} // namespace netlist