diff options
Diffstat (limited to 'src/lib/netlist/devices/nld_system.cpp')
-rw-r--r-- | src/lib/netlist/devices/nld_system.cpp | 75 |
1 files changed, 64 insertions, 11 deletions
diff --git a/src/lib/netlist/devices/nld_system.cpp b/src/lib/netlist/devices/nld_system.cpp index 36ae9bc6e35..e2580a296c6 100644 --- a/src/lib/netlist/devices/nld_system.cpp +++ b/src/lib/netlist/devices/nld_system.cpp @@ -1,4 +1,4 @@ -// license:GPL-2.0+ +// license:BSD-3-Clause // copyright-holders:Couriersud /* * nld_system.cpp @@ -11,14 +11,11 @@ #include "plib/pstrutil.h" -namespace netlist -{ -namespace devices -{ +namespace netlist::devices { - // ----------------------------------------------------------------------------- + // ------------------------------------------------------------------------- // extclock - // ----------------------------------------------------------------------------- + // ------------------------------------------------------------------------- NETLIB_OBJECT(extclock) { @@ -92,9 +89,9 @@ namespace devices // continue with optimized clock handlers .... if ((m_size & (m_size-1)) == 0) // power of 2? - m_feedback.set_delegate(nldelegate(&NETLIB_NAME(extclock)::clk2_pow2, this)); + m_feedback.set_delegate(nl_delegate(&NETLIB_NAME(extclock)::clk2_pow2, this)); else - m_feedback.set_delegate(nldelegate(&NETLIB_NAME(extclock)::clk2, this)); + m_feedback.set_delegate(nl_delegate(&NETLIB_NAME(extclock)::clk2, this)); } @@ -110,6 +107,62 @@ namespace devices std::array<netlist_time, 32> m_inc; }; + // ------------------------------------------------------------------------- + // sys_pulse + // ------------------------------------------------------------------------- + + NETLIB_OBJECT(sys_pulse) + { + NETLIB_CONSTRUCTOR(sys_pulse) + , m_I(*this, "I", NETLIB_DELEGATE(input)) + , m_FB(*this, "FB", NETLIB_DELEGATE(feedback)) + , m_Q(*this, "Q") + , m_delay(*this, "DELAY", 10) + , m_duration(*this, "DURATION", 100) + , m_invert_input(*this, "INVERT_INPUT", 1) + , m_invert_output(*this, "INVERT_OUTPUT", 1) + , m_last(*this, "m_last", 0) + { + connect(m_Q, m_FB); + } + + //NETLIB_UPDATE_PARAMI(); + NETLIB_RESETI() + { + //m_Q.initial(0); + } + + private: + NETLIB_HANDLERI(input) + { + netlist_sig_t nval = m_I() ^ m_invert_input; + if (nval && !m_last) + { + // L_to_H + m_Q.push(1 ^ m_invert_output, NLTIME_FROM_NS(static_cast<unsigned>(m_delay()))); + } + m_last = nval; + } + + NETLIB_HANDLERI(feedback) + { + if (m_FB() == (1 ^ m_invert_output)) + m_Q.push(0 ^ m_invert_output, NLTIME_FROM_NS(static_cast<unsigned>(m_duration()))); + } + + logic_input_t m_I; + logic_input_t m_FB; + logic_output_t m_Q; + + param_int_t m_delay; + param_int_t m_duration; + param_logic_t m_invert_input; + param_logic_t m_invert_output; + + state_var<netlist_sig_t> m_last; + }; + + NETLIB_DEVICE_IMPL(netlistparams, "PARAMETER", "") NETLIB_DEVICE_IMPL(nc_pin, "NC_PIN", "") @@ -122,6 +175,7 @@ namespace devices NETLIB_DEVICE_IMPL(sys_dsw1, "SYS_DSW", "+I,+1,+2") NETLIB_DEVICE_IMPL(sys_dsw2, "SYS_DSW2", "") NETLIB_DEVICE_IMPL(sys_compd, "SYS_COMPD", "") + NETLIB_DEVICE_IMPL(sys_pulse, "SYS_PULSE", "DELAY,DURATION,INVERT_INPUT,INVERT_OUTPUT") using NETLIB_NAME(sys_noise_mt_u) = NETLIB_NAME(sys_noise)<plib::mt19937_64, plib::uniform_distribution_t>; @@ -140,5 +194,4 @@ namespace devices NETLIB_DEVICE_IMPL(logic_input, "LOGIC_INPUT", "IN,MODEL") NETLIB_DEVICE_IMPL_ALIAS(logic_input_ttl, logic_input, "TTL_INPUT", "IN") -} // namespace devices -} // namespace netlist +} // namespace netlist::devices |