diff options
Diffstat (limited to 'src/lib/netlist/devices/nld_9316.cpp')
-rw-r--r-- | src/lib/netlist/devices/nld_9316.cpp | 217 |
1 files changed, 88 insertions, 129 deletions
diff --git a/src/lib/netlist/devices/nld_9316.cpp b/src/lib/netlist/devices/nld_9316.cpp index 8977f9d0364..54dcb7cc39e 100644 --- a/src/lib/netlist/devices/nld_9316.cpp +++ b/src/lib/netlist/devices/nld_9316.cpp @@ -1,141 +1,100 @@ -// license:GPL-2.0+ +// license:BSD-3-Clause // copyright-holders:Couriersud /* - * nld_9316.c + * nld_9316.cpp + * + * DM9316: Synchronous 4-Bit Counters + * + * +--------------+ + * /CLEAR |1 ++ 16| VCC + * CLOCK |2 15| RC (Ripple Carry) + * A |3 14| QA + * B |4 9316 13| QB + * C |5 12| QC + * D |6 11| QD + * Enable P |7 10| Enable T + * GND |8 9| /LOAD + * +--------------+ + * + * Counter Sequence + * + * +-------++----+----+----+----+----+ + * | COUNT || QD | QC | QB | QA | RC | + * +=======++====+====+====+====+====+ + * | 0 || 0 | 0 | 0 | 0 | 0 | + * | 1 || 0 | 0 | 0 | 1 | 0 | + * | 2 || 0 | 0 | 1 | 0 | 0 | + * | 3 || 0 | 0 | 1 | 1 | 0 | + * | 4 || 0 | 1 | 0 | 0 | 0 | + * | 5 || 0 | 1 | 0 | 1 | 0 | + * | 6 || 0 | 1 | 1 | 0 | 0 | + * | 7 || 0 | 1 | 1 | 1 | 0 | + * | 8 || 1 | 0 | 0 | 0 | 0 | + * | 9 || 1 | 0 | 0 | 1 | 0 | + * | 10 || 1 | 0 | 1 | 0 | 0 | + * | 11 || 1 | 0 | 1 | 1 | 0 | + * | 12 || 1 | 1 | 0 | 0 | 0 | + * | 13 || 1 | 1 | 0 | 1 | 0 | + * | 14 || 1 | 1 | 1 | 0 | 0 | + * | 15 || 1 | 1 | 1 | 1 | 1 | + * +-------++----+----+----+----+----+ + * + * Reset count function: Please refer to + * National Semiconductor datasheet (timing diagram) + * + * Naming conventions follow National Semiconductor datasheet + * + * DM9310: Synchronous 4-Bit Counters + * + * +--------------+ + * CLEAR |1 ++ 16| VCC + * CLOCK |2 15| RC (Ripple Carry) + * A |3 14| QA + * B |4 9310 13| QB + * C |5 12| QC + * D |6 11| QD + * Enable P |7 10| Enable T + * GND |8 9| LOAD + * +--------------+ + * + * Counter Sequence + * + * +-------++----+----+----+----+----+ + * | COUNT || QD | QC | QB | QA | RC | + * +=======++====+====+====+====+====+ + * | 0 || 0 | 0 | 0 | 0 | 0 | + * | 1 || 0 | 0 | 0 | 1 | 0 | + * | 2 || 0 | 0 | 1 | 0 | 0 | + * | 3 || 0 | 0 | 1 | 1 | 0 | + * | 4 || 0 | 1 | 0 | 0 | 0 | + * | 5 || 0 | 1 | 0 | 1 | 0 | + * | 6 || 0 | 1 | 1 | 0 | 0 | + * | 7 || 0 | 1 | 1 | 1 | 0 | + * | 8 || 1 | 0 | 0 | 0 | 0 | + * | 9 || 1 | 0 | 0 | 1 | 0 | + * +-------++----+----+----+----+----+ + * + * Reset count function: Please refer to + * National Semiconductor datasheet (timing diagram) + * + * Naming conventions follow National Semiconductor datasheet * */ -#include "nld_9316.h" -#include "netlist/nl_base.h" -#include "nlid_system.h" - -namespace netlist -{ - namespace devices - { - - static constexpr const unsigned MAXCNT = 15; - - NETLIB_OBJECT(9316) - { - NETLIB_CONSTRUCTOR(9316) - , m_CLK(*this, "CLK", NETLIB_DELEGATE(9316, clk)) - , m_ENT(*this, "ENT") - , m_RC(*this, "RC") - , m_LOADQ(*this, "LOADQ") - , m_ENP(*this, "ENP") - , m_CLRQ(*this, "CLRQ") - , m_ABCD(*this, {{"A", "B", "C", "D"}}, NETLIB_DELEGATE(9316, abcd)) - , m_Q(*this, {{ "QA", "QB", "QC", "QD" }}) - , m_cnt(*this, "m_cnt", 0) - , m_abcd(*this, "m_abcd", 0) - , m_loadq(*this, "m_loadq", 0) - , m_ent(*this, "m_ent", 0) - , m_power_pins(*this) - { - } - - private: - NETLIB_RESETI() - { - m_CLK.set_state(logic_t::STATE_INP_LH); - m_cnt = 0; - m_abcd = 0; - } - - NETLIB_UPDATEI() - { - const auto CLRQ(m_CLRQ()); - m_ent = m_ENT(); - m_loadq = m_LOADQ(); - - if (((m_loadq ^ 1) || (m_ent && m_ENP())) && CLRQ) - { - m_CLK.activate_lh(); - } - else - { - m_CLK.inactivate(); - if (!CLRQ && (m_cnt>0)) - { - update_outputs_all(0, NLTIME_FROM_NS(36)); - m_cnt = 0; - } - } - m_RC.push(m_ent && (m_cnt == MAXCNT), NLTIME_FROM_NS(27)); - } - - - NETLIB_HANDLERI(clk) - { - auto cnt = (m_loadq ? (m_cnt + 1) & MAXCNT: m_abcd); - m_RC.push(m_ent && (cnt == MAXCNT), NLTIME_FROM_NS(27)); - update_outputs_all(cnt, NLTIME_FROM_NS(20)); - m_cnt = cnt; - } - - NETLIB_HANDLERI(abcd) - { - m_abcd = static_cast<unsigned>((m_ABCD[0]() << 0) | (m_ABCD[1]() << 1) | (m_ABCD[2]() << 2) | (m_ABCD[3]() << 3)); - } - - logic_input_t m_CLK; - logic_input_t m_ENT; - - logic_output_t m_RC; - - logic_input_t m_LOADQ; - - logic_input_t m_ENP; - logic_input_t m_CLRQ; - - object_array_t<logic_input_t, 4> m_ABCD; - object_array_t<logic_output_t, 4> m_Q; - - /* counter state */ - state_var<unsigned> m_cnt; - /* cached pins */ - state_var<unsigned> m_abcd; - state_var_sig m_loadq; - state_var_sig m_ent; - nld_power_pins m_power_pins; +#include "nl_base.h" +#include "nl_factory.h" - void update_outputs_all(unsigned cnt, netlist_time out_delay) noexcept - { - m_Q[0].push((cnt >> 0) & 1, out_delay); - m_Q[1].push((cnt >> 1) & 1, out_delay); - m_Q[2].push((cnt >> 2) & 1, out_delay); - m_Q[3].push((cnt >> 3) & 1, out_delay); - } - }; +#include "nld_9316_base.hxx" - NETLIB_OBJECT_DERIVED(9316_dip, 9316) - { - NETLIB_CONSTRUCTOR_DERIVED(9316_dip, 9316) - { - register_subalias("1", "CLRQ"); - register_subalias("2", "CLK"); - register_subalias("3", "A"); - register_subalias("4", "B"); - register_subalias("5", "C"); - register_subalias("6", "D"); - register_subalias("7", "ENP"); - register_subalias("8", "GND"); +// FIXME: All detail can be found in nld_9316_base.hxx +// At least gcc-7.x needs the implementations of the base device +// in different compilation units. If created in the same file +// performance degrades horrible. - register_subalias("9", "LOADQ"); - register_subalias("10", "ENT"); - register_subalias("11", "QD"); - register_subalias("12", "QC"); - register_subalias("13", "QB"); - register_subalias("14", "QA"); - register_subalias("15", "RC"); - register_subalias("16", "VCC"); - } - }; +// FIXME: this file could be created programmatically +namespace netlist::devices { NETLIB_DEVICE_IMPL(9316, "TTL_9316", "+CLK,+ENP,+ENT,+CLRQ,+LOADQ,+A,+B,+C,+D,@VCC,@GND") - NETLIB_DEVICE_IMPL(9316_dip, "TTL_9316_DIP", "") - } //namespace devices -} // namespace netlist +} // namespace netlist::devices |