summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/devices/nld_74194.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/devices/nld_74194.cpp')
-rw-r--r--src/lib/netlist/devices/nld_74194.cpp122
1 files changed, 122 insertions, 0 deletions
diff --git a/src/lib/netlist/devices/nld_74194.cpp b/src/lib/netlist/devices/nld_74194.cpp
new file mode 100644
index 00000000000..e951e351e93
--- /dev/null
+++ b/src/lib/netlist/devices/nld_74194.cpp
@@ -0,0 +1,122 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+/*
+ * nld_74194.cpp
+ *
+ */
+
+#include "nld_74194.h"
+
+namespace netlist
+{
+ namespace devices
+ {
+ NETLIB_OBJECT(74194)
+ {
+ NETLIB_CONSTRUCTOR(74194)
+ , m_DATA(*this, {{"D", "C", "B", "A"}})
+ , m_SLIN(*this, "SLIN")
+ , m_SRIN(*this, "SRIN")
+ , m_CLK(*this, "CLK")
+ , m_S0(*this, "S0")
+ , m_S1(*this, "S1")
+ , m_CLRQ(*this, "CLRQ")
+ , m_Q(*this, {{"QD", "QC", "QB", "QA"}})
+ , m_last_CLK(*this, "m_last_CLK", 0)
+ , m_last_Q(*this, "m_last_Q", 0)
+ {
+ }
+
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+
+ protected:
+ object_array_t<logic_input_t, 4> m_DATA;
+ logic_input_t m_SLIN;
+ logic_input_t m_SRIN;
+ logic_input_t m_CLK;
+ logic_input_t m_S0;
+ logic_input_t m_S1;
+ logic_input_t m_CLRQ;
+ object_array_t<logic_output_t, 4> m_Q;
+
+ state_var<unsigned> m_last_CLK;
+ state_var<unsigned> m_last_Q;
+ };
+
+ NETLIB_OBJECT_DERIVED(74194_dip, 74194)
+ {
+ NETLIB_CONSTRUCTOR_DERIVED(74194_dip, 74194)
+ {
+ register_subalias("1", m_CLRQ);
+ register_subalias("2", m_SRIN);
+ register_subalias("3", m_DATA[3]);
+ register_subalias("4", m_DATA[2]);
+ register_subalias("5", m_DATA[1]);
+ register_subalias("6", m_DATA[0]);
+ register_subalias("7", m_SLIN);
+
+ register_subalias("9", m_S0);
+ register_subalias("10", m_S1);
+ register_subalias("11", m_CLK);
+ register_subalias("12", m_Q[0]);
+ register_subalias("13", m_Q[1]);
+ register_subalias("14", m_Q[2]);
+ register_subalias("15", m_Q[3]);
+
+ }
+ };
+
+ NETLIB_RESET(74194)
+ {
+ m_last_CLK = 0;
+ m_last_Q = 0;
+ }
+
+ // FIXME: Timing
+ NETLIB_UPDATE(74194)
+ {
+ unsigned q = m_last_Q;
+
+ if (!m_CLRQ())
+ {
+ q = 0;
+ }
+ else
+ {
+ if (!m_last_CLK && m_CLK())
+ {
+ unsigned s = (m_S1() << 1) | m_S0();
+ switch (s)
+ {
+ case 0: // LL: Keep old value
+ break;
+ case 1: // LH: Shift right
+ q >>= 1;
+ q |= m_SRIN() ? 8 : 0;
+ break;
+ case 2:
+ q <<= 1;
+ q |= m_SLIN() ? 1 : 0;
+ break;
+ case 3:
+ q = 0;
+ for (std::size_t i=0; i<4; i++)
+ q |= m_DATA[i]() << i;
+ break;
+ }
+ }
+ }
+
+ m_last_Q = q;
+ m_last_CLK = m_CLK();
+
+ for (std::size_t i=0; i<4; i++)
+ m_Q[i].push((q >> i) & 1, NLTIME_FROM_NS(26)); // FIXME: Timing
+ }
+
+ NETLIB_DEVICE_IMPL(74194)
+ NETLIB_DEVICE_IMPL(74194_dip)
+
+ } //namespace devices
+} // namespace netlist