From 43c6cad7dd2133a4597a909a24c7d4fbee7e6e05 Mon Sep 17 00:00:00 2001 From: couriersud Date: Sun, 17 Mar 2019 15:09:49 +0100 Subject: netlist: Add UJT example for 2N6027. --- nl_examples/2N6027.cpp | 101 +++++++++++++++++++++++++++++++++++++++++++ src/lib/netlist/nl_setup.cpp | 1 + 2 files changed, 102 insertions(+) create mode 100644 nl_examples/2N6027.cpp diff --git a/nl_examples/2N6027.cpp b/nl_examples/2N6027.cpp new file mode 100644 index 00000000000..47903706cb2 --- /dev/null +++ b/nl_examples/2N6027.cpp @@ -0,0 +1,101 @@ +// license:GPL-2.0+ +// copyright-holders:Couriersud + +#include "netlist/devices/net_lib.h" + +/* + * Run with + * ./nltool -t 1 -f nl_examples/2N6027.cpp -l PUT.A -l PUT.K -l PUT.G -v + */ + +/* ---------------------------------------------------------------------------- + * Library section header START + * ---------------------------------------------------------------------------*/ + +#ifndef __PLIB_PREPROCESSOR__ + +#define PUT_2N6027(_name) \ + NET_REGISTER_DEV(G501534_DIP, _name) + +//NETLIST_EXTERNAL(ex2N6027) +NETLIST_EXTERNAL(loc_lib) + +#endif + +/* ---------------------------------------------------------------------------- + * Library section header END + * ---------------------------------------------------------------------------*/ + +NETLIST_START(ex2N6027) + + /* This is a circuit pushing the solvers to the limits + * 50,000 maximum NR loops. + */ + SOLVER(Solver, 48000) + PARAM(Solver.ACCURACY, 1e-5) + PARAM(Solver.DYNAMIC_TS, 1) + PARAM(Solver.DYNAMIC_MIN_TIMESTEP, 1e-9) + PARAM(Solver.NR_LOOPS, 50000) + PARAM(Solver.METHOD, "MAT_CR") + + LOCAL_SOURCE(loc_lib) + INCLUDE(loc_lib) + + ANALOG_INPUT(VB, 10) + + PUT_2N6027(PUT) + + // Figure 3 from datasheet + RES(R1, RES_K(510)) + RES(R2, RES_K(16)) + RES(R3, RES_K(27)) + RES(R4, 20) + CAP(C, CAP_U(0.1)) + + NET_C(VB, R1.1, R2.1) + NET_C(R1.2, C.1, PUT.A) + NET_C(PUT.K, R4.1) + NET_C(PUT.G, R2.2, R3.1) + + NET_C(GND, C.2, R4.2, R3.2) + +NETLIST_END() + + +NETLIST_START(PUT_2N6027) + + NET_MODEL("2N6027_NPN NPN(IS=5E-15 VAF=100 IKF=0.3 ISE=1.85E-12 NE=1.45 RE=0.15 RC=0.15 CJE=7E-10 TF=0.6E-8 CJC=2.2E-10 TR=4.76E-8 XTB=3)") + NET_MODEL("2N6027_PNP PNP(IS=2E-15 VAF=100 IKF=0.3 ISE=1.90E-12 NE=1.5 RE=0.15 RC=0.15 CJE=7E-10 TF=1.6E-8 CJC=2.2E-10 TR=5.1E-8 XTB=3)") + + QBJT_EB(Q1, "2N6027_NPN") + QBJT_EB(Q2, "2N6027_PNP") + + /* The netlist transistor model currently doesn't support + * BE and BC capacitances. + * Adding those here significantly reduces NR loops. + * FIXME: Needs to be removed when added to the + * transistor EB model. + */ +#if 1 + CAP(CJE1, CAP_N(1)) + CAP(CJE2, CAP_N(1)) + + NET_C(CJE1.1, Q1.B) + NET_C(CJE1.2, Q1.E) + NET_C(CJE2.1, Q2.B) + NET_C(CJE2.2, Q2.E) +#endif + NET_C(Q1.C, Q2.B) + NET_C(Q1.B, Q2.C) + + ALIAS(G, Q2.B) + ALIAS(A, Q2.E) + ALIAS(K, Q1.E) + +NETLIST_END() + +NETLIST_START(loc_lib) + + LOCAL_LIB_ENTRY(PUT_2N6027) + +NETLIST_END() diff --git a/src/lib/netlist/nl_setup.cpp b/src/lib/netlist/nl_setup.cpp index a2f9dece076..5a375b92560 100644 --- a/src/lib/netlist/nl_setup.cpp +++ b/src/lib/netlist/nl_setup.cpp @@ -914,6 +914,7 @@ nl_double setup_t::model_value(detail::model_map_t &map, const pstring &entity) if (factor != plib::constants::one()) tmp = plib::left(tmp, tmp.size() - 1); // FIXME: check for errors + //printf("%s %s %e %e\n", entity.c_str(), tmp.c_str(), plib::pstonum(tmp), factor); return plib::pstonum(tmp) * factor; } -- cgit v1.2.3