Minor speed improvements and some timing adjustments. (nw)

This commit is contained in:
couriersud 2015-05-03 20:20:19 +02:00
parent 16618b71c7
commit b0979ceb10
10 changed files with 103 additions and 84 deletions

View File

@ -29,7 +29,7 @@ NETLIB_RESET(74175_sub)
{
m_CLK.set_state(netlist_input_t::STATE_INP_LH);
m_clrq = 0;
m_data = 0;
m_data = 0xFF;
}
NETLIB_UPDATE(74175_sub)
@ -42,26 +42,31 @@ NETLIB_UPDATE(74175_sub)
OUTLOGIC(m_Q[i], d, delay[d]);
OUTLOGIC(m_QQ[i], d ^ 1, delay[d ^ 1]);
}
m_CLK.inactivate();
}
}
NETLIB_UPDATE(74175)
{
if (!INPLOGIC(m_CLRQ))
UINT8 d = 0;
for (int i=0; i<4; i++)
{
d |= (INPLOGIC(m_D[i]) << i);
}
m_sub.m_clrq = INPLOGIC(m_CLRQ);
if (!m_sub.m_clrq)
{
for (int i=0; i<4; i++)
{
OUTLOGIC(m_sub.m_Q[i], 0, delay_clear[0]);
OUTLOGIC(m_sub.m_QQ[i], 1, delay_clear[1]);
}
}
m_sub.m_clrq = INPLOGIC(m_CLRQ);
UINT8 d = 0;
for (int i=0; i<4; i++)
m_sub.m_data = 0;
} else if (d != m_sub.m_data)
{
d |= (INPLOGIC(m_D[i]) << i);
m_sub.m_data = d;
m_sub.m_CLK.activate_lh();
}
m_sub.m_data = d;
}
NETLIB_START(74175)

View File

@ -51,7 +51,7 @@ NETLIB_SUBDEVICE(74175_sub,
netlist_ttl_output_t m_QQ[4];
netlist_state_t<netlist_sig_t> m_clrq;
netlist_state_t<netlist_sig_t> m_data;
netlist_state_t<UINT8> m_data;
);
NETLIB_DEVICE(74175,

View File

@ -9,10 +9,11 @@
NETLIB_START(74192)
{
register_input("A", m_A);
register_input("B", m_B);
register_input("C", m_C);
register_input("D", m_D);
register_sub(m_ABCD, "subABCD");
register_subalias("A", m_ABCD.m_A);
register_subalias("B", m_ABCD.m_B);
register_subalias("C", m_ABCD.m_C);
register_subalias("D", m_ABCD.m_D);
register_input("CLEAR", m_CLEAR);
register_input("LOADQ", m_LOADQ);
register_input("CU", m_CU);
@ -57,8 +58,7 @@ NETLIB_UPDATE(74192)
}
else if (!INPLOGIC(m_LOADQ))
{
m_cnt = (INPLOGIC(m_D) << 3) | (INPLOGIC(m_C) << 2)
| (INPLOGIC(m_B) << 1) | (INPLOGIC(m_A) << 0);
m_cnt = m_ABCD.read_ABCD();
}
else
{
@ -101,7 +101,7 @@ NETLIB_START(74192_dip)
{
NETLIB_NAME(74192)::start();
register_subalias("1", m_B);
register_subalias("1", m_ABCD.m_B);
register_subalias("2", m_Q[1]);
register_subalias("3", m_Q[0]);
register_subalias("4", m_CD);
@ -109,13 +109,13 @@ NETLIB_START(74192_dip)
register_subalias("6", m_Q[2]);
register_subalias("7", m_Q[3]);
register_subalias("9", m_D);
register_subalias("10", m_C);
register_subalias("9", m_ABCD.m_D);
register_subalias("10", m_ABCD.m_C);
register_subalias("11", m_LOADQ);
register_subalias("12", m_CARRYQ);
register_subalias("13", m_BORROWQ);
register_subalias("14", m_CLEAR);
register_subalias("15", m_A);
register_subalias("15", m_ABCD.m_A);
}

View File

@ -30,6 +30,7 @@
#define NLD_74192_H_
#include "../nl_base.h"
#include "nld_9316.h"
#define TTL_74192(_name) \
NET_REGISTER_DEV(74192, _name)
@ -40,10 +41,7 @@
NETLIB_DEVICE(74192,
ATTR_HOT void update_outputs();
netlist_ttl_input_t m_A;
netlist_ttl_input_t m_B;
netlist_ttl_input_t m_C;
netlist_ttl_input_t m_D;
NETLIB_NAME(9316_subABCD) m_ABCD;
netlist_ttl_input_t m_CLEAR;
netlist_ttl_input_t m_LOADQ;
netlist_ttl_input_t m_CU;

View File

@ -15,15 +15,15 @@ NETLIB_UPDATE(82S16)
{
// FIXME: Outputs are tristate. This needs to be properly implemented
OUTLOGIC(m_DOUTQ, 1, NLTIME_FROM_NS(20));
for (int i=0; i<8; i++)
m_A[i].inactivate();
//for (int i=0; i<8; i++)
//m_A[i].inactivate();
}
else
{
int adr = 0;
for (int i=0; i<8; i++)
{
m_A[i].activate();
//m_A[i].activate();
adr |= (INPLOGIC(m_A[i]) << i);
}

View File

@ -50,15 +50,12 @@ NETLIB_START(9310_subABCD)
NETLIB_RESET(9310_subABCD)
{
#if 0
m_A.inactivate();
m_B.inactivate();
m_C.inactivate();
m_D.inactivate();
}
ATTR_HOT inline UINT8 NETLIB_NAME(9310_subABCD::read_ABCD)()
{
return (INPLOGIC_PASSIVE(m_D) << 3) | (INPLOGIC_PASSIVE(m_C) << 2) | (INPLOGIC_PASSIVE(m_B) << 1) | (INPLOGIC_PASSIVE(m_A) << 0);
#endif
}
NETLIB_UPDATE(9310_subABCD)
@ -75,9 +72,9 @@ NETLIB_START(9310_sub)
register_output("QD", m_QD);
register_output("RC", m_RC);
save(NLNAME(m_cnt.ref()));
save(NLNAME(m_loadq.ref()));
save(NLNAME(m_ent.ref()));
save(NLNAME(m_cnt));
save(NLNAME(m_loadq));
save(NLNAME(m_ent));
}
NETLIB_RESET(9310_sub)
@ -90,28 +87,37 @@ NETLIB_RESET(9310_sub)
NETLIB_UPDATE(9310_sub)
{
UINT8 cnt = m_cnt;
if (m_loadq)
{
cnt++;
if (cnt > MAXCNT)
cnt = 0;
update_outputs(cnt);
OUTLOGIC(m_RC, m_ent & (cnt == MAXCNT), NLTIME_FROM_NS(20));
#if 0
if (cnt == 0x0f)
OUTLOGIC(m_RC, m_ent, NLTIME_FROM_NS(20));
else if (cnt == 0)
OUTLOGIC(m_RC, 0, NLTIME_FROM_NS(20));
m_cnt = (m_cnt < MAXCNT) ? m_cnt + 1 : 0;
update_outputs(m_cnt);
OUTLOGIC(m_RC, m_ent & (m_cnt == MAXCNT), NLTIME_FROM_NS(20));
#else
switch (m_cnt.get())
{
case MAXCNT - 1:
m_cnt = MAXCNT;
OUTLOGIC(m_RC, m_ent, NLTIME_FROM_NS(20));
OUTLOGIC(m_QA, 1, NLTIME_FROM_NS(20));
break;
case MAXCNT:
OUTLOGIC(m_RC, 0, NLTIME_FROM_NS(20));
m_cnt = 0;
update_outputs_all(m_cnt, NLTIME_FROM_NS(20));
break;
default:
m_cnt++;
update_outputs(m_cnt);
}
#endif
}
else
{
cnt = m_ABCD.get()->read_ABCD();
update_outputs_all(cnt);
OUTLOGIC(m_RC, m_ent & (cnt == MAXCNT), NLTIME_FROM_NS(20));
m_cnt = m_ABCD.get()->read_ABCD();
update_outputs_all(m_cnt, NLTIME_FROM_NS(22));
OUTLOGIC(m_RC, m_ent & (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
}
m_cnt = cnt;
}
NETLIB_UPDATE(9310)
@ -123,26 +129,23 @@ NETLIB_UPDATE(9310)
if ((!sub.m_loadq || (sub.m_ent & INPLOGIC(m_ENP))) && clrq)
{
sub.m_CLK.activate_lh();
OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(27));
}
else
{
UINT8 cnt = sub.m_cnt;
sub.m_CLK.inactivate();
if (!clrq && (cnt>0))
if (!clrq && (sub.m_cnt>0))
{
cnt = 0;
sub.update_outputs(cnt);
//OUTLOGIC(sub.m_RC, 0, NLTIME_FROM_NS(20));
sub.m_cnt = cnt;
sub.update_outputs_all(0, NLTIME_FROM_NS(36));
sub.m_cnt = 0;
//return;
}
OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(27));
}
OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(20));
}
inline NETLIB_FUNC_VOID(9310_sub, update_outputs_all, (const UINT8 cnt))
inline NETLIB_FUNC_VOID(9310_sub, update_outputs_all, (const UINT8 cnt, const netlist_time out_delay))
{
const netlist_time out_delay = NLTIME_FROM_NS(20);
OUTLOGIC(m_QA, (cnt >> 0) & 1, out_delay);
OUTLOGIC(m_QB, (cnt >> 1) & 1, out_delay);
OUTLOGIC(m_QC, (cnt >> 2) & 1, out_delay);
@ -151,8 +154,8 @@ inline NETLIB_FUNC_VOID(9310_sub, update_outputs_all, (const UINT8 cnt))
inline NETLIB_FUNC_VOID(9310_sub, update_outputs, (const UINT8 cnt))
{
const netlist_time out_delay = NLTIME_FROM_NS(20);
#if 1
static const netlist_time out_delay = NLTIME_FROM_NS(20);
#if 0
// for (int i=0; i<4; i++)
// OUTLOGIC(m_Q[i], (cnt >> i) & 1, delay[i]);
OUTLOGIC(m_QA, (cnt >> 0) & 1, out_delay);

View File

@ -68,12 +68,16 @@ NETLIB_SUBDEVICE(9310_subABCD,
netlist_ttl_input_t m_C;
netlist_ttl_input_t m_D;
ATTR_HOT inline UINT8 read_ABCD();
ATTR_HOT inline UINT8 read_ABCD() const
{
//return (INPLOGIC_PASSIVE(m_D) << 3) | (INPLOGIC_PASSIVE(m_C) << 2) | (INPLOGIC_PASSIVE(m_B) << 1) | (INPLOGIC_PASSIVE(m_A) << 0);
return (INPLOGIC(m_D) << 3) | (INPLOGIC(m_C) << 2) | (INPLOGIC(m_B) << 1) | (INPLOGIC(m_A) << 0);
}
);
NETLIB_SUBDEVICE(9310_sub,
ATTR_HOT void update_outputs_all(const UINT8 cnt);
ATTR_HOT void update_outputs(const UINT8 cnt);
ATTR_HOT inline void update_outputs_all(const UINT8 cnt, const netlist_time out_delay);
ATTR_HOT inline void update_outputs(const UINT8 cnt);
netlist_ttl_input_t m_CLK;

View File

@ -50,15 +50,12 @@ NETLIB_START(9316_subABCD)
NETLIB_RESET(9316_subABCD)
{
#if 0
m_A.inactivate();
m_B.inactivate();
m_C.inactivate();
m_D.inactivate();
}
ATTR_HOT inline UINT8 NETLIB_NAME(9316_subABCD::read_ABCD)()
{
return (INPLOGIC_PASSIVE(m_D) << 3) | (INPLOGIC_PASSIVE(m_C) << 2) | (INPLOGIC_PASSIVE(m_B) << 1) | (INPLOGIC_PASSIVE(m_A) << 0);
#endif
}
NETLIB_UPDATE(9316_subABCD)
@ -99,15 +96,15 @@ NETLIB_UPDATE(9316_sub)
#else
switch (m_cnt.get())
{
case 0x0e:
m_cnt = 0x0f;
case MAXCNT - 1:
m_cnt = MAXCNT;
OUTLOGIC(m_RC, m_ent, NLTIME_FROM_NS(20));
OUTLOGIC(m_QA, 1, NLTIME_FROM_NS(20));
break;
case 0x0f:
case MAXCNT:
OUTLOGIC(m_RC, 0, NLTIME_FROM_NS(20));
m_cnt = 0;
update_outputs_all(m_cnt);
update_outputs_all(m_cnt, NLTIME_FROM_NS(20));
break;
default:
m_cnt++;
@ -118,8 +115,8 @@ NETLIB_UPDATE(9316_sub)
else
{
m_cnt = m_ABCD.get()->read_ABCD();
update_outputs_all(m_cnt);
OUTLOGIC(m_RC, m_ent & (m_cnt == MAXCNT), NLTIME_FROM_NS(20));
update_outputs_all(m_cnt, NLTIME_FROM_NS(22));
OUTLOGIC(m_RC, m_ent & (m_cnt == MAXCNT), NLTIME_FROM_NS(27));
}
}
@ -129,27 +126,26 @@ NETLIB_UPDATE(9316)
sub.m_ent = INPLOGIC(m_ENT);
const netlist_sig_t clrq = INPLOGIC(m_CLRQ);
if ((!sub.m_loadq || (sub.m_ent & INPLOGIC(m_ENP))) && clrq)
if ((!sub.m_loadq | (sub.m_ent & INPLOGIC(m_ENP))) & clrq)
{
sub.m_CLK.activate_lh();
OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(20));
OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(27));
}
else
{
sub.m_CLK.inactivate();
if (!clrq && (sub.m_cnt>0))
{
sub.update_outputs(0);
sub.update_outputs_all(0, NLTIME_FROM_NS(36));
sub.m_cnt = 0;
//return;
}
OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(20));
OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(27));
}
}
inline NETLIB_FUNC_VOID(9316_sub, update_outputs_all, (const UINT8 cnt))
inline NETLIB_FUNC_VOID(9316_sub, update_outputs_all, (const UINT8 cnt, const netlist_time out_delay))
{
const netlist_time out_delay = NLTIME_FROM_NS(20);
OUTLOGIC(m_QA, (cnt >> 0) & 1, out_delay);
OUTLOGIC(m_QB, (cnt >> 1) & 1, out_delay);
OUTLOGIC(m_QC, (cnt >> 2) & 1, out_delay);

View File

@ -72,12 +72,16 @@ NETLIB_SUBDEVICE(9316_subABCD,
netlist_ttl_input_t m_C;
netlist_ttl_input_t m_D;
ATTR_HOT inline UINT8 read_ABCD();
ATTR_HOT inline UINT8 read_ABCD() const
{
//return (INPLOGIC_PASSIVE(m_D) << 3) | (INPLOGIC_PASSIVE(m_C) << 2) | (INPLOGIC_PASSIVE(m_B) << 1) | (INPLOGIC_PASSIVE(m_A) << 0);
return (INPLOGIC(m_D) << 3) | (INPLOGIC(m_C) << 2) | (INPLOGIC(m_B) << 1) | (INPLOGIC(m_A) << 0);
}
);
NETLIB_SUBDEVICE(9316_sub,
ATTR_HOT void update_outputs_all(const UINT8 cnt);
ATTR_HOT void update_outputs(const UINT8 cnt);
ATTR_HOT inline void update_outputs_all(const UINT8 cnt, const netlist_time out_delay);
ATTR_HOT inline void update_outputs(const UINT8 cnt);
netlist_ttl_input_t m_CLK;

View File

@ -161,7 +161,9 @@ CIRCUIT_LAYOUT( breakout )
PARAM(Solver.ACCURACY, 1e-8) // less accuracy and diode will not work
#else
SOLVER(Solver, 48000)
PARAM(Solver.ACCURACY, 1e-6) // less accuracy and diode will not work
PARAM(Solver.ACCURACY, 1e-6)
PARAM(Solver.GS_THRESHOLD, 2)
//PARAM(Solver.SOR_FACTOR, 1)
#endif
//CHIP("CLOCK", CLOCK_14_318_MHZ)
MAINCLOCK(Y1, 14318000.0)
@ -386,7 +388,7 @@ CIRCUIT_LAYOUT( breakout )
#define PAD_EN_n "C2", 8
//#define P VCC
#define P "V5", Q
#define P "ttlhigh", Q
#define COIN "L9", 6
#define COIN1_n "F8", 5
@ -1631,14 +1633,21 @@ CIRCUIT_LAYOUT( breakout )
NET_C(CR6.A, R41.1, R42.1, R43.1, R51.1, R52.1)
#else
//RES_SWITCH(CR6, E2.11, R41.1, GND)
RES_SWITCH(CR6, E2.11, R41.1, GND)
PARAM(CR6.RON, 1e20)
PARAM(CR6.ROFF, 1)
NET_C(R41.1, R42.1, R43.1, R51.1, R52.1)
#endif
#if 1
CONNECTION("R51", 2, PLAYFIELD)
CONNECTION("R43", 2, BSYNC)
CONNECTION("R52", 2, SCORE)
#else
CONNECTION("R51", 2, "V5", Q)
CONNECTION("R43", 2, "V5", Q)
CONNECTION("R52", 2, "V5", Q)
#endif
NET_C(R41.2, B9.3)
NET_C(R42.2, V5)