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.h92
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;
};