Added macro object registration and dynamic includes to netlist. This
allows the creation of macro libraries going forward. Any IC which can be described by a truthtable and a package wrapper can now be entirely described in netlist syntax. [Couriersud]
This commit is contained in:
parent
ae0fd9f1a5
commit
e629855237
@ -14,26 +14,31 @@
|
||||
|
||||
NETLIST_START(diode_models)
|
||||
NET_MODEL(".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)")
|
||||
NET_MODEL(".model 1N4001 D(Is=14.11n N=1.984 Rs=33.89m Ikf=94.81 Xti=3 Eg=1.11 Cjo=25.89p M=.44 Vj=.3245 Fc=.5 Bv=75 Ibv=10u Tt=5.7u Iave=1 Vpk=50 mfg=GI type=silicon)")
|
||||
NET_MODEL(".model 1N4148 D(Is=2.52n Rs=.568 N=1.752 Cjo=4p M=.4 tt=20n Iave=200m Vpk=75 mfg=OnSemi type=silicon)")
|
||||
NET_MODEL(".model 1S1588 D(Is=2.52n Rs=.568 N=1.752 Cjo=4p M=.4 tt=20n Iave=200m Vpk=75)")
|
||||
NET_MODEL(".model LedRed D(IS=93.2p RS=42M N=3.73 BV=4 IBV=10U CJO=2.97P VJ=.75 M=.333 TT=4.32U Iave=40m Vpk=4 type=LED)")
|
||||
NET_MODEL(".model LedGreen D(IS=93.2p RS=42M N=4.61 BV=4 IBV=10U CJO=2.97P VJ=.75 M=.333 TT=4.32U Iave=40m Vpk=4 type=LED)")
|
||||
NET_MODEL(".model LedBlue D(IS=93.2p RS=42M N=7.47 BV=5 IBV=10U CJO=2.97P VJ=.75 M=.333 TT=4.32U Iave=40m Vpk=5 type=LED)")
|
||||
NET_MODEL(".model LedWhite D(Is=0.27n Rs=5.65 N=6.79 Cjo=42p Iave=30m Vpk=5 type=LED)")
|
||||
NET_MODEL(".model 1N4001 D(Is=14.11n N=1.984 Rs=33.89m Ikf=94.81 Xti=3 Eg=1.11 Cjo=25.89p M=.44 Vj=.3245 Fc=.5 Bv=75 Ibv=10u Tt=5.7u Iave=1 Vpk=50 mfg=GI type=silicon)")
|
||||
|
||||
NETLIST_END()
|
||||
|
||||
NETLIST_START(bjt_models)
|
||||
NET_MODEL(".model BC237B NPN(IS=1.8E-14 ISE=5.0E-14 ISC=1.72E-13 XTI=3 BF=400 BR=35.5 IKF=0.14 IKR=0.03 XTB=1.5 VAF=80 VAR=12.5 VJE=0.58 VJC=0.54 RE=0.6 RC=0.25 RB=0.56 CJE=13E-12 CJC=4E-12 XCJC=0.75 FC=0.5 NF=0.9955 NR=1.005 NE=1.46 NC=1.27 MJE=0.33 MJC=0.33 TF=0.64E-9 TR=50.72E-9 EG=1.11 KF=0 AF=1 VCEO=45V ICRATING=100M MFG=ZETEX)")
|
||||
NET_MODEL(".model BC556B PNP(IS=3.83E-14 NF=1.008 ISE=1.22E-14 NE=1.528 BF=344.4 IKF=0.08039 VAF=21.11 NR=1.005 ISC=2.85E-13 NC=1.28 BR=14.84 IKR=0.047 VAR=32.02 RB=1 IRB=1.00E-06 RBM=1 RE=0.6202 RC=0.5713 XTB=0 EG=1.11 XTI=3 CJE=1.23E-11 VJE=0.6106 MJE=0.378 TF=5.60E-10 XTF=3.414 VTF=5.23 ITF=0.1483 PTF=0 CJC=1.08E-11 VJC=0.1022 MJC=0.3563 XCJC=0.6288 TR=1.00E-32 CJS=0 VJS=0.75 MJS=0.333 FC=0.8027 Vceo=65 Icrating=100m mfg=Philips)")
|
||||
NET_MODEL(".model 2SA1015 PNP(Is=295.1E-18 Xti=3 Eg=1.11 Vaf=100 Bf=110 Xtb=1.5 Br=10.45 Rc=15 Cjc=66.2p Mjc=1.054 Vjc=.75 Fc=.5 Cje=5p Mje=.3333 Vje=.75 Tr=10n Tf=1.661n VCEO=45V ICrating=150M MFG=Toshiba)")
|
||||
NET_MODEL(".model 2SC1815 NPN(Is=2.04f Xti=3 Eg=1.11 Vaf=6 Bf=400 Ikf=20m Xtb=1.5 Br=3.377 Rc=1 Cjc=1p Mjc=.3333 Vjc=.75 Fc=.5 Cje=25p Mje=.3333 Vje=.75 Tr=450n Tf=20n Itf=0 Vtf=0 Xtf=0 VCEO=45V ICrating=150M MFG=Toshiba)")
|
||||
|
||||
NET_MODEL(".model 2N3643 NPN(IS=14.34E-15 ISE=14.34E-15 ISC=0 XTI=3 BF=255.9 BR=6.092 IKF=0.2847 IKR=0 XTB=1.5 VAF=74.03 VAR=28 VJE=0.65 VJC=0.65 RE=0.1 RC=1 RB=10 CJE=22.01E-12 CJC=7.306E-12 XCJC=0.75 FC=0.5 NF=1 NR=1 NE=1.307 NC=2 MJE=0.377 MJC=0.3416 TF=411.1E-12 TR=46.91E-9 ITF=0.6 VTF=1.7 XTF=3 EG=1.11 KF=0 AF=1 VCEO=30 ICRATING=500m MFG=NSC)")
|
||||
NET_MODEL(".model 2N3645 PNP(IS=650.6E-18 ISE=54.81E-15 ISC=0 XTI=3 BF=231.7 BR=3.563 IKF=1.079 IKR=0 XTB=1.5 VAF=115.7 VAR=35 VJE=0.65 VJC=0.65 RE=0.15 RC=0.715 RB=10 CJE=19.82E-12 CJC=14.76E-12 XCJC=0.75 FC=0.5 NF=1 NR=1 NE=1.829 NC=2 MJE=0.3357 MJC=0.5383 TF=603.7E-12 TR=111.3E-9 ITF=0.65 VTF=5 XTF=1.7 EG=1.11 KF=0 AF=1 VCEO=60 ICRATING=500m MFG=NSC)")
|
||||
// 3644 = 3645 Difference between 3644 and 3645 is voltage rating. 3644: VCBO=45, 3645: VCBO=60
|
||||
NET_MODEL(".model 2N3644 PNP(IS=650.6E-18 ISE=54.81E-15 ISC=0 XTI=3 BF=231.7 BR=3.563 IKF=1.079 IKR=0 XTB=1.5 VAF=115.7 VAR=35 VJE=0.65 VJC=0.65 RE=0.15 RC=0.715 RB=10 CJE=19.82E-12 CJC=14.76E-12 XCJC=0.75 FC=0.5 NF=1 NR=1 NE=1.829 NC=2 MJE=0.3357 MJC=0.5383 TF=603.7E-12 TR=111.3E-9 ITF=0.65 VTF=5 XTF=1.7 EG=1.11 KF=0 AF=1 VCEO=60 ICRATING=500m MFG=NSC)")
|
||||
NET_MODEL(".model BC817-25 NPN(IS=9.198E-14 NF=1.003 ISE=4.468E-16 NE=1.65 BF=338.8 IKF=0.4913 VAF=107.9 NR=1.002 ISC=5.109E-15 NC=1.071 BR=29.48 IKR=0.193 VAR=25 RB=1 IRB=1000 RBM=1 RE=0.2126 RC=0.143 XTB=0 EG=1.11 XTI=3 CJE=3.825E-11 VJE=0.7004 MJE=0.364 TF=5.229E-10 XTF=219.7 VTF=3.502 ITF=7.257 PTF=0 CJC=1.27E-11 VJC=0.4431 MJC=0.3983 XCJC=0.4555 TR=7E-11 CJS=0 VJS=0.75 MJS=0.333 FC=0.905 Vceo=45 Icrating=500m mfg=Philips)")
|
||||
// 2N5190 = BC817-25
|
||||
NET_MODEL(".model 2N5190 NPN(IS=9.198E-14 NF=1.003 ISE=4.468E-16 NE=1.65 BF=338.8 IKF=0.4913 VAF=107.9 NR=1.002 ISC=5.109E-15 NC=1.071 BR=29.48 IKR=0.193 VAR=25 RB=1 IRB=1000 RBM=1 RE=0.2126 RC=0.143 XTB=0 EG=1.11 XTI=3 CJE=3.825E-11 VJE=0.7004 MJE=0.364 TF=5.229E-10 XTF=219.7 VTF=3.502 ITF=7.257 PTF=0 CJC=1.27E-11 VJC=0.4431 MJC=0.3983 XCJC=0.4555 TR=7E-11 CJS=0 VJS=0.75 MJS=0.333 FC=0.905 Vceo=45 Icrating=500m mfg=Philips)")
|
||||
NET_MODEL(".model 2SC945 NPN(IS=3.577E-14 BF=2.382E+02 NF=1.01 VAF=1.206E+02 IKF=3.332E-01 ISE=3.038E-16 NE=1.205 BR=1.289E+01 NR=1.015 VAR=1.533E+01 IKR=2.037E-01 ISC=3.972E-14 NC=1.115 RB=3.680E+01 IRB=1.004E-04 RBM=1 RE=8.338E-01 RC=1.557E+00 CJE=1.877E-11 VJE=7.211E-01 MJE=3.486E-01 TF=4.149E-10 XTF=1.000E+02 VTF=9.956 ITF=5.118E-01 PTF=0 CJC=6.876p VJC=3.645E-01 MJC=3.074E-01 TR=5.145E-08 XTB=1.5 EG=1.11 XTI=3 FC=0.5 Vceo=50 Icrating=100m MFG=NEC)")
|
||||
|
||||
NET_MODEL(".model BC237B NPN(IS=1.8E-14 ISE=5.0E-14 ISC=1.72E-13 XTI=3 BF=400 BR=35.5 IKF=0.14 IKR=0.03 XTB=1.5 VAF=80 VAR=12.5 VJE=0.58 VJC=0.54 RE=0.6 RC=0.25 RB=0.56 CJE=13E-12 CJC=4E-12 XCJC=0.75 FC=0.5 NF=0.9955 NR=1.005 NE=1.46 NC=1.27 MJE=0.33 MJC=0.33 TF=0.64E-9 TR=50.72E-9 EG=1.11 KF=0 AF=1 VCEO=45V ICRATING=100M MFG=ZETEX)")
|
||||
NET_MODEL(".model BC556B PNP(IS=3.83E-14 NF=1.008 ISE=1.22E-14 NE=1.528 BF=344.4 IKF=0.08039 VAF=21.11 NR=1.005 ISC=2.85E-13 NC=1.28 BR=14.84 IKR=0.047 VAR=32.02 RB=1 IRB=1.00E-06 RBM=1 RE=0.6202 RC=0.5713 XTB=0 EG=1.11 XTI=3 CJE=1.23E-11 VJE=0.6106 MJE=0.378 TF=5.60E-10 XTF=3.414 VTF=5.23 ITF=0.1483 PTF=0 CJC=1.08E-11 VJC=0.1022 MJC=0.3563 XCJC=0.6288 TR=1.00E-32 CJS=0 VJS=0.75 MJS=0.333 FC=0.8027 Vceo=65 Icrating=100m mfg=Philips)")
|
||||
NET_MODEL(".model BC817-25 NPN(IS=9.198E-14 NF=1.003 ISE=4.468E-16 NE=1.65 BF=338.8 IKF=0.4913 VAF=107.9 NR=1.002 ISC=5.109E-15 NC=1.071 BR=29.48 IKR=0.193 VAR=25 RB=1 IRB=1000 RBM=1 RE=0.2126 RC=0.143 XTB=0 EG=1.11 XTI=3 CJE=3.825E-11 VJE=0.7004 MJE=0.364 TF=5.229E-10 XTF=219.7 VTF=3.502 ITF=7.257 PTF=0 CJC=1.27E-11 VJC=0.4431 MJC=0.3983 XCJC=0.4555 TR=7E-11 CJS=0 VJS=0.75 MJS=0.333 FC=0.905 Vceo=45 Icrating=500m mfg=Philips)")
|
||||
NETLIST_END()
|
||||
|
||||
|
||||
|
@ -11,6 +11,7 @@
|
||||
|
||||
#include "../nl_setup.h"
|
||||
#include "../nl_base.h"
|
||||
#include "../nl_factory.h"
|
||||
#include "../analog/nld_twoterm.h"
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
@ -417,6 +418,45 @@ private:
|
||||
bool m_is_timestep;
|
||||
};
|
||||
|
||||
|
||||
class factory_lib_entry_t : public base_factory_t
|
||||
{
|
||||
P_PREVENT_COPYING(factory_lib_entry_t)
|
||||
public:
|
||||
|
||||
ATTR_COLD factory_lib_entry_t(setup_t &setup, const pstring &name, const pstring &classname,
|
||||
const pstring &def_param)
|
||||
: base_factory_t(name, classname, def_param), m_setup(setup) { }
|
||||
|
||||
class dummy : public device_t
|
||||
{
|
||||
public:
|
||||
dummy(const pstring &dev_name) : device_t(), m_dev_name(dev_name) { }
|
||||
protected:
|
||||
virtual void init(netlist_t &anetlist, const pstring &aname)
|
||||
{
|
||||
anetlist.setup().namespace_push(aname);
|
||||
anetlist.setup().include(m_dev_name);
|
||||
anetlist.setup().namespace_pop();
|
||||
}
|
||||
void start() { }
|
||||
void reset() { }
|
||||
void update() { }
|
||||
|
||||
pstring m_dev_name;
|
||||
};
|
||||
|
||||
ATTR_COLD device_t *Create()
|
||||
{
|
||||
device_t *r = palloc(dummy(this->name()));
|
||||
return r;
|
||||
}
|
||||
|
||||
private:
|
||||
setup_t &m_setup;
|
||||
};
|
||||
|
||||
|
||||
NETLIB_NAMESPACE_DEVICES_END()
|
||||
|
||||
#endif /* NLD_SYSTEM_H_ */
|
||||
|
@ -56,6 +56,7 @@ bool parser_t::parse(const char *buf, const pstring nlname)
|
||||
m_tok_NET_MODEL = register_token("NET_MODEL");
|
||||
m_tok_INCLUDE = register_token("INCLUDE");
|
||||
m_tok_LOCAL_SOURCE = register_token("LOCAL_SOURCE");
|
||||
m_tok_LOCAL_LIB_ENTRY = register_token("LOCAL_LIB_ENTRY");
|
||||
m_tok_SUBMODEL = register_token("SUBMODEL");
|
||||
m_tok_NETLIST_START = register_token("NETLIST_START");
|
||||
m_tok_NETLIST_END = register_token("NETLIST_END");
|
||||
@ -63,6 +64,7 @@ bool parser_t::parse(const char *buf, const pstring nlname)
|
||||
m_tok_TRUTHTABLE_END = register_token("TRUTHTABLE_END");
|
||||
m_tok_TT_HEAD = register_token("TT_HEAD");
|
||||
m_tok_TT_LINE = register_token("TT_LINE");
|
||||
m_tok_TT_FAMILY = register_token("TT_FAMILY");
|
||||
|
||||
bool in_nl = false;
|
||||
|
||||
@ -134,6 +136,11 @@ void parser_t::parse_netlist(ATTR_UNUSED const pstring &nlname)
|
||||
net_local_source();
|
||||
else if (token.is(m_tok_TRUTHTABLE_START))
|
||||
net_truthtable_start();
|
||||
else if (token.is(m_tok_LOCAL_LIB_ENTRY))
|
||||
{
|
||||
m_setup.register_lib_entry(get_identifier());
|
||||
require_token(m_tok_param_right);
|
||||
}
|
||||
else if (token.is(m_tok_NETLIST_END))
|
||||
{
|
||||
netdev_netlist_end();
|
||||
@ -176,6 +183,12 @@ void parser_t::net_truthtable_start()
|
||||
ttd->m_desc.add(get_string());
|
||||
require_token(m_tok_param_right);
|
||||
}
|
||||
else if (token.is(m_tok_TT_FAMILY))
|
||||
{
|
||||
require_token(m_tok_param_left);
|
||||
ttd->m_family = netlist::logic_family_desc_t::from_model(get_string());
|
||||
require_token(m_tok_param_right);
|
||||
}
|
||||
else
|
||||
{
|
||||
require_token(token, m_tok_TRUTHTABLE_END);
|
||||
@ -307,55 +320,65 @@ void parser_t::netdev_param()
|
||||
|
||||
void parser_t::device(const pstring &dev_type)
|
||||
{
|
||||
pstring devname;
|
||||
base_factory_t *f = m_setup.factory().factory_by_name(dev_type, m_setup);
|
||||
device_t *dev;
|
||||
pstring_list_t termlist = f->term_param_list();
|
||||
pstring_list_t def_params = f->def_params();
|
||||
|
||||
std::size_t cnt;
|
||||
|
||||
devname = get_identifier();
|
||||
|
||||
dev = f->Create();
|
||||
m_setup.register_dev(dev, devname);
|
||||
|
||||
NL_VERBOSE_OUT(("Parser: IC: %s\n", devname.cstr()));
|
||||
|
||||
cnt = 0;
|
||||
while (cnt < def_params.size())
|
||||
if (m_setup.is_library_item(dev_type))
|
||||
{
|
||||
pstring paramfq = devname + "." + def_params[cnt];
|
||||
pstring devname = get_identifier();
|
||||
m_setup.namespace_push(devname);
|
||||
m_setup.include(dev_type);
|
||||
m_setup.namespace_pop();
|
||||
require_token(m_tok_param_right);
|
||||
}
|
||||
else
|
||||
{
|
||||
base_factory_t *f = m_setup.factory().factory_by_name(dev_type, m_setup);
|
||||
device_t *dev;
|
||||
pstring_list_t termlist = f->term_param_list();
|
||||
pstring_list_t def_params = f->def_params();
|
||||
|
||||
std::size_t cnt;
|
||||
|
||||
pstring devname = get_identifier();
|
||||
|
||||
dev = f->Create();
|
||||
m_setup.register_dev(dev, devname);
|
||||
|
||||
NL_VERBOSE_OUT(("Parser: IC: %s\n", devname.cstr()));
|
||||
|
||||
cnt = 0;
|
||||
while (cnt < def_params.size())
|
||||
{
|
||||
pstring paramfq = devname + "." + def_params[cnt];
|
||||
|
||||
NL_VERBOSE_OUT(("Defparam: %s\n", paramfq.cstr()));
|
||||
require_token(m_tok_comma);
|
||||
token_t tok = get_token();
|
||||
if (tok.is_type(STRING))
|
||||
{
|
||||
m_setup.register_param(paramfq, tok.str());
|
||||
}
|
||||
else
|
||||
{
|
||||
nl_double val = eval_param(tok);
|
||||
m_setup.register_param(paramfq, val);
|
||||
}
|
||||
cnt++;
|
||||
}
|
||||
|
||||
NL_VERBOSE_OUT(("Defparam: %s\n", paramfq.cstr()));
|
||||
require_token(m_tok_comma);
|
||||
token_t tok = get_token();
|
||||
if (tok.is_type(STRING))
|
||||
cnt = 0;
|
||||
while (tok.is(m_tok_comma) && cnt < termlist.size())
|
||||
{
|
||||
m_setup.register_param(paramfq, tok.str());
|
||||
pstring output_name = get_identifier();
|
||||
|
||||
m_setup.register_link(devname + "." + termlist[cnt], output_name);
|
||||
|
||||
cnt++;
|
||||
tok = get_token();
|
||||
}
|
||||
else
|
||||
{
|
||||
nl_double val = eval_param(tok);
|
||||
m_setup.register_param(paramfq, val);
|
||||
}
|
||||
cnt++;
|
||||
if (cnt != termlist.size())
|
||||
m_setup.netlist().error("netlist: input count mismatch for %s - expected %" SIZETFMT " found %" SIZETFMT "\n", devname.cstr(), termlist.size(), cnt);
|
||||
require_token(tok, m_tok_param_right);
|
||||
}
|
||||
|
||||
token_t tok = get_token();
|
||||
cnt = 0;
|
||||
while (tok.is(m_tok_comma) && cnt < termlist.size())
|
||||
{
|
||||
pstring output_name = get_identifier();
|
||||
|
||||
m_setup.register_link(devname + "." + termlist[cnt], output_name);
|
||||
|
||||
cnt++;
|
||||
tok = get_token();
|
||||
}
|
||||
if (cnt != termlist.size())
|
||||
m_setup.netlist().error("netlist: input count mismatch for %s - expected %" SIZETFMT " found %" SIZETFMT "\n", devname.cstr(), termlist.size(), cnt);
|
||||
require_token(tok, m_tok_param_right);
|
||||
}
|
||||
|
||||
|
||||
|
@ -59,10 +59,12 @@ namespace netlist
|
||||
token_id_t m_tok_SUBMODEL;
|
||||
token_id_t m_tok_INCLUDE;
|
||||
token_id_t m_tok_LOCAL_SOURCE;
|
||||
token_id_t m_tok_LOCAL_LIB_ENTRY;
|
||||
token_id_t m_tok_TRUTHTABLE_START;
|
||||
token_id_t m_tok_TRUTHTABLE_END;
|
||||
token_id_t m_tok_TT_HEAD;
|
||||
token_id_t m_tok_TT_LINE;
|
||||
token_id_t m_tok_TT_FAMILY;
|
||||
|
||||
setup_t &m_setup;
|
||||
|
||||
|
@ -102,12 +102,30 @@ device_t *setup_t::register_dev(device_t *dev, const pstring &name)
|
||||
return dev;
|
||||
}
|
||||
|
||||
void setup_t::register_lib_entry(const pstring &name)
|
||||
{
|
||||
if (m_lib.contains(name))
|
||||
netlist().warning("Lib entry collection already contains %s. IGNORED", name.cstr());
|
||||
else
|
||||
m_lib.add(name);
|
||||
}
|
||||
|
||||
device_t *setup_t::register_dev(const pstring &classname, const pstring &name)
|
||||
{
|
||||
device_t *dev = factory().new_device_by_classname(classname);
|
||||
if (dev == NULL)
|
||||
netlist().error("Class %s not found!\n", classname.cstr());
|
||||
return register_dev(dev, name);
|
||||
if (m_lib.contains(classname))
|
||||
{
|
||||
namespace_push(name);
|
||||
include(classname);
|
||||
namespace_pop();
|
||||
return NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
device_t *dev = factory().new_device_by_classname(classname);
|
||||
if (dev == NULL)
|
||||
netlist().error("Class %s not found!\n", classname.cstr());
|
||||
return register_dev(dev, name);
|
||||
}
|
||||
}
|
||||
|
||||
void setup_t::remove_dev(const pstring &name)
|
||||
|
@ -49,23 +49,27 @@
|
||||
|
||||
#define NETLIST_NAME(_name) netlist ## _ ## _name
|
||||
|
||||
#define NETLIST_EXTERNAL(_name) \
|
||||
#define NETLIST_EXTERNAL(_name) \
|
||||
ATTR_COLD void NETLIST_NAME(_name)(netlist::setup_t &setup);
|
||||
|
||||
#define NETLIST_START(_name) \
|
||||
ATTR_COLD void NETLIST_NAME(_name)(netlist::setup_t &setup) \
|
||||
#define NETLIST_START(_name) \
|
||||
ATTR_COLD void NETLIST_NAME(_name)(netlist::setup_t &setup) \
|
||||
{
|
||||
#define NETLIST_END() }
|
||||
|
||||
#define LOCAL_SOURCE(_name) \
|
||||
#define LOCAL_SOURCE(_name) \
|
||||
setup.register_source(palloc(netlist::source_proc_t(# _name, &NETLIST_NAME(_name))));
|
||||
|
||||
#define INCLUDE(_name) \
|
||||
#define LOCAL_LIB_ENTRY(_name) \
|
||||
LOCAL_SOURCE(_name) \
|
||||
setup.register_lib_entry(# _name);
|
||||
|
||||
#define INCLUDE(_name) \
|
||||
setup.include(# _name);
|
||||
|
||||
#define SUBMODEL(_model, _name) \
|
||||
setup.namespace_push(# _name); \
|
||||
NETLIST_NAME(_model)(setup); \
|
||||
#define SUBMODEL(_model, _name) \
|
||||
setup.namespace_push(# _name); \
|
||||
NETLIST_NAME(_model)(setup); \
|
||||
setup.namespace_pop();
|
||||
|
||||
// ----------------------------------------------------------------------------------------
|
||||
@ -145,6 +149,8 @@ namespace netlist
|
||||
device_t *register_dev(const pstring &classname, const pstring &name);
|
||||
void remove_dev(const pstring &name);
|
||||
|
||||
void register_lib_entry(const pstring &name);
|
||||
|
||||
void register_model(const pstring &model);
|
||||
void register_alias(const pstring &alias, const pstring &out);
|
||||
void register_alias_nofqn(const pstring &alias, const pstring &out);
|
||||
@ -186,6 +192,8 @@ namespace netlist
|
||||
factory_list_t &factory() { return *m_factory; }
|
||||
const factory_list_t &factory() const { return *m_factory; }
|
||||
|
||||
bool is_library_item(const pstring &name) const { return m_lib.contains(name); }
|
||||
|
||||
/* not ideal, but needed for save_state */
|
||||
tagmap_terminal_t m_terminals;
|
||||
|
||||
@ -215,6 +223,7 @@ namespace netlist
|
||||
|
||||
pstack_t<pstring> m_stack;
|
||||
source_t::list_t m_sources;
|
||||
plist_t<pstring> m_lib;
|
||||
|
||||
|
||||
void connect_terminals(core_terminal_t &in, core_terminal_t &out);
|
||||
|
@ -415,22 +415,8 @@ NETLIST_START(kidniki_interface)
|
||||
PARAM(Solver.PARALLEL, 0)
|
||||
#endif
|
||||
|
||||
NET_MODEL(".model 2SC945 NPN(IS=3.577E-14 BF=2.382E+02 NF=1.01 VAF=1.206E+02 IKF=3.332E-01 ISE=3.038E-16 NE=1.205 BR=1.289E+01 NR=1.015 VAR=1.533E+01 IKR=2.037E-01 ISC=3.972E-14 NC=1.115 RB=3.680E+01 IRB=1.004E-04 RBM=1 RE=8.338E-01 RC=1.557E+00 CJE=1.877E-11 VJE=7.211E-01 MJE=3.486E-01 TF=4.149E-10 XTF=1.000E+02 VTF=9.956 ITF=5.118E-01 PTF=0 CJC=6.876p VJC=3.645E-01 MJC=3.074E-01 TR=5.145E-08 XTB=1.5 EG=1.11 XTI=3 FC=0.5 Vceo=50 Icrating=100m MFG=NEC)")
|
||||
// Equivalent to 1N914
|
||||
NET_MODEL(".model 1S1588 D(Is=2.52n Rs=.568 N=1.752 Cjo=4p M=.4 tt=20n Iave=200m Vpk=75)")
|
||||
|
||||
LOCAL_SOURCE(kidniki_schematics)
|
||||
|
||||
/*
|
||||
* Workaround: The simplified opamp model does not correctly
|
||||
* model the internals of the inputs.
|
||||
*/
|
||||
|
||||
ANALOG_INPUT(VWORKAROUND, 2.061)
|
||||
RES(RWORKAROUND, RES_K(27))
|
||||
NET_C(VWORKAROUND.Q, RWORKAROUND.1)
|
||||
NET_C(XU1.6, RWORKAROUND.2)
|
||||
|
||||
ANALOG_INPUT(I_V5, 5)
|
||||
//ANALOG_INPUT(I_V0, 0)
|
||||
ALIAS(I_V0.Q, GND)
|
||||
@ -481,16 +467,6 @@ NETLIST_START(kidniki_interface)
|
||||
|
||||
INCLUDE(kidniki_schematics)
|
||||
|
||||
CAP(C26, CAP_U(1))
|
||||
RES(R25, 560)
|
||||
RES(R26, RES_K(47))
|
||||
CAP(C29, CAP_U(0.01))
|
||||
|
||||
NET_C(RV1.2, C26.1)
|
||||
NET_C(C26.2, R25.1)
|
||||
NET_C(R25.2, R26.1, C29.1)
|
||||
NET_C(R26.2, C29.2, GND)
|
||||
|
||||
#if (USE_FRONTIERS)
|
||||
OPTIMIZE_FRONTIER(C63.2, RES_K(27), RES_K(1))
|
||||
OPTIMIZE_FRONTIER(R31.2, RES_K(5.1), 50)
|
||||
|
@ -9,45 +9,35 @@
|
||||
#define USE_FIXED_STV 0
|
||||
#endif
|
||||
|
||||
NETLIST_EXTERNAL(LM324_DIP)
|
||||
NETLIST_EXTERNAL(LM358_DIP)
|
||||
/* ----------------------------------------------------------------------------
|
||||
* Library section header START
|
||||
* ---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef __PLIB_PREPROCESSOR__
|
||||
#define MC14584B_GATE(_name) \
|
||||
|
||||
#define MC14584B_GATE(_name) \
|
||||
NET_REGISTER_DEV_X(MC14584B_GATE, _name)
|
||||
|
||||
#define MC14584B_DIP(_name) \
|
||||
NET_REGISTER_DEV_X(MC14584B_DIP, _name)
|
||||
|
||||
#define LM324_DIP(_name) \
|
||||
NET_REGISTER_DEV_X(LM324_DIP, _name)
|
||||
|
||||
#define LM358_DIP(_name) \
|
||||
NET_REGISTER_DEV_X(LM358_DIP, _name)
|
||||
|
||||
NETLIST_EXTERNAL(kidniki_lib)
|
||||
|
||||
#endif
|
||||
|
||||
NETLIST_START(kidniki_lib)
|
||||
TRUTHTABLE_START(MC14584B_GATE, 1, 1, 0, "A,B")
|
||||
TT_HEAD(" A | Q ")
|
||||
TT_LINE(" 0 | 1 |100")
|
||||
TT_LINE(" 1 | 0 |100")
|
||||
TT_FAMILY(".model MC14584B FAMILY(IVL=2.1 IVH=2.7 OVL=0.05 OVH=4.95 ORL=10.0 ORH 10.0)")
|
||||
TRUTHTABLE_END()
|
||||
NETLIST_END()
|
||||
/* ----------------------------------------------------------------------------
|
||||
* Library section header END
|
||||
* ---------------------------------------------------------------------------*/
|
||||
|
||||
NETLIST_START(MC14584B_DIP)
|
||||
MC14584B_GATE(s1)
|
||||
MC14584B_GATE(s2)
|
||||
MC14584B_GATE(s3)
|
||||
MC14584B_GATE(s4)
|
||||
MC14584B_GATE(s5)
|
||||
MC14584B_GATE(s6)
|
||||
|
||||
ALIAS( 1, s1.A)
|
||||
ALIAS( 2, s1.Q)
|
||||
ALIAS( 3, s2.A)
|
||||
ALIAS( 4, s2.Q)
|
||||
ALIAS( 5, s3.A)
|
||||
ALIAS( 6, s3.Q)
|
||||
|
||||
ALIAS( 8, s4.Q)
|
||||
ALIAS( 9, s4.A)
|
||||
ALIAS(10, s5.Q)
|
||||
ALIAS(11, s5.A)
|
||||
ALIAS(12, s6.Q)
|
||||
ALIAS(13, s6.A)
|
||||
NETLIST_END()
|
||||
/* ----------------------------------------------------------------------------
|
||||
* Kidniki schematics
|
||||
* ---------------------------------------------------------------------------*/
|
||||
|
||||
NETLIST_START(kidniki_schematics)
|
||||
// EESCHEMA NETLIST VERSION 1.1 (SPICE FORMAT) CREATION DATE: SAT 06 JUN 2015 01:06:26 PM CEST
|
||||
@ -58,9 +48,18 @@ NETLIST_START(kidniki_schematics)
|
||||
// .END
|
||||
|
||||
LOCAL_SOURCE(kidniki_lib)
|
||||
|
||||
INCLUDE(kidniki_lib)
|
||||
|
||||
/*
|
||||
* Workaround: The simplified opamp model does not correctly
|
||||
* model the internals of the inputs.
|
||||
*/
|
||||
|
||||
ANALOG_INPUT(VWORKAROUND, 2.061)
|
||||
RES(RWORKAROUND, RES_K(27))
|
||||
NET_C(VWORKAROUND.Q, RWORKAROUND.1)
|
||||
NET_C(XU1.6, RWORKAROUND.2)
|
||||
|
||||
CAP(C200, CAP_N(100))
|
||||
CAP(C28, CAP_U(1))
|
||||
CAP(C31, CAP_N(470))
|
||||
@ -118,10 +117,12 @@ NETLIST_START(kidniki_schematics)
|
||||
QBJT_EB(Q7, "2SC945")
|
||||
QBJT_EB(Q9, "2SC945")
|
||||
|
||||
SUBMODEL(LM324_DIP,XU1)
|
||||
SUBMODEL(LM358_DIP,XU2)
|
||||
LM324_DIP(XU1)
|
||||
LM358_DIP(XU2)
|
||||
//SUBMODEL(LM324_DIP,XU1)
|
||||
//SUBMODEL(LM358_DIP,XU2)
|
||||
|
||||
SUBMODEL(MC14584B_DIP, XU3)
|
||||
MC14584B_DIP(XU3)
|
||||
|
||||
RES(R100, RES_K(560))
|
||||
RES(R101, RES_K(150))
|
||||
@ -309,8 +310,25 @@ NETLIST_START(kidniki_schematics)
|
||||
NET_C(I_MSM3K0.Q, R200.2)
|
||||
NET_C(I_MSM2K0.Q, R201.2)
|
||||
NET_C(R200.1, R201.1, C200.1)
|
||||
|
||||
/* Amplifier stage */
|
||||
|
||||
CAP(C26, CAP_U(1))
|
||||
RES(R25, 560)
|
||||
RES(R26, RES_K(47))
|
||||
CAP(C29, CAP_U(0.01))
|
||||
|
||||
NET_C(RV1.2, C26.1)
|
||||
NET_C(C26.2, R25.1)
|
||||
NET_C(R25.2, R26.1, C29.1)
|
||||
NET_C(R26.2, C29.2, GND)
|
||||
|
||||
NETLIST_END()
|
||||
|
||||
/* ----------------------------------------------------------------------------
|
||||
* Library section body START
|
||||
* ---------------------------------------------------------------------------*/
|
||||
|
||||
NETLIST_START(opamp)
|
||||
|
||||
/* Opamp model from
|
||||
@ -426,3 +444,41 @@ NETLIST_START(LM358_DIP)
|
||||
ALIAS( 4, op1.GND)
|
||||
ALIAS( 8, op1.VCC)
|
||||
NETLIST_END()
|
||||
|
||||
NETLIST_START(MC14584B_DIP)
|
||||
MC14584B_GATE(s1)
|
||||
MC14584B_GATE(s2)
|
||||
MC14584B_GATE(s3)
|
||||
MC14584B_GATE(s4)
|
||||
MC14584B_GATE(s5)
|
||||
MC14584B_GATE(s6)
|
||||
|
||||
ALIAS( 1, s1.A)
|
||||
ALIAS( 2, s1.Q)
|
||||
ALIAS( 3, s2.A)
|
||||
ALIAS( 4, s2.Q)
|
||||
ALIAS( 5, s3.A)
|
||||
ALIAS( 6, s3.Q)
|
||||
|
||||
ALIAS( 8, s4.Q)
|
||||
ALIAS( 9, s4.A)
|
||||
ALIAS(10, s5.Q)
|
||||
ALIAS(11, s5.A)
|
||||
ALIAS(12, s6.Q)
|
||||
ALIAS(13, s6.A)
|
||||
NETLIST_END()
|
||||
|
||||
NETLIST_START(kidniki_lib)
|
||||
TRUTHTABLE_START(MC14584B_GATE, 1, 1, 0, "")
|
||||
TT_HEAD(" A | Q ")
|
||||
TT_LINE(" 0 | 1 |100")
|
||||
TT_LINE(" 1 | 0 |100")
|
||||
TT_FAMILY(".model MC14584B FAMILY(IVL=2.1 IVH=2.7 OVL=0.05 OVH=4.95 ORL=10.0 ORH 10.0)")
|
||||
TRUTHTABLE_END()
|
||||
|
||||
LOCAL_LIB_ENTRY(LM324_DIP)
|
||||
LOCAL_LIB_ENTRY(LM358_DIP)
|
||||
LOCAL_LIB_ENTRY(MC14584B_DIP)
|
||||
|
||||
NETLIST_END()
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user