summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author couriersud <couriersud@arcor.de>2015-07-22 23:13:01 +0200
committer couriersud <couriersud@arcor.de>2015-07-23 22:39:39 +0200
commitc2a192ec92c8dc1c055e42a7075326332f2685fe (patch)
tree7e7af18b7b7679beb983fd602293b36ad9e0ef70
parent907a751fc49cba393d4f69cf7f578436730deeee (diff)
Consolidate the scattered model parsing code. Now models support
recursive models,e.g. DIODE("1N914(IS=1e-15)"). Removed ".model" from model definitions. (nw)
-rw-r--r--nl_examples/congo_bongo.c14
-rw-r--r--nl_examples/kidniki.c4
-rw-r--r--nl_examples/msx_mixer_stage.c2
-rw-r--r--src/emu/netlist/analog/nld_bjt.c16
-rw-r--r--src/emu/netlist/analog/nld_opamps.c4
-rw-r--r--src/emu/netlist/analog/nld_twoterm.c4
-rw-r--r--src/emu/netlist/devices/net_lib.c48
-rw-r--r--src/emu/netlist/devices/nld_system.c4
-rw-r--r--src/emu/netlist/devices/nld_truthtable.h2
-rw-r--r--src/emu/netlist/macro/nlm_opamp.c4
-rw-r--r--src/emu/netlist/nl_base.c55
-rw-r--r--src/emu/netlist/nl_base.h23
-rw-r--r--src/emu/netlist/nl_parser.c2
-rw-r--r--src/emu/netlist/nl_setup.c190
-rw-r--r--src/emu/netlist/nl_setup.h14
-rw-r--r--src/emu/netlist/plib/plists.h2
-rw-r--r--src/emu/netlist/plib/pstring.h3
-rw-r--r--src/mame/audio/irem.c2
-rw-r--r--src/mame/audio/nl_kidniki.c2
19 files changed, 219 insertions, 176 deletions
diff --git a/nl_examples/congo_bongo.c b/nl_examples/congo_bongo.c
index bb7520b65db..25f8258f290 100644
--- a/nl_examples/congo_bongo.c
+++ b/nl_examples/congo_bongo.c
@@ -70,16 +70,18 @@ NETLIST_START(dummy)
NET_C(RO.2, GND)
// FIXME: Same as 1N4148
- NET_MODEL(".model 1S2075 D(Is=2.52n Rs=.568 N=1.752 Cjo=4p M=.4 tt=20n Iave=200m Vpk=75)")
- NET_MODEL(".model 2SC1941 NPN(IS=46.416f BF=210 NF=1.0022 VAF=600 IKF=500m ISE=60f NE=1.5 BR=2.0122 NR=1.0022 VAR=10G IKR=10G ISC=300p NC=2 RB=13.22 IRB=10G RBM=13.22 RE=100m RC=790m CJE=26.52p VJE=900m MJE=518m TF=1.25n XTF=10 VTF=10 ITF=500m PTF=0 CJC=4.89p VJC=750m MJC=237m XCJC=500m TR=100n CJS=0 VJS=750m MJS=500m XTB=1.5 EG=1.11 XTI=3 KF=0 AF=1 FC=500m)")
+ NET_MODEL("1S2075 D(Is=2.52n Rs=.568 N=1.752 Cjo=4p M=.4 tt=20n Iave=200m Vpk=75)")
+ NET_MODEL("2SC1941 NPN(IS=46.416f BF=210 NF=1.0022 VAF=600 IKF=500m ISE=60f NE=1.5 BR=2.0122 NR=1.0022 VAR=10G IKR=10G ISC=300p NC=2 RB=13.22 IRB=10G RBM=13.22 RE=100m RC=790m CJE=26.52p VJE=900m MJE=518m TF=1.25n XTF=10 VTF=10 ITF=500m PTF=0 CJC=4.89p VJC=750m MJC=237m XCJC=500m TR=100n CJS=0 VJS=750m MJS=500m XTB=1.5 EG=1.11 XTI=3 KF=0 AF=1 FC=500m)")
INCLUDE(CongoBongo_schematics)
/* The opamp actually has an FPF of about 500k. This doesn't work here and causes oscillations.
* FPF here therefore about half the Solver clock.
*/
- PARAM(XU16.B.MODEL, "MB3614_SLOW")
- PARAM(XU17.C.MODEL, "MB3614_SLOW")
+ PARAM(XU16.B.MODEL, "MB3614(UGF=11k)")
+ PARAM(XU17.C.MODEL, "MB3614(UGF=11k)")
+ //PARAM(XU16.B.MODEL, "MB3614_SLOW")
+ //PARAM(XU17.C.MODEL, "MB3614_SLOW")
OPTIMIZE_FRONTIER(C51.1, RES_K(20), 50)
OPTIMIZE_FRONTIER(R77.2, RES_K(20), 50)
@@ -390,8 +392,8 @@ NETLIST_START(opamp_mod)
NET_C(RP1.1, G1.OP)
NET_C(CP1.1, RP1.1)
- DIODE(DP,".model tt D(IS=1e-15 N=1)")
- DIODE(DN,".model tt D(IS=1e-15 N=1)")
+ DIODE(DP,"D(IS=1e-15 N=1)")
+ DIODE(DN,"D(IS=1e-15 N=1)")
#if 1
NET_C(DP.K, fUH.Q)
NET_C(fUL.Q, DN.A)
diff --git a/nl_examples/kidniki.c b/nl_examples/kidniki.c
index dfe1b057e5e..9e2b0052dae 100644
--- a/nl_examples/kidniki.c
+++ b/nl_examples/kidniki.c
@@ -20,8 +20,8 @@ NETLIST_START(dummy)
PARAM(Solver.LTE, 1e-1)
#endif
//FIXME proper models!
- NET_MODEL(".model 2SC945 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 1S1588 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("2SC945 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("1S1588 D(Is=2.52n Rs=.568 N=1.752 Cjo=4p M=.4 tt=20n Iave=200m Vpk=75 mfg=OnSemi type=silicon)")
//NET_C(R44.1, XU1.7)
diff --git a/nl_examples/msx_mixer_stage.c b/nl_examples/msx_mixer_stage.c
index 779280fcbc9..ddc1cd70cfd 100644
--- a/nl_examples/msx_mixer_stage.c
+++ b/nl_examples/msx_mixer_stage.c
@@ -24,7 +24,7 @@ NETLIST_START(msx)
ANALOG_INPUT(SOUND, 5)
ANALOG_INPUT(SND, 5)
- NET_MODEL(".model ss9014 NPN(is=2.87599e-14 bf=377.5 vaf=123 ikf=1.1841 ise=4.7863e-15 ne=1.5 br=4.79 var=11.29 ikr=0.275423 isc=1.44544e-14 nc=1.5 rb=200 irb=1e-5 rbm=10 re=0.56 rc=5 cje=1.7205e-11 vje=0.6905907 mje=0.3193434 tf=5.89463e-10 cjc=6.2956p vjc=0.4164212 mjc=0.2559546 xcjc=0.451391 xtb=1.8881 eg=1.2415 xti=3 fc=0.5 Vceo=45 Icrating=0.1 mfg=Fairchild)")
+ NET_MODEL("ss9014 NPN(is=2.87599e-14 bf=377.5 vaf=123 ikf=1.1841 ise=4.7863e-15 ne=1.5 br=4.79 var=11.29 ikr=0.275423 isc=1.44544e-14 nc=1.5 rb=200 irb=1e-5 rbm=10 re=0.56 rc=5 cje=1.7205e-11 vje=0.6905907 mje=0.3193434 tf=5.89463e-10 cjc=6.2956p vjc=0.4164212 mjc=0.2559546 xcjc=0.451391 xtb=1.8881 eg=1.2415 xti=3 fc=0.5 Vceo=45 Icrating=0.1 mfg=Fairchild)")
RES(R24, RES_K(51))
RES(R23, RES_K(5))
diff --git a/src/emu/netlist/analog/nld_bjt.c b/src/emu/netlist/analog/nld_bjt.c
index 14b832ba9b9..57c2d89c870 100644
--- a/src/emu/netlist/analog/nld_bjt.c
+++ b/src/emu/netlist/analog/nld_bjt.c
@@ -118,9 +118,9 @@ NETLIB_UPDATE(QBJT_switch)
NETLIB_UPDATE_PARAM(QBJT_switch)
{
- nl_double IS = m_model.model_value("IS", 1e-15);
- nl_double BF = m_model.model_value("BF", 100);
- nl_double NF = m_model.model_value("NF", 1);
+ nl_double IS = m_model.model_value("IS");
+ nl_double BF = m_model.model_value("BF");
+ nl_double NF = m_model.model_value("NF");
//nl_double VJE = m_model.dValue("VJE", 0.75);
set_qtype((m_model.model_type() == "NPN") ? BJT_NPN : BJT_PNP);
@@ -230,11 +230,11 @@ NETLIB_UPDATE_TERMINALS(QBJT_EB)
NETLIB_UPDATE_PARAM(QBJT_EB)
{
- nl_double IS = m_model.model_value("IS", 1e-15);
- nl_double BF = m_model.model_value("BF", 100);
- nl_double NF = m_model.model_value("NF", 1);
- nl_double BR = m_model.model_value("BR", 1);
- nl_double NR = m_model.model_value("NR", 1);
+ nl_double IS = m_model.model_value("IS");
+ nl_double BF = m_model.model_value("BF");
+ nl_double NF = m_model.model_value("NF");
+ nl_double BR = m_model.model_value("BR");
+ nl_double NR = m_model.model_value("NR");
//nl_double VJE = m_model.dValue("VJE", 0.75);
set_qtype((m_model.model_type() == "NPN") ? BJT_NPN : BJT_PNP);
diff --git a/src/emu/netlist/analog/nld_opamps.c b/src/emu/netlist/analog/nld_opamps.c
index 084e1970987..e54883151db 100644
--- a/src/emu/netlist/analog/nld_opamps.c
+++ b/src/emu/netlist/analog/nld_opamps.c
@@ -121,8 +121,8 @@ NETLIB_RESET(OPAMP)
m_EBUF.m_G.setTo(1.0);
m_G1.m_RI.setTo(m_model.model_value("RI"));
m_EBUF.m_RO.setTo(m_model.model_value("RO"));
- m_DP.m_model.setTo(".model tt D(IS=1e-15 N=1)");
- m_DN.m_model.setTo(".model tt D(IS=1e-15 N=1)");
+ m_DP.m_model.setTo("D(IS=1e-15 N=1)");
+ m_DN.m_model.setTo("D(IS=1e-15 N=1)");
double CP = m_model.model_value("DAB") / m_model.model_value("SLEW");
double RP = 0.5 / 3.1459 / CP / m_model.model_value("FPF");
diff --git a/src/emu/netlist/analog/nld_twoterm.c b/src/emu/netlist/analog/nld_twoterm.c
index be0925fc826..88f1cfaf257 100644
--- a/src/emu/netlist/analog/nld_twoterm.c
+++ b/src/emu/netlist/analog/nld_twoterm.c
@@ -273,8 +273,8 @@ NETLIB_START(D)
NETLIB_UPDATE_PARAM(D)
{
- nl_double Is = m_model.model_value("Is", 1e-15);
- nl_double n = m_model.model_value("N", 1);
+ nl_double Is = m_model.model_value("IS");
+ nl_double n = m_model.model_value("N");
m_D.set_param(Is, n, netlist().gmin());
}
diff --git a/src/emu/netlist/devices/net_lib.c b/src/emu/netlist/devices/net_lib.c
index 3d88895e279..89829620448 100644
--- a/src/emu/netlist/devices/net_lib.c
+++ b/src/emu/netlist/devices/net_lib.c
@@ -13,37 +13,45 @@
#include "../nl_factory.h"
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("D _(IS=1e-15 N=1)")
+
+ NET_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("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("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("1S1588 D(Is=2.52n Rs=.568 N=1.752 Cjo=4p M=.4 tt=20n Iave=200m Vpk=75)")
+ NET_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("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("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("LedWhite D(Is=0.27n Rs=5.65 N=6.79 Cjo=42p Iave=30m Vpk=5 type=LED)")
NETLIST_END()
NETLIST_START(bjt_models)
- 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("NPN _(IS=1e-15 BF=100 NF=1 BR=1 NR=1)")
+ NET_MODEL("PNP _(IS=1e-15 BF=100 NF=1 BR=1 NR=1)")
+
+ NET_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("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)")
+ NET_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("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("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)")
// 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("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("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)")
+ NET_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("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("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()
NETLIST_START(family_models)
- NET_MODEL(".model 74XXOC FAMILY(IVL=0.8 IVH=2.0 OVL=0.1 OVH=4.95 ORL=10.0 ORH=1.0e8)")
- NET_MODEL(".model CD4XXX FAMILY(TYPE=CD4XXX)")
+ NET_MODEL("FAMILY _(TYPE=CUSTOM IVL=0.8 IVH=2.0 OVL=0.1 OVH=4.0 ORL=1.0 ORH=130.0)")
+ NET_MODEL("OPAMP _()")
+
+ NET_MODEL("74XXOC FAMILY(IVL=0.8 IVH=2.0 OVL=0.1 OVH=4.95 ORL=10.0 ORH=1.0e8)")
+ NET_MODEL("CD4XXX FAMILY(TYPE=CD4XXX)")
NETLIST_END()
diff --git a/src/emu/netlist/devices/nld_system.c b/src/emu/netlist/devices/nld_system.c
index c4ecbaba454..a0c21ee6a2a 100644
--- a/src/emu/netlist/devices/nld_system.c
+++ b/src/emu/netlist/devices/nld_system.c
@@ -134,8 +134,8 @@ NETLIB_UPDATE(extclock)
NETLIB_START(logic_input)
{
/* make sure we get the family first */
- register_param("FAMILY", m_FAMILY, ".model FAMILY(TYPE=TTL)");
- set_logic_family(logic_family_desc_t::from_model(m_FAMILY.Value()));
+ register_param("FAMILY", m_FAMILY, "FAMILY(TYPE=TTL)");
+ set_logic_family(netlist().setup().family_from_model(m_FAMILY.Value()));
register_output("Q", m_Q);
register_param("IN", m_IN, 0);
diff --git a/src/emu/netlist/devices/nld_truthtable.h b/src/emu/netlist/devices/nld_truthtable.h
index aff146cfb91..fdf2aa58fe2 100644
--- a/src/emu/netlist/devices/nld_truthtable.h
+++ b/src/emu/netlist/devices/nld_truthtable.h
@@ -36,7 +36,7 @@
ttd->m_desc.add(_x);
#define TT_FAMILY(_x) \
- ttd->m_family = netlist::logic_family_desc_t::from_model(setup.get_model_str(_x));
+ ttd->m_family = setup.family_from_model(_x);
#define TRUTHTABLE_END() \
setup.factory().register_device(ttd); \
diff --git a/src/emu/netlist/macro/nlm_opamp.c b/src/emu/netlist/macro/nlm_opamp.c
index 143f4d8cfec..62e2312a3a8 100644
--- a/src/emu/netlist/macro/nlm_opamp.c
+++ b/src/emu/netlist/macro/nlm_opamp.c
@@ -39,8 +39,8 @@ NETLIST_END()
NETLIST_START(OPAMP_lib)
LOCAL_LIB_ENTRY(opamp_layout_4_4_11)
- NET_MODEL(".model MB3614 OPAMP(TYPE=3 VLH=2.0 VLL=0.2 FPF=5 UGF=500k SLEW=0.6M RI=1000k RO=50 DAB=0.002)")
- NET_MODEL(".model MB3614_SLOW OPAMP(TYPE=3 VLH=2.0 VLL=0.2 FPF=5 UGF=11k SLEW=0.6M RI=1000k RO=50 DAB=0.002)")
+ NET_MODEL("MB3614 OPAMP(TYPE=3 VLH=2.0 VLL=0.2 FPF=5 UGF=500k SLEW=0.6M RI=1000k RO=50 DAB=0.002)")
+ NET_MODEL("MB3614_SLOW OPAMP(TYPE=3 VLH=2.0 VLL=0.2 FPF=5 UGF=11k SLEW=0.6M RI=1000k RO=50 DAB=0.002)")
LOCAL_LIB_ENTRY(MB3614_DIP)
diff --git a/src/emu/netlist/nl_base.c b/src/emu/netlist/nl_base.c
index c63ddc61a00..129bdd2db44 100644
--- a/src/emu/netlist/nl_base.c
+++ b/src/emu/netlist/nl_base.c
@@ -87,36 +87,6 @@ public:
logic_family_desc_t *netlist_family_TTL = palloc(logic_family_ttl_t);
logic_family_desc_t *netlist_family_CD4XXX = palloc(logic_family_cd4xxx_t);
-class logic_family_std_proxy_t : public logic_family_desc_t
-{
-public:
- logic_family_std_proxy_t() { }
- virtual devices::nld_base_d_to_a_proxy *create_d_a_proxy(logic_output_t *proxied) const
- {
- return palloc(devices::nld_d_to_a_proxy(proxied));
- }
-};
-
-logic_family_desc_t *logic_family_desc_t::from_model(const pstring &model)
-{
- if (setup_t::model_value_str(model, "TYPE", "") == "TTL")
- return netlist_family_TTL;
- if (setup_t::model_value_str(model, "TYPE", "") == "CD4XXX")
- return netlist_family_CD4XXX;
-
- logic_family_std_proxy_t *ret = palloc(logic_family_std_proxy_t);
-
- ret->m_low_thresh_V = setup_t::model_value(model, "IVL", 0.8);
- ret->m_high_thresh_V = setup_t::model_value(model, "IVH", 2.0);
- ret->m_low_V = setup_t::model_value(model, "OVL", 0.1);
- ret->m_high_V = setup_t::model_value(model, "OVH", 4.0);
- ret->m_R_low = setup_t::model_value(model, "ORL", 1.0);
- ret->m_R_high = setup_t::model_value(model, "ORH", 130.0);
-
- return ret;
-}
-
-
// ----------------------------------------------------------------------------------------
// netlist_queue_t
// ----------------------------------------------------------------------------------------
@@ -1065,27 +1035,26 @@ ATTR_COLD param_t::param_t(const param_type_t atype)
{
}
-ATTR_COLD const pstring param_model_t::model_type() const
+ATTR_COLD const pstring param_model_t::model_type()
{
- 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();
+ if (m_map.size() == 0)
+ netlist().setup().model_parse(this->Value(), m_map);
+ return m_map["COREMODEL"];
}
-ATTR_COLD const pstring param_model_t::model_value_str(const pstring &entity, const pstring defval) const
+ATTR_COLD const pstring param_model_t::model_value_str(const pstring &entity)
{
- return setup_t::model_value_str(this->Value(), entity, defval);
+ if (m_map.size() == 0)
+ netlist().setup().model_parse(this->Value(), m_map);
+ return netlist().setup().model_value_str(m_map, entity);
}
-ATTR_COLD nl_double param_model_t::model_value(const pstring &entity, const nl_double defval) const
+ATTR_COLD nl_double param_model_t::model_value(const pstring &entity)
{
- return setup_t::model_value(this->Value(), entity, defval);
+ if (m_map.size() == 0)
+ netlist().setup().model_parse(this->Value(), m_map);
+ return netlist().setup().model_value(m_map, entity);
}
} // namespace
diff --git a/src/emu/netlist/nl_base.h b/src/emu/netlist/nl_base.h
index bd8ef6b48be..d1329a5e5d6 100644
--- a/src/emu/netlist/nl_base.h
+++ b/src/emu/netlist/nl_base.h
@@ -306,6 +306,12 @@ namespace netlist
class param_model_t;
// -----------------------------------------------------------------------------
+ // model_map_t
+ // -----------------------------------------------------------------------------
+
+ typedef phashmap_t<pstring, pstring> model_map_t;
+
+ // -----------------------------------------------------------------------------
// netlist_output_family_t
// -----------------------------------------------------------------------------
@@ -324,8 +330,6 @@ namespace netlist
nl_double m_R_high;
bool m_is_static;
-
- static logic_family_desc_t *from_model(const pstring &model);
};
class logic_family_t
@@ -946,6 +950,7 @@ namespace netlist
param_t::save_register();
}
+ virtual void changed() { }
C m_param;
private:
};
@@ -968,9 +973,16 @@ namespace netlist
ATTR_COLD param_model_t() : param_template_t<pstring, param_t::MODEL>() { }
/* these should be cached! */
- ATTR_COLD nl_double model_value(const pstring &entity, const nl_double defval = 0.0) const;
- ATTR_COLD const pstring model_value_str(const pstring &entity, const pstring defval = "") const;
- ATTR_COLD const pstring model_type() const;
+ ATTR_COLD nl_double model_value(const pstring &entity);
+ ATTR_COLD const pstring model_value_str(const pstring &entity);
+ ATTR_COLD const pstring model_type();
+ protected:
+ void changed()
+ {
+ m_map.clear();
+ }
+ private:
+ model_map_t m_map;
};
// -----------------------------------------------------------------------------
@@ -1284,6 +1296,7 @@ namespace netlist
if (m_param != param)
{
m_param = param;
+ changed();
device().update_param();
}
}
diff --git a/src/emu/netlist/nl_parser.c b/src/emu/netlist/nl_parser.c
index 06ff0c8e932..dbdabbff725 100644
--- a/src/emu/netlist/nl_parser.c
+++ b/src/emu/netlist/nl_parser.c
@@ -196,7 +196,7 @@ void parser_t::net_truthtable_start()
else if (token.is(m_tok_TT_FAMILY))
{
require_token(m_tok_param_left);
- ttd->m_family = netlist::logic_family_desc_t::from_model(m_setup.get_model_str(get_string()));
+ ttd->m_family = m_setup.family_from_model(get_string());
require_token(m_tok_param_right);
}
else
diff --git a/src/emu/netlist/nl_setup.c b/src/emu/netlist/nl_setup.c
index f8f9cf6943f..1628c9236e3 100644
--- a/src/emu/netlist/nl_setup.c
+++ b/src/emu/netlist/nl_setup.c
@@ -137,9 +137,15 @@ device_t *setup_t::register_dev(const pstring &classname, const pstring &name)
}
}
-void setup_t::register_model(const pstring &model)
+void setup_t::register_model(const pstring &model_in)
{
- m_models.add(model);
+ int pos = model_in.find(' ');
+ if (pos < 0)
+ netlist().error("Unable to parse model: %s", model_in.cstr());
+ pstring model = model_in.left(pos).trim().ucase();
+ pstring def = model_in.substr(pos + 1).trim();
+ if (!m_models.add(model, def))
+ netlist().error("Model already exists: %s", model_in.cstr());
}
void setup_t::register_alias_nofqn(const pstring &alias, const pstring &out)
@@ -194,25 +200,6 @@ pstring setup_t::objtype_as_astr(object_t &in) const
return "Error";
}
-const pstring setup_t::get_model_str(const pstring val) const
-{
- if (val.startsWith(".model ") || val.find("(") >= 0)
- {
- return val;
- }
- else
- {
- pstring search = (".model " + val + " ").ucase();
- for (std::size_t i=0; i < m_models.size(); i++)
- {
- if (m_models[i].ucase().startsWith(search))
- return m_models[i];
- }
- netlist().error("Model %s not found\n", val.cstr());
- return ""; /* please compiler */
- }
-}
-
void setup_t::register_object(device_t &dev, const pstring &name, object_t &obj)
{
@@ -276,7 +263,8 @@ void setup_t::register_object(device_t &dev, const pstring &name, object_t &obj)
}
break;
case param_t::MODEL:
- dynamic_cast<param_model_t &>(param).initial(get_model_str(val));
+ //dynamic_cast<param_model_t &>(param).initial(val);
+ dynamic_cast<param_model_t &>(param).initial(val);
break;
default:
netlist().error("Parameter is not supported %s : %s\n", name.cstr(), val.cstr());
@@ -763,13 +751,9 @@ void setup_t::resolve_inputs()
core_terminal_t *t2 = find_terminal(t2s);
if (connect(*t1, *t2))
- {
m_links.remove_at(li);
- }
else
- {
li++;
- }
}
tries--;
}
@@ -893,66 +877,130 @@ void setup_t::print_stats() const
}
// ----------------------------------------------------------------------------------------
-// Static
+// Model / family
// ----------------------------------------------------------------------------------------
-const pstring setup_t::model_value_str(const pstring &model_str, const pstring &entity, const pstring defval)
+class logic_family_std_proxy_t : public logic_family_desc_t
{
- pstring tmp = model_str;
- // .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.ucase().find(entity.ucase() + "=");
- if (p>=0)
+public:
+ logic_family_std_proxy_t() { }
+ virtual devices::nld_base_d_to_a_proxy *create_d_a_proxy(logic_output_t *proxied) const
{
- int pblank = tmp.find(" ", p);
- if (pblank < 0) pblank = tmp.len() + 1;
- tmp = tmp.substr(p, pblank - p);
- if (tmp.right(1) == ")")
- tmp = tmp.left(tmp.len()-1);
- int pequal = tmp.find("=", 0);
- if (pequal < 0)
- fatalerror_e("parameter %s misformat in model %s temp %s\n", entity.cstr(), model_str.cstr(), tmp.cstr());
- tmp = tmp.substr(pequal+1);
- return tmp;
+ return palloc(devices::nld_d_to_a_proxy(proxied));
}
+};
+
+logic_family_desc_t *setup_t::family_from_model(const pstring &model)
+{
+ model_map_t map;
+ model_parse(model, map);
+
+ if (setup_t::model_value_str(map, "TYPE") == "TTL")
+ return netlist_family_TTL;
+ if (setup_t::model_value_str(map, "TYPE") == "CD4XXX")
+ return netlist_family_CD4XXX;
+
+ logic_family_std_proxy_t *ret = palloc(logic_family_std_proxy_t);
+
+ ret->m_low_thresh_V = setup_t::model_value(map, "IVL");
+ ret->m_high_thresh_V = setup_t::model_value(map, "IVH");
+ ret->m_low_V = setup_t::model_value(map, "OVL");
+ ret->m_high_V = setup_t::model_value(map, "OVH");
+ ret->m_R_low = setup_t::model_value(map, "ORL");
+ ret->m_R_high = setup_t::model_value(map, "ORH");
+
+ return ret;
+}
+
+static pstring model_string(model_map_t &map)
+{
+ pstring ret = map["COREMODEL"] + "(";
+ for (unsigned i=0; i<map.size(); i++)
+ ret = ret + map.key_at(i) + "=" + map.value_at(i) + " ";
+
+ return ret + ")";
+}
+
+
+void setup_t::model_parse(const pstring &model_in, model_map_t &map)
+{
+ pstring model = model_in;
+ int pos = 0;
+ pstring key;
+
+ while (true)
+ {
+ pos = model.find("(");
+ if (pos >= 0) break;
+
+ key = model.ucase();
+ if (!m_models.contains(key))
+ netlist().error("Model %s not found\n", model.cstr());
+ model = m_models[key];
+ }
+ pstring xmodel = model.left(pos);
+
+ if (xmodel.equals("_"))
+ map["COREMODEL"] = key;
else
{
- //netlist().log("Entity %s not found in model %s\n", entity.cstr(), tmp.cstr());
- //printf("Entity %s not found in model %s\n", entity.cstr(), tmp.cstr());
- return defval;
+ if (m_models.contains(xmodel))
+ model_parse(xmodel, map);
+ else
+ netlist().error("Model doesn't exist %s\n", xmodel.cstr());
+ }
+
+ pstring remainder=model.substr(pos+1).trim();
+ if (!remainder.endsWith(")"))
+ netlist().error("Model error %s\n", model.cstr());
+ remainder = remainder.left(remainder.len() - 1);
+ pstring_list_t pairs(remainder," ", true);
+ for (unsigned i=0; i<pairs.size(); i++)
+ {
+ int pose = pairs[i].find('=');
+ if (pose < 0)
+ netlist().error("Model error on pair %s\n", model.cstr());
+ map[pairs[i].left(pose).ucase()] = pairs[i].substr(pose+1);
}
}
-nl_double setup_t::model_value(const pstring &model_str, const pstring &entity, const nl_double defval)
+const pstring setup_t::model_value_str(model_map_t &map, const pstring &entity)
{
- pstring tmp = model_value_str(model_str, entity, "NOTFOUND");
+ pstring ret;
- nl_double factor = NL_FCONST(1.0);
- if (tmp != "NOTFOUND")
- {
- char numfac = *(tmp.right(1).cstr());
- switch (numfac)
- {
- case 'M': factor = 1e6; break;
- case 'k': factor = 1e3; break;
- case 'm': factor = 1e-3; break;
- case 'u': factor = 1e-6; break;
- case 'n': factor = 1e-9; break;
- case 'p': factor = 1e-12; break;
- case 'f': factor = 1e-15; break;
- case 'a': factor = 1e-18; break;
- default:
- if (numfac < '0' || numfac > '9')
- fatalerror_e("Unknown number factor <%c> in: %s", numfac, entity.cstr());
- }
- if (factor != NL_FCONST(1.0))
- tmp = tmp.left(tmp.len() - 1);
- return tmp.as_double() * factor;
- }
+ if (entity != entity.ucase())
+ netlist().error("model parameters should be uppercase:%s %s\n", entity.cstr(), model_string(map).cstr());
+ if (!map.contains(entity))
+ netlist().error("Entity %s not found in model %s\n", entity.cstr(), model_string(map).cstr());
else
+ ret = map[entity];
+
+ return ret;
+}
+
+nl_double setup_t::model_value(model_map_t &map, const pstring &entity)
+{
+ pstring tmp = model_value_str(map, entity);
+
+ nl_double factor = NL_FCONST(1.0);
+ char numfac = *(tmp.right(1).cstr());
+ switch (numfac)
{
- //netlist().log("Entity %s not found in model %s\n", entity.cstr(), tmp.cstr());
- return defval;
+ case 'M': factor = 1e6; break;
+ case 'k': factor = 1e3; break;
+ case 'm': factor = 1e-3; break;
+ case 'u': factor = 1e-6; break;
+ case 'n': factor = 1e-9; break;
+ case 'p': factor = 1e-12; break;
+ case 'f': factor = 1e-15; break;
+ case 'a': factor = 1e-18; break;
+ default:
+ if (numfac < '0' || numfac > '9')
+ fatalerror_e("Unknown number factor <%c> in: %s", numfac, entity.cstr());
}
+ if (factor != NL_FCONST(1.0))
+ tmp = tmp.left(tmp.len() - 1);
+ return tmp.as_double() * factor;
}
// ----------------------------------------------------------------------------------------
diff --git a/src/emu/netlist/nl_setup.h b/src/emu/netlist/nl_setup.h
index 0bcf9c541ae..a38aa7229ef 100644
--- a/src/emu/netlist/nl_setup.h
+++ b/src/emu/netlist/nl_setup.h
@@ -143,7 +143,7 @@ namespace netlist
void register_lib_entry(const pstring &name);
- void register_model(const pstring &model);
+ void register_model(const pstring &model_in);
void register_alias(const pstring &alias, const pstring &out);
void register_dippins_arr(const pstring &terms);
@@ -159,8 +159,6 @@ namespace netlist
void register_frontier(const pstring attach, const double r_IN, const double r_OUT);
void remove_connections(const pstring attach);
- const pstring get_model_str(const pstring val) const;
-
void register_object(device_t &dev, const pstring &name, object_t &obj);
bool connect(core_terminal_t &t1, core_terminal_t &t2);
@@ -192,11 +190,13 @@ namespace netlist
void print_stats() const;
- /* static support functions */
+ /* model / family related */
- static const pstring model_value_str(const pstring &model_str, const pstring &entity, const pstring defval);
- static nl_double model_value(const pstring &model_str, const pstring &entity, const nl_double defval);
+ logic_family_desc_t *family_from_model(const pstring &model);
+ const pstring model_value_str(model_map_t &map, const pstring &entity);
+ nl_double model_value(model_map_t &map, const pstring &entity);
+ void model_parse(const pstring &model, model_map_t &map);
protected:
private:
@@ -224,7 +224,7 @@ namespace netlist
factory_list_t *m_factory;
- plist_t<pstring> m_models;
+ phashmap_t<pstring, pstring> m_models;
int m_proxy_cnt;
diff --git a/src/emu/netlist/plib/plists.h b/src/emu/netlist/plib/plists.h
index 669c3f34ad9..8f4914145b5 100644
--- a/src/emu/netlist/plib/plists.h
+++ b/src/emu/netlist/plib/plists.h
@@ -799,7 +799,7 @@ public:
V& value_at(const unsigned pos) { return m_values[pos].m_value; }
const V& value_at(const unsigned pos) const { return m_values[pos].m_value; }
- V& key_at(const unsigned pos) const { return m_values[pos].m_key; }
+ V& key_at(const unsigned pos) { return m_values[pos].m_key; }
private:
int get_idx(const K &key) const
diff --git a/src/emu/netlist/plib/pstring.h b/src/emu/netlist/plib/pstring.h
index 88a8922e98b..7a7b536e98a 100644
--- a/src/emu/netlist/plib/pstring.h
+++ b/src/emu/netlist/plib/pstring.h
@@ -81,6 +81,9 @@ public:
bool startsWith(const pstring &arg) const { return (pcmp(cstr(), arg.cstr(), arg.len()) == 0); }
bool startsWith(const char *arg) const;
+ bool endsWith(const pstring &arg) const { return (this->right(arg.len()) == arg); }
+ bool endsWith(const char *arg) const { return endsWith(pstring(arg)); }
+
pstring replace(const pstring &search, const pstring &replace) const;
// these return nstring ...
diff --git a/src/mame/audio/irem.c b/src/mame/audio/irem.c
index 06de09520d7..67fe2b27de3 100644
--- a/src/mame/audio/irem.c
+++ b/src/mame/audio/irem.c
@@ -452,7 +452,7 @@ NETLIST_START(kidniki_interface)
ALIAS(I_SINH0, SINH_DUMMY.2)
#endif
- NET_MODEL(".model AY8910PORT FAMILY(OVL=0.05 OVH=4.95 ORL=100.0 ORH=0.5k)")
+ NET_MODEL("AY8910PORT FAMILY(OVL=0.05 OVH=4.95 ORL=100.0 ORH=0.5k)")
LOGIC_INPUT(I_SD0, 1, "AY8910PORT")
//CLOCK(I_SD0, 5)
diff --git a/src/mame/audio/nl_kidniki.c b/src/mame/audio/nl_kidniki.c
index 71f6ea1a14a..b7b46a1cd10 100644
--- a/src/mame/audio/nl_kidniki.c
+++ b/src/mame/audio/nl_kidniki.c
@@ -473,7 +473,7 @@ NETLIST_START(kidniki_lib)
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)")
+ TT_FAMILY("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)