// license:GPL-2.0+
// copyright-holders:Couriersud
/*
* nl_dice_compat.h
*
* The following script will convert a circuit using dice syntax into netlist
* syntax. It's not fail proof, but eases the manual work involved significantly.
sed -e 's/#define \(.*\)"\(.*\)"[ \t]*,[ \t]*\(.*\)/NET_ALIAS(\1,\2.\3)/' src/mame/drivers/nl_breakout.c \
| sed -e 's/^[ \t]*$/NL_EMPTY /' \
| cpp -I src/emu -I src/osd/ -DNL_CONVERT_CPP -P -CC - \
| sed -e 's/\(TTL_.*\)("\(.*\)")/\1(\2)/' \
| sed -e 's/CONNECTION(\(.*\),[ \t]*"\(.*\)", \(.*\))/NET_C(\1, \2.\3)/' \
| sed -e 's/CONNECTION("\(.*\)",[ \t]*\(.*\), \(.*\))/NET_C(\1.\2, \3)/' \
| sed -e 's/NET_C("\(.*\)", \(.*\), \(.*\))/NET_C(\1.\2, \3)/' \
| sed -e 's/) RES(/)\n RES(/g' \
| sed -e 's/) CAP(/)\n CAP(/g' \
| sed -e 's/) NET_C(/)\n NET_C(/g' \
| sed -e 's/NL_EMPTY//' \
*
*/
#ifndef NL_DICE_COMPAT_H_
#define NL_DICE_COMPAT_H_
#ifndef NL_CONVERT_CPP
#include "devices/net_lib.h"
#endif
/* --------------------------------------------------------------------
* Compatibility macros for DICE netlists ...
* -------------------------------------------------------------------- */
/*
* define NETLIST_DEVELOPMENT in IDEs before including this header file
* to get compile time errors on unknown devices. This should only be
* a temporary support and not be used in commits.
*/
#define NETLIB_NAME_STR_S(s) # s
#define NETLIB_NAME_STR(chip) NETLIB_NAME_STR_S(nld_ ## chip)
#ifndef NL_CONVERT_CPP
#ifndef NETLIST_DEVELOPMENT
#define NETLIST_DEVELOPMENT 0
#endif
#if (NETLIST_DEVELOPMENT)
#define CHIP(n, t) setup.register_dev( palloc(netlist::devices::nld_ ## t ## dip), n);
#else
#define CHIP(n, t) setup.register_dev(NETLIB_NAME_STR_S(TTL_ ## t ## _DIP), n);
//#define CHIP(n, t) TTL_ ## t ## _DIP(n)
#endif
#define CONNECTION( ... ) CONNECTIONY( CONNECTIONX( __VA_ARGS__ ) )
#define CONNECTIONY(a) a
#define CONNECTIONX(a, b, c, d) setup.register_link(a "." # b, c "." # d);
#define NET_CSTR(a, b) setup.register_link( a, b);
#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
{
public:
nl_fptype r, c;
Mono555Desc(nl_fptype res, nl_fptype cap) : r(res), c(cap) { }
};
struct Astable555Desc
{
public:
nl_fptype r1, r2, c;
Astable555Desc(nl_fptype res1, nl_fptype res2, nl_fptype cap) : r1(res1), r2(res2), c(cap) { }
};
struct Mono9602Desc
{
public:
nl_fptype r1, c1, r2, c2;
Mono9602Desc(nl_fptype res1, nl_fptype cap1, nl_fptype res2, nl_fptype cap2)
: r1(res1), c1(cap1), r2(res2), c2(cap2) { }
};
struct SeriesRCDesc
{
public:
nl_fptype r, c;
SeriesRCDesc(nl_fptype res, nl_fptype cap) : r(res), c(cap) { }
};
struct CapacitorDesc : public SeriesRCDesc
{
public:
CapacitorDesc(nl_fptype cap) : SeriesRCDesc(0.0, cap) { }
};
#else
#define CHIP(n, t) TTL_ ## t ## _DIP(n)
#define OHM(x) x
#define K_OHM(x) RES_K(x)
#define M_OHM(x) RES_M(x)
#define U_FARAD(x) CAP_U(x)
#define N_FARAD(x) CAP_N(x)
#define P_FARAD(x) CAP_P(x)
#endif
#define CIRCUIT_LAYOUT(x) NETLIST_START(x)
#define CIRCUIT_LAYOUT_END NETLIST_END()
#define CHIP_555_Mono(name, pdesc) \
NE555_DIP(name) \
NET_C(name.6, name.7) \
RES(name ## _R, pdesc ## _R) \
CAP(name ## _C, pdesc ## _C) \
NET_C(name.6, name ## _R.1) \
NET_C(name.6, name ## _C.1) \
NET_C(name ## _R.2, V5) \
NET_C(name ## _C.2, GND) \
NET_C(name.8, V5) \
NET_C(name.1, GND)
#define CHIP_555_Astable(name, pdesc) \
NE555_DIP(name) \
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.2, name ## _C.1) \
NET_C(name ## _R1.2, V5) \
NET_C(name ## _C.2, GND) \
NET_C(name.8, V5) \
NET_C(name.1, GND)
#define CHIP_9602_Mono(name, pdesc) \
CHIP(# name, 9602) \
NET_C(VCC, name.16) \
NET_C(GND, name.8) \
RES(name ## _R1, (pdesc)->r1) \
CAP(name ## _C1, (pdesc)->c1) \
RES(name ## _R2, (pdesc)->r2) \
NET_C(name.1, name ## _C1.1) \
NET_C(name.2, name ## _C1.2) \
NET_C(name.2, name ## _R1.2) \
NET_C(VCC, name ## _R1.1) \
if (((pdesc)->c2)>1e-15) { \
CAP(name ## _C2, (pdesc)->c2) \
NET_C(name.15, name ## _C2.1) \
NET_C(name.14, name ## _C2.2) }\
NET_C(name.14, name ## _R2.2) \
NET_C(VCC, name ## _R2.1)
#define CHIP_SERIES_RC(name, pdesc) \
RES(name ## _R, pdesc ## _R) \
CAP(name ## _C, pdesc ## _C) \
NET_C(name ## _R.1, name ## _C.2) \
ALIAS(name.3, name ## _R.1) \
ALIAS(name.2, name ## _R.2) \
ALIAS(name.1, name ## _C.1)
#define CHIP_INPUT_ACTIVE_LOW(name) \
SWITCH2(name ## _SW) \
NET_C(name ## _SW.1, V5) \
NET_C(name ## _SW.2, GND) \
ALIAS(name.1, name ## _SW.Q)
#define CHIP_INPUT_ACTIVE_HIGH(name) \
SWITCH2(name ## _SW) \
NET_C(name ## _SW.2, V5) \
NET_C(name ## _SW.1, GND) \
ALIAS(name.1, name ## _SW.Q)
#define CHIP_LATCH(name) \
NETDEV_RSFF(name) \
ALIAS(name.1, name.R) \
ALIAS(name.2, name.S) \
ALIAS(name.3, name.QQ)
/* FIXME: Alternative implementation using capacitor.
* This is a transitional implementation
*/
inline int CAPACITOR_tc_hl(const double c, const double r)
{
/*
* Vt = (VH-VL)*exp(-t/RC)
* ln(Vt/(VH-VL))*RC = -t
*/
static const double TIME_CONSTANT = -plib::log(0.8 / (4.0-0.1));
int ret = (int) (TIME_CONSTANT * (1.0 + r) * c * 1e9);
return ret;
}
inline int CAPACITOR_tc_lh(const double c, const double r)
{
/*
* Vt = (VH-VL)*(1-exp(-t/RC))
* -t=ln(1-Vt/(VH-VL))*RC
*/
static const double TIME_CONSTANT = -plib::log(1.0 - 2.0 / (4.0-0.1));
int ret = (int) (TIME_CONSTANT * (130.0 + r) * c * 1e9);
return ret;
}
#if 1
#define CHIP_CAPACITOR(name, pdesc) \
NETDEV_DELAY(name) \
NETDEV_PARAMI(name, L_TO_H, CAPACITOR_tc_lh((pdesc)->c, (pdesc)->r)) \
NETDEV_PARAMI(name, H_TO_L, CAPACITOR_tc_hl((pdesc)->c, (pdesc)->r))
#elif 1
// slow, very slow
#define CHIP_CAPACITOR(name, pdesc) \
CAP(name ## _C, (pdesc)->c) \
ALIAS(name.1, name ## _C.1 ) \
ALIAS(name.2, name ## _C.1) \
NET_C(GND, name ## _C.2)
#else
// fast, might work
#define CHIP_CAPACITOR(name, pdesc) \
RES(name ## _C, RES_K(1000)) \
ALIAS(name.1, name ## _C.1 ) \
ALIAS(name.2, name ## _C.1) \
NET_C(GND, name ## _C.2)
#endif
#endif /* NL_DICE_COMPAT_H_ */