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.
This commit is contained in:
couriersud 2020-09-28 22:00:34 +02:00
parent c93702f9a3
commit 2f73dca6e6
13 changed files with 105 additions and 540 deletions

View File

@ -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

View File

@ -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}")

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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)