From e9a5e08b41bd03cfb253b4daddcd5ea5014f4743 Mon Sep 17 00:00:00 2001 From: couriersud Date: Sun, 28 May 2017 09:03:17 +0200 Subject: Fix state saving for pfunction lfsr. (nw) --- src/lib/netlist/analog/nlid_twoterm.h | 2 ++ src/lib/netlist/devices/nld_system.cpp | 2 +- src/lib/netlist/devices/nlid_system.h | 5 +++-- src/lib/netlist/plib/pfunction.cpp | 1 - src/lib/netlist/plib/pfunction.h | 17 +++++++++++++++++ 5 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/lib/netlist/analog/nlid_twoterm.h b/src/lib/netlist/analog/nlid_twoterm.h index 578d5b3b367..7778f5f4585 100644 --- a/src/lib/netlist/analog/nlid_twoterm.h +++ b/src/lib/netlist/analog/nlid_twoterm.h @@ -392,6 +392,7 @@ public: , m_R(*this, "R", 0.1) , m_V(*this, "V", 0.0) , m_func(*this,"FUNC", "") + , m_compiled(this->name() + ".FUNCC", this, this->netlist().state()) { register_subalias("P", m_P); register_subalias("N", m_N); @@ -422,6 +423,7 @@ public: NETLIB_CONSTRUCTOR_DERIVED(CS, twoterm) , m_I(*this, "I", 1.0) , m_func(*this,"FUNC", "") + , m_compiled(this->name() + ".FUNCC", this, this->netlist().state()) { register_subalias("P", m_P); register_subalias("N", m_N); diff --git a/src/lib/netlist/devices/nld_system.cpp b/src/lib/netlist/devices/nld_system.cpp index 98793c657d2..eabc4b4fbff 100644 --- a/src/lib/netlist/devices/nld_system.cpp +++ b/src/lib/netlist/devices/nld_system.cpp @@ -137,7 +137,7 @@ namespace netlist { m_vals[i] = (*m_I[i])(); } - m_Q.push(m_precompiled.evaluate(m_vals)); + m_Q.push(m_compiled.evaluate(m_vals)); } diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h index 92fb91d627c..a5574706569 100644 --- a/src/lib/netlist/devices/nlid_system.h +++ b/src/lib/netlist/devices/nlid_system.h @@ -306,6 +306,7 @@ namespace netlist , m_N(*this, "N", 1) , m_func(*this, "FUNC", "A0") , m_Q(*this, "Q") + , m_compiled(this->name() + ".FUNCC", this, this->netlist().state()) { std::vector inps; for (int i=0; i < m_N(); i++) @@ -315,7 +316,7 @@ namespace netlist inps.push_back(n); m_vals.push_back(0.0); } - m_precompiled.compile(inps, m_func()); + m_compiled.compile(inps, m_func()); } protected: @@ -331,7 +332,7 @@ namespace netlist std::vector> m_I; std::vector m_vals; - plib::pfunction m_precompiled; + plib::pfunction m_compiled; }; // ----------------------------------------------------------------------------- diff --git a/src/lib/netlist/plib/pfunction.cpp b/src/lib/netlist/plib/pfunction.cpp index a1cfb8f3366..79f09cb4a46 100644 --- a/src/lib/netlist/plib/pfunction.cpp +++ b/src/lib/netlist/plib/pfunction.cpp @@ -37,7 +37,6 @@ void pfunction::compile_postfix(const std::vector &inputs, for (const pstring &cmd : cmds) { - printf("%s %d\n", cmd.c_str(), stk); rpn_inst rc; if (cmd == "+") { rc.m_cmd = ADD; stk -= 1; } diff --git a/src/lib/netlist/plib/pfunction.h b/src/lib/netlist/plib/pfunction.h index 60d85a3358c..7d5984f9d15 100644 --- a/src/lib/netlist/plib/pfunction.h +++ b/src/lib/netlist/plib/pfunction.h @@ -9,6 +9,7 @@ #define PFUNCTION_H_ #include "pstring.h" +#include "pstate.h" #include @@ -43,6 +44,22 @@ namespace plib { double m_param; }; public: + /*! Constructor with state saving support + * + * @param name Name of this object + * @param owner Owner of this object + * @param state_manager State manager to handle saving object state + * + */ + pfunction(const pstring &name, const void *owner, state_manager_t &state_manager) + : m_lfsr(0xACE1u) + { + state_manager.save_item(owner, m_lfsr, name + ".lfsr"); + } + + /*! Constructor without state saving support + * + */ pfunction() : m_lfsr(0xACE1u) { -- cgit v1.2.3