mirror of
https://github.com/holub/mame
synced 2025-04-22 08:22:15 +03:00
Merge branch 'master' of https://github.com/mamedev/mame
This commit is contained in:
commit
d7541fe44c
@ -48,16 +48,27 @@ NETLIST_START(dummy)
|
||||
// IGNORED O_AUDIO0: O_AUDIO0 64 0
|
||||
// .END
|
||||
|
||||
SOLVER(Solver, 12000)
|
||||
SOLVER(Solver, 24000)
|
||||
PARAM(Solver.ACCURACY, 1e-8)
|
||||
PARAM(Solver.NR_LOOPS, 90)
|
||||
PARAM(Solver.SOR_FACTOR, 0.00001)
|
||||
PARAM(Solver.GS_LOOPS, 1)
|
||||
//PARAM(Solver.GS_THRESHOLD, 99)
|
||||
PARAM(Solver.ITERATIVE, "SOR")
|
||||
|
||||
LOCAL_SOURCE(congob_lib)
|
||||
INCLUDE(congob_lib)
|
||||
|
||||
TTL_INPUT(I_BASS_DRUM0, 0)
|
||||
//CLOCK(I_BASS_DRUM0, 2)
|
||||
TTL_INPUT(I_CONGA_H0, 0)
|
||||
//CLOCK(I_CONGA_H0, 2)
|
||||
TTL_INPUT(I_CONGA_L0, 0)
|
||||
TTL_INPUT(I_GORILLA0, 0)
|
||||
//CLOCK(I_CONGA_L0, 2)
|
||||
//TTL_INPUT(I_GORILLA0, 0)
|
||||
CLOCK(I_GORILLA0, 2)
|
||||
TTL_INPUT(I_RIM0, 0)
|
||||
//CLOCK(I_RIM0, 2)
|
||||
|
||||
ALIAS(I_V0.Q, GND.Q)
|
||||
|
||||
@ -65,11 +76,34 @@ NETLIST_START(dummy)
|
||||
ANALOG_INPUT(I_V5, 5)
|
||||
ANALOG_INPUT(I_V6, 6)
|
||||
|
||||
/* temporary output stage */
|
||||
RES(RO, RES_K(50))
|
||||
CAP(CO, CAP_U(10))
|
||||
|
||||
NET_C(R94.1, CO.1)
|
||||
NET_C(CO.2, RO.1)
|
||||
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)")
|
||||
|
||||
INCLUDE(CongoBongo_schematics)
|
||||
|
||||
OPTIMIZE_FRONTIER(C51.1, RES_K(50), 50)
|
||||
OPTIMIZE_FRONTIER(R77.2, RES_K(20), 50)
|
||||
|
||||
OPTIMIZE_FRONTIER(C25.2, RES_K(240), 50)
|
||||
OPTIMIZE_FRONTIER(C29.2, RES_K(390), 50)
|
||||
OPTIMIZE_FRONTIER(C37.2, RES_K(390), 50)
|
||||
OPTIMIZE_FRONTIER(C44.2, RES_K(200), 50)
|
||||
|
||||
OPTIMIZE_FRONTIER(R90.2, RES_K(100), 50)
|
||||
OPTIMIZE_FRONTIER(R92.2, RES_K(15), 50)
|
||||
|
||||
NETLIST_END()
|
||||
|
||||
NETLIST_START(CongoBongo_schematics)
|
||||
CAP(C20, CAP_N(68))
|
||||
CAP(C21, CAP_U(1))
|
||||
CAP(C22, CAP_U(47))
|
||||
@ -95,11 +129,11 @@ NETLIST_START(dummy)
|
||||
CAP(C42, CAP_N(6.8))
|
||||
CAP(C43, CAP_N(47))
|
||||
CAP(C44, CAP_U(1))
|
||||
//CAP(C45, CAP_U(33))
|
||||
//CAP(C46, CAP_N(100))
|
||||
CAP(C47, CAP_U(470))
|
||||
CAP(C45, CAP_U(33))
|
||||
CAP(C46, CAP_N(100))
|
||||
CAP(C47, CAP_P(470))
|
||||
CAP(C48, CAP_N(1.5))
|
||||
CAP(C49, CAP_U(220))
|
||||
CAP(C49, CAP_P(220))
|
||||
CAP(C50, CAP_N(3.9))
|
||||
CAP(C51, CAP_U(1))
|
||||
CAP(C52, CAP_U(1))
|
||||
@ -110,8 +144,9 @@ NETLIST_START(dummy)
|
||||
CAP(C57, CAP_N(47))
|
||||
CAP(C58, CAP_N(22))
|
||||
CAP(C59, CAP_U(10))
|
||||
//CAP(C60, CAP_N(22))
|
||||
CAP(C60, CAP_N(22))
|
||||
CAP(C62, CAP_N(22))
|
||||
CAP(C61, CAP_U(1))
|
||||
DIODE(D1, "1S2075")
|
||||
DIODE(D2, "1S2075")
|
||||
DIODE(D3, "1S2075")
|
||||
@ -194,6 +229,7 @@ NETLIST_START(dummy)
|
||||
RES(R91, RES_K(10))
|
||||
RES(R92, RES_K(15))
|
||||
RES(R93, RES_K(15))
|
||||
RES(R94, RES_K(51))
|
||||
MB3614_DIP(XU13)
|
||||
G501534_DIP(XU15)
|
||||
MB3614_DIP(XU16)
|
||||
@ -202,19 +238,19 @@ NETLIST_START(dummy)
|
||||
CD4538_DIP(XU19)
|
||||
MM5837_DIP(XU20)
|
||||
DM7416_DIP(XU6)
|
||||
NET_C(D1.K, C21.2, R23.1)
|
||||
NET_C(D1.A, C20.1, R22.1)
|
||||
NET_C(D1.A, C21.2, R23.1)
|
||||
NET_C(D1.K, C20.1, R22.1)
|
||||
NET_C(XU13.1, C37.2, C36.1, R48.1)
|
||||
NET_C(XU13.2, C35.2, R48.2)
|
||||
NET_C(XU13.3, R44.1, R46.2, R45.1)
|
||||
NET_C(XU13.4, R27.1, R21.1, R37.1, R31.1, R47.1, R41.1, R57.1, R51.1, /*C46.2, C45.2,*/ XU17.4, R80.2, XU16.4, XU20.4, XU15.12, I_V12.Q)
|
||||
NET_C(XU13.4, R27.1, R21.1, R37.1, R31.1, R47.1, R41.1, R57.1, R51.1, C46.2, C45.2, XU17.4, R80.2, XU16.4, XU20.4, XU15.12, I_V12.Q)
|
||||
NET_C(XU13.5, R54.1, R56.2, R55.1)
|
||||
NET_C(XU13.6, C41.2, R58.2, R60.2)
|
||||
NET_C(XU13.7, C44.2, C42.1, R58.1, R61.1)
|
||||
NET_C(XU13.8, C29.2, C31.1, R38.1)
|
||||
NET_C(XU13.9, C30.2, R38.2)
|
||||
NET_C(XU13.10, R34.1, R36.2, R35.1)
|
||||
NET_C(XU13.11, C22.2, R29.2, R25.2, R23.2, R22.2, XU6.1, XU6.3, XU6.7, C28.2, R39.2, R35.2, R33.2, R32.2, C34.2, R49.2, R45.2, R43.2, R42.2, C40.2, R59.2, R55.2, R53.2, R52.2, C43.2, R69.1, R64.1, C49.2, C48.2, C47.2, /*C46.1, C45.1,*/ XU17.11, XU19.1, XU19.4, XU19.8, XU19.12, XU19.15, R81.1, C56.2, C55.2, C53.2, C52.2, XU18.1, XU18.2, XU18.7, XU18.12, XU18.13, C54.2, XU16.11, R84.1, R88.1, Q2.E, C58.2, /* C60.2, */ XU20.1, XU20.2, XU15.4, I_V0.Q)
|
||||
NET_C(XU13.11, C22.2, R29.2, R25.2, R23.2, R22.2, XU6.1, XU6.3, XU6.7, C28.2, R39.2, R35.2, R33.2, R32.2, C34.2, R49.2, R45.2, R43.2, R42.2, C40.2, R59.2, R55.2, R53.2, R52.2, C43.2, R69.1, R64.1, C49.2, C48.2, C47.2, C46.1, C45.1, XU17.11, XU19.1, XU19.4, XU19.8, XU19.12, XU19.15, R81.1, C56.2, C55.2, C53.2, C52.2, XU18.1, XU18.2, XU18.7, XU18.12, XU18.13, C54.2, XU16.11, R84.1, R88.1, Q2.E, C58.2, C60.2, XU20.1, XU20.2, XU15.4, I_V0.Q)
|
||||
NET_C(XU13.12, R24.1, R26.2, R25.1)
|
||||
NET_C(XU13.13, C23.2, R28.2)
|
||||
NET_C(XU13.14, C25.2, C24.1, R28.1)
|
||||
@ -223,7 +259,7 @@ NETLIST_START(dummy)
|
||||
NET_C(C21.1, R24.2)
|
||||
NET_C(C20.2, R21.2, XU6.8)
|
||||
NET_C(C22.1, R27.2, R26.1)
|
||||
NET_C(R30.1, R40.1, R50.1, R62.1, XU15.3)
|
||||
NET_C(R30.1, R40.1, R50.1, R62.1, R94.1)
|
||||
//NET_C(XU6.2, XU6.4, XU19.7, XU18.3, XU18.11, XU15.5, XU15.6, XU15.7, XU15.8, XU15.9, XU15.10, XU15.11, XU15.14)
|
||||
NET_C(XU6.5, I_CONGA_L0.Q)
|
||||
NET_C(XU6.6, C26.2, R31.2)
|
||||
@ -232,27 +268,27 @@ NETLIST_START(dummy)
|
||||
NET_C(XU6.11, I_RIM0.Q)
|
||||
NET_C(XU6.12, C32.2, R41.2)
|
||||
NET_C(XU6.13, I_CONGA_H0.Q)
|
||||
NET_C(XU6.14, D5.A, XU19.16, R70.2, R76.2, R71.2, XU18.14, I_V5.Q)
|
||||
NET_C(D2.K, C27.2, R33.1)
|
||||
NET_C(D2.A, C26.1, R32.1)
|
||||
NET_C(XU6.14, D5.K, XU19.16, R70.2, R76.2, R71.2, XU18.14, I_V5.Q)
|
||||
NET_C(D2.A, C27.2, R33.1)
|
||||
NET_C(D2.K, C26.1, R32.1)
|
||||
NET_C(C29.1, R40.2)
|
||||
NET_C(C31.2, C30.1, R39.1)
|
||||
NET_C(C27.1, R34.2)
|
||||
NET_C(C28.1, R37.2, R36.1)
|
||||
NET_C(D3.K, C33.2, R43.1)
|
||||
NET_C(D3.A, C32.1, R42.1)
|
||||
NET_C(D3.A, C33.2, R43.1)
|
||||
NET_C(D3.K, C32.1, R42.1)
|
||||
NET_C(C37.1, R50.2)
|
||||
NET_C(C36.2, C35.1, R49.1)
|
||||
NET_C(C33.1, R44.2)
|
||||
NET_C(C34.1, R47.2, R46.1)
|
||||
NET_C(D4.K, C39.2, R53.1)
|
||||
NET_C(D4.A, C38.1, R52.1)
|
||||
NET_C(D4.A, C39.2, R53.1)
|
||||
NET_C(D4.K, C38.1, R52.1)
|
||||
NET_C(C44.1, R62.2)
|
||||
NET_C(C42.2, C41.1, R59.1)
|
||||
NET_C(C39.1, R54.2)
|
||||
NET_C(C40.1, R57.2, R56.1)
|
||||
NET_C(R60.1, R61.2, C43.1)
|
||||
NET_C(R63.1, R64.2, C47.1, D5.K, XU18.5, XU18.6)
|
||||
NET_C(R63.1, R64.2, C47.1, D5.A, XU18.5, XU18.6)
|
||||
NET_C(R63.2, XU20.3)
|
||||
NET_C(R65.1, R66.2, C48.1)
|
||||
NET_C(R65.2, XU18.4)
|
||||
@ -274,26 +310,28 @@ NETLIST_START(dummy)
|
||||
NET_C(XU19.5, XU19.11, I_GORILLA0.Q)
|
||||
NET_C(XU19.6, XU18.9)
|
||||
NET_C(XU19.9, XU18.8)
|
||||
NET_C(XU19.10, D7.K, R75.2)
|
||||
NET_C(XU19.10, D7.A, R75.2)
|
||||
NET_C(XU19.14, R71.1, C53.1)
|
||||
NET_C(R72.2, D6.K, XU18.10)
|
||||
NET_C(R73.2, D6.A)
|
||||
NET_C(D7.A, R74.2)
|
||||
NET_C(R72.2, D6.A, XU18.10)
|
||||
NET_C(R73.2, D6.K)
|
||||
NET_C(D7.K, R74.2)
|
||||
NET_C(R74.1, R75.1, C54.1, XU16.10)
|
||||
NET_C(XU16.1, R91.1, R92.2)
|
||||
NET_C(XU16.2, R90.1, R91.2)
|
||||
NET_C(XU16.3, R86.2, I_V6.Q)
|
||||
NET_C(XU16.5, R86.1, R87.2)
|
||||
NET_C(XU16.7, R87.1, D8.K, R90.2)
|
||||
NET_C(XU16.7, R87.1, D8.A, R90.2)
|
||||
NET_C(XU16.8, XU16.9, XU15.13)
|
||||
NET_C(XU16.12, R93.1, C58.1)
|
||||
NET_C(XU16.13, XU16.14, C57.1, C59.2)
|
||||
NET_C(R85.1, Q2.C)
|
||||
NET_C(R89.1, D8.A)
|
||||
NET_C(R89.1, D8.K)
|
||||
NET_C(R89.2, R88.2, Q2.B)
|
||||
NET_C(R92.1, C57.2, R93.2)
|
||||
NET_C(C59.1, XU15.1)
|
||||
//NET_C(C60.1, XU15.2)
|
||||
NET_C(C60.1, XU15.2)
|
||||
NET_C(XU15.3, C61.2)
|
||||
NET_C(C61.1, R94.2)
|
||||
NETLIST_END()
|
||||
|
||||
NETLIST_START(opamp)
|
||||
@ -302,7 +340,18 @@ NETLIST_START(opamp)
|
||||
*
|
||||
* http://www.ecircuitcenter.com/Circuits/opmodel1/opmodel1.htm
|
||||
*
|
||||
* Bandwidth 1Mhz
|
||||
* MB3614 Unit Gain frequency is about 500 kHz and the first pole frequency
|
||||
* about 5 Hz. We have to keep the Unity Gain Frequency below our sampling
|
||||
* frequency of 24 Khz.
|
||||
*
|
||||
* Simple Opamp Model Calculation
|
||||
*
|
||||
* First Pole Frequency 5 Hz
|
||||
* Unity Gain Frequency 11,000 Hz
|
||||
* RP 100,000 Ohm
|
||||
* DC Gain / Aol 2200
|
||||
* CP 0.318 uF
|
||||
* KG 0.022
|
||||
*
|
||||
*/
|
||||
|
||||
@ -312,52 +361,44 @@ NETLIST_START(opamp)
|
||||
ALIAS(MINUS, G1.IN) // Negative input
|
||||
ALIAS(OUT, EBUF.OP) // Opamp output ...
|
||||
|
||||
ALIAS(GND, EBUF.ON) // GND terminal
|
||||
ALIAS(VCC, DUMMY.I) // VCC terminal
|
||||
DUMMY_INPUT(DUMMY)
|
||||
AFUNC(fUH, 1, "A0 1.2 -")
|
||||
AFUNC(fUL, 1, "A0 1.2 +")
|
||||
|
||||
ALIAS(VCC, fUH.A0) // VCC terminal
|
||||
ALIAS(GND, fUL.A0) // VCC terminal
|
||||
|
||||
AFUNC(fVREF, 2, "A0 A1 + 0.5 *")
|
||||
NET_C(fUH.A0, fVREF.A0)
|
||||
NET_C(fUL.A0, fVREF.A1)
|
||||
|
||||
NET_C(EBUF.ON, fVREF)
|
||||
/* The opamp model */
|
||||
|
||||
VCCS(G1)
|
||||
PARAM(G1.RI, RES_K(1000))
|
||||
#if 1
|
||||
PARAM(G1.G, 100) // typical OP-AMP amplification 100 * 1000 = 100000
|
||||
RES(RP1, 1000)
|
||||
CAP(CP1, 1.59e-5) // <== change to 1.59e-3 for 10Khz bandwidth
|
||||
#else
|
||||
PARAM(G1.G, 1) // typical OP-AMP amplification 100 * 1000 = 100000
|
||||
RES(RP1, 100000)
|
||||
CAP(CP1, 1.59e-7) // <== change to 1.59e-3 for 10Khz bandwidth
|
||||
#endif
|
||||
|
||||
PARAM(G1.G, 0.0022)
|
||||
RES(RP1, 1e6)
|
||||
CAP(CP1, 0.0318e-6)
|
||||
|
||||
VCVS(EBUF)
|
||||
PARAM(EBUF.RO, 50)
|
||||
PARAM(EBUF.G, 1)
|
||||
|
||||
// PARAM(EBUF.RI, 1e20)
|
||||
// NET_C(EBUF.ON, GND)
|
||||
|
||||
NET_C(G1.ON, GND)
|
||||
NET_C(RP1.2, GND)
|
||||
NET_C(CP1.2, GND)
|
||||
NET_C(EBUF.IN, GND)
|
||||
NET_C(G1.ON, fVREF)
|
||||
NET_C(RP1.2, fVREF)
|
||||
NET_C(CP1.2, fVREF)
|
||||
NET_C(EBUF.IN, fVREF)
|
||||
|
||||
NET_C(RP1.1, G1.OP)
|
||||
NET_C(CP1.1, RP1.1)
|
||||
|
||||
DIODE(DP,"1N914")
|
||||
DIODE(DN,"1N914")
|
||||
DIODE(DP,".model tt D(IS=1e-15 N=1)")
|
||||
DIODE(DN,".model tt D(IS=1e-15 N=1)")
|
||||
|
||||
NET_C(DP.K, VCC)
|
||||
#if 1
|
||||
NET_C(DP.K, fUH.Q)
|
||||
NET_C(fUL.Q, DN.A)
|
||||
NET_C(DP.A, DN.K, RP1.1)
|
||||
#else
|
||||
RES(RDP, 1000)
|
||||
RES(RDN, 1000)
|
||||
NET_C(RDP.1, DP.A)
|
||||
NET_C(RDN.1, DN.K)
|
||||
NET_C(RDP.2, RDN.2, RP1.1)
|
||||
#endif
|
||||
NET_C(DN.A, GND)
|
||||
|
||||
NET_C(EBUF.IP, RP1.1)
|
||||
|
||||
@ -449,7 +490,7 @@ NETLIST_START(CD4001_DIP)
|
||||
NETLIST_END()
|
||||
|
||||
NETLIST_START(G501534_DIP)
|
||||
FUNCTION(f, 2)
|
||||
AFUNC(f, 2, "A0 A1 0.2 * *")
|
||||
|
||||
/*
|
||||
* 12: VCC
|
||||
@ -462,13 +503,17 @@ NETLIST_START(G501534_DIP)
|
||||
|
||||
DUMMY_INPUT(DU1)
|
||||
DUMMY_INPUT(DU2)
|
||||
DUMMY_INPUT(DU3)
|
||||
|
||||
RES(RO, 1000)
|
||||
|
||||
ALIAS(12, DU1.I)
|
||||
ALIAS(4, DU2.I)
|
||||
ALIAS(2, DU2.I)
|
||||
ALIAS(1, f.I0)
|
||||
ALIAS(13, f.I1)
|
||||
ALIAS(3, f.Q)
|
||||
ALIAS(2, DU3.I)
|
||||
ALIAS(1, f.A0)
|
||||
ALIAS(13, f.A1)
|
||||
NET_C(f.Q, RO.1)
|
||||
ALIAS(3, RO.2)
|
||||
|
||||
NETLIST_END()
|
||||
|
||||
|
@ -62,7 +62,7 @@ void initialize_factory(factory_list_t &factory)
|
||||
ENTRY(CS, CS, "I")
|
||||
ENTRY(dummy_input, DUMMY_INPUT, "-")
|
||||
ENTRY(frontier, FRONTIER_DEV, "+I,G,Q") // not intended to be used directly
|
||||
ENTRY(function, FUNCTION, "N") // only for macro devices - NO FEEDBACK loops
|
||||
ENTRY(function, AFUNC, "N,FUNC") // only for macro devices - NO FEEDBACK loops
|
||||
ENTRY(QBJT_EB, QBJT_EB, "model")
|
||||
ENTRY(QBJT_switch, QBJT_SW, "model")
|
||||
ENTRY(logic_input, TTL_INPUT, "IN")
|
||||
|
@ -73,9 +73,11 @@ NETLIB_UPDATE(74123)
|
||||
else // 4538
|
||||
{
|
||||
m_trig = (INPLOGIC(m_B) ^ 1) | INPLOGIC(m_A);
|
||||
res = res | INPLOGIC(m_A) | (INPLOGIC(m_B) ^ 1);
|
||||
// The line below is from the datasheet truthtable ... doesn't make sense at all
|
||||
//res = res | INPLOGIC(m_A) | (INPLOGIC(m_B) ^ 1);
|
||||
t_AB_to_Q = NLTIME_FROM_NS(300);
|
||||
t_C_to_Q = NLTIME_FROM_NS(250);
|
||||
//printf("m_trig %d res %d\n", m_trig, res);
|
||||
}
|
||||
|
||||
if (res)
|
||||
|
@ -288,4 +288,97 @@ NETLIB_UPDATE_PARAM(res_sw)
|
||||
// nothing, not intended to be called
|
||||
}
|
||||
|
||||
/* -----------------------------------------------------------------------------
|
||||
* nld_function
|
||||
* ----------------------------------------------------------------------------- */
|
||||
|
||||
NETLIB_START(function)
|
||||
{
|
||||
register_param("N", m_N, 2);
|
||||
register_param("FUNC", m_func, "");
|
||||
register_output("Q", m_Q);
|
||||
|
||||
for (int i=0; i < m_N; i++)
|
||||
register_input(pstring::sprintf("A%d", i), m_I[i]);
|
||||
|
||||
pstring_list_t cmds(m_func.Value(), " ");
|
||||
m_precompiled.clear();
|
||||
|
||||
for (std::size_t i=0; i < cmds.size(); i++)
|
||||
{
|
||||
pstring cmd = cmds[i];
|
||||
rpn_inst rc;
|
||||
if (cmd == "+")
|
||||
rc.m_cmd = ADD;
|
||||
else if (cmd == "-")
|
||||
rc.m_cmd = SUB;
|
||||
else if (cmd == "*")
|
||||
rc.m_cmd = MULT;
|
||||
else if (cmd == "/")
|
||||
rc.m_cmd = DIV;
|
||||
else if (cmd == "/")
|
||||
rc.m_cmd = DIV;
|
||||
else if (cmd.startsWith("A"))
|
||||
{
|
||||
rc.m_cmd = PUSH_INPUT;
|
||||
rc.m_param = cmd.substr(1).as_long();
|
||||
}
|
||||
else
|
||||
{
|
||||
bool err = false;
|
||||
rc.m_cmd = PUSH_CONST;
|
||||
rc.m_param = cmd.as_double(&err);
|
||||
if (err)
|
||||
netlist().error("nld_function: unknown/misformatted token <%s> in <%s>", cmd.cstr(), m_func.Value().cstr());
|
||||
}
|
||||
m_precompiled.add(rc);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
NETLIB_RESET(function)
|
||||
{
|
||||
m_Q.initial(0.0);
|
||||
}
|
||||
|
||||
NETLIB_UPDATE(function)
|
||||
{
|
||||
//nl_double val = INPANALOG(m_I[0]) * INPANALOG(m_I[1]) * 0.2;
|
||||
//OUTANALOG(m_Q, val);
|
||||
nl_double stack[20];
|
||||
unsigned ptr = 0;
|
||||
unsigned e = m_precompiled.size();
|
||||
for (unsigned i = 0; i<e; i++)
|
||||
{
|
||||
rpn_inst &rc = m_precompiled[i];
|
||||
switch (rc.m_cmd)
|
||||
{
|
||||
case ADD:
|
||||
ptr--;
|
||||
stack[ptr-1] = stack[ptr] + stack[ptr-1];
|
||||
break;
|
||||
case MULT:
|
||||
ptr--;
|
||||
stack[ptr-1] = stack[ptr] * stack[ptr-1];
|
||||
break;
|
||||
case SUB:
|
||||
ptr--;
|
||||
stack[ptr-1] = stack[ptr-1] - stack[ptr];
|
||||
break;
|
||||
case DIV:
|
||||
ptr--;
|
||||
stack[ptr-1] = stack[ptr-1] / stack[ptr];
|
||||
break;
|
||||
case PUSH_INPUT:
|
||||
stack[ptr++] = INPANALOG(m_I[(int) rc.m_param]);
|
||||
break;
|
||||
case PUSH_CONST:
|
||||
stack[ptr++] = rc.m_param;
|
||||
break;
|
||||
}
|
||||
}
|
||||
OUTANALOG(m_Q, stack[ptr-1]);
|
||||
}
|
||||
|
||||
|
||||
NETLIB_NAMESPACE_DEVICES_END()
|
||||
|
@ -70,9 +70,10 @@
|
||||
#define PARAMETERS(_name) \
|
||||
NET_REGISTER_DEV(netlistparams, _name)
|
||||
|
||||
#define FUNCTION(_name, _N) \
|
||||
#define AFUNC(_name, _N, _F) \
|
||||
NET_REGISTER_DEV(function, _name) \
|
||||
PARAM(_name.N, _N)
|
||||
PARAM(_name.N, _N) \
|
||||
PARAM(_name.FUNC, _F)
|
||||
|
||||
NETLIB_NAMESPACE_DEVICES_START()
|
||||
|
||||
@ -280,31 +281,34 @@ public:
|
||||
|
||||
protected:
|
||||
|
||||
void start()
|
||||
{
|
||||
register_param("INPUTS", m_N, 2);
|
||||
register_output("Q", m_Q);
|
||||
|
||||
for (int i=0; i < m_N; i++)
|
||||
register_input(pstring::sprintf("I%d", i), m_I[i]);
|
||||
}
|
||||
|
||||
void reset()
|
||||
{
|
||||
m_Q.initial(0.0);
|
||||
}
|
||||
|
||||
void update()
|
||||
{
|
||||
nl_double val = INPANALOG(m_I[0]) * INPANALOG(m_I[1]) * 0.2;
|
||||
OUTANALOG(m_Q, val);
|
||||
}
|
||||
void start();
|
||||
void reset();
|
||||
void update();
|
||||
|
||||
private:
|
||||
|
||||
enum rpn_cmd
|
||||
{
|
||||
ADD,
|
||||
MULT,
|
||||
SUB,
|
||||
DIV,
|
||||
PUSH_CONST,
|
||||
PUSH_INPUT,
|
||||
};
|
||||
|
||||
struct rpn_inst
|
||||
{
|
||||
rpn_cmd m_cmd;
|
||||
nl_double m_param;
|
||||
};
|
||||
|
||||
param_int_t m_N;
|
||||
param_str_t m_func;
|
||||
analog_output_t m_Q;
|
||||
analog_input_t m_I[10];
|
||||
|
||||
plist_t<rpn_inst> m_precompiled;
|
||||
};
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
@ -256,22 +256,29 @@ void setup_t::register_object(device_t &dev, const pstring &name, object_t &obj)
|
||||
break;
|
||||
case param_t::MODEL:
|
||||
{
|
||||
pstring search = (".model " + val + " ").ucase();
|
||||
bool found = false;
|
||||
for (std::size_t i=0; i < m_models.size(); i++)
|
||||
if (val.startsWith(".model "))
|
||||
{
|
||||
if (m_models[i].ucase().startsWith(search))
|
||||
{
|
||||
//int pl=m_models[i].find("(");
|
||||
//int pr=m_models[i].find(")");
|
||||
//dynamic_cast<netlist_param_model_t &>(param).initial(m_models[i].substr(pl+1,pr-pl-1));
|
||||
dynamic_cast<param_model_t &>(param).initial(m_models[i]);
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
dynamic_cast<param_model_t &>(param).initial(val);
|
||||
}
|
||||
else
|
||||
{
|
||||
pstring search = (".model " + val + " ").ucase();
|
||||
bool found = false;
|
||||
for (std::size_t i=0; i < m_models.size(); i++)
|
||||
{
|
||||
if (m_models[i].ucase().startsWith(search))
|
||||
{
|
||||
//int pl=m_models[i].find("(");
|
||||
//int pr=m_models[i].find(")");
|
||||
//dynamic_cast<netlist_param_model_t &>(param).initial(m_models[i].substr(pl+1,pr-pl-1));
|
||||
dynamic_cast<param_model_t &>(param).initial(m_models[i]);
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!found)
|
||||
netlist().error("Model %s not found\n", val.cstr());
|
||||
}
|
||||
if (!found)
|
||||
netlist().error("Model %s not found\n", val.cstr());
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@ -813,8 +820,13 @@ void setup_t::resolve_inputs()
|
||||
{
|
||||
has_twoterms = true;
|
||||
if (t->m_N.net().isRailNet() && t->m_P.net().isRailNet())
|
||||
#if 0
|
||||
netlist().error("Found device %s connected only to railterminals %s/%s\n",
|
||||
t->name().cstr(), t->m_N.net().name().cstr(), t->m_P.net().name().cstr());
|
||||
#else
|
||||
netlist().warning("Found device %s connected only to railterminals %s/%s\n",
|
||||
t->name().cstr(), t->m_N.net().name().cstr(), t->m_P.net().name().cstr());
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@ -892,6 +904,7 @@ const pstring setup_t::model_value_str(const pstring &model_str, const pstring &
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
@ -495,21 +495,43 @@ ATTR_HOT nl_double matrix_solver_direct_t<m_N, _storage_N>::vsolve()
|
||||
template <unsigned m_N, unsigned _storage_N>
|
||||
ATTR_HOT int matrix_solver_direct_t<m_N, _storage_N>::solve_non_dynamic(ATTR_UNUSED const bool newton_raphson)
|
||||
{
|
||||
nl_double new_v[_storage_N]; // = { 0.0 };
|
||||
nl_double new_V[_storage_N]; // = { 0.0 };
|
||||
|
||||
this->LE_back_subst(new_v);
|
||||
this->LE_back_subst(new_V);
|
||||
|
||||
if (newton_raphson)
|
||||
{
|
||||
nl_double err = delta(new_v);
|
||||
|
||||
store(new_v);
|
||||
#if 0
|
||||
/* limiting just doesn't work. */
|
||||
const unsigned iN = this->N();
|
||||
double err = 0;
|
||||
for (unsigned k = 0; k < iN; k++)
|
||||
{
|
||||
const double ov = this->m_nets[k]->m_cur_Analog;
|
||||
double d = new_V[k] - ov;
|
||||
err = std::max(nl_math::abs(d), err);
|
||||
}
|
||||
double a = 1.05;
|
||||
for (unsigned k = 0; k < iN; k++)
|
||||
{
|
||||
const double ov = this->m_nets[k]->m_cur_Analog;
|
||||
double d = new_V[k] - ov;
|
||||
const double nv = ov + a * d;
|
||||
this->m_nets[k]->m_cur_Analog = nv;
|
||||
}
|
||||
|
||||
return (err > this->m_params.m_accuracy) ? 2 : 1;
|
||||
#else
|
||||
nl_double err = delta(new_V);
|
||||
|
||||
store(new_V);
|
||||
|
||||
return (err > this->m_params.m_accuracy) ? 2 : 1;
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
store(new_v);
|
||||
store(new_V);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
@ -262,7 +262,7 @@ void matrix_solver_t::solve_base(C *p)
|
||||
// reschedule ....
|
||||
if (this_resched > 1 && !m_Q_sync.net().is_queued())
|
||||
{
|
||||
netlist().warning("NEWTON_LOOPS exceeded ... reschedule");
|
||||
netlist().warning("NEWTON_LOOPS exceeded on net %s... reschedule", this->name().cstr());
|
||||
m_Q_sync.net().reschedule_in_queue(m_params.m_nt_sync_delay);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user