diff options
author | 2020-09-28 22:00:34 +0200 | |
---|---|---|
committer | 2020-09-28 22:00:34 +0200 | |
commit | 2f73dca6e688dbc0b0fd23ba43c7b3b481fac884 (patch) | |
tree | 01ea8f88d3c3c749a9ea268654256471cb52fef6 | |
parent | c93702f9a3697625788704fdddea5bf881e0c97f (diff) |
netlist: implement stricter validation.
* Devices like BJTs and FETs which are defined but not used will now
cause an error.
* An unused device will create an additional solver with a singular
matrix.
- This is adding unnecessary performance overhead.
- It complicates debugging because the unused device will cause an
arithmetic signal if used with --fperr (nltool).
* Fixed all validation errors.
-rw-r--r-- | src/lib/netlist/generated/static_solvers.cpp | 522 | ||||
-rw-r--r-- | src/lib/netlist/nl_errstr.h | 11 | ||||
-rw-r--r-- | src/lib/netlist/solver/nld_solver.cpp | 49 | ||||
-rw-r--r-- | src/mame/audio/nl_armora.cpp | 2 | ||||
-rw-r--r-- | src/mame/audio/nl_barrier.cpp | 6 | ||||
-rw-r--r-- | src/mame/audio/nl_boxingb.cpp | 14 | ||||
-rw-r--r-- | src/mame/audio/nl_ripoff.cpp | 6 | ||||
-rw-r--r-- | src/mame/audio/nl_solarq.cpp | 2 | ||||
-rw-r--r-- | src/mame/audio/nl_spacewar.cpp | 6 | ||||
-rw-r--r-- | src/mame/audio/nl_starcas.cpp | 4 | ||||
-rw-r--r-- | src/mame/audio/nl_tailg.cpp | 4 | ||||
-rw-r--r-- | src/mame/audio/nl_warrior.cpp | 2 | ||||
-rw-r--r-- | src/mame/machine/nl_tank.cpp | 17 |
13 files changed, 105 insertions, 540 deletions
diff --git a/src/lib/netlist/generated/static_solvers.cpp b/src/lib/netlist/generated/static_solvers.cpp index de767784c3c..3dfe1def465 100644 --- a/src/lib/netlist/generated/static_solvers.cpp +++ b/src/lib/netlist/generated/static_solvers.cpp @@ -2384,74 +2384,6 @@ static void nl_gcr_15e8f6fb021de0f9_28_double_double(double * __restrict V, cons V[0] = (RHS0 - tmp0) / m_A0; } -// armora -static void nl_gcr_1692de755a535408_9_double_double(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) - -{ - - plib::unused_var(cnV); - double m_A0(0.0); - double m_A1(0.0); - double m_A2(0.0); - double m_A3(0.0); - double m_A4(0.0); - double m_A5(0.0); - double m_A6(0.0); - double m_A7(0.0); - double m_A8(0.0); - m_A0 += gt[0]; - m_A0 += gt[1]; - m_A0 += gt[2]; - m_A2 += go[0]; - m_A1 += go[1]; - m_A1 += go[2]; - double RHS0 = Idr[0]; - RHS0 += Idr[1]; - RHS0 += Idr[2]; - m_A4 += gt[3]; - m_A4 += gt[4]; - m_A4 += gt[5]; - m_A4 += gt[6]; - m_A5 += go[3]; - m_A5 += go[4]; - m_A3 += go[5]; - m_A3 += go[6]; - double RHS1 = Idr[3]; - RHS1 += Idr[4]; - RHS1 += Idr[5]; - RHS1 += Idr[6]; - m_A8 += gt[7]; - m_A8 += gt[8]; - m_A8 += gt[9]; - m_A7 += go[7]; - m_A7 += go[8]; - m_A6 += go[9]; - double RHS2 = Idr[7]; - RHS2 += Idr[8]; - RHS2 += Idr[9]; - const double f0 = 1.0 / m_A0; - const double f0_1 = -f0 * m_A3; - m_A4 += m_A1 * f0_1; - m_A5 += m_A2 * f0_1; - RHS1 += f0_1 * RHS0; - const double f0_2 = -f0 * m_A6; - m_A7 += m_A1 * f0_2; - m_A8 += m_A2 * f0_2; - RHS2 += f0_2 * RHS0; - const double f1 = 1.0 / m_A4; - const double f1_2 = -f1 * m_A7; - m_A8 += m_A5 * f1_2; - RHS2 += f1_2 * RHS1; - V[2] = RHS2 / m_A8; - double tmp1 = 0.0; - tmp1 += m_A5 * V[2]; - V[1] = (RHS1 - tmp1) / m_A4; - double tmp0 = 0.0; - tmp0 += m_A1 * V[1]; - tmp0 += m_A2 * V[2]; - V[0] = (RHS0 - tmp0) / m_A0; -} - // dpatrol static void nl_gcr_18f4d9160b51d613_20_double_double(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) @@ -43620,456 +43552,6 @@ static void nl_gcr_b09deef9a25aecaf_24_double_double(double * __restrict V, cons V[0] = (RHS0 - tmp0) / m_A0; } -// astrob -static void nl_gcr_b19a63ae17435486_61_double_double(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) - -{ - - plib::unused_var(cnV); - double m_A0(0.0); - double m_A1(0.0); - double m_A2(0.0); - double m_A3(0.0); - double m_A4(0.0); - double m_A5(0.0); - double m_A6(0.0); - double m_A7(0.0); - double m_A8(0.0); - double m_A9(0.0); - double m_A10(0.0); - double m_A11(0.0); - double m_A12(0.0); - double m_A13(0.0); - double m_A14(0.0); - double m_A15(0.0); - double m_A16(0.0); - double m_A17(0.0); - double m_A18(0.0); - double m_A19(0.0); - double m_A20(0.0); - double m_A21(0.0); - double m_A22(0.0); - double m_A23(0.0); - double m_A24(0.0); - double m_A25(0.0); - double m_A26(0.0); - double m_A27(0.0); - double m_A28(0.0); - double m_A29(0.0); - double m_A30(0.0); - double m_A31(0.0); - double m_A32(0.0); - double m_A33(0.0); - double m_A34(0.0); - double m_A35(0.0); - double m_A36(0.0); - double m_A37(0.0); - double m_A38(0.0); - double m_A39(0.0); - double m_A40(0.0); - double m_A41(0.0); - double m_A42(0.0); - double m_A43(0.0); - double m_A44(0.0); - double m_A45(0.0); - double m_A46(0.0); - double m_A47(0.0); - double m_A48(0.0); - double m_A49(0.0); - double m_A50(0.0); - double m_A51(0.0); - double m_A52(0.0); - double m_A53(0.0); - double m_A54(0.0); - double m_A55(0.0); - double m_A56(0.0); - double m_A57(0.0); - double m_A58(0.0); - double m_A59(0.0); - double m_A60(0.0); - m_A0 += gt[0]; - m_A0 += gt[1]; - m_A0 += gt[2]; - m_A0 += gt[3]; - m_A0 += gt[4]; - m_A0 += gt[5]; - m_A0 += gt[6]; - m_A1 += go[0]; - double RHS0 = Idr[0]; - RHS0 += Idr[1]; - RHS0 += Idr[2]; - RHS0 += Idr[3]; - RHS0 += Idr[4]; - RHS0 += Idr[5]; - RHS0 += Idr[6]; - RHS0 -= go[1] * *cnV[1]; - RHS0 -= go[2] * *cnV[2]; - RHS0 -= go[3] * *cnV[3]; - RHS0 -= go[4] * *cnV[4]; - RHS0 -= go[5] * *cnV[5]; - RHS0 -= go[6] * *cnV[6]; - m_A2 += gt[7]; - m_A2 += gt[8]; - m_A2 += gt[9]; - m_A4 += go[7]; - m_A3 += go[8]; - double RHS1 = Idr[7]; - RHS1 += Idr[8]; - RHS1 += Idr[9]; - RHS1 -= go[9] * *cnV[9]; - m_A5 += gt[10]; - m_A5 += gt[11]; - m_A5 += gt[12]; - m_A5 += gt[13]; - m_A5 += gt[14]; - m_A5 += gt[15]; - m_A5 += gt[16]; - m_A6 += go[10]; - double RHS2 = Idr[10]; - RHS2 += Idr[11]; - RHS2 += Idr[12]; - RHS2 += Idr[13]; - RHS2 += Idr[14]; - RHS2 += Idr[15]; - RHS2 += Idr[16]; - RHS2 -= go[11] * *cnV[11]; - RHS2 -= go[12] * *cnV[12]; - RHS2 -= go[13] * *cnV[13]; - RHS2 -= go[14] * *cnV[14]; - RHS2 -= go[15] * *cnV[15]; - RHS2 -= go[16] * *cnV[16]; - m_A7 += gt[17]; - m_A7 += gt[18]; - m_A7 += gt[19]; - m_A7 += gt[20]; - m_A8 += go[17]; - m_A10 += go[18]; - m_A9 += go[19]; - double RHS3 = Idr[17]; - RHS3 += Idr[18]; - RHS3 += Idr[19]; - RHS3 += Idr[20]; - RHS3 -= go[20] * *cnV[20]; - m_A13 += gt[21]; - m_A13 += gt[22]; - m_A13 += gt[23]; - m_A11 += go[21]; - double RHS4 = Idr[21]; - RHS4 += Idr[22]; - RHS4 += Idr[23]; - RHS4 -= go[22] * *cnV[22]; - RHS4 -= go[23] * *cnV[23]; - m_A16 += gt[24]; - m_A16 += gt[25]; - m_A16 += gt[26]; - m_A16 += gt[27]; - m_A16 += gt[28]; - m_A16 += gt[29]; - m_A16 += gt[30]; - m_A17 += go[24]; - double RHS5 = Idr[24]; - RHS5 += Idr[25]; - RHS5 += Idr[26]; - RHS5 += Idr[27]; - RHS5 += Idr[28]; - RHS5 += Idr[29]; - RHS5 += Idr[30]; - RHS5 -= go[25] * *cnV[25]; - RHS5 -= go[26] * *cnV[26]; - RHS5 -= go[27] * *cnV[27]; - RHS5 -= go[28] * *cnV[28]; - RHS5 -= go[29] * *cnV[29]; - RHS5 -= go[30] * *cnV[30]; - m_A18 += gt[31]; - m_A18 += gt[32]; - m_A18 += gt[33]; - m_A18 += gt[34]; - m_A18 += gt[35]; - m_A18 += gt[36]; - m_A18 += gt[37]; - m_A19 += go[31]; - double RHS6 = Idr[31]; - RHS6 += Idr[32]; - RHS6 += Idr[33]; - RHS6 += Idr[34]; - RHS6 += Idr[35]; - RHS6 += Idr[36]; - RHS6 += Idr[37]; - RHS6 -= go[32] * *cnV[32]; - RHS6 -= go[33] * *cnV[33]; - RHS6 -= go[34] * *cnV[34]; - RHS6 -= go[35] * *cnV[35]; - RHS6 -= go[36] * *cnV[36]; - RHS6 -= go[37] * *cnV[37]; - m_A20 += gt[38]; - m_A20 += gt[39]; - m_A20 += gt[40]; - m_A22 += go[38]; - m_A21 += go[39]; - double RHS7 = Idr[38]; - RHS7 += Idr[39]; - RHS7 += Idr[40]; - RHS7 -= go[40] * *cnV[40]; - m_A23 += gt[41]; - m_A23 += gt[42]; - m_A23 += gt[43]; - m_A23 += gt[44]; - m_A25 += go[41]; - m_A26 += go[42]; - m_A24 += go[43]; - double RHS8 = Idr[41]; - RHS8 += Idr[42]; - RHS8 += Idr[43]; - RHS8 += Idr[44]; - RHS8 -= go[44] * *cnV[44]; - m_A28 += gt[45]; - m_A28 += gt[46]; - m_A28 += gt[47]; - m_A30 += go[45]; - m_A27 += go[46]; - double RHS9 = Idr[45]; - RHS9 += Idr[46]; - RHS9 += Idr[47]; - RHS9 -= go[47] * *cnV[47]; - m_A37 += gt[48]; - m_A37 += gt[49]; - m_A37 += gt[50]; - m_A37 += gt[51]; - m_A37 += gt[52]; - m_A37 += gt[53]; - m_A37 += gt[54]; - m_A33 += go[48]; - m_A35 += go[49]; - m_A34 += go[50]; - m_A32 += go[51]; - m_A31 += go[52]; - double RHS10 = Idr[48]; - RHS10 += Idr[49]; - RHS10 += Idr[50]; - RHS10 += Idr[51]; - RHS10 += Idr[52]; - RHS10 += Idr[53]; - RHS10 += Idr[54]; - RHS10 -= go[53] * *cnV[53]; - RHS10 -= go[54] * *cnV[54]; - m_A43 += gt[55]; - m_A43 += gt[56]; - m_A43 += gt[57]; - m_A45 += go[55]; - m_A41 += go[56]; - double RHS11 = Idr[55]; - RHS11 += Idr[56]; - RHS11 += Idr[57]; - RHS11 -= go[57] * *cnV[57]; - m_A52 += gt[58]; - m_A52 += gt[59]; - m_A52 += gt[60]; - m_A52 += gt[61]; - m_A52 += gt[62]; - m_A52 += gt[63]; - m_A52 += gt[64]; - m_A52 += gt[65]; - m_A47 += go[58]; - m_A49 += go[59]; - m_A48 += go[60]; - m_A46 += go[61]; - double RHS12 = Idr[58]; - RHS12 += Idr[59]; - RHS12 += Idr[60]; - RHS12 += Idr[61]; - RHS12 += Idr[62]; - RHS12 += Idr[63]; - RHS12 += Idr[64]; - RHS12 += Idr[65]; - RHS12 -= go[62] * *cnV[62]; - RHS12 -= go[63] * *cnV[63]; - RHS12 -= go[64] * *cnV[64]; - RHS12 -= go[65] * *cnV[65]; - m_A60 += gt[66]; - m_A60 += gt[67]; - m_A60 += gt[68]; - m_A60 += gt[69]; - m_A60 += gt[70]; - m_A60 += gt[71]; - m_A60 += gt[72]; - m_A60 += gt[73]; - m_A54 += go[66]; - m_A58 += go[67]; - m_A56 += go[68]; - m_A55 += go[69]; - double RHS13 = Idr[66]; - RHS13 += Idr[67]; - RHS13 += Idr[68]; - RHS13 += Idr[69]; - RHS13 += Idr[70]; - RHS13 += Idr[71]; - RHS13 += Idr[72]; - RHS13 += Idr[73]; - RHS13 -= go[70] * *cnV[70]; - RHS13 -= go[71] * *cnV[71]; - RHS13 -= go[72] * *cnV[72]; - RHS13 -= go[73] * *cnV[73]; - const double f0 = 1.0 / m_A0; - const double f0_4 = -f0 * m_A11; - m_A12 += m_A1 * f0_4; - RHS4 += f0_4 * RHS0; - const double f1 = 1.0 / m_A2; - const double f1_4 = -f1 * m_A12; - m_A14 += m_A3 * f1_4; - m_A15 += m_A4 * f1_4; - RHS4 += f1_4 * RHS1; - const double f1_10 = -f1 * m_A31; - m_A37 += m_A3 * f1_10; - m_A39 += m_A4 * f1_10; - RHS10 += f1_10 * RHS1; - const double f1_12 = -f1 * m_A46; - m_A50 += m_A3 * f1_12; - m_A52 += m_A4 * f1_12; - RHS12 += f1_12 * RHS1; - const double f2 = 1.0 / m_A5; - const double f2_12 = -f2 * m_A47; - m_A49 += m_A6 * f2_12; - RHS12 += f2_12 * RHS2; - const double f3 = 1.0 / m_A7; - const double f3_9 = -f3 * m_A27; - m_A28 += m_A8 * f3_9; - m_A29 += m_A9 * f3_9; - m_A30 += m_A10 * f3_9; - RHS9 += f3_9 * RHS3; - const double f3_10 = -f3 * m_A32; - m_A36 += m_A8 * f3_10; - m_A37 += m_A9 * f3_10; - m_A39 += m_A10 * f3_10; - RHS10 += f3_10 * RHS3; - const double f3_12 = -f3 * m_A48; - m_A49 += m_A8 * f3_12; - m_A50 += m_A9 * f3_12; - m_A52 += m_A10 * f3_12; - RHS12 += f3_12 * RHS3; - const double f5 = 1.0 / m_A16; - const double f5_10 = -f5 * m_A33; - m_A34 += m_A17 * f5_10; - RHS10 += f5_10 * RHS5; - const double f6 = 1.0 / m_A18; - const double f6_13 = -f6 * m_A54; - m_A58 += m_A19 * f6_13; - RHS13 += f6_13 * RHS6; - const double f7 = 1.0 / m_A20; - const double f7_10 = -f7 * m_A34; - m_A37 += m_A21 * f7_10; - m_A40 += m_A22 * f7_10; - RHS10 += f7_10 * RHS7; - const double f7_13 = -f7 * m_A55; - m_A57 += m_A21 * f7_13; - m_A60 += m_A22 * f7_13; - RHS13 += f7_13 * RHS7; - const double f8 = 1.0 / m_A23; - const double f8_10 = -f8 * m_A35; - m_A37 += m_A24 * f8_10; - m_A38 += m_A25 * f8_10; - m_A40 += m_A26 * f8_10; - RHS10 += f8_10 * RHS8; - const double f8_11 = -f8 * m_A41; - m_A42 += m_A24 * f8_11; - m_A43 += m_A25 * f8_11; - m_A45 += m_A26 * f8_11; - RHS11 += f8_11 * RHS8; - const double f8_13 = -f8 * m_A56; - m_A57 += m_A24 * f8_13; - m_A58 += m_A25 * f8_13; - m_A60 += m_A26 * f8_13; - RHS13 += f8_13 * RHS8; - const double f9 = 1.0 / m_A28; - const double f9_10 = -f9 * m_A36; - m_A37 += m_A29 * f9_10; - m_A39 += m_A30 * f9_10; - RHS10 += f9_10 * RHS9; - const double f9_12 = -f9 * m_A49; - m_A50 += m_A29 * f9_12; - m_A52 += m_A30 * f9_12; - RHS12 += f9_12 * RHS9; - const double f10 = 1.0 / m_A37; - const double f10_11 = -f10 * m_A42; - m_A43 += m_A38 * f10_11; - m_A44 += m_A39 * f10_11; - m_A45 += m_A40 * f10_11; - RHS11 += f10_11 * RHS10; - const double f10_12 = -f10 * m_A50; - m_A51 += m_A38 * f10_12; - m_A52 += m_A39 * f10_12; - m_A53 += m_A40 * f10_12; - RHS12 += f10_12 * RHS10; - const double f10_13 = -f10 * m_A57; - m_A58 += m_A38 * f10_13; - m_A59 += m_A39 * f10_13; - m_A60 += m_A40 * f10_13; - RHS13 += f10_13 * RHS10; - const double f11 = 1.0 / m_A43; - const double f11_12 = -f11 * m_A51; - m_A52 += m_A44 * f11_12; - m_A53 += m_A45 * f11_12; - RHS12 += f11_12 * RHS11; - const double f11_13 = -f11 * m_A58; - m_A59 += m_A44 * f11_13; - m_A60 += m_A45 * f11_13; - RHS13 += f11_13 * RHS11; - const double f12 = 1.0 / m_A52; - const double f12_13 = -f12 * m_A59; - m_A60 += m_A53 * f12_13; - RHS13 += f12_13 * RHS12; - V[13] = RHS13 / m_A60; - double tmp12 = 0.0; - tmp12 += m_A53 * V[13]; - V[12] = (RHS12 - tmp12) / m_A52; - double tmp11 = 0.0; - tmp11 += m_A44 * V[12]; - tmp11 += m_A45 * V[13]; - V[11] = (RHS11 - tmp11) / m_A43; - double tmp10 = 0.0; - tmp10 += m_A38 * V[11]; - tmp10 += m_A39 * V[12]; - tmp10 += m_A40 * V[13]; - V[10] = (RHS10 - tmp10) / m_A37; - double tmp9 = 0.0; - tmp9 += m_A29 * V[10]; - tmp9 += m_A30 * V[12]; - V[9] = (RHS9 - tmp9) / m_A28; - double tmp8 = 0.0; - tmp8 += m_A24 * V[10]; - tmp8 += m_A25 * V[11]; - tmp8 += m_A26 * V[13]; - V[8] = (RHS8 - tmp8) / m_A23; - double tmp7 = 0.0; - tmp7 += m_A21 * V[10]; - tmp7 += m_A22 * V[13]; - V[7] = (RHS7 - tmp7) / m_A20; - double tmp6 = 0.0; - tmp6 += m_A19 * V[11]; - V[6] = (RHS6 - tmp6) / m_A18; - double tmp5 = 0.0; - tmp5 += m_A17 * V[7]; - V[5] = (RHS5 - tmp5) / m_A16; - double tmp4 = 0.0; - tmp4 += m_A14 * V[10]; - tmp4 += m_A15 * V[12]; - V[4] = (RHS4 - tmp4) / m_A13; - double tmp3 = 0.0; - tmp3 += m_A8 * V[9]; - tmp3 += m_A9 * V[10]; - tmp3 += m_A10 * V[12]; - V[3] = (RHS3 - tmp3) / m_A7; - double tmp2 = 0.0; - tmp2 += m_A6 * V[9]; - V[2] = (RHS2 - tmp2) / m_A5; - double tmp1 = 0.0; - tmp1 += m_A3 * V[10]; - tmp1 += m_A4 * V[12]; - V[1] = (RHS1 - tmp1) / m_A2; - double tmp0 = 0.0; - tmp0 += m_A1 * V[1]; - V[0] = (RHS0 - tmp0) / m_A0; -} - // spacfury static void nl_gcr_b1db23287df1da54_175_double_double(double * __restrict V, const double * __restrict go, const double * __restrict gt, const double * __restrict Idr, const double * const * __restrict cnV) @@ -72871,8 +72353,6 @@ const plib::dynlib_static_sym nl_static_solver_syms[] = { {"nl_gcr_144ed14e6bafdb_119_double_double", reinterpret_cast<void *>(&nl_gcr_144ed14e6bafdb_119_double_double)}, // spacewar {"nl_gcr_15e8f6fb021de0f9_28_double_double", reinterpret_cast<void *>(&nl_gcr_15e8f6fb021de0f9_28_double_double)}, -// armora - {"nl_gcr_1692de755a535408_9_double_double", reinterpret_cast<void *>(&nl_gcr_1692de755a535408_9_double_double)}, // dpatrol {"nl_gcr_18f4d9160b51d613_20_double_double", reinterpret_cast<void *>(&nl_gcr_18f4d9160b51d613_20_double_double)}, // starhawk @@ -73101,8 +72581,6 @@ const plib::dynlib_static_sym nl_static_solver_syms[] = { {"nl_gcr_afce66fb47d3c5f3_62_double_double", reinterpret_cast<void *>(&nl_gcr_afce66fb47d3c5f3_62_double_double)}, // spacewar {"nl_gcr_b09deef9a25aecaf_24_double_double", reinterpret_cast<void *>(&nl_gcr_b09deef9a25aecaf_24_double_double)}, -// astrob - {"nl_gcr_b19a63ae17435486_61_double_double", reinterpret_cast<void *>(&nl_gcr_b19a63ae17435486_61_double_double)}, // spacfury {"nl_gcr_b1db23287df1da54_175_double_double", reinterpret_cast<void *>(&nl_gcr_b1db23287df1da54_175_double_double)}, // segaspeech diff --git a/src/lib/netlist/nl_errstr.h b/src/lib/netlist/nl_errstr.h index 4b44fb7b963..f60287e7a2d 100644 --- a/src/lib/netlist/nl_errstr.h +++ b/src/lib/netlist/nl_errstr.h @@ -150,6 +150,17 @@ namespace netlist PERRMSGV(MI_NO_SPECIFIC_SOLVER, 1, "No specific solver found for netlist of size {1}") PERRMSGV(MW_SOLVER_METHOD_NOT_SUPPORTED, 2, "Solver method {1} not supported. Falling back to {2}") + PERRMSGV(ME_SOLVER_CONSISTENCY_NOT_ANALOG_NET, 1, "Solver consistency: {1} is not an analog net") + PERRMSGV(ME_SOLVER_CONSISTENCY_RAIL_NET, 1, "Solver consistency: {1} is a rail net") + PERRMSGV(ME_SOLVER_TERMINAL_NO_NET, 1, "Solver consistency: Terminal {1} has no net") + PERRMSGV(ME_SOLVER_NO_RAIL_TERMINAL, 1, "Solver consistency: No rail terminals in group with nets: {1}\n" + "At least one rail terminal (like ANALOG_INPUT) needs to be part of a group of nets\n" + "solved by a solver. Without a singular matrix would be created\n" + "which has the potential to cause a crash now or in the future.\n" + "A common cause of this error are BJT or FET devices which\n" + "are defined but not used in the netlist.") + PERRMSGV(MF_SOLVER_CONSISTENCY_ERRORS, 1, "Found {1} errors during solver consistency test") + // nld_mm5837.cpp PERRMSGV(MW_FREQUENCY_OUTSIDE_OF_SPECS_1, 1, "MM5837: Frequency outside of specs: {1}") diff --git a/src/lib/netlist/solver/nld_solver.cpp b/src/lib/netlist/solver/nld_solver.cpp index a9ff476728d..cd669256608 100644 --- a/src/lib/netlist/solver/nld_solver.cpp +++ b/src/lib/netlist/solver/nld_solver.cpp @@ -3,6 +3,7 @@ #include "nl_factory.h" +#include "nl_errstr.h" #include "core/setup.h" #include "nl_setup.h" // FIXME: only needed for splitter code #include "nld_matrix_solver.h" @@ -380,9 +381,55 @@ namespace devices net_splitter splitter; splitter.run(state()); + log().verbose("Found {1} net groups in {2} nets\n", splitter.groups.size(), state().nets().size()); + + int num_errors = 0; + + log().verbose("checking net consistency ..."); + for (const auto &grp : splitter.groups) + { + int railterms = 0; + pstring nets_in_grp; + for (const auto &n : grp) + { + nets_in_grp += (n->name() + " "); + if (!n->is_analog()) + { + state().log().error(ME_SOLVER_CONSISTENCY_NOT_ANALOG_NET(n->name())); + num_errors++; + } + if (n->is_rail_net()) + { + state().log().error(ME_SOLVER_CONSISTENCY_RAIL_NET(n->name())); + num_errors++; + } + for (const auto &t : n->core_terms()) + { + if (!t->has_net()) + { + state().log().error(ME_SOLVER_TERMINAL_NO_NET(t->name())); + num_errors++; + } + else + { + auto *otherterm = dynamic_cast<terminal_t *>(t); + if (otherterm != nullptr) + if (state().setup().get_connected_terminal(*otherterm)->net().is_rail_net()) + railterms++; + } + } + } + if (railterms == 0) + { + state().log().error(ME_SOLVER_NO_RAIL_TERMINAL(nets_in_grp)); + num_errors++; + } + } + if (num_errors > 0) + throw nl_exception(MF_SOLVER_CONSISTENCY_ERRORS(num_errors)); + // setup the solvers - log().verbose("Found {1} net groups in {2} nets\n", splitter.groups.size(), state().nets().size()); for (auto & grp : splitter.groups) { solver_ptr ms; diff --git a/src/mame/audio/nl_armora.cpp b/src/mame/audio/nl_armora.cpp index 53b102be96b..05775622295 100644 --- a/src/mame/audio/nl_armora.cpp +++ b/src/mame/audio/nl_armora.cpp @@ -224,7 +224,7 @@ NETLIST_START(armora) D_1N914(D8) - Q_2N3904(Q1) // NPN +// Q_2N3904(Q1) // NPN -- not used Q_2N3906(Q2) // PNP Q_2N3906(Q3) // PNP Q_2N3906(Q4) // PNP diff --git a/src/mame/audio/nl_barrier.cpp b/src/mame/audio/nl_barrier.cpp index edd7c3d71a3..929e666eb08 100644 --- a/src/mame/audio/nl_barrier.cpp +++ b/src/mame/audio/nl_barrier.cpp @@ -123,11 +123,13 @@ NETLIST_START(barrier) D_1N914(CR5) D_1N914(CR6) +#if !(HLE_NOISE_GEN) Q_2N3906(Q1) // PNP Q_2N3904(Q2) // NPN +#endif Q_2N6426(Q3) // NPN Darlington - Q_2N6292(Q4) // NPN - Q_2N6107(Q5) // PNP +// Q_2N6292(Q4) // NPN -- not used +// Q_2N6107(Q5) // PNP -- not used Q_2N6426(Q6) // NPN Darlington Q_2N3904(Q7) // NPN diff --git a/src/mame/audio/nl_boxingb.cpp b/src/mame/audio/nl_boxingb.cpp index 39be6050b19..78f7bbac761 100644 --- a/src/mame/audio/nl_boxingb.cpp +++ b/src/mame/audio/nl_boxingb.cpp @@ -362,31 +362,41 @@ NETLIST_START(boxingb) Q_2N3906(Q3) // PNP Q_2N3906(Q4) // PNP Q_2N3904(Q5) // NPN +#if !(HLE_CHIRPING_VCO) Q_2N3904(Q6) // NPN +#endif Q_2N3906(Q7) // PNP Q_2N3904(Q8) // NPN +#if !(HLE_DYING_BUG_VCO) Q_2N3904(Q9) // NPN +#endif Q_2N3906(Q10) // PNP Q_2N3904(Q11) // NPN +#if !(HLE_CRACKING_VCO) Q_2N3904(Q12) // NPN +#endif Q_2N3906(Q13) // PNP Q_2N3904(Q14) // NPN +#if !(HLE_BEETLE_VCO) Q_2N3904(Q15) // NPN +#endif Q_2N3906(Q16) // PNP Q_2N3904(Q17) // NPN Q_2N3906(Q18) // PNP Q_2N3906(Q19) // PNP Q_2N3906(Q20) // PNP Q_2N3904(Q21) // NPN +#if !(HLE_CANNON_VCO) Q_2N3904(Q22) // NPN +#endif Q_2N3906(Q23) // PNP Q_2N3906(Q24) // PNP Q_2N3906(Q25) // PNP Q_2N3906(Q26) // PNP // Q_2N6292(Q27) // PNP -- part of final amp (not emulated) // Q_2N6107(Q28) // NPN -- part of final amp (not emulated) - Q_2N5210(Q29) // NPN - Q_2N5210(Q30) // NPN +// Q_2N5210(Q29) // NPN -- not used +// Q_2N5210(Q30) // NPN -- not used Q_2N3906(Q31) // PNP Q_2N3906(Q32) // PNP Q_2N3906(Q33) // PNP diff --git a/src/mame/audio/nl_ripoff.cpp b/src/mame/audio/nl_ripoff.cpp index 84ccfea212a..60e525cb615 100644 --- a/src/mame/audio/nl_ripoff.cpp +++ b/src/mame/audio/nl_ripoff.cpp @@ -239,9 +239,15 @@ NETLIST_START(ripoff) Q_2N3906(Q5) // PNP // Q_2N6292(Q6) // PNP -- part of final amp (not emulated) // Q_2N6107(Q7) // PNP -- part of final amp (not emulated) +#if !(HLE_LASER_VCO) Q_2N3904(Q8) // NPN +#endif +#if !(HLE_TORPEDO_VCO) Q_2N3904(Q9) // NPN +#endif +#if !(HLE_BACKGROUND_VCOS) Q_2N3904(Q10) // NPN +#endif AMI_S2688(IC1) // Noise generator diff --git a/src/mame/audio/nl_solarq.cpp b/src/mame/audio/nl_solarq.cpp index be6ef4bca6f..ec7795e1cfa 100644 --- a/src/mame/audio/nl_solarq.cpp +++ b/src/mame/audio/nl_solarq.cpp @@ -298,7 +298,9 @@ NETLIST_START(solarq) Q_2N3906(Q10) // PNP Q_2N3906(Q11) // PNP Q_2N3904(Q12) // NPN +#if !(HLE_CAPTURE_VCO) Q_2N3904(Q13) // NPN +#endif Q_2N3906(Q14) // PNP Q_2N3906(Q15) // PNP Q_2N3906(Q16) // PNP diff --git a/src/mame/audio/nl_spacewar.cpp b/src/mame/audio/nl_spacewar.cpp index 778906b31ad..1d1d9e7df40 100644 --- a/src/mame/audio/nl_spacewar.cpp +++ b/src/mame/audio/nl_spacewar.cpp @@ -128,11 +128,13 @@ NETLIST_START(spacewar) D_1N914(CR5) D_1N914(CR6) +#if !(HLE_NOISE_GEN) Q_2N3906(Q1) // PNP Q_2N3904(Q2) // NPN +#endif Q_2N6426(Q3) // NPN Darlington - Q_2N6292(Q4) // NPN - Q_2N6107(Q5) // PNP +// Q_2N6292(Q4) // NPN -- not used +// Q_2N6107(Q5) // PNP -- not used Q_2N6426(Q6) // NPN Darlington Q_2N3904(Q7) // NPN diff --git a/src/mame/audio/nl_starcas.cpp b/src/mame/audio/nl_starcas.cpp index fd6dee8d968..1792217fd01 100644 --- a/src/mame/audio/nl_starcas.cpp +++ b/src/mame/audio/nl_starcas.cpp @@ -281,11 +281,15 @@ NETLIST_START(wotw) D_1N914B(D9) D_1N914B(D10) +#if !(HLE_BACKGROUND_VCO) Q_2N3904(Q1) // NPN +#endif Q_2N3904(Q2) // NPN Q_2N3906(Q3) // PNP Q_2N3904(Q4) // NPN +#if !(HLE_LASER_VCO) Q_2N3904(Q5) // NPN +#endif Q_2N3906(Q6) // PNP Q_2N3906(Q7) // PNP Q_2N3906(Q8) // PNP diff --git a/src/mame/audio/nl_tailg.cpp b/src/mame/audio/nl_tailg.cpp index fab4b88bf9c..63c01ae4cf7 100644 --- a/src/mame/audio/nl_tailg.cpp +++ b/src/mame/audio/nl_tailg.cpp @@ -204,8 +204,8 @@ NETLIST_START(tailg) D_1N914(D8) D_1N914(D9) - Q_2N3904(Q1) // NPN - Q_2N3904(Q2) // NPN +// Q_2N3904(Q1) // NPN -- not used +// Q_2N3904(Q2) // NPN -- not used Q_2N3906(Q3) // PNP Q_2N3906(Q4) // PNP Q_2N3906(Q5) // PNP diff --git a/src/mame/audio/nl_warrior.cpp b/src/mame/audio/nl_warrior.cpp index d5403559420..cd439d0fff4 100644 --- a/src/mame/audio/nl_warrior.cpp +++ b/src/mame/audio/nl_warrior.cpp @@ -168,7 +168,9 @@ NETLIST_START(warrior) Q_2N3906(Q2) // PNP Q_2N3906(Q3) // PNP Q_2N3906(Q4) // PNP +#if !(HLE_PITFALL_VCO) Q_2N3904(Q5) // NPN +#endif // Q_2N5878(Q6) // NPN -- part of final amp (not emulated) // Q_2N5876(Q7) // PNP -- part of final amp (not emulated) diff --git a/src/mame/machine/nl_tank.cpp b/src/mame/machine/nl_tank.cpp index 152d7fe01d3..3885aa7a0fd 100644 --- a/src/mame/machine/nl_tank.cpp +++ b/src/mame/machine/nl_tank.cpp @@ -230,14 +230,15 @@ NETLIST_START(tank) QBJT_EB(Q4, "2N3643") QBJT_EB(Q6, "2N3644") QBJT_EB(Q7, "2N3644") - QBJT_EB(Q27, "2N3643") - QBJT_EB(Q28, "2N3644") - QBJT_EB(Q29, "2N3643") - QBJT_EB(Q30, "2N3644") - QBJT_EB(Q31, "2N3643") - QBJT_EB(Q32, "2N3644") - QBJT_EB(Q33, "2N3643") - QBJT_EB(Q34, "2N3644") +// Currently not used +// QBJT_EB(Q27, "2N3643") +// QBJT_EB(Q28, "2N3644") +// QBJT_EB(Q29, "2N3643") +// QBJT_EB(Q30, "2N3644") +// QBJT_EB(Q31, "2N3643") +// QBJT_EB(Q32, "2N3644") +// QBJT_EB(Q33, "2N3643") +// QBJT_EB(Q34, "2N3644") TTL_7404_DIP(IC_H3) TTL_7400_DIP(IC_B6) |