summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author couriersud <couriersud@gmx.org>2019-04-06 14:11:06 +0200
committer couriersud <couriersud@gmx.org>2019-04-07 19:09:48 +0200
commit58e6383ada73e3d9bb2330248c77d99f4063896d (patch)
tree69ea6066ac01e90cffba02ebf7e3775dfeaaaf87 /src
parent140dc2237eed85e3451ab95a4bcdae84ee8600c5 (diff)
netlist: MB3614 again, function controlled VARCLOCK and other
improvements. - fix MB3614 parameter - Added VARCLOCK which derives step size from function - optimized function handling in CS and VS - fixed a bug in ppreprocessor - add trunc to pfunction - added opamp_amplification_curve to derive characteristic amplification curve
Diffstat (limited to 'src')
-rw-r--r--src/lib/netlist/analog/nld_opamps.cpp12
-rw-r--r--src/lib/netlist/analog/nlid_twoterm.h14
-rw-r--r--src/lib/netlist/devices/net_lib.cpp1
-rw-r--r--src/lib/netlist/devices/nld_system.cpp15
-rw-r--r--src/lib/netlist/devices/nld_system.h4
-rw-r--r--src/lib/netlist/devices/nlid_system.h48
-rw-r--r--src/lib/netlist/macro/nlm_opamp.cpp2
-rw-r--r--src/lib/netlist/plib/pfunction.cpp11
-rw-r--r--src/lib/netlist/plib/pfunction.h1
-rw-r--r--src/lib/netlist/plib/pparser.cpp16
-rw-r--r--src/mame/audio/nl_cheekyms.cpp2
11 files changed, 89 insertions, 37 deletions
diff --git a/src/lib/netlist/analog/nld_opamps.cpp b/src/lib/netlist/analog/nld_opamps.cpp
index 0539a5dea51..009795e9a00 100644
--- a/src/lib/netlist/analog/nld_opamps.cpp
+++ b/src/lib/netlist/analog/nld_opamps.cpp
@@ -223,18 +223,14 @@ namespace netlist
m_EBUF->reset();
m_CP->reset();
m_RP.reset();
-#if 0
- double CP = 0.0;
- double RP = 1000;
- double G = m_model.m_UGF / m_model.m_FPF / RP;
-#else
+
double CP = m_model.m_DAB / m_model.m_SLEW;
double RP = 0.5 / constants::pi() / CP / m_model.m_FPF;
double G = m_model.m_UGF / m_model.m_FPF / RP;
-#endif
- printf("OPAMP %s: %g %g %g\n", name().c_str(), CP, RP, G);
+
+ //printf("OPAMP %s: %g %g %g\n", name().c_str(), CP, RP, G);
if (m_model.m_SLEW / (4.0 * constants::pi() * 0.0258) < m_model.m_UGF)
- printf("failed!\n");
+ log().warning("Opamp <{1}> parameters fail convergence criteria", this->name());
m_CP->m_C.setTo(CP);
m_RP.set_R(RP);
diff --git a/src/lib/netlist/analog/nlid_twoterm.h b/src/lib/netlist/analog/nlid_twoterm.h
index 63ab43db591..00812911550 100644
--- a/src/lib/netlist/analog/nlid_twoterm.h
+++ b/src/lib/netlist/analog/nlid_twoterm.h
@@ -399,11 +399,12 @@ namespace analog
, m_V(*this, "V", 0.0)
, m_func(*this,"FUNC", "")
, m_compiled(this->name() + ".FUNCC", this, this->state().run_state_manager())
+ , m_funcparam({0.0})
{
register_subalias("P", m_P);
register_subalias("N", m_N);
if (m_func() != "")
- m_compiled.compile_postfix(std::vector<pstring>({{"T"}}), m_func());
+ m_compiled.compile(std::vector<pstring>({{"T"}}), m_func());
}
NETLIB_IS_TIMESTEP(m_func() != "")
@@ -411,8 +412,9 @@ namespace analog
NETLIB_TIMESTEPI()
{
m_t += step;
+ m_funcparam[0] = m_t;
this->set_G_V_I(1.0 / m_R(),
- m_compiled.evaluate(std::vector<double>({m_t})),
+ m_compiled.evaluate(m_funcparam),
0.0);
}
@@ -431,6 +433,7 @@ namespace analog
param_double_t m_V;
param_str_t m_func;
plib::pfunction m_compiled;
+ std::vector<double> m_funcparam;
};
// -----------------------------------------------------------------------------
@@ -445,18 +448,20 @@ namespace analog
, m_I(*this, "I", 1.0)
, m_func(*this,"FUNC", "")
, m_compiled(this->name() + ".FUNCC", this, this->state().run_state_manager())
+ , m_funcparam({0.0})
{
register_subalias("P", m_P);
register_subalias("N", m_N);
if (m_func() != "")
- m_compiled.compile_postfix(std::vector<pstring>({{"T"}}), m_func());
+ m_compiled.compile(std::vector<pstring>({{"T"}}), m_func());
}
NETLIB_IS_TIMESTEP(m_func() != "")
NETLIB_TIMESTEPI()
{
m_t += step;
- const double I = m_compiled.evaluate(std::vector<double>({m_t}));
+ m_funcparam[0] = m_t;
+ const double I = m_compiled.evaluate(m_funcparam);
set_mat(0.0, 0.0, -I,
0.0, 0.0, I);
}
@@ -476,6 +481,7 @@ namespace analog
param_double_t m_I;
param_str_t m_func;
plib::pfunction m_compiled;
+ std::vector<double> m_funcparam;
};
diff --git a/src/lib/netlist/devices/net_lib.cpp b/src/lib/netlist/devices/net_lib.cpp
index c0353f2489a..43a74fd43f1 100644
--- a/src/lib/netlist/devices/net_lib.cpp
+++ b/src/lib/netlist/devices/net_lib.cpp
@@ -52,6 +52,7 @@ namespace devices
LIB_ENTRY(log)
LIB_ENTRY(logD)
LIB_ENTRY(clock)
+ LIB_ENTRY(varclock)
LIB_ENTRY(extclock)
LIB_ENTRY(mainclock)
LIB_ENTRY(gnd)
diff --git a/src/lib/netlist/devices/nld_system.cpp b/src/lib/netlist/devices/nld_system.cpp
index 03aa5c678f1..5a1868bb775 100644
--- a/src/lib/netlist/devices/nld_system.cpp
+++ b/src/lib/netlist/devices/nld_system.cpp
@@ -19,20 +19,6 @@ namespace netlist
// ----------------------------------------------------------------------------------------
- // clock
- // ----------------------------------------------------------------------------------------
-
- NETLIB_UPDATE_PARAM(clock)
- {
- m_inc = netlist_time::from_double(1.0 / (m_freq() * 2.0));
- }
-
- NETLIB_UPDATE(clock)
- {
- m_Q.push(!m_feedback(), m_inc);
- }
-
- // ----------------------------------------------------------------------------------------
// extclock
// ----------------------------------------------------------------------------------------
@@ -123,6 +109,7 @@ namespace netlist
NETLIB_DEVICE_IMPL(function, "AFUNC", "N,FUNC")
NETLIB_DEVICE_IMPL(analog_input, "ANALOG_INPUT", "IN")
NETLIB_DEVICE_IMPL(clock, "CLOCK", "FREQ")
+ NETLIB_DEVICE_IMPL(varclock, "VARCLOCK", "FUNC")
NETLIB_DEVICE_IMPL(extclock, "EXTCLOCK", "FREQ,PATTERN")
NETLIB_DEVICE_IMPL(res_sw, "RES_SWITCH", "+IN,+P1,+P2")
NETLIB_DEVICE_IMPL(mainclock, "MAINCLOCK", "FREQ")
diff --git a/src/lib/netlist/devices/nld_system.h b/src/lib/netlist/devices/nld_system.h
index 5158e098cfa..e2b70455411 100644
--- a/src/lib/netlist/devices/nld_system.h
+++ b/src/lib/netlist/devices/nld_system.h
@@ -36,6 +36,10 @@
NET_REGISTER_DEV(CLOCK, name) \
PARAM(name.FREQ, freq)
+#define VARCLOCK(name, func) \
+ NET_REGISTER_DEV(VARCLOCK, name) \
+ PARAM(name.FUNC, func)
+
#define EXTCLOCK(name, freq, pattern) \
NET_REGISTER_DEV(EXTCLOCK, name) \
PARAM(name.FREQ, freq) \
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
// -----------------------------------------------------------------------------
diff --git a/src/lib/netlist/macro/nlm_opamp.cpp b/src/lib/netlist/macro/nlm_opamp.cpp
index 2c61430c935..cfa25cd88b4 100644
--- a/src/lib/netlist/macro/nlm_opamp.cpp
+++ b/src/lib/netlist/macro/nlm_opamp.cpp
@@ -225,7 +225,7 @@ NETLIST_START(OPAMP_lib)
NET_MODEL("LM324 OPAMP(TYPE=3 VLH=2.0 VLL=0.2 FPF=5 UGF=500k SLEW=0.3M RI=1000k RO=50 DAB=0.00075)")
NET_MODEL("LM358 OPAMP(TYPE=3 VLH=2.0 VLL=0.2 FPF=5 UGF=500k SLEW=0.3M RI=1000k RO=50 DAB=0.001)")
- NET_MODEL("MB3614 OPAMP(TYPE=3 VLH=1.4 VLL=0.02 FPF=2 UGF=200k SLEW=0.6M RI=1000k RO=50 DAB=0.002)")
+ NET_MODEL("MB3614 OPAMP(TYPE=3 VLH=1.4 VLL=0.02 FPF=10 UGF=1000k SLEW=0.6M RI=1000k RO=50 DAB=0.002)")
NET_MODEL("UA741 OPAMP(TYPE=3 VLH=1.0 VLL=1.0 FPF=5 UGF=1000k SLEW=0.5M RI=2000k RO=75 DAB=0.0017)")
NET_MODEL("LM747 OPAMP(TYPE=3 VLH=1.0 VLL=1.0 FPF=5 UGF=1000k SLEW=0.5M RI=2000k RO=50 DAB=0.0017)")
NET_MODEL("LM747A OPAMP(TYPE=3 VLH=2.0 VLL=2.0 FPF=5 UGF=1000k SLEW=0.7M RI=6000k RO=50 DAB=0.0015)")
diff --git a/src/lib/netlist/plib/pfunction.cpp b/src/lib/netlist/plib/pfunction.cpp
index 6a2179e0e6f..6b15d7f8229 100644
--- a/src/lib/netlist/plib/pfunction.cpp
+++ b/src/lib/netlist/plib/pfunction.cpp
@@ -52,6 +52,8 @@ void pfunction::compile_postfix(const std::vector<pstring> &inputs,
{ rc.m_cmd = SIN; stk -= 0; }
else if (cmd == "cos")
{ rc.m_cmd = COS; stk -= 0; }
+ else if (cmd == "trunc")
+ { rc.m_cmd = TRUNC; stk -= 0; }
else if (cmd == "rand")
{ rc.m_cmd = RAND; stk += 1; }
else
@@ -72,16 +74,16 @@ void pfunction::compile_postfix(const std::vector<pstring> &inputs,
bool err;
rc.m_param = plib::pstonum_ne<decltype(rc.m_param)>(cmd, err);
if (err)
- throw plib::pexception(plib::pfmt("nld_function: unknown/misformatted token <{1}> in <{2}>")(cmd)(expr));
+ throw plib::pexception(plib::pfmt("pfunction: unknown/misformatted token <{1}> in <{2}>")(cmd)(expr));
stk += 1;
}
}
if (stk < 1)
- throw plib::pexception(plib::pfmt("nld_function: stack underflow on token <{1}> in <{2}>")(cmd)(expr));
+ throw plib::pexception(plib::pfmt("pfunction: stack underflow on token <{1}> in <{2}>")(cmd)(expr));
m_precompiled.push_back(rc);
}
if (stk != 1)
- throw plib::pexception(plib::pfmt("nld_function: stack count different to one on <{2}>")(expr));
+ throw plib::pexception(plib::pfmt("pfunction: stack count different to one on <{2}>")(expr));
}
static int get_prio(const pstring &v)
@@ -103,7 +105,7 @@ static int get_prio(const pstring &v)
static pstring pop_check(std::stack<pstring> &stk, const pstring &expr)
{
if (stk.size() == 0)
- throw plib::pexception(plib::pfmt("nld_function: stack underflow during infix parsing of: <{1}>")(expr));
+ throw plib::pexception(plib::pfmt("pfunction: stack underflow during infix parsing of: <{1}>")(expr));
pstring res = stk.top();
stk.pop();
return res;
@@ -201,6 +203,7 @@ double pfunction::evaluate(const std::vector<double> &values)
OP(POW, 1, std::pow(ST2, ST1))
OP(SIN, 0, std::sin(ST2))
OP(COS, 0, std::cos(ST2))
+ OP(TRUNC, 0, std::trunc(ST2))
case RAND:
stack[ptr++] = lfsr_random();
break;
diff --git a/src/lib/netlist/plib/pfunction.h b/src/lib/netlist/plib/pfunction.h
index fbb6c508333..bc81ef0c5a6 100644
--- a/src/lib/netlist/plib/pfunction.h
+++ b/src/lib/netlist/plib/pfunction.h
@@ -34,6 +34,7 @@ namespace plib {
SIN,
COS,
RAND, /* random number between 0 and 1 */
+ TRUNC,
PUSH_CONST,
PUSH_INPUT
};
diff --git a/src/lib/netlist/plib/pparser.cpp b/src/lib/netlist/plib/pparser.cpp
index 5e1a231da81..55e4c74c778 100644
--- a/src/lib/netlist/plib/pparser.cpp
+++ b/src/lib/netlist/plib/pparser.cpp
@@ -282,6 +282,7 @@ ppreprocessor::ppreprocessor(defines_map_type *defines)
m_expr_sep.emplace_back("&&");
m_expr_sep.emplace_back("||");
m_expr_sep.emplace_back("==");
+ m_expr_sep.emplace_back(",");
m_expr_sep.emplace_back(" ");
m_expr_sep.emplace_back("\t");
@@ -508,9 +509,18 @@ pstring ppreprocessor::process_line(pstring line)
{
if (m_ifflag == 0)
{
- if (lti.size() != 3)
- error("PREPRO: only simple defines allowed: " + line);
- m_defines.insert({lti[1], define_t(lti[1], lti[2])});
+ if (lti.size() < 2)
+ error("PREPRO: define needs at least one argument: " + line);
+ else if (lti.size() == 2)
+ m_defines.insert({lti[1], define_t(lti[1], "")});
+ else
+ {
+ pstring arg("");
+ for (int i=2; i<lti.size() - 1; i++)
+ arg += lti[i] + " ";
+ arg += lti[lti.size()-1];
+ m_defines.insert({lti[1], define_t(lti[1], arg)});
+ }
}
}
else
diff --git a/src/mame/audio/nl_cheekyms.cpp b/src/mame/audio/nl_cheekyms.cpp
index 6caaf71d610..5abc5104778 100644
--- a/src/mame/audio/nl_cheekyms.cpp
+++ b/src/mame/audio/nl_cheekyms.cpp
@@ -241,7 +241,7 @@ NETLIST_END()
static NETLIST_START(NOISE)
CS(FC, 0)
- PARAM(FC.FUNC, "0.0000001 rand *")
+ PARAM(FC.FUNC, "0.0000001 * rand()")
ALIAS(E, FC.P)
ALIAS(B, FC.N)