summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/devices/nld_4017.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/devices/nld_4017.cpp')
-rw-r--r--src/lib/netlist/devices/nld_4017.cpp86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/lib/netlist/devices/nld_4017.cpp b/src/lib/netlist/devices/nld_4017.cpp
new file mode 100644
index 00000000000..c396ff73cd2
--- /dev/null
+++ b/src/lib/netlist/devices/nld_4017.cpp
@@ -0,0 +1,86 @@
+// license:GPL-2.0+
+// copyright-holders:Couriersud
+/*
+ * nld_4017.c
+ *
+ */
+
+#include "nld_4017.h"
+#include "nl_base.h"
+#include "nl_factory.h"
+
+namespace netlist
+{
+ namespace devices
+ {
+
+ template <std::size_t _MaxCount>
+ NETLIB_OBJECT(CD4017_base)
+ {
+ NETLIB_CONSTRUCTOR_MODEL(CD4017_base, "CD4XXX")
+ , m_CLK(*this, "CLK", NETLIB_DELEGATE(clk))
+ , m_CLKEN(*this, "CLKEN", NETLIB_DELEGATE(inputs))
+ , m_RESET(*this, "RESET", NETLIB_DELEGATE(inputs))
+ , m_CO(*this, "CO")
+ , m_Q(*this, 0, "Q{}")
+ , m_cnt(*this, "m_cnt", 0)
+ , m_supply(*this)
+ {
+ }
+
+ NETLIB_RESETI()
+ {
+ m_CLK.set_state(logic_t::STATE_INP_LH);
+ m_cnt = 0;
+ }
+
+ NETLIB_HANDLERI(clk)
+ {
+ ++m_cnt;
+ update_outputs(m_cnt);
+ }
+
+ NETLIB_HANDLERI(inputs)
+ {
+ if (m_RESET())
+ {
+ m_CLK.inactivate();
+ m_cnt = 0;
+ update_outputs(m_cnt);
+ }
+ else if (m_CLKEN())
+ {
+ m_CLK.inactivate();
+ }
+ else
+ {
+ m_CLK.activate_lh();
+ }
+ }
+
+ public:
+ void update_outputs(const unsigned cnt) noexcept
+ {
+ for (std::size_t i = 0; i < _MaxCount; i++)
+ m_Q[i].push(i == cnt, NLTIME_FROM_NS(200));
+ m_CO.push(cnt < _MaxCount / 2, NLTIME_FROM_NS(160));
+ }
+ logic_input_t m_CLK;
+ logic_input_t m_CLKEN;
+ logic_input_t m_RESET;
+ logic_output_t m_CO;
+ object_array_t<logic_output_t, _MaxCount> m_Q;
+
+ state_var<unsigned> m_cnt;
+ nld_power_pins m_supply;
+ };
+
+ using NETLIB_NAME(CD4017) = NETLIB_NAME(CD4017_base)<10>;
+ using NETLIB_NAME(CD4022) = NETLIB_NAME(CD4017_base)<8>;
+
+
+ NETLIB_DEVICE_IMPL(CD4017, "CD4017", "")
+ NETLIB_DEVICE_IMPL(CD4022, "CD4022", "")
+
+ } //namespace devices
+} // namespace netlist