Added 74192, 9316, 9310 and 74193 devices to netlist. Added breakout

(wip) netlist as well, but still have to implement three more devices
until work can really start. [Couriersud]
This commit is contained in:
couriersud 2015-04-22 00:45:21 +02:00
parent b894ca83ad
commit 7fa10acca6
17 changed files with 2402 additions and 11 deletions

View File

@ -1,3 +1,6 @@
#define NETLIST_DEVELOPMENT 1
#include "netlist/nl_dice_compat.h"
#include "netlist/devices/net_lib.h"
#include "netlist/analog/nld_twoterm.h"
@ -75,9 +78,9 @@ CIRCUIT_LAYOUT( breakout )
//CHIP("Y1", CLOCK_14_318_MHZ) //Y1
CHIP("C32", CAPACITOR, &c32_desc)
CHIP("C36", CAPACITOR, &c36_desc)
CHIP("C37", CAPACITOR, &c37_desc)
CHIP_CAPACITOR(C32, &c32_desc)
CHIP_CAPACITOR(C36, &c36_desc)
CHIP_CAPACITOR(C37, &c37_desc)
CHIP("PAD_EN_BUF", BUFFER, &pad_en_buf_desc)
CHIP("A3", 7474)
@ -87,7 +90,7 @@ CIRCUIT_LAYOUT( breakout )
CHIP_9602_Mono(A7, &a7_desc)
CHIP_9602_Mono(A8, &a8_desc)
CHIP("B2", 555_Astable, &b2_555_desc)
CHIP_555_Astable(B2, &b2_555_desc)
CHIP("B3", 7402)
CHIP("B4", 9316)
CHIP("B5", 74193)
@ -203,7 +206,7 @@ CIRCUIT_LAYOUT( breakout )
CHIP("PAD1", PADDLE1_HORIZONTAL_INPUT, &pad1_desc)
PADDLE_CONNECTION("PAD1", "C9")
CHIP("LATCH", LATCH)
CHIP_LATCH(LATCH)
CHIP("COIN1", COIN_INPUT)
//CHIP("COIN2", COIN_INPUT)
@ -1454,6 +1457,5 @@ CIRCUIT_LAYOUT( breakout )
CONNECTION("LOG1", 16, "L3", 6)*/ //N
#endif
CIRCUIT_LAYOUT_END
};
CIRCUIT_LAYOUT_END

View File

@ -81,8 +81,14 @@ files {
MAME_DIR .. "src/emu/netlist/devices/nld_74123.h",
MAME_DIR .. "src/emu/netlist/devices/nld_74153.c",
MAME_DIR .. "src/emu/netlist/devices/nld_74153.h",
MAME_DIR .. "src/emu/netlist/devices/nld_74192.c",
MAME_DIR .. "src/emu/netlist/devices/nld_74192.h",
MAME_DIR .. "src/emu/netlist/devices/nld_74193.c",
MAME_DIR .. "src/emu/netlist/devices/nld_74193.h",
MAME_DIR .. "src/emu/netlist/devices/nld_74ls629.c",
MAME_DIR .. "src/emu/netlist/devices/nld_74ls629.h",
MAME_DIR .. "src/emu/netlist/devices/nld_9310.c",
MAME_DIR .. "src/emu/netlist/devices/nld_9310.h",
MAME_DIR .. "src/emu/netlist/devices/nld_9312.c",
MAME_DIR .. "src/emu/netlist/devices/nld_9312.h",
MAME_DIR .. "src/emu/netlist/devices/nld_9316.c",

View File

@ -980,6 +980,7 @@ files {
MAME_DIR .. "src/mame/drivers/pong.c",
MAME_DIR .. "src/mame/drivers/nl_pong.c",
MAME_DIR .. "src/mame/drivers/nl_pongd.c",
MAME_DIR .. "src/mame/drivers/nl_breakout.c",
MAME_DIR .. "src/mame/drivers/poolshrk.c",
MAME_DIR .. "src/mame/audio/poolshrk.c",
MAME_DIR .. "src/mame/video/poolshrk.c",

View File

@ -91,6 +91,7 @@ void nl_initialize_factory(netlist_factory_t &factory)
ENTRY(gnd, GND, "-")
ENTRY(switch2, SWITCH2, "-")
ENTRY(nicRSFF, NETDEV_RSFF, "+S,R")
ENTRY(nicDelay, NETDEV_DELAY, "-")
ENTRY(4020, CD_4020, "+IP,RESET,VDD,VSS")
//ENTRY(4066, CD_4066, "+A,B")
ENTRY(7400, TTL_7400_NAND, "+A,B")
@ -116,7 +117,10 @@ void nl_initialize_factory(netlist_factory_t &factory)
ENTRY(74107A, TTL_74107A, "+CLK,J,K,CLRQ")
ENTRY(74123, TTL_74123, "-")
ENTRY(74153, TTL_74153, "+C0,C1,C2,C3,A,B,G")
ENTRY(74192, TTL_74192, "-")
ENTRY(74193, TTL_74193, "-")
ENTRY(SN74LS629, SN74LS629, "CAP")
ENTRY(9310, TTL_9310, "-")
ENTRY(9312, TTL_9312, "-")
ENTRY(9316, TTL_9316, "+CLK,ENP,ENT,CLRQ,LOADQ,A,B,C,D")
ENTRY(NE555, NE555, "-")
@ -145,7 +149,10 @@ void nl_initialize_factory(netlist_factory_t &factory)
ENTRY(74107_dip, TTL_74107_DIP, "-")
ENTRY(74123_dip, TTL_74123_DIP, "-")
ENTRY(74153_dip, TTL_74153_DIP, "-")
ENTRY(74192_dip, TTL_74192_DIP, "-")
ENTRY(74193_dip, TTL_74193_DIP, "-")
ENTRY(9602_dip, TTL_9602_DIP, "-")
ENTRY(9310_dip, TTL_9310_DIP, "-")
ENTRY(9312_dip, TTL_9312_DIP, "-")
ENTRY(9316_dip, TTL_9316_DIP, "-")
ENTRY(SN74LS629_dip, SN74LS629_DIP, "1.CAP1,2.CAP2")

View File

@ -78,7 +78,10 @@
#include "nld_74107.h"
#include "nld_74123.h"
#include "nld_74153.h"
#include "nld_74192.h"
#include "nld_74193.h"
#include "nld_74ls629.h"
#include "nld_9310.h"
#include "nld_9312.h"
#include "nld_9316.h"

View File

@ -0,0 +1,133 @@
/*
* nld_74192.c
*
*/
#define MAXCNT 9
#include "nld_74192.h"
NETLIB_START(74192)
{
register_input("A", m_A);
register_input("B", m_B);
register_input("C", m_C);
register_input("D", m_D);
register_input("CLEAR", m_CLEAR);
register_input("LOADQ", m_LOADQ);
register_input("CU", m_CU);
register_input("CD", m_CD);
register_output("QA", m_Q[0]);
register_output("QB", m_Q[1]);
register_output("QC", m_Q[2]);
register_output("QD", m_Q[3]);
register_output("BORROWQ", m_BORROWQ);
register_output("CARRYQ", m_CARRYQ);
save(NLNAME(m_cnt));
save(NLNAME(m_last_CU));
save(NLNAME(m_last_CD));
}
NETLIB_RESET(74192)
{
m_cnt = 0;
m_last_CU = 0;
m_last_CD = 0;
}
// FIXME: Timing
static const netlist_time delay[4] =
{
NLTIME_FROM_NS(18),
NLTIME_FROM_NS(36) - NLTIME_FROM_NS(18),
NLTIME_FROM_NS(54) - NLTIME_FROM_NS(18),
NLTIME_FROM_NS(72) - NLTIME_FROM_NS(18)};
NETLIB_UPDATE(74192)
{
int tCarry = 1;
int tBorrow = 1;
if (INPLOGIC(m_CLEAR))
{
m_cnt = 0;
}
else if (!INPLOGIC(m_LOADQ))
{
m_cnt = (INPLOGIC(m_D) << 3) | (INPLOGIC(m_C) << 2)
| (INPLOGIC(m_B) << 1) | (INPLOGIC(m_D) << 0);
}
else
{
if (INPLOGIC(m_CD) && !m_last_CU && INPLOGIC(m_CU))
{
m_cnt++;
if (m_cnt > MAXCNT)
m_cnt = 0;
}
else if (INPLOGIC(m_CD) && m_last_CU && !INPLOGIC(m_CU))
{
if (m_cnt == MAXCNT)
tCarry = 0;
}
if (INPLOGIC(m_CU) && !m_last_CD && INPLOGIC(m_CD))
{
if (m_cnt > 0)
m_cnt--;
else
m_cnt = MAXCNT;
}
else if (INPLOGIC(m_CU) && m_last_CD && !INPLOGIC(m_CD))
{
if (m_cnt == 0)
tBorrow = 0;
}
}
m_last_CD = INPLOGIC(m_CD);
m_last_CU = INPLOGIC(m_CU);
for (int i=0; i<4; i++)
OUTLOGIC(m_Q[i], (m_cnt >> i) & 1, delay[i]);
OUTLOGIC(m_BORROWQ, tBorrow, NLTIME_FROM_NS(20)); //FIXME
OUTLOGIC(m_CARRYQ, tCarry, NLTIME_FROM_NS(20)); //FIXME
}
NETLIB_FUNC_VOID(74192, update_outputs, (void))
{
}
NETLIB_START(74192_dip)
{
NETLIB_NAME(74192)::start();
register_subalias("1", m_B);
register_subalias("2", m_Q[1]);
register_subalias("3", m_Q[0]);
register_subalias("4", m_CD);
register_subalias("5", m_CU);
register_subalias("6", m_Q[2]);
register_subalias("7", m_Q[3]);
register_subalias("9", m_D);
register_subalias("10", 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);
}
NETLIB_UPDATE(74192_dip)
{
NETLIB_NAME(74192)::update();
}
NETLIB_RESET(74192_dip)
{
NETLIB_NAME(74192)::reset();
}

View File

@ -0,0 +1,64 @@
// license:GPL-2.0+
// copyright-holders:Couriersud
/*
* nld_74192.h
*
* DM74192: Synchronous 4-Bit Binary Counter with Dual Clock
* Decade counter
*
* FIXME: This should be merged with the 74193 which counts to 16
*
* +--------------+
* B |1 ++ 16| VCC
* QB |2 15| A
* QA |3 14| CLEAR
* CD |4 74192 13| BORROWQ
* CU |5 12| CARRYQ
* QC |6 11| LOADQ
* QD |7 10| C
* GND |8 9| D
* +--------------+
*
* CD: Count up
* CU: Count down
*
* Naming conventions follow National Semiconductor datasheet
*
*/
#ifndef NLD_74192_H_
#define NLD_74192_H_
#include "../nl_base.h"
#define TTL_74192(_name) \
NET_REGISTER_DEV(74192, _name)
#define TTL_74192_DIP(_name) \
NET_REGISTER_DEV(74192_dip, _name)
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;
netlist_ttl_input_t m_CLEAR;
netlist_ttl_input_t m_LOADQ;
netlist_ttl_input_t m_CU;
netlist_ttl_input_t m_CD;
netlist_state_t<INT8> m_cnt;
netlist_state_t<UINT8> m_last_CU;
netlist_state_t<UINT8> m_last_CD;
netlist_ttl_output_t m_Q[4];
netlist_ttl_output_t m_BORROWQ;
netlist_ttl_output_t m_CARRYQ;
);
NETLIB_DEVICE_DERIVED(74192_dip, 74192,
);
#endif /* NLD_74192_H_ */

View File

@ -0,0 +1,133 @@
/*
* nld_74193.c
*
*/
#define MAXCNT 15
#include "nld_74193.h"
NETLIB_START(74193)
{
register_input("A", m_A);
register_input("B", m_B);
register_input("C", m_C);
register_input("D", m_D);
register_input("CLEAR", m_CLEAR);
register_input("LOADQ", m_LOADQ);
register_input("CU", m_CU);
register_input("CD", m_CD);
register_output("QA", m_Q[0]);
register_output("QB", m_Q[1]);
register_output("QC", m_Q[2]);
register_output("QD", m_Q[3]);
register_output("BORROWQ", m_BORROWQ);
register_output("CARRYQ", m_CARRYQ);
save(NLNAME(m_cnt));
save(NLNAME(m_last_CU));
save(NLNAME(m_last_CD));
}
NETLIB_RESET(74193)
{
m_cnt = 0;
m_last_CU = 0;
m_last_CD = 0;
}
// FIXME: Timing
static const netlist_time delay[4] =
{
NLTIME_FROM_NS(18),
NLTIME_FROM_NS(36) - NLTIME_FROM_NS(18),
NLTIME_FROM_NS(54) - NLTIME_FROM_NS(18),
NLTIME_FROM_NS(72) - NLTIME_FROM_NS(18)};
NETLIB_UPDATE(74193)
{
int tCarry = 1;
int tBorrow = 1;
if (INPLOGIC(m_CLEAR))
{
m_cnt = 0;
}
else if (!INPLOGIC(m_LOADQ))
{
m_cnt = (INPLOGIC(m_D) << 3) | (INPLOGIC(m_C) << 2)
| (INPLOGIC(m_B) << 1) | (INPLOGIC(m_D) << 0);
}
else
{
if (INPLOGIC(m_CD) && !m_last_CU && INPLOGIC(m_CU))
{
m_cnt++;
if (m_cnt > MAXCNT)
m_cnt = 0;
}
else if (INPLOGIC(m_CD) && m_last_CU && !INPLOGIC(m_CU))
{
if (m_cnt == MAXCNT)
tCarry = 0;
}
if (INPLOGIC(m_CU) && !m_last_CD && INPLOGIC(m_CD))
{
if (m_cnt > 0)
m_cnt--;
else
m_cnt = MAXCNT;
}
else if (INPLOGIC(m_CU) && m_last_CD && !INPLOGIC(m_CD))
{
if (m_cnt == 0)
tBorrow = 0;
}
}
m_last_CD = INPLOGIC(m_CD);
m_last_CU = INPLOGIC(m_CU);
for (int i=0; i<4; i++)
OUTLOGIC(m_Q[i], (m_cnt >> i) & 1, delay[i]);
OUTLOGIC(m_BORROWQ, tBorrow, NLTIME_FROM_NS(20)); //FIXME
OUTLOGIC(m_CARRYQ, tCarry, NLTIME_FROM_NS(20)); //FIXME
}
NETLIB_FUNC_VOID(74193, update_outputs, (void))
{
}
NETLIB_START(74193_dip)
{
NETLIB_NAME(74193)::start();
register_subalias("1", m_B);
register_subalias("2", m_Q[1]);
register_subalias("3", m_Q[0]);
register_subalias("4", m_CD);
register_subalias("5", m_CU);
register_subalias("6", m_Q[2]);
register_subalias("7", m_Q[3]);
register_subalias("9", m_D);
register_subalias("10", 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);
}
NETLIB_UPDATE(74193_dip)
{
NETLIB_NAME(74193)::update();
}
NETLIB_RESET(74193_dip)
{
NETLIB_NAME(74193)::reset();
}

View File

@ -0,0 +1,61 @@
// license:GPL-2.0+
// copyright-holders:Couriersud
/*
* nld_74193.h
*
* DM74193: Synchronous 4-Bit Binary Counter with Dual Clock
*
* +--------------+
* B |1 ++ 16| VCC
* QB |2 15| A
* QA |3 14| CLEAR
* CD |4 74193 13| BORROWQ
* CU |5 12| CARRYQ
* QC |6 11| LOADQ
* QD |7 10| C
* GND |8 9| D
* +--------------+
*
* CD: Count up
* CU: Count down
*
* Naming conventions follow National Semiconductor datasheet
*
*/
#ifndef NLD_74193_H_
#define NLD_74193_H_
#include "../nl_base.h"
#define TTL_74193(_name) \
NET_REGISTER_DEV(74193, _name)
#define TTL_74193_DIP(_name) \
NET_REGISTER_DEV(74193_dip, _name)
NETLIB_DEVICE(74193,
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;
netlist_ttl_input_t m_CLEAR;
netlist_ttl_input_t m_LOADQ;
netlist_ttl_input_t m_CU;
netlist_ttl_input_t m_CD;
netlist_state_t<INT8> m_cnt;
netlist_state_t<UINT8> m_last_CU;
netlist_state_t<UINT8> m_last_CD;
netlist_ttl_output_t m_Q[4];
netlist_ttl_output_t m_BORROWQ;
netlist_ttl_output_t m_CARRYQ;
);
NETLIB_DEVICE_DERIVED(74193_dip, 74193,
);
#endif /* NLD_74193_H_ */

View File

@ -0,0 +1,228 @@
/*
* nld_9310.c
*
*/
#include "nld_9310.h"
#define MAXCNT 9
NETLIB_START(9310)
{
register_sub(subABCD, "subABCD");
sub.m_ABCD = &subABCD;
register_sub(sub, "sub");
register_subalias("CLK", sub.m_CLK);
register_input("ENP", m_ENP);
register_input("ENT", m_ENT);
register_input("CLRQ", m_CLRQ);
register_input("LOADQ", m_LOADQ);
register_subalias("A", subABCD.m_A);
register_subalias("B", subABCD.m_B);
register_subalias("C", subABCD.m_C);
register_subalias("D", subABCD.m_D);
register_subalias("QA", sub.m_QA);
register_subalias("QB", sub.m_QB);
register_subalias("QC", sub.m_QC);
register_subalias("QD", sub.m_QD);
register_subalias("RC", sub.m_RC);
}
NETLIB_RESET(9310)
{
sub.do_reset();
subABCD.do_reset();
}
NETLIB_START(9310_subABCD)
{
register_input("A", m_A);
register_input("B", m_B);
register_input("C", m_C);
register_input("D", m_D);
}
NETLIB_RESET(9310_subABCD)
{
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);
}
NETLIB_UPDATE(9310_subABCD)
{
}
NETLIB_START(9310_sub)
{
register_input("CLK", m_CLK);
register_output("QA", m_QA);
register_output("QB", m_QB);
register_output("QC", m_QC);
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()));
}
NETLIB_RESET(9310_sub)
{
m_CLK.set_state(netlist_input_t::STATE_INP_LH);
m_cnt = 0;
m_loadq = 1;
m_ent = 1;
}
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));
#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 = cnt;
}
NETLIB_UPDATE(9310)
{
sub.m_loadq = INPLOGIC(m_LOADQ);
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)
{
sub.m_CLK.activate_lh();
}
else
{
UINT8 cnt = sub.m_cnt;
sub.m_CLK.inactivate();
if (!clrq && (cnt>0))
{
cnt = 0;
sub.update_outputs(cnt);
//OUTLOGIC(sub.m_RC, 0, NLTIME_FROM_NS(20));
sub.m_cnt = cnt;
//return;
}
}
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))
{
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);
OUTLOGIC(m_QD, (cnt >> 3) & 1, out_delay);
}
inline NETLIB_FUNC_VOID(9310_sub, update_outputs, (const UINT8 cnt))
{
const netlist_time out_delay = NLTIME_FROM_NS(20);
#if 1
// for (int i=0; i<4; i++)
// OUTLOGIC(m_Q[i], (cnt >> i) & 1, delay[i]);
OUTLOGIC(m_QA, (cnt >> 0) & 1, out_delay);
OUTLOGIC(m_QB, (cnt >> 1) & 1, out_delay);
OUTLOGIC(m_QC, (cnt >> 2) & 1, out_delay);
OUTLOGIC(m_QD, (cnt >> 3) & 1, out_delay);
#else
if ((cnt & 1) == 1)
OUTLOGIC(m_QA, 1, out_delay);
else
{
OUTLOGIC(m_QA, 0, out_delay);
switch (cnt)
{
case 0x00:
OUTLOGIC(m_QB, 0, out_delay);
OUTLOGIC(m_QC, 0, out_delay);
OUTLOGIC(m_QD, 0, out_delay);
break;
case 0x02:
case 0x06:
case 0x0A:
case 0x0E:
OUTLOGIC(m_QB, 1, out_delay);
break;
case 0x04:
case 0x0C:
OUTLOGIC(m_QB, 0, out_delay);
OUTLOGIC(m_QC, 1, out_delay);
break;
case 0x08:
OUTLOGIC(m_QB, 0, out_delay);
OUTLOGIC(m_QC, 0, out_delay);
OUTLOGIC(m_QD, 1, out_delay);
break;
}
}
#endif
}
NETLIB_START(9310_dip)
{
NETLIB_NAME(9310)::start();
register_subalias("1", m_CLRQ);
register_subalias("2", sub.m_CLK);
register_subalias("3", subABCD.m_A);
register_subalias("4", subABCD.m_B);
register_subalias("5", subABCD.m_C);
register_subalias("6", subABCD.m_D);
register_subalias("7", m_ENP);
// register_subalias("8", ); --> GND
register_subalias("9", m_LOADQ);
register_subalias("10", m_ENT);
register_subalias("11", sub.m_QD);
register_subalias("12", sub.m_QC);
register_subalias("13", sub.m_QB);
register_subalias("14", sub.m_QA);
register_subalias("15", sub.m_RC);
// register_subalias("16", ); --> VCC
}
NETLIB_UPDATE(9310_dip)
{
NETLIB_NAME(9310)::update();
}
NETLIB_RESET(9310_dip)
{
NETLIB_NAME(9310)::reset();
}

View File

@ -0,0 +1,104 @@
// license:GPL-2.0+
// copyright-holders:Couriersud
/*
* nld_9310.h
*
* DM9310: Synchronous 4-Bit Counters
*
* FIXME: This should be merged with the 9316. The only difference is MAXCNT!
*
* +--------------+
* CLEAR |1 ++ 16| VCC
* CLOCK |2 15| RC (Ripple Carry)
* A |3 14| QA
* B |4 9310 13| QB
* C |5 12| QC
* D |6 11| QD
* Enable P |7 10| Enable T
* GND |8 9| LOAD
* +--------------+
*
* Counter Sequence
*
* +-------++----+----+----+----+----+
* | COUNT || QD | QC | QB | QA | RC |
* +=======++====+====+====+====+====+
* | 0 || 0 | 0 | 0 | 0 | 0 |
* | 1 || 0 | 0 | 0 | 1 | 0 |
* | 2 || 0 | 0 | 1 | 0 | 0 |
* | 3 || 0 | 0 | 1 | 1 | 0 |
* | 4 || 0 | 1 | 0 | 0 | 0 |
* | 5 || 0 | 1 | 0 | 1 | 0 |
* | 6 || 0 | 1 | 1 | 0 | 0 |
* | 7 || 0 | 1 | 1 | 1 | 0 |
* | 8 || 1 | 0 | 0 | 0 | 0 |
* | 9 || 1 | 0 | 0 | 1 | 0 |
* +-------++----+----+----+----+----+
*
* Reset count function: Please refer to
* National Semiconductor datasheet (timing diagramm)
*
* Naming conventions follow National Semiconductor datasheet
*
*/
#ifndef NLD_9310_H_
#define NLD_9310_H_
#include "../nl_base.h"
#define TTL_9310(_name, _CLK, _ENP, _ENT, _CLRQ, _LOADQ, _A, _B, _C, _D) \
NET_REGISTER_DEV(9310, _name) \
NET_CONNECT(_name, CLK, _CLK) \
NET_CONNECT(_name, ENP, _ENP) \
NET_CONNECT(_name, ENT, _ENT) \
NET_CONNECT(_name, CLRQ, _CLRQ) \
NET_CONNECT(_name, LOADQ,_LOADQ) \
NET_CONNECT(_name, A, _A) \
NET_CONNECT(_name, B, _B) \
NET_CONNECT(_name, C, _C) \
NET_CONNECT(_name, D, _D)
#define TTL_9310_DIP(_name) \
NET_REGISTER_DEV(9310_dip, _name)
NETLIB_SUBDEVICE(9310_subABCD,
netlist_ttl_input_t m_A;
netlist_ttl_input_t m_B;
netlist_ttl_input_t m_C;
netlist_ttl_input_t m_D;
ATTR_HOT inline UINT8 read_ABCD();
);
NETLIB_SUBDEVICE(9310_sub,
ATTR_HOT void update_outputs_all(const UINT8 cnt);
ATTR_HOT void update_outputs(const UINT8 cnt);
netlist_ttl_input_t m_CLK;
netlist_state_t<UINT8> m_cnt;
netlist_state_t<NETLIB_NAME(9310_subABCD) *> m_ABCD;
netlist_state_t<netlist_sig_t> m_loadq;
netlist_state_t<netlist_sig_t> m_ent;
netlist_ttl_output_t m_QA;
netlist_ttl_output_t m_QB;
netlist_ttl_output_t m_QC;
netlist_ttl_output_t m_QD;
netlist_ttl_output_t m_RC;
);
NETLIB_DEVICE(9310,
NETLIB_NAME(9310_sub) sub;
NETLIB_NAME(9310_subABCD) subABCD;
netlist_ttl_input_t m_ENP;
netlist_ttl_input_t m_ENT;
netlist_ttl_input_t m_CLRQ;
netlist_ttl_input_t m_LOADQ;
);
NETLIB_DEVICE_DERIVED(9310_dip, 9310,
);
#endif /* NLD_9310_H_ */

View File

@ -5,6 +5,8 @@
#include "nld_9316.h"
#define MAXCNT 15
NETLIB_START(9316)
{
register_sub(subABCD, "subABCD");
@ -91,9 +93,11 @@ NETLIB_UPDATE(9316_sub)
UINT8 cnt = m_cnt;
if (m_loadq)
{
cnt = ( cnt + 1) & 0x0f;
cnt++;
if (cnt > MAXCNT)
cnt = 0;
update_outputs(cnt);
OUTLOGIC(m_RC, m_ent & (cnt == 0x0f), NLTIME_FROM_NS(20));
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));
@ -105,7 +109,7 @@ NETLIB_UPDATE(9316_sub)
{
cnt = m_ABCD.get()->read_ABCD();
update_outputs_all(cnt);
OUTLOGIC(m_RC, m_ent & (cnt == 0x0f), NLTIME_FROM_NS(20));
OUTLOGIC(m_RC, m_ent & (cnt == MAXCNT), NLTIME_FROM_NS(20));
}
m_cnt = cnt;
}
@ -133,7 +137,7 @@ NETLIB_UPDATE(9316)
//return;
}
}
OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == 0x0f), NLTIME_FROM_NS(20));
OUTLOGIC(sub.m_RC, sub.m_ent & (sub.m_cnt == MAXCNT), NLTIME_FROM_NS(20));
}
inline NETLIB_FUNC_VOID(9316_sub, update_outputs_all, (const UINT8 cnt))

View File

@ -33,3 +33,39 @@ NETLIB_UPDATE(nicRSFF)
OUTLOGIC(m_QQ, 1, NLTIME_FROM_NS(20));
}
}
NETLIB_START(nicDelay)
{
register_input("1", m_I);
register_output("2", m_Q);
register_param("L_TO_H", m_L_to_H, 10);
register_param("H_TO_L", m_H_to_L, 10);
save(NLNAME(m_last));
}
NETLIB_RESET(nicDelay)
{
m_Q.initial(0);
}
NETLIB_UPDATE_PARAM(nicDelay)
{
}
NETLIB_UPDATE(nicDelay)
{
if (INPLOGIC(m_I) && !m_last)
{
// L_to_H
OUTLOGIC(m_Q, 1, NLTIME_FROM_NS(m_L_to_H.Value()));
}
else if (!INPLOGIC(m_I) && m_last)
{
OUTLOGIC(m_Q, 1, NLTIME_FROM_NS(m_H_to_L.Value()));
}
m_last = INPLOGIC(m_I);
}

View File

@ -22,6 +22,9 @@
#define NETDEV_RSFF(_name) \
NET_REGISTER_DEV(nicRSFF, _name)
#define NETDEV_DELAY(_name) \
NET_REGISTER_DEV(nicDelay, _name)
// ----------------------------------------------------------------------------------------
// Devices ...
// ----------------------------------------------------------------------------------------
@ -35,4 +38,16 @@ NETLIB_DEVICE(nicRSFF,
);
NETLIB_DEVICE_WITH_PARAMS(nicDelay,
netlist_ttl_input_t m_I;
netlist_ttl_output_t m_Q;
netlist_param_int_t m_L_to_H;
netlist_param_int_t m_H_to_L;
netlist_state_t<UINT8> m_last;
);
#endif /* NLD_LEGACY_H_ */

View File

@ -35,8 +35,12 @@
#define CIRCUIT_LAYOUT_END NETLIST_END()
#define OHM(x) (x)
#define K_OHM(x) ((x) * 1000.0)
#define M_OHM(x) ((x) * 1.0e6)
#define U_FARAD(x) ((x) * 1.0e-6)
#define N_FARAD(x) ((x) * 1.0e-9)
#define P_FARAD(x) ((x) * 1.0e-12)
struct Mono555Desc
{
@ -46,6 +50,14 @@ public:
Mono555Desc(nl_double res, nl_double cap) : r(res), c(cap) { }
};
struct Astable555Desc
{
public:
nl_double r1, r2, c;
Astable555Desc(nl_double res1, nl_double res2, nl_double cap) : r1(res1), r2(res2), c(cap) { }
};
struct Mono9602Desc
{
public:
@ -63,6 +75,12 @@ public:
SeriesRCDesc(nl_double res, nl_double cap) : r(res), c(cap) { }
};
struct CapacitorDesc : public SeriesRCDesc
{
public:
CapacitorDesc(nl_double cap) : SeriesRCDesc(0.0, cap) { }
};
#define CHIP_555_Mono(_name, _pdesc) \
CHIP(# _name, NE555) \
NET_C(_name.6, _name.7) \
@ -75,6 +93,21 @@ public:
NET_C(_name.8, V5) \
NET_CSTR(# _name ".1", "GND")
#define CHIP_555_Astable(_name, _pdesc) \
CHIP(# _name, NE555) \
NET_C(_name.6, _name.2) \
RES(_name ## _R1, (_pdesc)->r1) \
RES(_name ## _R2, (_pdesc)->r2) \
CAP(_name ## _C, (_pdesc)->c) \
NET_C(_name.7, _name ## _R1.1) \
NET_C(_name.7, _name ## _R2.1) \
NET_C(_name.6, _name ## _R2.2) \
NET_C(_name.6, _name ## _C.1) \
NET_C(_name ## _R1.2, V5) \
NET_CSTR(# _name "_C.2", "GND") \
NET_C(_name.8, V5) \
NET_CSTR(# _name ".1", "GND")
#define CHIP_9602_Mono(_name, _pdesc) \
CHIP(# _name, 9602) \
NET_C(VCC, _name.16) \
@ -118,6 +151,20 @@ public:
ALIAS(_name.2, _name.S) \
ALIAS(_name.3, _name.QQ)
/* FIXME: Alternative implementation using capacitor.
* This is a transitional implementation
*/
inline int CAPACITOR_tc(const double c, const double r)
{
static const double TIME_CONSTANT = -log((3.4 - 2.0) / 3.4);
return (int) (TIME_CONSTANT * (130.0 + r) * c * 1e9);
}
#define CHIP_CAPACITOR(_name, _pdesc) \
NETDEV_DELAY(_name) \
NETDEV_PARAMI(_name, L_TO_H, CAPACITOR_tc((_pdesc)->c, (_pdesc)->r)) \
NETDEV_PARAMI(_name, H_TO_HL, CAPACITOR_tc((_pdesc)->c, (_pdesc)->r)) \
#endif /* NL_DICE_COMPAT_H_ */

File diff suppressed because it is too large Load Diff

View File

@ -9,6 +9,7 @@
NETLIST_START(pong_fast)
SOLVER(Solver, 48000)
PARAM(Solver.PARALLEL, 0) // Don't do parallel solvers
PARAM(Solver.ACCURACY, 1e-4) // works and is sufficient
PARAM(Solver.LTE, 1e-4) // Default is not enough for paddle control if using LTE