diff options
Diffstat (limited to 'src/lib/netlist/devices/nlid_system.h')
-rw-r--r-- | src/lib/netlist/devices/nlid_system.h | 48 |
1 files changed, 46 insertions, 2 deletions
diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h index 11b207a1103..a88be547abc 100644 --- a/src/lib/netlist/devices/nlid_system.h +++ b/src/lib/netlist/devices/nlid_system.h @@ -94,9 +94,17 @@ namespace netlist connect(m_feedback, m_Q); } - NETLIB_UPDATEI(); //NETLIB_RESETI(); - NETLIB_UPDATE_PARAMI(); + + NETLIB_UPDATE_PARAMI() + { + m_inc = netlist_time::from_double(1.0 / (m_freq() * 2.0)); + } + + NETLIB_UPDATEI() + { + m_Q.push(!m_feedback(), m_inc); + } private: logic_input_t m_feedback; @@ -107,6 +115,42 @@ namespace netlist }; // ----------------------------------------------------------------------------- + // varclock + // ----------------------------------------------------------------------------- + + NETLIB_OBJECT(varclock) + { + NETLIB_CONSTRUCTOR(varclock) + , m_feedback(*this, "FB") + , m_Q(*this, "Q") + , m_func(*this,"FUNC", "") + , m_compiled(this->name() + ".FUNCC", this, this->state().run_state_manager()) + , m_funcparam({0.0}) + { + if (m_func() != "") + m_compiled.compile(std::vector<pstring>({{"T"}}), m_func()); + connect(m_feedback, m_Q); + } + //NETLIB_RESETI(); + //NETLIB_UPDATE_PARAMI() + + NETLIB_UPDATEI() + { + m_funcparam[0] = exec().time().as_double(); + const netlist_time m_inc = netlist_time::from_double(m_compiled.evaluate(m_funcparam)); + m_Q.push(!m_feedback(), m_inc); + } + + private: + logic_input_t m_feedback; + logic_output_t m_Q; + + param_str_t m_func; + plib::pfunction m_compiled; + std::vector<double> m_funcparam; + }; + + // ----------------------------------------------------------------------------- // extclock // ----------------------------------------------------------------------------- |