diff options
Diffstat (limited to 'src/lib/netlist/devices/nlid_system.h')
-rw-r--r-- | src/lib/netlist/devices/nlid_system.h | 92 |
1 files changed, 48 insertions, 44 deletions
diff --git a/src/lib/netlist/devices/nlid_system.h b/src/lib/netlist/devices/nlid_system.h index 326cd3dbf2c..f1f2af1b31e 100644 --- a/src/lib/netlist/devices/nlid_system.h +++ b/src/lib/netlist/devices/nlid_system.h @@ -11,10 +11,10 @@ #ifndef NLID_SYSTEM_H_ #define NLID_SYSTEM_H_ -#include "../nl_base.h" -#include "../nl_setup.h" -#include "../analog/nlid_twoterm.h" -#include "../plib/putil.h" +#include "netlist/analog/nlid_twoterm.h" +#include "netlist/nl_base.h" +#include "netlist/nl_setup.h" +#include "plib/putil.h" namespace netlist { @@ -27,7 +27,8 @@ namespace netlist NETLIB_OBJECT(netlistparams) { NETLIB_CONSTRUCTOR(netlistparams) - , m_use_deactivate(*this, "USE_DEACTIVATE", 0) + , m_use_deactivate(*this, "USE_DEACTIVATE", false) + , m_startup_strategy(*this, "STARTUP_STRATEGY", 1) { } NETLIB_UPDATEI() { } @@ -35,6 +36,7 @@ namespace netlist //NETLIB_UPDATE_PARAMI() { } public: param_logic_t m_use_deactivate; + param_int_t m_startup_strategy; }; // ----------------------------------------------------------------------------- @@ -52,7 +54,7 @@ namespace netlist NETLIB_RESETI() { - m_Q.net().set_time(netlist_time::zero()); + m_Q.net().set_next_scheduled_time(netlist_time::zero()); } NETLIB_UPDATE_PARAMI() @@ -65,16 +67,14 @@ namespace netlist logic_net_t &net = m_Q.net(); // this is only called during setup ... net.toggle_new_Q(); - net.set_time(netlist().time() + m_inc); + net.set_next_scheduled_time(exec().time() + m_inc); } public: logic_output_t m_Q; - - param_double_t m_freq; netlist_time m_inc; - - inline static void mc_update(logic_net_t &net); + private: + param_double_t m_freq; }; // ----------------------------------------------------------------------------- @@ -96,7 +96,7 @@ namespace netlist //NETLIB_RESETI(); NETLIB_UPDATE_PARAMI(); - protected: + private: logic_input_t m_feedback; logic_output_t m_Q; @@ -127,31 +127,35 @@ namespace netlist std::vector<pstring> pat(plib::psplit(m_pattern(),",")); m_off = netlist_time::from_double(m_offset()); - unsigned long pati[32]; - for (int pI = 0; pI < 32; pI++) - { - pati[pI] = 0; - } + std::array<std::int64_t, 32> pati = { 0 }; + m_size = static_cast<std::uint8_t>(pat.size()); - unsigned long total = 0; + netlist_time::mult_type total = 0; for (unsigned i=0; i<m_size; i++) { - pati[i] = static_cast<unsigned long>(pat[i].as_long()); + // FIXME: use pstonum_ne + //pati[i] = plib::pstonum<decltype(pati[i])>(pat[i]); + pati[i] = plib::pstonum<std::int64_t>(pat[i]); total += pati[i]; } netlist_time ttotal = netlist_time::zero(); - for (unsigned i=0; i<m_size - 1; i++) + auto sm1 = static_cast<uint8_t>(m_size - 1); + for (unsigned i=0; i < sm1; i++) { m_inc[i] = base * pati[i]; ttotal += m_inc[i]; } - m_inc[m_size - 1] = base * total - ttotal; + m_inc[sm1] = base * total - ttotal; } } NETLIB_UPDATEI(); NETLIB_RESETI(); //NETLIB_UPDATE_PARAMI(); - protected: + + NETLIB_HANDLERI(clk2); + NETLIB_HANDLERI(clk2_pow2); + + private: param_double_t m_freq; param_str_t m_pattern; @@ -162,7 +166,7 @@ namespace netlist state_var_u8 m_cnt; std::uint8_t m_size; state_var<netlist_time> m_off; - netlist_time m_inc[32]; + std::array<netlist_time, 32> m_inc; }; // ----------------------------------------------------------------------------- @@ -173,20 +177,19 @@ namespace netlist { NETLIB_CONSTRUCTOR(logic_input) , m_Q(*this, "Q") - , m_IN(*this, "IN", 0) + , m_IN(*this, "IN", false) /* make sure we get the family first */ , m_FAMILY(*this, "FAMILY", "FAMILY(TYPE=TTL)") { set_logic_family(setup().family_from_model(m_FAMILY())); + m_Q.set_logic_family(this->logic_family()); } - NETLIB_UPDATE_AFTER_PARAM_CHANGE() - - NETLIB_UPDATEI(); - NETLIB_RESETI(); - NETLIB_UPDATE_PARAMI(); + NETLIB_UPDATEI() { } + NETLIB_RESETI() { m_Q.initial(0); } + NETLIB_UPDATE_PARAMI() { m_Q.push(m_IN() & 1, netlist_time::from_nsec(1)); } - protected: + private: logic_output_t m_Q; param_logic_t m_IN; @@ -200,12 +203,12 @@ namespace netlist , m_IN(*this, "IN", 0.0) { } - NETLIB_UPDATE_AFTER_PARAM_CHANGE() - NETLIB_UPDATEI(); - NETLIB_RESETI(); - NETLIB_UPDATE_PARAMI(); - protected: + NETLIB_UPDATEI() { } + NETLIB_RESETI() { m_Q.initial(0.0); } + NETLIB_UPDATE_PARAMI() { m_Q.push(m_IN()); } + + private: analog_output_t m_Q; param_double_t m_IN; }; @@ -278,8 +281,8 @@ namespace netlist NETLIB_RESETI() { - m_RIN.set(1.0 / m_p_RIN(),0,0); - m_ROUT.set(1.0 / m_p_ROUT(),0,0); + m_RIN.set_G_V_I(1.0 / m_p_RIN(),0,0); + m_ROUT.set_G_V_I(1.0 / m_p_ROUT(),0,0); } NETLIB_UPDATEI() @@ -310,13 +313,13 @@ 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()) + , m_compiled(this->name() + ".FUNCC", this, this->state().run_state_manager()) { std::vector<pstring> inps; for (int i=0; i < m_N(); i++) { pstring n = plib::pfmt("A{1}")(i); - m_I.push_back(plib::make_unique<analog_input_t>(*this, n)); + m_I.push_back(pool().make_poolptr<analog_input_t>(*this, n)); inps.push_back(n); m_vals.push_back(0.0); } @@ -333,7 +336,7 @@ namespace netlist param_int_t m_N; param_str_t m_func; analog_output_t m_Q; - std::vector<std::unique_ptr<analog_input_t>> m_I; + std::vector<pool_owned_ptr<analog_input_t>> m_I; std::vector<double> m_vals; plib::pfunction m_compiled; @@ -357,16 +360,17 @@ namespace netlist register_subalias("2", m_R.m_N); } + NETLIB_RESETI(); + //NETLIB_UPDATE_PARAMI(); + NETLIB_UPDATEI(); + analog::NETLIB_SUB(R_base) m_R; logic_input_t m_I; param_double_t m_RON; param_double_t m_ROFF; - NETLIB_RESETI(); - //NETLIB_UPDATE_PARAMI(); - NETLIB_UPDATEI(); - private: + state_var<netlist_sig_t> m_last_state; }; |