summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/devices/nld_74161.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/devices/nld_74161.cpp')
-rw-r--r--src/lib/netlist/devices/nld_74161.cpp133
1 files changed, 133 insertions, 0 deletions
diff --git a/src/lib/netlist/devices/nld_74161.cpp b/src/lib/netlist/devices/nld_74161.cpp
new file mode 100644
index 00000000000..d6e31f36417
--- /dev/null
+++ b/src/lib/netlist/devices/nld_74161.cpp
@@ -0,0 +1,133 @@
+// license:BSD-3-Clause
+// copyright-holders:Ryan Holtz
+/*
+ * nld_74161.cpp
+ *
+ */
+
+#define MAXCNT 15
+
+#include "nld_74161.h"
+
+namespace netlist
+{
+ namespace devices
+ {
+ NETLIB_OBJECT(74161)
+ {
+ NETLIB_CONSTRUCTOR(74161)
+ , m_A(*this, "A")
+ , m_B(*this, "B")
+ , m_C(*this, "C")
+ , m_D(*this, "D")
+ , m_CLRQ(*this, "CLRQ")
+ , m_LOADQ(*this, "LOADQ")
+ , m_CLK(*this, "CLK")
+ , m_ENABLEP(*this, "ENABLEP")
+ , m_ENABLET(*this, "ENABLET")
+ , m_cnt(*this, "m_cnt", 0)
+ , m_last_CLK(*this, "m_last_CLK", 0)
+ , m_Q(*this, {{"QA", "QB", "QC", "QD"}})
+ , m_RCO(*this, "RCO")
+ {
+ }
+
+ NETLIB_RESETI();
+ NETLIB_UPDATEI();
+
+ protected:
+ logic_input_t m_A;
+ logic_input_t m_B;
+ logic_input_t m_C;
+ logic_input_t m_D;
+ logic_input_t m_CLRQ;
+ logic_input_t m_LOADQ;
+ logic_input_t m_CLK;
+ logic_input_t m_ENABLEP;
+ logic_input_t m_ENABLET;
+
+ state_var<unsigned> m_cnt;
+ state_var<unsigned> m_last_CLK;
+
+ object_array_t<logic_output_t, 4> m_Q;
+ logic_output_t m_RCO;
+ };
+
+ NETLIB_OBJECT_DERIVED(74161_dip, 74161)
+ {
+ NETLIB_CONSTRUCTOR_DERIVED(74161_dip, 74161)
+ {
+ register_subalias("1", m_CLRQ);
+ register_subalias("2", m_CLK);
+ register_subalias("3", m_A);
+ register_subalias("4", m_B);
+ register_subalias("5", m_C);
+ register_subalias("6", m_D);
+ register_subalias("7", m_ENABLEP);
+
+ register_subalias("9", m_LOADQ);
+ register_subalias("10", m_ENABLET);
+ register_subalias("11", m_Q[3]);
+ register_subalias("12", m_Q[2]);
+ register_subalias("13", m_Q[1]);
+ register_subalias("14", m_Q[0]);
+ register_subalias("15", m_RCO);
+
+ }
+ };
+
+ NETLIB_RESET(74161)
+ {
+ m_cnt = 0;
+ m_last_CLK = 0;
+ }
+
+ // FIXME: Timing
+ static const netlist_time delay[4] =
+ {
+ NLTIME_FROM_NS(40),
+ NLTIME_FROM_NS(40),
+ NLTIME_FROM_NS(40),
+ NLTIME_FROM_NS(40)
+ };
+
+ NETLIB_UPDATE(74161)
+ {
+ netlist_sig_t tRippleCarryOut = 0;
+ if (!m_CLRQ())
+ {
+ m_cnt = 0;
+ }
+ else if (m_CLK() && !m_last_CLK)
+ {
+ if (!m_LOADQ())
+ {
+ m_cnt = (m_D() << 3) | (m_C() << 2)
+ | (m_B() << 1) | (m_A() << 0);
+ }
+ else if (m_ENABLET() && m_ENABLEP())
+ {
+ m_cnt++;
+ if (m_cnt > MAXCNT)
+ m_cnt = 0;
+ }
+ }
+
+ if (m_ENABLET() && (m_cnt == MAXCNT))
+ {
+ tRippleCarryOut = 1;
+ }
+
+ m_last_CLK = m_CLK();
+
+ for (std::size_t i=0; i<4; i++)
+ m_Q[i].push((m_cnt >> i) & 1, delay[i]);
+
+ m_RCO.push(tRippleCarryOut, NLTIME_FROM_NS(20)); //FIXME
+ }
+
+ NETLIB_DEVICE_IMPL(74161)
+ NETLIB_DEVICE_IMPL(74161_dip)
+
+ } //namespace devices
+} // namespace netlist