summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/devices/nlid_system.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/devices/nlid_system.h')
-rw-r--r--src/lib/netlist/devices/nlid_system.h48
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
// -----------------------------------------------------------------------------