diff options
Diffstat (limited to 'src/lib/netlist/devices/nld_74161.cpp')
-rw-r--r-- | src/lib/netlist/devices/nld_74161.cpp | 143 |
1 files changed, 14 insertions, 129 deletions
diff --git a/src/lib/netlist/devices/nld_74161.cpp b/src/lib/netlist/devices/nld_74161.cpp index ae58a43feba..357746d102f 100644 --- a/src/lib/netlist/devices/nld_74161.cpp +++ b/src/lib/netlist/devices/nld_74161.cpp @@ -1,141 +1,26 @@ // license:BSD-3-Clause -// copyright-holders:Ryan Holtz +// copyright-holders:Couriersud /* * nld_74161.cpp * */ -#include "nld_74161.h" -#include "netlist/nl_base.h" -#include "nlid_system.h" +#include "nl_base.h" +#include "nl_factory.h" -#include <array> +#include "nld_9316_base.hxx" -namespace netlist -{ - namespace devices - { +// 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. - static constexpr const unsigned MAXCNT = 15; +// FIXME: this file could be created programmatically - 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") - , m_power_pins(*this) - { - } +namespace netlist::devices { - NETLIB_RESETI(); - NETLIB_UPDATEI(); + NETLIB_DEVICE_IMPL(74161, "TTL_74161", "+CLK,+ENP,+ENT,+CLRQ,+LOADQ,+A,+B,+C,+D,@VCC,@GND") + // FIXME: This happens on copy/paste + NETLIB_DEVICE_IMPL(74161_fixme, "TTL_74161_FIXME", "+A,+B,+C,+D,+CLRQ,+LOADQ,+CLK,+ENP,+ENT,@VCC,@GND") - 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; - - nld_power_pins m_power_pins; - }; - - 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("8", "GND"); - - 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); - register_subalias("16", "VCC"); - - } - }; - - NETLIB_RESET(74161) - { - m_cnt = 0; - m_last_CLK = 0; - } - - // FIXME: Timing - static constexpr const std::array<netlist_time, 4> delay = - { - 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 &= MAXCNT; - } - } - - 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, "TTL_74161", "+A,+B,+C,+D,+CLRQ,+LOADQ,+CLK,+ENABLEP,+ENABLET,@VCC,@GND") - NETLIB_DEVICE_IMPL(74161_dip, "TTL_74161_DIP", "") - - } //namespace devices -} // namespace netlist +} // namespace netlist::devices |