Quite a number of simplifications for netlist. Also tested some parallel processing using OpenMP (disabled). No wn

This commit is contained in:
Couriersud 2014-01-10 19:23:42 +00:00
parent 6efc17f695
commit f8eac14fa9
21 changed files with 787 additions and 567 deletions

2
.gitattributes vendored
View File

@ -354,6 +354,8 @@ nl_examples/bjt_eb.c svneol=native#text/plain
nl_examples/msx_mixer_stage.c svneol=native#text/plain
nl_examples/ne555_astable.c svneol=native#text/plain
nl_examples/opamp.c svneol=native#text/plain
nl_examples/test.c svneol=native#text/plain
nl_examples/todo.c svneol=native#text/plain
src/build/build.mak svneol=native#text/plain
src/build/file2str.c svneol=native#text/plain
src/build/makedep.c svneol=native#text/plain

View File

@ -18,7 +18,7 @@ NETLIST_START(bjt)
/* NPN - example */
NETDEV_QNPN(Q, BC237B)
NETDEV_QNPN(Q, "BC237B")
NETDEV_R(RB, 1000)
NETDEV_R(RC, 1000)
@ -30,7 +30,7 @@ NETLIST_START(bjt)
/* PNP - example */
NETDEV_QPNP(Q1, BC556B)
NETDEV_QPNP(Q1, "BC556B")
NETDEV_R(RB1, 1000)
NETDEV_R(RC1, 1000)

View File

@ -19,7 +19,7 @@ NETLIST_START(bjt)
/* NPN - example */
NETDEV_QNPN_EB(Q, BC237B)
NETDEV_QBJT_EB(Q, "BC237B")
NETDEV_R(RB, 1000)
NETDEV_R(RC, 1000)
@ -30,7 +30,7 @@ NETLIST_START(bjt)
NET_C(RB.2, Q.B)
NET_C(Q.E, GND)
NETDEV_LOG(logB, Q.B)
NETDEV_LOG(logC, Q.C)
//NETDEV_LOG(logB, Q.B)
//NETDEV_LOG(logC, Q.C)
NETLIST_END()

View File

@ -50,7 +50,7 @@ NETLIST_START(msx)
NET_C(R21.1, V5)
NET_C(R21.2, R23.2)
NETDEV_QNPN_EB(T2, ss9014)
NETDEV_QBJT_EB(T2, "ss9014")
NET_C(R9.1, V12)
NET_C(R9.2, T2.C)

86
nl_examples/test.c Normal file
View File

@ -0,0 +1,86 @@
/*
* bjt.c
*
*/
#include "netlist/devices/net_lib.h"
NETLIST_START(bjt)
/* Standard stuff */
NETDEV_CLOCK(clk)
NETDEV_PARAM(clk.FREQ, 1000) // 1000 Hz
NETDEV_SOLVER(Solver)
NETDEV_PARAM(Solver.FREQ, 48000)
NETDEV_ANALOG_CONST(V3, 3)
NETDEV_ANALOG_CONST(STOPG, 0)
NET_ALIAS(SRSTQ, RYf.2)
NET_ALIAS(SRST, RYc.2)
NET_C(antenna, GND)
NET_ALIAS(runQ, Q1.C)
TTL_7404_INVERT(e4d, STOPG)
NETDEV_R(RYf, 50) // output impedance
NETDEV_R(RYc, 50) // output impedance
TTL_7404_INVERT(c9f, RYc.2)
TTL_7404_INVERT(c9c, RYf.2)
NET_C(c9f.Q, RYf.1)
NET_C(c9c.Q, RYc.1)
NETDEV_SWITCH2(coinsw, RYc.2, RYf.2)
NET_C(coinsw.Q, GND)
/* Antenna circuit */
/* Also has a diode to clamp negative voltages - omitted here */
NETDEV_QNPN(Q3, BC237B)
NET_ALIAS(antenna, Q3.B)
NET_C(GND, Q3.E)
NETDEV_R(RX5, 100)
NETDEV_C(CX1, 100)
NET_C(RX5.1, CX1.1)
NET_C(RX5.1, Q3.C)
NET_C(RX5.2, GND)
NET_C(CX1.2, GND)
NETDEV_QNPN(Q1, BC237B)
NET_C(Q1.B, RX5.1)
NET_C(Q1.E, GND)
NETDEV_D(D3, 1N914)
NET_C(D3.A, Q1.C)
NET_C(D3.K, SRSTQ)
NETDEV_D(D2, 1N914)
NETDEV_R(RX4, 220)
NET_C(D2.K, e4d.Q)
NET_C(D2.A, RX4.1)
NET_C(RX4.2, Q3.C)
NETDEV_R(RX1, 100)
NETDEV_R(RX2, 100)
NETDEV_R(RX3, 330)
NETDEV_C(CX2, CAP_U(0.1))
NET_C(RX3.2, D3.A)
NET_C(RX3.1, RX1.2)
NET_C(RX1.1, V3)
NET_C(RX1.1, CX2.1)
NET_C(RX1.2, CX2.2)
NETDEV_QPNP(Q2, BC556B)
NET_C(Q2.E, V3)
NET_C(Q2.B, RX1.2)
NET_C(Q2.C, RX2.2)
NET_C(RX2.1, D2.A)
//NETDEV_LOG(logB, Q1.B)
//NETDEV_LOG(logC, Q1.C)
NETLIST_END()

118
nl_examples/todo.c Normal file
View File

@ -0,0 +1,118 @@
/*
* todo.c
*
*/
#if 0
NETDEV_R(R1, 10)
NETDEV_R(R2, 10)
NETDEV_R(R3, 10)
NET_C(V5,R1.1)
NET_C(R1.2, R2.1)
NET_C(R2.2, R3.1)
NET_C(R3.2, GND)
#endif
#if 0
NETDEV_R(R4, 1000)
NETDEV_C(C1, 1e-6)
NET_C(V5,R4.1)
NET_C(R4.2, C1.1)
NET_C(C1.2, GND)
//NETDEV_LOG(log1, C1.1)
#endif
#if 0
NETDEV_R(R5, 1000)
NETDEV_1N914(D1)
NET_C(V5, R5.1)
NET_C(R5.2, D1.A)
NET_C(D1.K, GND)
//NETDEV_LOG(log1, D1.A)
#endif
#if 0
#endif
#if 0
NETDEV_VCVS(VV)
NETDEV_R(R1, 1000)
NETDEV_R(R2, 10000)
NET_C(V5, R1.1)
NET_C(R1.2, VV.IN)
NET_C(R2.1, VV.OP)
NET_C(R2.2, VV.IN)
NET_C(VV.ON, GND)
NET_C(VV.IP, GND)
NETDEV_LOG(logX, VV.OP)
#endif
#if 0
NETDEV_VCCS(VV)
NETDEV_PARAM(VV.G, 100000) // typical OP-AMP amplification
NETDEV_R(R1, 1000)
NETDEV_R(R2, 1)
NETDEV_R(R3, 10000)
NET_C(4V, R1.1)
NET_C(R1.2, VV.IN)
NET_C(R2.1, VV.OP)
NET_C(R3.1, VV.IN)
NET_C(R3.2, VV.OP)
NET_C(R2.2, GND)
NET_C(VV.ON, GND)
NET_C(VV.IP, GND)
//NETDEV_LOG(logX, VV.OP)
//NETDEV_LOG(logY, 4V)
#endif
#if 0
NETDEV_VCVS(VV)
NETDEV_PARAM(VV.G, 100000) // typical OP-AMP amplification
NETDEV_PARAM(VV.RO, 50) // typical OP-AMP amplification
NETDEV_R(R1, 1000)
NETDEV_R(R3, 10000) // ==> 10x amplification (inverting)
NET_C(4V, R1.1)
NET_C(R1.2, VV.IN)
NET_C(R3.1, VV.IN)
NET_C(R3.2, VV.OP)
NET_C(VV.ON, GND)
NET_C(VV.IP, GND)
NETDEV_LOG(logX, VV.OP)
NETDEV_LOG(logY, 4V)
#endif
#if 0
// Impedance converter with resistor
NETDEV_VCVS(VV)
NETDEV_PARAM(VV.G, 100000) // typical OP-AMP amplification
NETDEV_PARAM(VV.RO, 50) // typical OP-AMP amplification
NETDEV_R(R3, 10000)
NET_C(4V, VV.IP)
NET_C(R3.1, VV.IN)
NET_C(R3.2, VV.OP)
NET_C(VV.ON, GND)
NETDEV_LOG(logX, VV.OP)
NETDEV_LOG(logY, 4V)
#endif
#if 0
// Impedance converter without resistor
NETDEV_VCVS(VV)
NETDEV_PARAM(VV.G, 100000) // typical OP-AMP amplification
NETDEV_PARAM(VV.RO, 50) // typical OP-AMP amplification
NET_C(4V, VV.IP)
NET_C(VV.IN, VV.OP)
NET_C(VV.ON, GND)
NETDEV_LOG(logX, VV.OP)
NETDEV_LOG(logY, 4V)
#endif
d

View File

@ -45,8 +45,7 @@ NETLIB_START(Q)
register_param("model", m_model, "");
}
template <NETLIB_NAME(Q)::q_type _type>
NETLIB_START(QBJT_switch<_type>)
NETLIB_START(QBJT_switch)
{
NETLIB_NAME(Q)::start();
@ -77,14 +76,15 @@ NETLIB_UPDATE(Q)
netlist().solver()->schedule();
}
template <NETLIB_NAME(Q)::q_type _type>
NETLIB_UPDATE_PARAM(QBJT_switch<_type>)
NETLIB_UPDATE_PARAM(QBJT_switch)
{
double IS = m_model.dValue("IS", 1e-15);
double BF = m_model.dValue("BF", 100);
double NF = m_model.dValue("NF", 1);
double IS = m_model.model_value("IS", 1e-15);
double BF = m_model.model_value("BF", 100);
double NF = m_model.model_value("NF", 1);
//double VJE = m_model.dValue("VJE", 0.75);
set_qtype((m_model.model_type() == "NPN") ? BJT_NPN : BJT_PNP);
double alpha = BF / (1.0 + BF);
diode d(IS, NF);
@ -106,17 +106,11 @@ NETLIB_UPDATE_PARAM(QBJT_switch<_type>)
m_RC.set(NETLIST_GMIN, 0.0, 0.0);
}
template NETLIB_START(QBJT_switch<NETLIB_NAME(Q)::BJT_NPN>);
template NETLIB_START(QBJT_switch<NETLIB_NAME(Q)::BJT_PNP>);
template NETLIB_UPDATE_PARAM(QBJT_switch<NETLIB_NAME(Q)::BJT_NPN>);
template NETLIB_UPDATE_PARAM(QBJT_switch<NETLIB_NAME(Q)::BJT_PNP>);
// ----------------------------------------------------------------------------------------
// nld_Q - Ebers Moll
// ----------------------------------------------------------------------------------------
template <NETLIB_NAME(Q)::q_type _type>
NETLIB_START(QBJT_EB<_type>)
NETLIB_START(QBJT_EB)
{
NETLIB_NAME(Q)::start();
@ -145,16 +139,17 @@ NETLIB_START(QBJT_EB<_type>)
}
template <NETLIB_NAME(Q)::q_type _type>
NETLIB_UPDATE_PARAM(QBJT_EB<_type>)
NETLIB_UPDATE_PARAM(QBJT_EB)
{
double IS = m_model.dValue("IS", 1e-15);
double BF = m_model.dValue("BF", 100);
double NF = m_model.dValue("NF", 1);
double BR = m_model.dValue("BR", 1);
double NR = m_model.dValue("NR", 1);
double IS = m_model.model_value("IS", 1e-15);
double BF = m_model.model_value("BF", 100);
double NF = m_model.model_value("NF", 1);
double BR = m_model.model_value("BR", 1);
double NR = m_model.model_value("NR", 1);
//double VJE = m_model.dValue("VJE", 0.75);
set_qtype((m_model.model_type() == "NPN") ? BJT_NPN : BJT_PNP);
m_alpha_f = BF / (1.0 + BF);
m_alpha_r = BR / (1.0 + BR);
@ -163,8 +158,3 @@ NETLIB_UPDATE_PARAM(QBJT_EB<_type>)
}
template NETLIB_START(QBJT_EB<NETLIB_NAME(Q)::BJT_NPN>);
template NETLIB_START(QBJT_EB<NETLIB_NAME(Q)::BJT_PNP>);
template NETLIB_UPDATE_PARAM(QBJT_EB<NETLIB_NAME(Q)::BJT_NPN>);
template NETLIB_UPDATE_PARAM(QBJT_EB<NETLIB_NAME(Q)::BJT_PNP>);

View File

@ -13,21 +13,13 @@
// Macros
// ----------------------------------------------------------------------------------------
#define NETDEV_QPNP(_name, _model) \
NET_REGISTER_DEV(QPNP_switch, _name) \
NETDEV_PARAMI(_name, model, # _model)
#define NETDEV_QBJT_SW(_name, _model) \
NET_REGISTER_DEV(QBJT_switch, _name) \
NETDEV_PARAMI(_name, model, _model)
#define NETDEV_QNPN(_name, _model) \
NET_REGISTER_DEV(QNPN_switch, _name) \
NETDEV_PARAMI(_name, model, # _model)
#define NETDEV_QPNP_EB(_name, _model) \
NET_REGISTER_DEV(QPNP_EB, _name) \
NETDEV_PARAMI(_name, model, # _model)
#define NETDEV_QNPN_EB(_name, _model) \
NET_REGISTER_DEV(QNPN_switch, _name) \
NETDEV_PARAMI(_name, model, # _model)
#define NETDEV_QBJT_EB(_name, _model) \
NET_REGISTER_DEV(QBJT_EB, _name) \
NETDEV_PARAMI(_name, model, _model)
// ----------------------------------------------------------------------------------------
@ -44,12 +36,13 @@ public:
BJT_PNP
};
ATTR_COLD NETLIB_NAME(Q)(const q_type atype, const family_t afamily)
ATTR_COLD NETLIB_NAME(Q)(const family_t afamily)
: netlist_device_t(afamily)
, m_qtype(atype) { }
, m_qtype(BJT_NPN) { }
inline q_type qtype() const { return m_qtype; }
inline bool is_qtype(q_type atype) const { return m_qtype == atype; }
inline void set_qtype(q_type atype) { m_qtype = atype; }
protected:
ATTR_COLD virtual void start();
ATTR_HOT ATTR_ALIGN void update();
@ -63,8 +56,8 @@ class NETLIB_NAME(QBJT) : public NETLIB_NAME(Q)
{
public:
ATTR_COLD NETLIB_NAME(QBJT)(const q_type atype, const family_t afamily)
: NETLIB_NAME(Q)(atype, afamily) { }
ATTR_COLD NETLIB_NAME(QBJT)(const family_t afamily)
: NETLIB_NAME(Q)(afamily) { }
protected:
@ -92,18 +85,17 @@ private:
* E
*/
template <NETLIB_NAME(Q)::q_type _type>
class NETLIB_NAME(QBJT_switch) : public NETLIB_NAME(QBJT)
{
public:
ATTR_COLD NETLIB_NAME(QBJT_switch)()
: NETLIB_NAME(QBJT)(_type, BJT_SWITCH), m_gB(NETLIST_GMIN), m_gC(NETLIST_GMIN), m_V(0.0), m_state_on(0) { }
: NETLIB_NAME(QBJT)(BJT_SWITCH), m_gB(NETLIST_GMIN), m_gC(NETLIST_GMIN), m_V(0.0), m_state_on(0) { }
NETLIB_UPDATEI()
{
double vE = INPANALOG(m_EV);
double vB = INPANALOG(m_BV);
double m = (_type == BJT_NPN) ? 1 : -1;
double m = (is_qtype( BJT_NPN) ? 1 : -1);
int new_state = ((vB - vE) * m > m_V ) ? 1 : 0;
if (m_state_on ^ new_state)
@ -146,22 +138,15 @@ protected:
private:
};
typedef NETLIB_NAME(QBJT_switch)<NETLIB_NAME(Q)::BJT_PNP> NETLIB_NAME(QPNP_switch);
typedef NETLIB_NAME(QBJT_switch)<NETLIB_NAME(Q)::BJT_NPN> NETLIB_NAME(QNPN_switch);
// ----------------------------------------------------------------------------------------
// nld_QBJT_EB
// ----------------------------------------------------------------------------------------
template <NETLIB_NAME(Q)::q_type _type>
class NETLIB_NAME(QBJT_EB) : public NETLIB_NAME(QBJT)
{
public:
ATTR_COLD NETLIB_NAME(QBJT_EB)()
: NETLIB_NAME(QBJT)(_type, BJT_EB),
: NETLIB_NAME(QBJT)(BJT_EB),
m_D_BC(netlist_object_t::ANALOG),
m_D_BE(netlist_object_t::ANALOG),
m_I_BC(netlist_object_t::ANALOG),
@ -200,8 +185,4 @@ protected:
private:
};
typedef NETLIB_NAME(QBJT_EB)<NETLIB_NAME(Q)::BJT_PNP> NETLIB_NAME(QPNP_EB);
typedef NETLIB_NAME(QBJT_EB)<NETLIB_NAME(Q)::BJT_NPN> NETLIB_NAME(QNPN_EB);
#endif /* NLD_BJT_H_ */

View File

@ -6,6 +6,10 @@
#include "nld_solver.h"
#include "nld_twoterm.h"
#if HAS_OPENMP
#include "omp.h"
#endif
// ----------------------------------------------------------------------------------------
// netlist_matrix_solver
// ----------------------------------------------------------------------------------------
@ -15,13 +19,17 @@
ATTR_COLD void netlist_matrix_solver_t::setup(netlist_net_t::list_t &nets, NETLIB_NAME(solver) &aowner)
{
/* make sure we loop at least once */
m_resched = true;
m_owner = &aowner;
for (netlist_net_t::list_t::entry_t *pn = nets.first(); pn != NULL; pn = nets.next(pn))
{
NL_VERBOSE_OUT(("setting up net\n"));
m_nets.add(pn->object());
pn->object()->m_solver = this;
m_nets.add(pn->object());
pn->object()->m_solver = this;
for (netlist_core_terminal_t *p = pn->object()->m_head; p != NULL; p = p->m_update_list_next)
{
@ -35,7 +43,6 @@ ATTR_COLD void netlist_matrix_solver_t::setup(netlist_net_t::list_t &nets, NETLI
m_steps.add(&p->netdev());
break;
case netlist_device_t::BJT_EB:
printf("Found ebers moll\n");
case netlist_device_t::DIODE:
//case netlist_device_t::VCVS:
//case netlist_device_t::BJT_SWITCH:
@ -86,11 +93,16 @@ ATTR_HOT inline void netlist_matrix_solver_t::update_inputs()
ATTR_HOT inline int netlist_matrix_solver_t::solve_non_dynamic()
{
bool resched;
bool resched = false;
int resched_cnt = 0;
ATTR_UNUSED netlist_net_t *last_resched_net = NULL;
/* over-relaxation not really works on these matrices */
const double w = 1.0; //2.0 / (1.0 + sin(3.14159 / (m_nets.count()+1)));
const double w1 = 1.0 - w;
//printf("%f %d\n", w, m_nets.count());
do {
resched = false;
@ -110,12 +122,11 @@ ATTR_HOT inline int netlist_matrix_solver_t::solve_non_dynamic()
gabs += fabs(terms[i]->m_go);
iIdr += terms[i]->m_Idr + terms[i]->m_go * terms[i]->m_otherterm->net().Q_Analog();
}
gabs *= m_convergence_factor;
if (gabs > gtot)
new_val = (net->m_cur.Analog * gabs + iIdr) / (gtot + gabs);
else
new_val = iIdr / gtot;
new_val = w1 * net->m_cur.Analog + w * iIdr / gtot;
if (fabs(new_val - net->m_cur.Analog) > m_accuracy)
{
@ -129,7 +140,7 @@ ATTR_HOT inline int netlist_matrix_solver_t::solve_non_dynamic()
//NL_VERBOSE_OUT(("New: %lld %f %f\n", netlist().time().as_raw(), netlist().time().as_double(), new_val));
}
resched_cnt++;
} while (resched && (resched_cnt < m_resched_loops / 2 ));
} while (resched && (resched_cnt < m_resched_loops / 3 ));
return resched_cnt;
}
@ -137,12 +148,11 @@ ATTR_HOT inline int netlist_matrix_solver_t::solve_non_dynamic()
ATTR_HOT inline bool netlist_matrix_solver_t::solve()
{
bool resched = false;
// FIXME: There may be situations where we *could* need more than one iteration for dynamic elements
int resched_cnt = 0;
ATTR_UNUSED netlist_net_t *last_resched_net = NULL;
m_resched = false;
if (is_dynamic())
{
int this_resched;
@ -168,14 +178,12 @@ ATTR_HOT inline bool netlist_matrix_solver_t::solve()
resched_cnt = solve_non_dynamic();
}
if (resched_cnt >= m_resched_loops)
resched = true;
m_resched = true;
if (!resched)
update_inputs();
//if (resched)
//printf("Resched on net %s first term %s\n", last_resched_net->name().cstr(), last_resched_net->m_terms[0]->name().cstr());
return resched;
return m_resched;
}
// ----------------------------------------------------------------------------------------
@ -198,18 +206,18 @@ ATTR_COLD static bool already_processed(net_groups_t groups, int &cur_group, net
ATTR_COLD static void process_net(net_groups_t groups, int &cur_group, netlist_net_t *net)
{
/* add the net */
if (net->m_head == NULL)
return;
/* add the net */
groups[cur_group].add(net);
for (netlist_core_terminal_t *p = net->m_head; p != NULL; p = p->m_update_list_next)
{
if (p->isType(netlist_terminal_t::TERMINAL))
{
netlist_terminal_t *pt = static_cast<netlist_terminal_t *>(p);
netlist_net_t *nnet = &pt->m_otherterm->net();
if (!already_processed(groups, cur_group, nnet))
process_net(groups, cur_group, nnet);
netlist_net_t *other_net = &pt->m_otherterm->net();
if (!already_processed(groups, cur_group, other_net))
process_net(groups, cur_group, other_net);
}
}
}
@ -230,7 +238,7 @@ NETLIB_START(solver)
//register_param("ACCURACY", m_accuracy, 1e-3);
register_param("ACCURACY", m_accuracy, 1e-6);
register_param("CONVERG", m_convergence, 0.3);
register_param("RESCHED_LOOPS", m_resched_loops, 15);
register_param("RESCHED_LOOPS", m_resched_loops, 35);
// internal staff
@ -279,10 +287,34 @@ NETLIB_UPDATE(solver)
}
}
bool global_resched = false;
for (netlist_matrix_solver_t::list_t::entry_t *e = m_mat_solvers.first(); e != NULL; e = m_mat_solvers.next(e))
{
global_resched = global_resched || e->object()->solve();
}
bool this_resched[100];
#if HAS_OPENMP && USE_OPENMP
int t_cnt = m_mat_solvers.count();
omp_set_num_threads(3);
omp_set_dynamic(0);
#pragma omp parallel
{
int i;
#pragma omp for nowait
for (i = 0; i < t_cnt; i++)
{
this_resched[i] = m_mat_solvers[i]->solve();
}
}
#else
for (int i = 0; i < m_mat_solvers.count(); i++)
{
this_resched[i] = m_mat_solvers[i]->solve();
}
#endif
for (int i = 0; i < m_mat_solvers.count(); i++)
{
global_resched = global_resched || this_resched[i];
if (!this_resched[i])
m_mat_solvers[i]->update_inputs();
}
if (global_resched)
{
schedule();

View File

@ -22,12 +22,16 @@
class NETLIB_NAME(solver);
/* FIXME: these should become proper devices */
class netlist_matrix_solver_t
{
public:
typedef netlist_list_t<netlist_matrix_solver_t *> list_t;
typedef netlist_core_device_t::list_t dev_list_t;
netlist_matrix_solver_t() : m_resched(false) {}
ATTR_COLD void setup(netlist_net_t::list_t &nets, NETLIB_NAME(solver) &owner);
// return true if a reschedule is needed ...
@ -50,8 +54,9 @@ private:
dev_list_t m_dynamic;
netlist_core_terminal_t::list_t m_inps;
dev_list_t m_steps;
bool m_resched;
NETLIB_NAME(solver) *m_owner;
NETLIB_NAME(solver) *m_owner;
};
NETLIB_DEVICE_WITH_PARAMS(solver,
@ -89,7 +94,6 @@ public:
ATTR_HOT inline void NETLIB_NAME(solver)::schedule()
{
// FIXME: time should be parameter;
if (!m_Q_sync.net().is_queued())
m_Q_sync.net().push_to_queue(m_nt_sync_delay);
}

View File

@ -134,8 +134,8 @@ NETLIB_START(D)
NETLIB_UPDATE_PARAM(D)
{
double Is = m_model.dValue("Is", 1e-15);
double n = m_model.dValue("N", 1);
double Is = m_model.model_value("Is", 1e-15);
double n = m_model.model_value("N", 1);
m_D.set_param(Is, n);
}

View File

@ -55,7 +55,7 @@
/* Generic Diode */
#define NETDEV_D(_name, _model) \
NET_REGISTER_DEV(D, _name) \
NETDEV_PARAMI(_name, model, # _model)
NETDEV_PARAMI(_name, model, _model)
// ----------------------------------------------------------------------------------------
// Implementation

View File

@ -244,10 +244,8 @@ void netlist_factory_t::initialize()
ENTRY(D, NETDEV_D, "model")
ENTRY(VCVS, NETDEV_VCVS, "-")
ENTRY(VCCS, NETDEV_VCCS, "-")
ENTRY(QPNP_EB, NETDEV_QPNP_EB, "model")
ENTRY(QNPN_EB, NETDEV_QNPN_EB, "model")
ENTRY(QPNP_switch, NETDEV_QPNP, "model")
ENTRY(QNPN_switch, NETDEV_QNPN, "model")
ENTRY(QBJT_EB, NETDEV_QBJT_EB, "model")
ENTRY(QBJT_switch, NETDEV_QBJT_SW, "model")
ENTRY(ttl_const, NETDEV_TTL_CONST, "CONST")
ENTRY(analog_const, NETDEV_ANALOG_CONST, "CONST")
ENTRY(logic_input, NETDEV_LOGIC_INPUT, "-")

View File

@ -37,7 +37,8 @@ NETLIB_UPDATE(analog_const)
NETLIB_UPDATE_PARAM(analog_const)
{
m_Q.initial(m_const.Value());
//m_Q.initial(m_const.Value());
OUTANALOG(m_Q, m_const.Value(), NLTIME_IMMEDIATE);
}
// ----------------------------------------------------------------------------------------

View File

@ -629,14 +629,16 @@ ATTR_COLD netlist_ttl_output_t::netlist_ttl_output_t()
ATTR_COLD netlist_analog_output_t::netlist_analog_output_t()
: netlist_output_t(OUTPUT, ANALOG)
{
net().m_cur.Analog = 0.0;
net().m_new.Analog = 99.0;
net().m_last.Analog = 0.97;
net().m_cur.Analog = 0.98;
net().m_new.Analog = 0.99;
}
ATTR_COLD void netlist_analog_output_t::initial(const double val)
{
net().m_cur.Analog = val;
net().m_new.Analog = 99.0;
net().m_cur.Analog = val * 0.98;
net().m_cur.Analog = val * 0.99;
net().m_new.Analog = val * 1.0;
}
// ----------------------------------------------------------------------------------------
@ -678,7 +680,20 @@ ATTR_COLD netlist_param_model_t::netlist_param_model_t()
{
}
ATTR_COLD double netlist_param_model_t::dValue(const pstring &entity, const double defval) const
ATTR_COLD const pstring netlist_param_model_t::model_type() const
{
pstring tmp = this->Value();
// .model 1N914 D(Is=2.52n Rs=.568 N=1.752 Cjo=4p M=.4 tt=20n Iave=200m Vpk=75 mfg=OnSemi type=silicon)
int p = tmp.find("(");
int p1 = p;
while (--p >= 0 && tmp[p] != ' ')
;
return tmp.substr(p+1, p1-p-1).ucase();
}
ATTR_COLD double netlist_param_model_t::model_value(const pstring &entity, const double defval) const
{
pstring tmp = this->Value();
// .model 1N914 D(Is=2.52n Rs=.568 N=1.752 Cjo=4p M=.4 tt=20n Iave=200m Vpk=75 mfg=OnSemi type=silicon)

View File

@ -822,7 +822,8 @@ public:
ATTR_HOT inline const pstring &Value() const { return m_param; }
/* these should be cached! */
ATTR_COLD double dValue(const pstring &entity, const double defval = 0.0) const;
ATTR_COLD double model_value(const pstring &entity, const double defval = 0.0) const;
ATTR_COLD const pstring model_type() const;
private:
pstring m_param;
@ -1287,6 +1288,14 @@ public:
return nl_util::pstring_list();
}
ATTR_COLD const pstring def_param()
{
if (m_def_param.startsWith("+") || m_def_param.equals("-"))
return "";
else
return m_def_param;
}
protected:
pstring m_name; /* device name */
pstring m_classname; /* device class name */

View File

@ -28,6 +28,8 @@
#define USE_DEACTIVE_DEVICE (0)
#define USE_OPENMP (0)
// Use nano-second resolution - Sufficient for now
#define NETLIST_INTERNAL_RES (U64(1000000000))
//#define NETLIST_INTERNAL_RES (U64(1000000000000))
@ -55,14 +57,31 @@ typedef UINT8 netlist_sig_t;
#endif
//============================================================
// MACROS
// General Macros
//============================================================
#define HAS_OPENMP ( _OPENMP >= 200805 )
// prevent implicit copying
#define NETLIST_PREVENT_COPYING(_name) \
private: \
_name(const _name &); \
_name &operator=(const _name &);
#if defined(__GNUC__) && (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3))
#if !defined(__ppc__) && !defined (__PPC__) && !defined(__ppc64__) && !defined(__PPC64__)
#define ATTR_ALIGN __attribute__ ((aligned(128)))
#else
#define ATTR_ALIGN
#endif
#else
#define ATTR_ALIGN
#endif
//============================================================
// Performance tracking
//============================================================
#if NL_KEEP_STATISTICS
#define add_to_stat(v,x) do { v += (x); } while (0)
#define inc_stat(v) add_to_stat(v, 1)
@ -75,6 +94,11 @@ typedef UINT8 netlist_sig_t;
#define end_timing(v) do { } while (0)
#endif
//============================================================
// Performance tracking
//============================================================
// Compiling without mame ?
#ifndef ATTR_HOT
@ -86,15 +110,14 @@ typedef UINT8 netlist_sig_t;
#define ATTR_COLD
#endif
#if defined(__GNUC__) && (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3))
#if !defined(__ppc__) && !defined (__PPC__) && !defined(__ppc64__) && !defined(__PPC64__)
#define ATTR_ALIGN __attribute__ ((aligned(128)))
#else
#define ATTR_ALIGN
#endif
#else
#define ATTR_ALIGN
#endif
//============================================================
// WARNINGS
//============================================================
#if (USE_OPENMP)
#if (!HAS_OPEN_MP)
#warning To use openmp compile and link with "-fopenmp"
#endif
#endif
#endif /* NLCONFIG_H_ */

View File

@ -54,24 +54,6 @@ void netlist_parser::parse(const char *buf)
net_c();
else if (n == "NETDEV_PARAM")
netdev_param();
else if (n == "NETDEV_R")
netdev_device(n, "R");
else if (n == "NETDEV_C")
netdev_device(n, "C");
else if (n == "NETDEV_POT")
netdev_device(n, "R");
else if (n == "NETDEV_D")
netdev_device(n, "model", true);
else if (n == "NETDEV_QNPN")
netdev_device(n, "model", true);
else if (n == "NETDEV_QPNP")
netdev_device(n, "model", true);
else if (n == "NETDEV_QNPN_EB")
netdev_device(n, "model", true);
else if (n == "NETDEV_QPNP_EB")
netdev_device(n, "model", true);
else if ((n == "NETDEV_TTL_CONST") || (n == "NETDEV_ANALOG_CONST"))
netdev_const(n);
else if ((n == "NET_MODEL"))
net_model();
else if (n == "NETLIST_START")
@ -143,88 +125,58 @@ void netlist_parser::netdev_param()
check_char(')');
}
void netlist_parser::netdev_const(const pstring &dev_name)
{
pstring name;
netlist_device_t *dev;
pstring paramfq;
double val;
skipws();
name = getname(',');
dev = m_setup.factory().new_device_by_name(dev_name, m_setup);
m_setup.register_dev(dev, name);
skipws();
val = eval_param();
paramfq = name + ".CONST";
NL_VERBOSE_OUT(("Parser: Const: %s %f\n", name.cstr(), val));
check_char(')');
m_setup.register_param(paramfq, val);
}
void netlist_parser::netdev_device(const pstring &dev_type)
{
pstring devname;
net_device_t_base_factory *f = m_setup.factory().factory_by_name(dev_type, m_setup);
netlist_device_t *dev;
nl_util::pstring_list termlist = f->term_param_list();
pstring def_param = f->def_param();
int cnt;
skipws();
devname = getname2(',', ')');
dev = f->Create();
m_setup.register_dev(dev, devname);
NL_VERBOSE_OUT(("Parser: IC: %s\n", devname.cstr()));
cnt = 0;
while (getc() != ')')
{
if (cnt >= termlist.count())
fatalerror("netlist: input count mismatch for %s - expected %d found %d\n", devname.cstr(), termlist.count(), cnt);
NL_VERBOSE_OUT(("Parser: IC: %s\n", devname.cstr()));
if (def_param != "")
{
pstring paramfq = devname + "." + def_param;
NL_VERBOSE_OUT(("Defparam: %s\n", def_param.cstr()));
check_char(',');
skipws();
if (peekc() == '"')
{
pstring val = getstring();
m_setup.register_param(paramfq, val);
}
else
{
double val = eval_param();
m_setup.register_param(paramfq, val);
}
if (termlist.count() > 0)
check_char(',');
}
cnt = 0;
while (getc() != ')' && cnt < termlist.count())
{
skipws();
pstring output_name = getname2(',', ')');
#if 0
pstring alias = pstring::sprintf("%s.[%d]", devname.cstr(), cnt);
NL_VERBOSE_OUT(("Parser: ID: %s %s\n", output_name.cstr(), alias.cstr()));
m_setup.register_link(alias, output_name);
#else
m_setup.register_link(devname + "." + termlist[cnt], output_name);
#endif
m_setup.register_link(devname + "." + termlist[cnt], output_name);
skipws();
cnt++;
}
if (cnt != termlist.count())
fatalerror("netlist: input count mismatch for %s - expected %d found %d\n", devname.cstr(), termlist.count(), cnt);
}
void netlist_parser::netdev_device(const pstring &dev_type, const pstring &default_param, bool isString)
{
netlist_device_t *dev;
skipws();
pstring devname = getname2(',', ')');
pstring defparam = devname + "." + default_param;
dev = m_setup.factory().new_device_by_name(dev_type, m_setup);
m_setup.register_dev(dev, devname);
NL_VERBOSE_OUT(("Parser: IC: %s\n", devname.cstr()));
if (getc() != ')')
{
// have a default param
skipws();
if (isString)
{
pstring val = getname(')');
ungetc();
NL_VERBOSE_OUT(("Parser: Default param: %s %s\n", defparam.cstr(), val.cstr()));
m_setup.register_param(defparam, val);
}
else
{
double val = eval_param();
NL_VERBOSE_OUT(("Parser: Default param: %s %f\n", defparam.cstr(), val));
m_setup.register_param(defparam, val);
}
}
check_char(')');
}
// ----------------------------------------------------------------------------------------
// private
@ -360,14 +312,23 @@ double netlist_parser::eval_param()
for (i=1; i<6;i++)
if (strncmp(s.cstr(), macs[i], strlen(macs[i])) == 0)
f = i;
ret = s.substr(strlen(macs[f])).as_double(&e);
if ((f>0) && e)
if (f>0)
check_char(')');
s = s.substr(strlen(macs[f]));
ret = s.as_double(&e);
// if ((f>0) && e)
if (e)
error("Error with parameter ...\n");
if (f>0)
check_char(')');
return ret * facs[f];
}
unsigned char netlist_parser::peekc()
{
unsigned char c = getc();
ungetc();
return c;
}
unsigned char netlist_parser::getc()
{
if (*m_px == 10)

View File

@ -21,9 +21,7 @@ public:
void net_alias();
void netdev_param();
void net_c();
void netdev_const(const pstring &dev_name);
void netdev_device(const pstring &dev_type);
void netdev_device(const pstring &dev_type, const pstring &default_param, bool isString = false);
void netdev_netlist_start();
void netdev_netlist_end();
void net_model();
@ -40,6 +38,7 @@ private:
double eval_param();
pstring getstring();
unsigned char peekc();
unsigned char getc();
void ungetc();
bool eof() { return *m_px == 0; }

View File

@ -207,9 +207,10 @@ void netlist_setup_t::register_object(netlist_device_t &dev, const pstring &name
{
if (m_models[i].ucase().startsWith(search))
{
int pl=m_models[i].find("(");
int pr=m_models[i].find("(");
dynamic_cast<netlist_param_model_t &>(param).initial(m_models[i].substr(pl+1,pr-pl-1));
//int pl=m_models[i].find("(");
//int pr=m_models[i].find(")");
//dynamic_cast<netlist_param_model_t &>(param).initial(m_models[i].substr(pl+1,pr-pl-1));
dynamic_cast<netlist_param_model_t &>(param).initial(m_models[i]);
found = true;
break;
}

View File

@ -113,15 +113,15 @@ static NETLIST_START(pong_schematics)
NETDEV_PARAM(xclk.FREQ, 7159000.0*2)
#endif
/* 3V Logic - Just a resistor - the value is not given in schematics */
/* 3V Logic - Just a resistor - the value is not given in schematics */
NETDEV_R(R3V, 50) // Works ...
NET_C(R3V.1, V5)
NET_ALIAS(V3, R3V.2)
NETDEV_R(R3V, 50) // Works ...
NET_C(R3V.1, V5)
NET_ALIAS(V3, R3V.2)
/* Coin, antenna and startup circuit */
/* Coin, antenna and startup circuit */
NETDEV_ANALOG_CONST(STOPG, 0)
NETDEV_ANALOG_CONST(STOPG, 0)
NET_ALIAS(SRSTQ, RYf.2)
NET_ALIAS(SRST, RYc.2)
@ -148,7 +148,7 @@ static NETLIST_START(pong_schematics)
/* Antenna circuit */
/* Has a diode to clamp negative voltages - omitted here */
NETDEV_QNPN(Q3, BC237B)
NETDEV_QBJT_SW(Q3, "BC237B")
NET_C(antenna, Q3.B)
NET_C(GND, Q3.E)
NETDEV_R(RX5, 100)
@ -158,15 +158,15 @@ static NETLIST_START(pong_schematics)
NET_C(RX5.1, Q3.C)
NET_C(RX5.2, GND)
NET_C(CX1.2, GND)
NETDEV_QNPN(Q1, BC237B)
NETDEV_QBJT_SW(Q1, "BC237B")
NET_C(Q1.B, RX5.1)
NET_C(Q1.E, GND)
NETDEV_D(D3, 1N914)
NETDEV_D(D3, "1N914")
NET_C(D3.A, Q1.C)
NET_C(D3.K, SRSTQ)
NETDEV_D(D2, 1N914)
NETDEV_D(D2, "1N914")
NETDEV_R(RX4, 220)
NET_C(D2.K, e4d.Q)
NET_C(D2.A, RX4.1)
@ -184,7 +184,7 @@ static NETLIST_START(pong_schematics)
NET_C(RX1.1, CX2.1)
NET_C(RX1.2, CX2.2)
NETDEV_QPNP(Q2, BC556B)
NETDEV_QBJT_SW(Q2, "BC556B")
NET_C(Q2.E, V3)
NET_C(Q2.B, RX1.2)
NET_C(Q2.C, RX2.2)
@ -193,451 +193,451 @@ static NETLIST_START(pong_schematics)
/* hit logic */
TTL_7404_INVERT(hitQ, hit)
TTL_7400_NAND(hit, hit1Q, hit2Q)
TTL_7404_INVERT(hitQ, hit)
TTL_7400_NAND(hit, hit1Q, hit2Q)
TTL_7402_NOR(attractQ, StopG, runQ)
TTL_7404_INVERT(attract, attractQ)
TTL_7402_NOR(attractQ, StopG, runQ)
TTL_7404_INVERT(attract, attractQ)
TTL_7420_NAND(ic_h6a, hvidQ, hvidQ, hvidQ, hvidQ)
NET_ALIAS(hvid, ic_h6a.Q)
TTL_7420_NAND(ic_h6a, hvidQ, hvidQ, hvidQ, hvidQ)
NET_ALIAS(hvid, ic_h6a.Q)
TTL_7400_NAND(ic_e6c, hvid, hblank)
NET_ALIAS(MissQ, ic_e6c.Q)
TTL_7400_NAND(ic_e6c, hvid, hblank)
NET_ALIAS(MissQ, ic_e6c.Q)
TTL_7404_INVERT(ic_d1e, MissQ)
TTL_7400_NAND(ic_e1a, ic_d1e.Q, attractQ)
NET_ALIAS(Missed, ic_e1a.Q)
TTL_7404_INVERT(ic_d1e, MissQ)
TTL_7400_NAND(ic_e1a, ic_d1e.Q, attractQ)
NET_ALIAS(Missed, ic_e1a.Q)
TTL_7400_NAND(rstspeed, SRSTQ, MissQ)
TTL_7400_NAND(StopG, StopG1Q, StopG2Q)
NET_ALIAS(L, ic_h3b.Q)
NET_ALIAS(R, ic_h3b.QQ)
TTL_7400_NAND(rstspeed, SRSTQ, MissQ)
TTL_7400_NAND(StopG, StopG1Q, StopG2Q)
NET_ALIAS(L, ic_h3b.Q)
NET_ALIAS(R, ic_h3b.QQ)
TTL_7400_NAND(hit1Q, pad1, ic_g1b.Q)
TTL_7400_NAND(hit2Q, pad2, ic_g1b.Q)
TTL_7400_NAND(hit1Q, pad1, ic_g1b.Q)
TTL_7400_NAND(hit2Q, pad2, ic_g1b.Q)
TTL_7400_NAND(ic_g3c, 128H, ic_h3a.QQ)
TTL_7427_NOR(ic_g2c, ic_g3c.Q, 256H, vpad1Q)
NET_ALIAS(pad1, ic_g2c.Q)
TTL_7427_NOR(ic_g2a, ic_g3c.Q, 256HQ, vpad2Q)
NET_ALIAS(pad2, ic_g2a.Q)
TTL_7400_NAND(ic_g3c, 128H, ic_h3a.QQ)
TTL_7427_NOR(ic_g2c, ic_g3c.Q, 256H, vpad1Q)
NET_ALIAS(pad1, ic_g2c.Q)
TTL_7427_NOR(ic_g2a, ic_g3c.Q, 256HQ, vpad2Q)
NET_ALIAS(pad2, ic_g2a.Q)
// ----------------------------------------------------------------------------------------
// horizontal counter
// ----------------------------------------------------------------------------------------
TTL_7493(ic_f8, clk, ic_f8.QA, ic_e7b.QQ, ic_e7b.QQ) // f8, f9, f6b
TTL_7493(ic_f9, ic_f8.QD, ic_f9.QA, ic_e7b.QQ, ic_e7b.QQ) // f8, f9, f6b
TTL_74107(ic_f6b, ic_f9.QD, high, high, ic_e7b.Q)
TTL_7430_NAND(ic_f7, ic_f8.QB, ic_f8.QC, ic_f9.QC, ic_f9.QD, ic_f6b.Q, high, high, high)
TTL_7474(ic_e7b, clk, ic_f7, high, high)
// ----------------------------------------------------------------------------------------
// horizontal counter
// ----------------------------------------------------------------------------------------
TTL_7493(ic_f8, clk, ic_f8.QA, ic_e7b.QQ, ic_e7b.QQ) // f8, f9, f6b
TTL_7493(ic_f9, ic_f8.QD, ic_f9.QA, ic_e7b.QQ, ic_e7b.QQ) // f8, f9, f6b
TTL_74107(ic_f6b, ic_f9.QD, high, high, ic_e7b.Q)
TTL_7430_NAND(ic_f7, ic_f8.QB, ic_f8.QC, ic_f9.QC, ic_f9.QD, ic_f6b.Q, high, high, high)
TTL_7474(ic_e7b, clk, ic_f7, high, high)
NET_ALIAS(hreset, ic_e7b.QQ)
NET_ALIAS(hresetQ, ic_e7b.Q)
NET_ALIAS( 4H, ic_f8.QC)
NET_ALIAS( 8H, ic_f8.QD)
NET_ALIAS( 16H, ic_f9.QA)
NET_ALIAS( 32H, ic_f9.QB)
NET_ALIAS( 64H, ic_f9.QC)
NET_ALIAS(128H, ic_f9.QD)
NET_ALIAS(256H, ic_f6b.Q)
NET_ALIAS(256HQ, ic_f6b.QQ)
NET_ALIAS(hreset, ic_e7b.QQ)
NET_ALIAS(hresetQ, ic_e7b.Q)
NET_ALIAS( 4H, ic_f8.QC)
NET_ALIAS( 8H, ic_f8.QD)
NET_ALIAS( 16H, ic_f9.QA)
NET_ALIAS( 32H, ic_f9.QB)
NET_ALIAS( 64H, ic_f9.QC)
NET_ALIAS(128H, ic_f9.QD)
NET_ALIAS(256H, ic_f6b.Q)
NET_ALIAS(256HQ, ic_f6b.QQ)
// ----------------------------------------------------------------------------------------
// vertical counter
// ----------------------------------------------------------------------------------------
TTL_7493(ic_e8, hreset, ic_e8.QA, ic_e7a.QQ, ic_e7a.QQ) // e8, e9, d9b
TTL_7493(ic_e9, ic_e8.QD,ic_e9.QA, ic_e7a.QQ, ic_e7a.QQ) // e8, e9, d9b
TTL_74107(ic_d9b, ic_e9.QD, high, high, ic_e7a.Q)
TTL_7474(ic_e7a, hreset, e7a_data, high, high)
TTL_7410_NAND(e7a_data, ic_e8.QA, ic_e8.QC, ic_d9b.Q)
// ----------------------------------------------------------------------------------------
// vertical counter
// ----------------------------------------------------------------------------------------
TTL_7493(ic_e8, hreset, ic_e8.QA, ic_e7a.QQ, ic_e7a.QQ) // e8, e9, d9b
TTL_7493(ic_e9, ic_e8.QD,ic_e9.QA, ic_e7a.QQ, ic_e7a.QQ) // e8, e9, d9b
TTL_74107(ic_d9b, ic_e9.QD, high, high, ic_e7a.Q)
TTL_7474(ic_e7a, hreset, e7a_data, high, high)
TTL_7410_NAND(e7a_data, ic_e8.QA, ic_e8.QC, ic_d9b.Q)
NET_ALIAS(vreset, ic_e7a.QQ)
NET_ALIAS( 4V, ic_e8.QC)
NET_ALIAS( 8V, ic_e8.QD)
NET_ALIAS( 16V, ic_e9.QA)
NET_ALIAS( 32V, ic_e9.QB)
NET_ALIAS( 64V, ic_e9.QC)
NET_ALIAS(128V, ic_e9.QD)
NET_ALIAS(256V, ic_d9b.Q)
NET_ALIAS(256VQ, ic_d9b.QQ)
NET_ALIAS(vreset, ic_e7a.QQ)
NET_ALIAS( 4V, ic_e8.QC)
NET_ALIAS( 8V, ic_e8.QD)
NET_ALIAS( 16V, ic_e9.QA)
NET_ALIAS( 32V, ic_e9.QB)
NET_ALIAS( 64V, ic_e9.QC)
NET_ALIAS(128V, ic_e9.QD)
NET_ALIAS(256V, ic_d9b.Q)
NET_ALIAS(256VQ, ic_d9b.QQ)
// ----------------------------------------------------------------------------------------
// hblank flip flop
// ----------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------
// hblank flip flop
// ----------------------------------------------------------------------------------------
TTL_7400_NAND(ic_g5b, 16H, 64H)
TTL_7400_NAND(ic_g5b, 16H, 64H)
// the time critical one
TTL_7400_NAND(ic_h5c, ic_h5b.Q, hresetQ)
TTL_7400_NAND(ic_h5b, ic_h5c.Q, ic_g5b.Q)
// the time critical one
TTL_7400_NAND(ic_h5c, ic_h5b.Q, hresetQ)
TTL_7400_NAND(ic_h5b, ic_h5c.Q, ic_g5b.Q)
NET_ALIAS(hblank, ic_h5c.Q)
NET_ALIAS(hblankQ, ic_h5b.Q)
TTL_7400_NAND(hsyncQ, hblank, 32H)
NET_ALIAS(hblank, ic_h5c.Q)
NET_ALIAS(hblankQ, ic_h5b.Q)
TTL_7400_NAND(hsyncQ, hblank, 32H)
// ----------------------------------------------------------------------------------------
// vblank flip flop
// ----------------------------------------------------------------------------------------
TTL_7402_NOR(ic_f5c, ic_f5d.Q, vreset)
TTL_7402_NOR(ic_f5d, ic_f5c.Q, 16V)
// ----------------------------------------------------------------------------------------
// vblank flip flop
// ----------------------------------------------------------------------------------------
TTL_7402_NOR(ic_f5c, ic_f5d.Q, vreset)
TTL_7402_NOR(ic_f5d, ic_f5c.Q, 16V)
NET_ALIAS(vblank, ic_f5d.Q)
NET_ALIAS(vblankQ, ic_f5c.Q)
NET_ALIAS(vblank, ic_f5d.Q)
NET_ALIAS(vblankQ, ic_f5c.Q)
TTL_7400_NAND(ic_h5a, 8V, 8V)
TTL_7410_NAND(ic_g5a, vblank, 4V, ic_h5a.Q)
NET_ALIAS(vsyncQ, ic_g5a.Q)
TTL_7400_NAND(ic_h5a, 8V, 8V)
TTL_7410_NAND(ic_g5a, vblank, 4V, ic_h5a.Q)
NET_ALIAS(vsyncQ, ic_g5a.Q)
// ----------------------------------------------------------------------------------------
// move logic
// ----------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------
// move logic
// ----------------------------------------------------------------------------------------
TTL_7400_NAND(ic_e1d, hit_sound, ic_e1c.Q)
TTL_7400_NAND(ic_e1c, ic_f1.QC, ic_f1.QD)
TTL_7493(ic_f1, ic_e1d.Q, ic_f1.QA, rstspeed, rstspeed)
TTL_7400_NAND(ic_e1d, hit_sound, ic_e1c.Q)
TTL_7400_NAND(ic_e1c, ic_f1.QC, ic_f1.QD)
TTL_7493(ic_f1, ic_e1d.Q, ic_f1.QA, rstspeed, rstspeed)
TTL_7402_NOR(ic_g1d, ic_f1.QC, ic_f1.QD)
TTL_7400_NAND(ic_h1a, ic_g1d.Q, ic_g1d.Q)
TTL_7400_NAND(ic_h1d, ic_e1c.Q, ic_h1a.Q)
TTL_7402_NOR(ic_g1d, ic_f1.QC, ic_f1.QD)
TTL_7400_NAND(ic_h1a, ic_g1d.Q, ic_g1d.Q)
TTL_7400_NAND(ic_h1d, ic_e1c.Q, ic_h1a.Q)
TTL_7400_NAND(ic_h1c, ic_h1d.Q, vreset)
TTL_7400_NAND(ic_h1b, ic_h1a.Q, vreset)
TTL_7402_NOR(ic_g1c, 256HQ, vreset)
TTL_7400_NAND(ic_h1c, ic_h1d.Q, vreset)
TTL_7400_NAND(ic_h1b, ic_h1a.Q, vreset)
TTL_7402_NOR(ic_g1c, 256HQ, vreset)
TTL_74107(ic_h2a, ic_g1c.Q, ic_h2b.Q, low, ic_h1b.Q)
TTL_74107(ic_h2b, ic_g1c.Q, high, move, ic_h1c.Q)
TTL_74107(ic_h2a, ic_g1c.Q, ic_h2b.Q, low, ic_h1b.Q)
TTL_74107(ic_h2b, ic_g1c.Q, high, move, ic_h1c.Q)
TTL_7400_NAND(ic_h4a, ic_h2b.Q, ic_h2a.Q)
NET_ALIAS(move, ic_h4a.Q)
TTL_7400_NAND(ic_h4a, ic_h2b.Q, ic_h2a.Q)
NET_ALIAS(move, ic_h4a.Q)
TTL_7400_NAND(ic_c1d, SC, attract)
TTL_7404_INVERT(ic_d1a, ic_c1d.Q)
TTL_7474(ic_h3b, ic_d1a.Q, ic_h3b.QQ, hit1Q, hit2Q)
TTL_7400_NAND(ic_c1d, SC, attract)
TTL_7404_INVERT(ic_d1a, ic_c1d.Q)
TTL_7474(ic_h3b, ic_d1a.Q, ic_h3b.QQ, hit1Q, hit2Q)
TTL_7400_NAND(ic_h4d, ic_h3b.Q, move)
TTL_7400_NAND(ic_h4b, ic_h3b.QQ, move)
TTL_7400_NAND(ic_h4c, ic_h4d.Q, ic_h4b.Q)
NET_ALIAS(Aa, ic_h4c.Q)
NET_ALIAS(Ba, ic_h4b.Q)
TTL_7400_NAND(ic_h4d, ic_h3b.Q, move)
TTL_7400_NAND(ic_h4b, ic_h3b.QQ, move)
TTL_7400_NAND(ic_h4c, ic_h4d.Q, ic_h4b.Q)
NET_ALIAS(Aa, ic_h4c.Q)
NET_ALIAS(Ba, ic_h4b.Q)
// ----------------------------------------------------------------------------------------
// hvid circuit
// ----------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------
// hvid circuit
// ----------------------------------------------------------------------------------------
TTL_7400_NAND(hball_resetQ, Serve, attractQ)
TTL_7400_NAND(hball_resetQ, Serve, attractQ)
TTL_9316(ic_g7, clk, high, hblankQ, hball_resetQ, ic_g5c.Q, Aa, Ba, low, high)
TTL_9316(ic_h7, clk, ic_g7.RC, high, hball_resetQ, ic_g5c.Q, low, low, low, high)
TTL_74107(ic_g6b, ic_h7.RC, high, high, hball_resetQ)
TTL_7410_NAND(ic_g5c, ic_g6b.Q, ic_h7.RC, ic_g7.RC)
TTL_7420_NAND(ic_h6b, ic_g6b.Q, ic_h7.RC, ic_g7.QC, ic_g7.QD)
NET_ALIAS(hvidQ, ic_h6b.Q)
TTL_9316(ic_g7, clk, high, hblankQ, hball_resetQ, ic_g5c.Q, Aa, Ba, low, high)
TTL_9316(ic_h7, clk, ic_g7.RC, high, hball_resetQ, ic_g5c.Q, low, low, low, high)
TTL_74107(ic_g6b, ic_h7.RC, high, high, hball_resetQ)
TTL_7410_NAND(ic_g5c, ic_g6b.Q, ic_h7.RC, ic_g7.RC)
TTL_7420_NAND(ic_h6b, ic_g6b.Q, ic_h7.RC, ic_g7.QC, ic_g7.QD)
NET_ALIAS(hvidQ, ic_h6b.Q)
// ----------------------------------------------------------------------------------------
// vvid circuit
// ----------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------
// vvid circuit
// ----------------------------------------------------------------------------------------
TTL_9316(ic_b3, hsyncQ, high, vblankQ, high, ic_b2b.Q, a6, b6, c6, d6)
TTL_9316(ic_a3, hsyncQ, ic_b3.RC, high, high, ic_b2b.Q, low, low, low, low)
TTL_7400_NAND(ic_b2b, ic_a3.RC, ic_b3.RC)
TTL_7410_NAND(ic_e2b, ic_a3.RC, ic_b3.QC, ic_b3.QD)
NET_ALIAS(vvidQ, ic_e2b.Q)
TTL_7404_INVERT(vvid, vvidQ) // D2D
NET_ALIAS(vpos256, ic_a3.RC)
NET_ALIAS(vpos32, ic_a3.QB)
NET_ALIAS(vpos16, ic_a3.QA)
TTL_9316(ic_b3, hsyncQ, high, vblankQ, high, ic_b2b.Q, a6, b6, c6, d6)
TTL_9316(ic_a3, hsyncQ, ic_b3.RC, high, high, ic_b2b.Q, low, low, low, low)
TTL_7400_NAND(ic_b2b, ic_a3.RC, ic_b3.RC)
TTL_7410_NAND(ic_e2b, ic_a3.RC, ic_b3.QC, ic_b3.QD)
NET_ALIAS(vvidQ, ic_e2b.Q)
TTL_7404_INVERT(vvid, vvidQ) // D2D
NET_ALIAS(vpos256, ic_a3.RC)
NET_ALIAS(vpos32, ic_a3.QB)
NET_ALIAS(vpos16, ic_a3.QA)
// ----------------------------------------------------------------------------------------
// vball ctrl circuit
// ----------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------
// vball ctrl circuit
// ----------------------------------------------------------------------------------------
TTL_7450_ANDORINVERT(ic_a6a, b1, 256HQ, b2, 256H)
TTL_7450_ANDORINVERT(ic_a6b, c1, 256HQ, c2, 256H)
TTL_7450_ANDORINVERT(ic_b6b, d1, 256HQ, d2, 256H)
TTL_7450_ANDORINVERT(ic_a6a, b1, 256HQ, b2, 256H)
TTL_7450_ANDORINVERT(ic_a6b, c1, 256HQ, c2, 256H)
TTL_7450_ANDORINVERT(ic_b6b, d1, 256HQ, d2, 256H)
TTL_7474(ic_a5b, hit, ic_a6a, attractQ, high)
TTL_7474(ic_a5a, hit, ic_a6b, attractQ, high)
TTL_7474(ic_b5a, hit, ic_b6b, attractQ, high)
TTL_74107(ic_h2x, vblank, vvid, vvid, hitQ) // two marked at position h2a ==> this h2x
TTL_7474(ic_a5b, hit, ic_a6a, attractQ, high)
TTL_7474(ic_a5a, hit, ic_a6b, attractQ, high)
TTL_7474(ic_b5a, hit, ic_b6b, attractQ, high)
TTL_74107(ic_h2x, vblank, vvid, vvid, hitQ) // two marked at position h2a ==> this h2x
TTL_7486_XOR(ic_a4c, ic_a5b.Q, ic_h2x.Q)
TTL_7486_XOR(ic_a4b, ic_a5a.Q, ic_h2x.Q)
TTL_7486_XOR(ic_a4c, ic_a5b.Q, ic_h2x.Q)
TTL_7486_XOR(ic_a4b, ic_a5a.Q, ic_h2x.Q)
TTL_7450_ANDORINVERT(ic_b6a, ic_b5a.Q, ic_h2x.Q, ic_b5a.QQ, ic_h2x.QQ)
TTL_7450_ANDORINVERT(ic_b6a, ic_b5a.Q, ic_h2x.Q, ic_b5a.QQ, ic_h2x.QQ)
TTL_7404_INVERT(ic_c4a, ic_b6a)
TTL_7404_INVERT(ic_c4a, ic_b6a)
TTL_7483(ic_b4, ic_a4c, ic_a4b, ic_b6a, low, ic_c4a, high, high, low, low)
NET_ALIAS(a6, ic_b4.SA)
NET_ALIAS(b6, ic_b4.SB)
NET_ALIAS(c6, ic_b4.SC)
NET_ALIAS(d6, ic_b4.SD)
TTL_7483(ic_b4, ic_a4c, ic_a4b, ic_b6a, low, ic_c4a, high, high, low, low)
NET_ALIAS(a6, ic_b4.SA)
NET_ALIAS(b6, ic_b4.SB)
NET_ALIAS(c6, ic_b4.SC)
NET_ALIAS(d6, ic_b4.SD)
// ----------------------------------------------------------------------------------------
// serve monoflop
// ----------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------
// serve monoflop
// ----------------------------------------------------------------------------------------
TTL_7404_INVERT(f4_trig, rstspeed)
TTL_7404_INVERT(f4_trig, rstspeed)
NETDEV_R(ic_f4_serve_R, RES_K(330))
NETDEV_C(ic_f4_serve_C, CAP_U(4.7))
NETDEV_NE555(ic_f4_serve)
NETDEV_R(ic_f4_serve_R, RES_K(330))
NETDEV_C(ic_f4_serve_C, CAP_U(4.7))
NETDEV_NE555(ic_f4_serve)
NET_C(ic_f4_serve.VCC, V5)
NET_C(ic_f4_serve.GND, GND)
NET_C(ic_f4_serve.RESET, V5)
NET_C(ic_f4_serve_R.1, V5)
NET_C(ic_f4_serve_R.2, ic_f4_serve.THRESH)
NET_C(ic_f4_serve_R.2, ic_f4_serve.DISCH)
NET_C(f4_trig, ic_f4_serve.TRIG)
NET_C(ic_f4_serve_R.2, ic_f4_serve_C.1)
NET_C(GND, ic_f4_serve_C.2)
NET_C(ic_f4_serve.VCC, V5)
NET_C(ic_f4_serve.GND, GND)
NET_C(ic_f4_serve.RESET, V5)
NET_C(ic_f4_serve_R.1, V5)
NET_C(ic_f4_serve_R.2, ic_f4_serve.THRESH)
NET_C(ic_f4_serve_R.2, ic_f4_serve.DISCH)
NET_C(f4_trig, ic_f4_serve.TRIG)
NET_C(ic_f4_serve_R.2, ic_f4_serve_C.1)
NET_C(GND, ic_f4_serve_C.2)
TTL_7427_NOR(ic_e5a, ic_f4_serve.OUT, StopG, runQ)
TTL_7474(ic_b5b_serve, pad1, ic_e5a, ic_e5a, high)
TTL_7427_NOR(ic_e5a, ic_f4_serve.OUT, StopG, runQ)
TTL_7474(ic_b5b_serve, pad1, ic_e5a, ic_e5a, high)
NET_ALIAS(Serve, ic_b5b_serve.QQ)
NET_ALIAS(ServeQ, ic_b5b_serve.Q)
NET_ALIAS(Serve, ic_b5b_serve.QQ)
NET_ALIAS(ServeQ, ic_b5b_serve.Q)
// ----------------------------------------------------------------------------------------
// score logic
// ----------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------
// score logic
// ----------------------------------------------------------------------------------------
TTL_7474(ic_h3a, 4H, 128H, high, attractQ)
TTL_7474(ic_h3a, 4H, 128H, high, attractQ)
// ----------------------------------------------------------------------------------------
// sound logic
// ----------------------------------------------------------------------------------------
TTL_7474(ic_c2a, vpos256, high, hitQ, high)
TTL_74107(ic_f3_topbot, vblank, vvid, vvidQ, ServeQ)
// ----------------------------------------------------------------------------------------
// sound logic
// ----------------------------------------------------------------------------------------
TTL_7474(ic_c2a, vpos256, high, hitQ, high)
TTL_74107(ic_f3_topbot, vblank, vvid, vvidQ, ServeQ)
// ----------------------------------------------------------------------------------------
// monoflop with NE555 determines duration of score sound
// ----------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------
// monoflop with NE555 determines duration of score sound
// ----------------------------------------------------------------------------------------
NETDEV_R(ic_g4_R, RES_K(220))
NETDEV_C(ic_g4_C, CAP_U(1))
NETDEV_NE555(ic_g4_sc)
NET_ALIAS(SC, ic_g4_sc.OUT)
NETDEV_R(ic_g4_R, RES_K(220))
NETDEV_C(ic_g4_C, CAP_U(1))
NETDEV_NE555(ic_g4_sc)
NET_ALIAS(SC, ic_g4_sc.OUT)
NET_C(ic_g4_sc.VCC, V5)
NET_C(ic_g4_sc.GND, GND)
NET_C(ic_g4_sc.RESET, V5)
NET_C(ic_g4_R.1, V5)
NET_C(ic_g4_R.2, ic_g4_sc.THRESH)
NET_C(ic_g4_R.2, ic_g4_sc.DISCH)
NET_C(MissQ, ic_g4_sc.TRIG)
NET_C(ic_g4_R.2, ic_g4_C.1)
NET_C(GND, ic_g4_C.2)
NET_C(ic_g4_sc.VCC, V5)
NET_C(ic_g4_sc.GND, GND)
NET_C(ic_g4_sc.RESET, V5)
NET_C(ic_g4_R.1, V5)
NET_C(ic_g4_R.2, ic_g4_sc.THRESH)
NET_C(ic_g4_R.2, ic_g4_sc.DISCH)
NET_C(MissQ, ic_g4_sc.TRIG)
NET_C(ic_g4_R.2, ic_g4_C.1)
NET_C(GND, ic_g4_C.2)
NET_ALIAS(hit_sound_en, ic_c2a.QQ)
TTL_7400_NAND(hit_sound, hit_sound_en, vpos16)
TTL_7400_NAND(score_sound, SC, vpos32)
TTL_7400_NAND(topbothitsound, ic_f3_topbot.Q, vpos32)
NET_ALIAS(hit_sound_en, ic_c2a.QQ)
TTL_7400_NAND(hit_sound, hit_sound_en, vpos16)
TTL_7400_NAND(score_sound, SC, vpos32)
TTL_7400_NAND(topbothitsound, ic_f3_topbot.Q, vpos32)
TTL_7410_NAND(ic_c4b, topbothitsound, hit_sound, score_sound)
TTL_7400_NAND(ic_c1b, ic_c4b.Q, attractQ)
NET_ALIAS(sound, ic_c1b.Q)
TTL_7410_NAND(ic_c4b, topbothitsound, hit_sound, score_sound)
TTL_7400_NAND(ic_c1b, ic_c4b.Q, attractQ)
NET_ALIAS(sound, ic_c1b.Q)
// ----------------------------------------------------------------------------------------
// paddle1 logic 1
// ----------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------
// paddle1 logic 1
// ----------------------------------------------------------------------------------------
NETDEV_POT(ic_b9_POT, RES_K(1)) // This is a guess!!
NETDEV_PARAM(ic_b9_POT.DIALLOG, 1) // Log Dial ...
NETDEV_R(ic_b9_RPRE, 470)
NETDEV_POT(ic_b9_POT, RES_K(1)) // This is a guess!!
NETDEV_PARAM(ic_b9_POT.DIALLOG, 1) // Log Dial ...
NETDEV_R(ic_b9_RPRE, 470)
NET_C(ic_b9_POT.1, V5)
NET_C(ic_b9_POT.3, GND)
NET_C(ic_b9_POT.2, ic_b9_RPRE.1)
NET_C(ic_b9_RPRE.2, ic_b9.CONT)
NET_C(ic_b9_POT.1, V5)
NET_C(ic_b9_POT.3, GND)
NET_C(ic_b9_POT.2, ic_b9_RPRE.1)
NET_C(ic_b9_RPRE.2, ic_b9.CONT)
NETDEV_R(ic_b9_R, RES_K(81)) // Adjustment pot
NETDEV_C(ic_b9_C, CAP_U(.1))
NETDEV_D(ic_b9_D, 1N914)
NETDEV_NE555(ic_b9)
NETDEV_R(ic_b9_R, RES_K(81)) // Adjustment pot
NETDEV_C(ic_b9_C, CAP_U(.1))
NETDEV_D(ic_b9_D, "1N914")
NETDEV_NE555(ic_b9)
NET_C(ic_b9.VCC, V5)
NET_C(ic_b9.GND, GND)
NET_C(ic_b9.RESET, V5)
NET_C(ic_b9_R.1, V5)
NET_C(ic_b9_R.2, ic_b9.THRESH)
NET_C(ic_b9_R.2, ic_b9_D.A)
NET_C(ic_b9_D.K, ic_b9.DISCH)
NET_C(256VQ, ic_b9.TRIG)
NET_C(ic_b9_R.2, ic_b9_C.1)
NET_C(GND, ic_b9_C.2)
NET_C(ic_b9.VCC, V5)
NET_C(ic_b9.GND, GND)
NET_C(ic_b9.RESET, V5)
NET_C(ic_b9_R.1, V5)
NET_C(ic_b9_R.2, ic_b9.THRESH)
NET_C(ic_b9_R.2, ic_b9_D.A)
NET_C(ic_b9_D.K, ic_b9.DISCH)
NET_C(256VQ, ic_b9.TRIG)
NET_C(ic_b9_R.2, ic_b9_C.1)
NET_C(GND, ic_b9_C.2)
TTL_7404_INVERT(ic_c9b, ic_b9.OUT)
TTL_7400_NAND(ic_b7b, ic_a7b.Q, hsyncQ)
TTL_7493(ic_b8, ic_b7b.Q, ic_b8.QA, ic_b9.OUT, ic_b9.OUT)
TTL_7400_NAND(ic_b7a, ic_c9b.Q, ic_a7b.Q)
TTL_7420_NAND(ic_a7b, ic_b8.QA, ic_b8.QB, ic_b8.QC, ic_b8.QD)
NET_ALIAS(vpad1Q, ic_b7a.Q)
TTL_7404_INVERT(ic_c9b, ic_b9.OUT)
TTL_7400_NAND(ic_b7b, ic_a7b.Q, hsyncQ)
TTL_7493(ic_b8, ic_b7b.Q, ic_b8.QA, ic_b9.OUT, ic_b9.OUT)
TTL_7400_NAND(ic_b7a, ic_c9b.Q, ic_a7b.Q)
TTL_7420_NAND(ic_a7b, ic_b8.QA, ic_b8.QB, ic_b8.QC, ic_b8.QD)
NET_ALIAS(vpad1Q, ic_b7a.Q)
NET_ALIAS(b1, ic_b8.QB)
NET_ALIAS(c1, ic_b8.QC)
NET_ALIAS(d1, ic_b8.QD)
NET_ALIAS(b1, ic_b8.QB)
NET_ALIAS(c1, ic_b8.QC)
NET_ALIAS(d1, ic_b8.QD)
// ----------------------------------------------------------------------------------------
// paddle1 logic 2
// ----------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------
// paddle1 logic 2
// ----------------------------------------------------------------------------------------
NETDEV_POT(ic_a9_POT, RES_K(1)) // This is a guess!!
NETDEV_POT(ic_a9_POT, RES_K(1)) // This is a guess!!
NETDEV_PARAM(ic_a9_POT.DIALLOG, 1) // Log Dial ...
NETDEV_R(ic_a9_RPRE, 470)
NETDEV_R(ic_a9_RPRE, 470)
NET_C(ic_a9_POT.1, V5)
NET_C(ic_a9_POT.3, GND)
NET_C(ic_a9_POT.2, ic_a9_RPRE.1)
NET_C(ic_a9_RPRE.2, ic_a9.CONT)
NET_C(ic_a9_POT.1, V5)
NET_C(ic_a9_POT.3, GND)
NET_C(ic_a9_POT.2, ic_a9_RPRE.1)
NET_C(ic_a9_RPRE.2, ic_a9.CONT)
NETDEV_R(ic_a9_R, RES_K(81)) // Adjustment pot
NETDEV_C(ic_a9_C, CAP_U(.1))
NETDEV_D(ic_a9_D, 1N914)
NETDEV_NE555(ic_a9)
NETDEV_R(ic_a9_R, RES_K(81)) // Adjustment pot
NETDEV_C(ic_a9_C, CAP_U(.1))
NETDEV_D(ic_a9_D, "1N914")
NETDEV_NE555(ic_a9)
NET_C(ic_a9.VCC, V5)
NET_C(ic_a9.GND, GND)
NET_C(ic_a9.RESET, V5)
NET_C(ic_a9_R.1, V5)
NET_C(ic_a9_R.2, ic_a9.THRESH)
NET_C(ic_a9_R.2, ic_a9_D.A)
NET_C(ic_a9_D.K, ic_a9.DISCH)
NET_C(256VQ, ic_a9.TRIG)
NET_C(ic_a9_R.2, ic_a9_C.1)
NET_C(GND, ic_a9_C.2)
NET_C(ic_a9.VCC, V5)
NET_C(ic_a9.GND, GND)
NET_C(ic_a9.RESET, V5)
NET_C(ic_a9_R.1, V5)
NET_C(ic_a9_R.2, ic_a9.THRESH)
NET_C(ic_a9_R.2, ic_a9_D.A)
NET_C(ic_a9_D.K, ic_a9.DISCH)
NET_C(256VQ, ic_a9.TRIG)
NET_C(ic_a9_R.2, ic_a9_C.1)
NET_C(GND, ic_a9_C.2)
TTL_7404_INVERT(ic_c9a, ic_a9.OUT)
TTL_7400_NAND(ic_b7c, ic_a7a.Q, hsyncQ)
TTL_7493(ic_a8, ic_b7c.Q, ic_a8.QA, ic_a9.OUT, ic_a9.OUT)
TTL_7400_NAND(ic_b7d, ic_c9a.Q, ic_a7a.Q)
TTL_7420_NAND(ic_a7a, ic_a8.QA, ic_a8.QB, ic_a8.QC, ic_a8.QD)
NET_ALIAS(vpad2Q, ic_b7d.Q)
TTL_7404_INVERT(ic_c9a, ic_a9.OUT)
TTL_7400_NAND(ic_b7c, ic_a7a.Q, hsyncQ)
TTL_7493(ic_a8, ic_b7c.Q, ic_a8.QA, ic_a9.OUT, ic_a9.OUT)
TTL_7400_NAND(ic_b7d, ic_c9a.Q, ic_a7a.Q)
TTL_7420_NAND(ic_a7a, ic_a8.QA, ic_a8.QB, ic_a8.QC, ic_a8.QD)
NET_ALIAS(vpad2Q, ic_b7d.Q)
NET_ALIAS(b2, ic_a8.QB)
NET_ALIAS(c2, ic_a8.QC)
NET_ALIAS(d2, ic_a8.QD)
NET_ALIAS(b2, ic_a8.QB)
NET_ALIAS(c2, ic_a8.QC)
NET_ALIAS(d2, ic_a8.QD)
// ----------------------------------------------------------------------------------------
// C5-EN Logic
// ----------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------
// C5-EN Logic
// ----------------------------------------------------------------------------------------
TTL_7404_INVERT(ic_e3a, 128H)
TTL_7427_NOR( ic_e3b, 256H, 64H, ic_e3a.Q)
TTL_7410_NAND(ic_e2c, 256H, 64H, ic_e3a.Q)
TTL_7404_INVERT(ic_e3c, ic_e2c.Q)
TTL_7402_NOR(ic_d2c, ic_e3c.Q, ic_e3b.Q)
TTL_7404_INVERT(ic_g1a, 32V)
TTL_7425_NOR(ic_f2a, ic_g1a.Q, 64V, 128V, ic_d2c.Q)
NET_ALIAS(c5_en, ic_f2a.Q)
TTL_7404_INVERT(ic_e3a, 128H)
TTL_7427_NOR( ic_e3b, 256H, 64H, ic_e3a.Q)
TTL_7410_NAND(ic_e2c, 256H, 64H, ic_e3a.Q)
TTL_7404_INVERT(ic_e3c, ic_e2c.Q)
TTL_7402_NOR(ic_d2c, ic_e3c.Q, ic_e3b.Q)
TTL_7404_INVERT(ic_g1a, 32V)
TTL_7425_NOR(ic_f2a, ic_g1a.Q, 64V, 128V, ic_d2c.Q)
NET_ALIAS(c5_en, ic_f2a.Q)
// ----------------------------------------------------------------------------------------
// Score logic ...
// ----------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------
// Score logic ...
// ----------------------------------------------------------------------------------------
TTL_7402_NOR(ic_f5b, L, Missed)
TTL_7490(ic_c7, ic_f5b, SRST, SRST, low, low)
TTL_74107(ic_c8a, ic_c7.QD, high, high, SRSTQ)
NETDEV_SWITCH2(sw1a, high, ic_c7.QC)
NETDEV_PARAM(sw1a.POS, 0)
TTL_7410_NAND(ic_d8a, ic_c7.QA, sw1a.Q, ic_c8a.Q) // would be nand2 for 11 instead of 15 points, need a switch dev!
TTL_7402_NOR(ic_f5b, L, Missed)
TTL_7490(ic_c7, ic_f5b, SRST, SRST, low, low)
TTL_74107(ic_c8a, ic_c7.QD, high, high, SRSTQ)
NETDEV_SWITCH2(sw1a, high, ic_c7.QC)
NETDEV_PARAM(sw1a.POS, 0)
TTL_7410_NAND(ic_d8a, ic_c7.QA, sw1a.Q, ic_c8a.Q) // would be nand2 for 11 instead of 15 points, need a switch dev!
NET_ALIAS(StopG1Q, ic_d8a.Q)
NET_ALIAS(score1_1, ic_c7.QA)
NET_ALIAS(score1_2, ic_c7.QB)
NET_ALIAS(score1_4, ic_c7.QC)
NET_ALIAS(score1_8, ic_c7.QD)
NET_ALIAS(score1_10, ic_c8a.Q)
NET_ALIAS(score1_10Q, ic_c8a.QQ)
NET_ALIAS(StopG1Q, ic_d8a.Q)
NET_ALIAS(score1_1, ic_c7.QA)
NET_ALIAS(score1_2, ic_c7.QB)
NET_ALIAS(score1_4, ic_c7.QC)
NET_ALIAS(score1_8, ic_c7.QD)
NET_ALIAS(score1_10, ic_c8a.Q)
NET_ALIAS(score1_10Q, ic_c8a.QQ)
TTL_7402_NOR(ic_f5a, R, Missed)
TTL_7490(ic_d7, ic_f5a, SRST, SRST, low, low)
TTL_74107(ic_c8b, ic_d7.QD, high, high, SRSTQ)
NETDEV_SWITCH2(sw1b, high, ic_d7.QC)
NETDEV_PARAM(sw1b.POS, 0)
TTL_7410_NAND(ic_d8b, ic_d7.QA, sw1b.Q, ic_c8b.Q) // would be nand2 for 11 instead of 15 points, need a switch dev!
TTL_7402_NOR(ic_f5a, R, Missed)
TTL_7490(ic_d7, ic_f5a, SRST, SRST, low, low)
TTL_74107(ic_c8b, ic_d7.QD, high, high, SRSTQ)
NETDEV_SWITCH2(sw1b, high, ic_d7.QC)
NETDEV_PARAM(sw1b.POS, 0)
TTL_7410_NAND(ic_d8b, ic_d7.QA, sw1b.Q, ic_c8b.Q) // would be nand2 for 11 instead of 15 points, need a switch dev!
NET_ALIAS(StopG2Q, ic_d8b.Q)
NET_ALIAS(score2_1, ic_d7.QA)
NET_ALIAS(score2_2, ic_d7.QB)
NET_ALIAS(score2_4, ic_d7.QC)
NET_ALIAS(score2_8, ic_d7.QD)
NET_ALIAS(score2_10, ic_c8b.Q)
NET_ALIAS(score2_10Q, ic_c8b.QQ)
NET_ALIAS(StopG2Q, ic_d8b.Q)
NET_ALIAS(score2_1, ic_d7.QA)
NET_ALIAS(score2_2, ic_d7.QB)
NET_ALIAS(score2_4, ic_d7.QC)
NET_ALIAS(score2_8, ic_d7.QD)
NET_ALIAS(score2_10, ic_c8b.Q)
NET_ALIAS(score2_10Q, ic_c8b.QQ)
// ----------------------------------------------------------------------------------------
// Score display
// ----------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------
// Score display
// ----------------------------------------------------------------------------------------
TTL_74153(ic_d6a, score1_10Q, score1_4, score2_10Q, score2_4, 32H, 64H, low)
TTL_74153(ic_d6b, score1_10Q, score1_8, score2_10Q, score2_8, 32H, 64H, low)
TTL_74153(ic_d6a, score1_10Q, score1_4, score2_10Q, score2_4, 32H, 64H, low)
TTL_74153(ic_d6b, score1_10Q, score1_8, score2_10Q, score2_8, 32H, 64H, low)
TTL_74153(ic_c6a, high, score1_1, high, score2_1, 32H, 64H, low)
TTL_74153(ic_c6b, score1_10Q, score1_2, score2_10Q, score2_2, 32H, 64H, low)
TTL_74153(ic_c6a, high, score1_1, high, score2_1, 32H, 64H, low)
TTL_74153(ic_c6b, score1_10Q, score1_2, score2_10Q, score2_2, 32H, 64H, low)
TTL_7448(ic_c5, ic_c6a.AY, ic_c6b.AY, ic_d6a.AY, ic_d6b.AY, high, c5_en, high)
TTL_7448(ic_c5, ic_c6a.AY, ic_c6b.AY, ic_d6a.AY, ic_d6b.AY, high, c5_en, high)
TTL_7404_INVERT(ic_e4b, 16H)
TTL_7427_NOR(ic_e5c, ic_e4b.Q, 8H, 4H)
NET_ALIAS(scoreFE, ic_e5c.Q)
TTL_7404_INVERT(ic_e4b, 16H)
TTL_7427_NOR(ic_e5c, ic_e4b.Q, 8H, 4H)
NET_ALIAS(scoreFE, ic_e5c.Q)
TTL_7400_NAND(ic_c3d, 8H, 4H)
//TTL_7400_NAND(ic_c3d, 4H, 8H)
TTL_7402_NOR(ic_d2b, ic_e4b.Q, ic_c3d.Q)
NET_ALIAS(scoreBC, ic_d2b.Q)
TTL_7400_NAND(ic_c3d, 8H, 4H)
//TTL_7400_NAND(ic_c3d, 4H, 8H)
TTL_7402_NOR(ic_d2b, ic_e4b.Q, ic_c3d.Q)
NET_ALIAS(scoreBC, ic_d2b.Q)
TTL_7427_NOR(ic_e5b, ic_e4b.Q, 8V, 4V)
NET_ALIAS(scoreA, ic_e5b.Q)
TTL_7427_NOR(ic_e5b, ic_e4b.Q, 8V, 4V)
NET_ALIAS(scoreA, ic_e5b.Q)
TTL_7410_NAND(ic_e2a, 16H, 8V, 4V)
TTL_7404_INVERT(ic_e4a, ic_e2a.Q)
NET_ALIAS(scoreGD, ic_e4a.Q)
TTL_7410_NAND(ic_e2a, 16H, 8V, 4V)
TTL_7404_INVERT(ic_e4a, ic_e2a.Q)
NET_ALIAS(scoreGD, ic_e4a.Q)
TTL_7404_INVERT(ic_e4c, 16V)
TTL_7404_INVERT(ic_e4c, 16V)
TTL_7410_NAND(ic_d4a, ic_e4c.Q, ic_c5.f, scoreFE)
TTL_7410_NAND(ic_d5c, 16V, ic_c5.e, scoreFE)
TTL_7410_NAND(ic_c4c, ic_e4c.Q, ic_c5.b, scoreBC)
TTL_7410_NAND(ic_d5a, 16V, ic_c5.c, scoreBC)
TTL_7410_NAND(ic_d4c, ic_e4c.Q, ic_c5.a, scoreA)
TTL_7410_NAND(ic_d4b, ic_e4c.Q, ic_c5.g, scoreGD)
TTL_7410_NAND(ic_d5b, 16V, ic_c5.d, scoreGD)
TTL_7410_NAND(ic_d4a, ic_e4c.Q, ic_c5.f, scoreFE)
TTL_7410_NAND(ic_d5c, 16V, ic_c5.e, scoreFE)
TTL_7410_NAND(ic_c4c, ic_e4c.Q, ic_c5.b, scoreBC)
TTL_7410_NAND(ic_d5a, 16V, ic_c5.c, scoreBC)
TTL_7410_NAND(ic_d4c, ic_e4c.Q, ic_c5.a, scoreA)
TTL_7410_NAND(ic_d4b, ic_e4c.Q, ic_c5.g, scoreGD)
TTL_7410_NAND(ic_d5b, 16V, ic_c5.d, scoreGD)
TTL_7430_NAND(ic_d3, ic_d4a, ic_d5c, ic_c4c, ic_d5a, ic_d4c, ic_d4b, ic_d5b, high)
NET_ALIAS(score, ic_d3.Q) //FIXME
TTL_7430_NAND(ic_d3, ic_d4a, ic_d5c, ic_c4c, ic_d5a, ic_d4c, ic_d4b, ic_d5b, high)
NET_ALIAS(score, ic_d3.Q) //FIXME
// net
TTL_74107(ic_f3b, clk, 256H, 256HQ, high)
TTL_7400_NAND(ic_g3b, ic_f3b.QQ, 256H)
TTL_7427_NOR(ic_g2b, ic_g3b.Q, vblank, 4V)
NET_ALIAS(net, ic_g2b.Q)
// net
TTL_74107(ic_f3b, clk, 256H, 256HQ, high)
TTL_7400_NAND(ic_g3b, ic_f3b.QQ, 256H)
TTL_7427_NOR(ic_g2b, ic_g3b.Q, vblank, 4V)
NET_ALIAS(net, ic_g2b.Q)
// ----------------------------------------------------------------------------------------
// video
// ----------------------------------------------------------------------------------------
// ----------------------------------------------------------------------------------------
// video
// ----------------------------------------------------------------------------------------
TTL_7402_NOR(ic_g1b, hvidQ, vvidQ)
TTL_7425_NOR(ic_f2b, ic_g1b.Q, pad1, pad2, net)
TTL_7404_INVERT(ic_e4e, ic_f2b.Q)
NET_ALIAS(video, ic_e4e.Q)
TTL_7402_NOR(ic_g1b, hvidQ, vvidQ)
TTL_7425_NOR(ic_f2b, ic_g1b.Q, pad1, pad2, net)
TTL_7404_INVERT(ic_e4e, ic_f2b.Q)
NET_ALIAS(video, ic_e4e.Q)
TTL_7486_XOR(ic_a4d, hsyncQ, vsyncQ)
TTL_7404_INVERT(ic_e4f, ic_a4d.Q)
TTL_7486_XOR(ic_a4d, hsyncQ, vsyncQ)
TTL_7404_INVERT(ic_e4f, ic_a4d.Q)
NETDEV_R(RV1, RES_K(1))
NETDEV_R(RV2, RES_K(1.2))
NETDEV_R(RV3, RES_K(22))
NET_C(video, RV1.1)
NET_C(score, RV2.1)
NET_C(ic_e4f.Q, RV3.1)
NET_C(RV1.2, RV2.2)
NET_C(RV2.2, RV3.2)
NETDEV_R(RV1, RES_K(1))
NETDEV_R(RV2, RES_K(1.2))
NETDEV_R(RV3, RES_K(22))
NET_C(video, RV1.1)
NET_C(score, RV2.1)
NET_C(ic_e4f.Q, RV3.1)
NET_C(RV1.2, RV2.2)
NET_C(RV2.2, RV3.2)
NET_ALIAS(videomix, RV3.2)
NET_ALIAS(videomix, RV3.2)
NETLIST_END()
@ -799,7 +799,7 @@ MACHINE_CONFIG_END
ROM_START( pong ) /* dummy to satisfy game entry*/
ROM_REGION( 0x10000, "maincpu", 0 ) /* enough for netlist */
ROM_LOAD( "pong.netlist", 0x000000, 0x0043d9, CRC(64edd5a0) SHA1(9e661f2fba44f46015fdccffa7766dd4e61cdc7d) )
ROM_LOAD( "pong.netlist", 0x000000, 0x004400, CRC(64edd5a0) SHA1(9e661f2fba44f46015fdccffa7766dd4e61cdc7d) )
ROM_END
ROM_START( pongf ) /* dummy to satisfy game entry*/