LCOV - code coverage report
Current view: top level - src/components/devices - jfet.cpp (source / functions) Hit Total Coverage
Test: qucs-core-0.0.19 Code Coverage Lines: 163 237 68.8 %
Date: 2015-01-05 16:01:02 Functions: 10 18 55.6 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 36 142 25.4 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * jfet.cpp - jfet class implementation
       3                 :            :  *
       4                 :            :  * Copyright (C) 2004, 2005, 2006, 2008 Stefan Jahn <stefan@lkcc.org>
       5                 :            :  *
       6                 :            :  * This is free software; you can redistribute it and/or modify
       7                 :            :  * it under the terms of the GNU General Public License as published by
       8                 :            :  * the Free Software Foundation; either version 2, or (at your option)
       9                 :            :  * any later version.
      10                 :            :  *
      11                 :            :  * This software is distributed in the hope that it will be useful,
      12                 :            :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      13                 :            :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14                 :            :  * GNU General Public License for more details.
      15                 :            :  *
      16                 :            :  * You should have received a copy of the GNU General Public License
      17                 :            :  * along with this package; see the file COPYING.  If not, write to
      18                 :            :  * the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
      19                 :            :  * Boston, MA 02110-1301, USA.
      20                 :            :  *
      21                 :            :  * $Id$
      22                 :            :  *
      23                 :            :  */
      24                 :            : 
      25                 :            : #if HAVE_CONFIG_H
      26                 :            : # include <config.h>
      27                 :            : #endif
      28                 :            : 
      29                 :            : #include "component.h"
      30                 :            : #include "device.h"
      31                 :            : #include "jfet.h"
      32                 :            : 
      33                 :            : #define NODE_G 0 /* gate node   */
      34                 :            : #define NODE_D 1 /* drain node  */
      35                 :            : #define NODE_S 2 /* source node */
      36                 :            : 
      37                 :            : using namespace qucs;
      38                 :            : using namespace qucs::device;
      39                 :            : 
      40                 :          1 : jfet::jfet () : circuit (3) {
      41                 :          1 :   rs = rd = NULL;
      42                 :          1 :   type = CIR_JFET;
      43                 :          1 : }
      44                 :            : 
      45                 :          0 : void jfet::calcSP (nr_double_t frequency) {
      46 [ #  # ][ #  # ]:          0 :   setMatrixS (ytos (calcMatrixY (frequency)));
         [ #  # ][ #  # ]
                 [ #  # ]
      47                 :          0 : }
      48                 :            : 
      49                 :          0 : matrix jfet::calcMatrixY (nr_double_t frequency) {
      50                 :            : 
      51                 :            :   // fetch computed operating points
      52         [ #  # ]:          0 :   nr_double_t Cgd = getOperatingPoint ("Cgd");
      53         [ #  # ]:          0 :   nr_double_t Cgs = getOperatingPoint ("Cgs");
      54         [ #  # ]:          0 :   nr_double_t ggs = getOperatingPoint ("ggs");
      55         [ #  # ]:          0 :   nr_double_t ggd = getOperatingPoint ("ggd");
      56         [ #  # ]:          0 :   nr_double_t gds = getOperatingPoint ("gds");
      57         [ #  # ]:          0 :   nr_double_t gm  = getOperatingPoint ("gm");
      58                 :            : 
      59                 :            :   // compute the models admittances
      60                 :          0 :   nr_complex_t Ygd = nr_complex_t (ggd, 2.0 * M_PI * frequency * Cgd);
      61                 :          0 :   nr_complex_t Ygs = nr_complex_t (ggs, 2.0 * M_PI * frequency * Cgs);
      62                 :          0 :   nr_complex_t Yds = gds;
      63                 :            : 
      64                 :            :   // build admittance matrix and convert it to S-parameter matrix
      65         [ #  # ]:          0 :   matrix y (3);
      66 [ #  # ][ #  # ]:          0 :   y.set (NODE_G, NODE_G, Ygd + Ygs);
      67         [ #  # ]:          0 :   y.set (NODE_G, NODE_D, -Ygd);
      68         [ #  # ]:          0 :   y.set (NODE_G, NODE_S, -Ygs);
      69         [ #  # ]:          0 :   y.set (NODE_D, NODE_G, gm - Ygd);
      70 [ #  # ][ #  # ]:          0 :   y.set (NODE_D, NODE_D, Ygd + Yds);
      71         [ #  # ]:          0 :   y.set (NODE_D, NODE_S, -Yds - gm);
      72         [ #  # ]:          0 :   y.set (NODE_S, NODE_G, -Ygs - gm);
      73         [ #  # ]:          0 :   y.set (NODE_S, NODE_D, -Yds);
      74 [ #  # ][ #  # ]:          0 :   y.set (NODE_S, NODE_S, Ygs + Yds + gm);
      75                 :          0 :   return y;
      76                 :            : }
      77                 :            : 
      78                 :          0 : void jfet::calcNoiseSP (nr_double_t frequency) {
      79 [ #  # ][ #  # ]:          0 :   setMatrixN (cytocs (calcMatrixCy (frequency) * z0, getMatrixS ()));
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
      80                 :          0 : }
      81                 :            : 
      82                 :          0 : matrix jfet::calcMatrixCy (nr_double_t frequency) {
      83                 :            :   /* get operating points and noise properties */
      84                 :          0 :   nr_double_t Kf  = getPropertyDouble ("Kf");
      85                 :          0 :   nr_double_t Af  = getPropertyDouble ("Af");
      86                 :          0 :   nr_double_t Ffe = getPropertyDouble ("Ffe");
      87                 :          0 :   nr_double_t gm  = fabs (getOperatingPoint ("gm"));
      88                 :          0 :   nr_double_t Ids = fabs (getOperatingPoint ("Id"));
      89                 :          0 :   nr_double_t T   = getPropertyDouble ("Temp");
      90                 :            : 
      91                 :            :   /* compute channel noise and flicker noise generated by the DC
      92                 :            :      transconductance and current flow from drain to source */
      93                 :            :   nr_double_t i = 8 * kelvin (T) / T0 * gm / 3 +
      94                 :          0 :     Kf * qucs::pow (Ids, Af) / qucs::pow (frequency, Ffe) / kB / T0;
      95                 :            : 
      96                 :            :   /* build noise current correlation matrix and convert it to
      97                 :            :      noise-wave correlation matrix */
      98                 :          0 :   matrix cy = matrix (3);
      99         [ #  # ]:          0 :   cy.set (NODE_D, NODE_D, +i);
     100         [ #  # ]:          0 :   cy.set (NODE_S, NODE_S, +i);
     101         [ #  # ]:          0 :   cy.set (NODE_D, NODE_S, -i);
     102         [ #  # ]:          0 :   cy.set (NODE_S, NODE_D, -i);
     103                 :          0 :   return cy;
     104                 :            : }
     105                 :            : 
     106                 :          2 : void jfet::initModel (void) {
     107                 :            :   // fetch necessary device properties
     108                 :          2 :   nr_double_t T  = getPropertyDouble ("Temp");
     109                 :          2 :   nr_double_t Tn = getPropertyDouble ("Tnom");
     110                 :          2 :   nr_double_t A  = getPropertyDouble ("Area");
     111                 :            : 
     112                 :            :   // compute Is temperature and area dependency
     113                 :          2 :   nr_double_t Is  = getPropertyDouble ("Is");
     114                 :          2 :   nr_double_t N   = getPropertyDouble ("N");
     115                 :          2 :   nr_double_t Xti = getPropertyDouble ("Xti");
     116                 :            :   nr_double_t T1, T2, Eg;
     117                 :          2 :   T2 = kelvin (T);
     118                 :          2 :   T1 = kelvin (Tn);
     119                 :          2 :   Eg = Egap (300);
     120                 :          2 :   Is = pnCurrent_T (T1, T2, Is, Eg, N, Xti);
     121                 :          2 :   setScaledProperty ("Is", Is * A);
     122                 :            : 
     123                 :            :   // compute Isr temperature and area dependency
     124                 :          2 :   nr_double_t Isr = getPropertyDouble ("Isr");
     125                 :          2 :   nr_double_t Nr  = getPropertyDouble ("Nr");
     126                 :          2 :   Isr = pnCurrent_T (T1, T2, Isr, Eg, Nr, Xti);
     127                 :          2 :   setScaledProperty ("Isr", Isr * A);
     128                 :            : 
     129                 :            :   // compute Pb temperature dependency
     130                 :          2 :   nr_double_t Pb = getPropertyDouble ("Pb");
     131                 :            :   nr_double_t PbT;
     132                 :          2 :   PbT = pnPotential_T (T1,T2, Pb);
     133                 :          2 :   setScaledProperty ("Pb", PbT);
     134                 :            : 
     135                 :            :   // compute Cgs and Cgd temperature and area dependency
     136                 :          2 :   nr_double_t Cgs = getPropertyDouble ("Cgs");
     137                 :          2 :   nr_double_t Cgd = getPropertyDouble ("Cgd");
     138                 :          2 :   nr_double_t M   = getPropertyDouble ("M");
     139                 :            :   nr_double_t F;
     140                 :          2 :   F = A * pnCapacitance_F (T1, T2, M, PbT / Pb);
     141                 :          2 :   setScaledProperty ("Cgs", Cgs * F);
     142                 :          2 :   setScaledProperty ("Cgd", Cgd * F);
     143                 :            : 
     144                 :            :   // compute Vth temperature dependency
     145                 :          2 :   nr_double_t Vt0   = getPropertyDouble ("Vt0");
     146                 :          2 :   nr_double_t Vt0tc = getPropertyDouble ("Vt0tc");
     147                 :          2 :   nr_double_t DT    = T2 - T1;
     148                 :          2 :   Vt0 = Vt0 + Vt0tc * DT;
     149                 :          2 :   setScaledProperty ("Vt0", Vt0);
     150                 :            : 
     151                 :            :   // compute Beta temperature and area dependency
     152                 :          2 :   nr_double_t Beta    = getPropertyDouble ("Beta");
     153                 :          2 :   nr_double_t Betatce = getPropertyDouble ("Betatce");
     154                 :          2 :   Beta = Beta * qucs::exp (Betatce * DT * qucs::log (1.01));
     155                 :          2 :   setScaledProperty ("Beta", Beta * A);
     156                 :            : 
     157                 :            :   // compute Rs and Rd area dependency
     158                 :          2 :   nr_double_t Rs = getPropertyDouble ("Rs");
     159                 :          2 :   nr_double_t Rd = getPropertyDouble ("Rd");
     160                 :          2 :   setScaledProperty ("Rs", Rs / A);
     161                 :          2 :   setScaledProperty ("Rd", Rd / A);
     162                 :          2 : }
     163                 :            : 
     164                 :        300 : void jfet::restartDC (void) {
     165                 :            :   // apply starting values to previous iteration values
     166 [ +  - ][ +  - ]:        300 :   UgdPrev = real (getV (NODE_G) - getV (NODE_D));
     167 [ +  - ][ +  - ]:        300 :   UgsPrev = real (getV (NODE_G) - getV (NODE_S));
     168                 :        300 : }
     169                 :            : 
     170                 :          2 : void jfet::initDC (void) {
     171                 :            : 
     172                 :            :   // allocate MNA matrices
     173                 :          2 :   allocMatrixMNA ();
     174                 :            : 
     175                 :            :   // initialize scalability
     176                 :          2 :   initModel ();
     177                 :            : 
     178                 :            :   // initialize starting values
     179                 :          2 :   restartDC ();
     180                 :            : 
     181                 :            :   // apply polarity of JFET
     182                 :          2 :   const char * const type = getPropertyString ("Type");
     183         [ -  + ]:          2 :   pol = !strcmp (type, "pfet") ? -1 : 1;
     184                 :            : 
     185                 :            :   // get device temperature
     186                 :          2 :   nr_double_t T = getPropertyDouble ("Temp");
     187                 :            : 
     188                 :            :   // possibly insert series resistance at source
     189                 :          2 :   nr_double_t Rs = getScaledProperty ("Rs");
     190         [ -  + ]:          2 :   if (Rs != 0.0) {
     191                 :            :     // create additional circuit if necessary and reassign nodes
     192                 :          0 :     rs = splitResistor (this, rs, "Rs", "source", NODE_S);
     193                 :          0 :     rs->setProperty ("Temp", T);
     194                 :          0 :     rs->setProperty ("R", Rs);
     195                 :          0 :     rs->setProperty ("Controlled", getName ());
     196                 :          0 :     rs->initDC ();
     197                 :            :   }
     198                 :            :   // no series resistance at source
     199                 :            :   else {
     200                 :          2 :     disableResistor (this, rs, NODE_S);
     201                 :            :   }
     202                 :            : 
     203                 :            :   // possibly insert series resistance at drain
     204                 :          2 :   nr_double_t Rd = getScaledProperty ("Rd");
     205         [ -  + ]:          2 :   if (Rd != 0.0) {
     206                 :            :     // create additional circuit if necessary and reassign nodes
     207                 :          0 :     rd = splitResistor (this, rd, "Rd", "drain", NODE_D);
     208                 :          0 :     rd->setProperty ("Temp", T);
     209                 :          0 :     rd->setProperty ("R", Rd);
     210                 :          0 :     rd->setProperty ("Controlled", getName ());
     211                 :          0 :     rd->initDC ();
     212                 :            :   }
     213                 :            :   // no series resistance at drain
     214                 :            :   else {
     215                 :          2 :     disableResistor (this, rd, NODE_D);
     216                 :            :   }
     217                 :          2 : }
     218                 :            : 
     219                 :       2413 : void jfet::calcDC (void) {
     220                 :            : 
     221                 :            :   // fetch device model parameters
     222                 :       2413 :   nr_double_t Is   = getScaledProperty ("Is");
     223                 :       2413 :   nr_double_t n    = getPropertyDouble ("N");
     224                 :       2413 :   nr_double_t Isr  = getScaledProperty ("Isr");
     225                 :       2413 :   nr_double_t nr   = getPropertyDouble ("Nr");
     226                 :       2413 :   nr_double_t Vt0  = getScaledProperty ("Vt0");
     227                 :       2413 :   nr_double_t l    = getPropertyDouble ("Lambda");
     228                 :       2413 :   nr_double_t beta = getScaledProperty ("Beta");
     229                 :       2413 :   nr_double_t T    = getPropertyDouble ("Temp");
     230                 :            : 
     231                 :            :   nr_double_t Ut, IeqG, IeqD, IeqS, UgsCrit, UgdCrit;
     232                 :            :   nr_double_t Igs, Igd, gtiny;
     233                 :            : 
     234                 :       2413 :   T = kelvin (T);
     235                 :       2413 :   Ut = T * kBoverQ;
     236 [ +  - ][ +  - ]:       2413 :   Ugd = real (getV (NODE_G) - getV (NODE_D)) * pol;
     237 [ +  - ][ +  - ]:       2413 :   Ugs = real (getV (NODE_G) - getV (NODE_S)) * pol;
     238                 :            : 
     239                 :            :   // critical voltage necessary for bad start values
     240                 :       2413 :   UgsCrit = pnCriticalVoltage (Is, Ut * n);
     241                 :       2413 :   UgdCrit = pnCriticalVoltage (Is, Ut * n);
     242                 :       2413 :   UgsPrev = Ugs = pnVoltage (Ugs, UgsPrev, Ut * n, UgsCrit);
     243                 :       2413 :   UgdPrev = Ugd = pnVoltage (Ugd, UgdPrev, Ut * n, UgdCrit);
     244                 :            : 
     245                 :       2413 :   Uds = Ugs - Ugd;
     246                 :            : 
     247                 :            :   // gate-source diode
     248         [ +  + ]:       2413 :   gtiny = Ugs < - 10 * Ut * n ? (Is + Isr) : 0;
     249                 :       2413 :   ggs = pnConductance (Ugs, Is, Ut * n) +
     250                 :       2413 :     pnConductance (Ugs, Isr, Ut * nr) + gtiny;
     251                 :       2413 :   Igs = pnCurrent (Ugs, Is, Ut * n) +
     252                 :       2413 :     pnCurrent (Ugs, Isr, Ut * nr) + gtiny * Ugs;
     253                 :            : 
     254                 :            :   // gate-drain diode
     255         [ +  + ]:       2413 :   gtiny = Ugd < - 10 * Ut * n ? (Is + Isr) : 0;
     256                 :       2413 :   ggd = pnConductance (Ugd, Is, Ut * n) +
     257                 :       2413 :     pnConductance (Ugd, Isr, Ut * nr) + gtiny;
     258                 :       2413 :   Igd = pnCurrent (Ugd, Is, Ut * n) +
     259                 :       2413 :     pnCurrent (Ugd, Isr, Ut * nr) + gtiny * Ugd;
     260                 :            : 
     261                 :            :   // normal (forward) mode of operation
     262         [ +  - ]:       2413 :   if (Uds >= 0) {
     263                 :       2413 :     nr_double_t Ugst = Ugs - Vt0;
     264                 :            :     // normal mode, cutoff region
     265         [ +  + ]:       2413 :     if (Ugst <= 0) {
     266                 :          1 :       Ids = 0;
     267                 :          1 :       gm  = 0;
     268                 :          1 :       gds = 0;
     269                 :            :     }
     270                 :            :     else {
     271                 :       2412 :       nr_double_t b = beta * (1 + l * Uds);
     272                 :            :       // normal mode, saturation region
     273         [ +  + ]:       2412 :       if (Ugst <= Uds) {
     274                 :       2411 :         Ids = b * Ugst * Ugst;
     275                 :       2411 :         gm  = b * 2 * Ugst;
     276                 :       2411 :         gds = l * beta * Ugst * Ugst;
     277                 :            :       }
     278                 :            :       // normal mode, linear region
     279                 :            :       else {
     280                 :          1 :         Ids = b * Uds * (2 * Ugst - Uds);
     281                 :          1 :         gm  = b * 2 * Uds;
     282                 :          1 :         gds = b * 2 * (Ugst - Uds) + l * beta * Uds * (2 * Ugst - Uds);
     283                 :            :       }
     284                 :            :     }
     285                 :            :   }
     286                 :            :   // inverse (backward) mode of operation
     287                 :            :   else {
     288                 :          0 :     nr_double_t Ugdt = Ugd - Vt0;
     289                 :            :     // inverse mode, cutoff region
     290         [ #  # ]:          0 :     if (Ugdt <= 0) {
     291                 :          0 :       Ids = 0;
     292                 :          0 :       gm  = 0;
     293                 :          0 :       gds = 0;
     294                 :            :     }
     295                 :            :     else {
     296                 :          0 :       nr_double_t b = beta * (1 - l * Uds);
     297                 :            :       // inverse mode, saturation region
     298         [ #  # ]:          0 :       if (Ugdt <= -Uds) {
     299                 :          0 :         Ids = - b * Ugdt * Ugdt;
     300                 :          0 :         gm  = - b * 2 * Ugdt;
     301                 :          0 :         gds = beta * l * Ugdt * Ugdt + b * 2 * Ugdt;
     302                 :            :       }
     303                 :            :       // inverse mode, linear region
     304                 :            :       else {
     305                 :          0 :         Ids = b * Uds * (2 * Ugdt + Uds);
     306                 :          0 :         gm  = b * 2 * Uds;
     307                 :          0 :         gds = 2 * b * Ugdt - beta * l * Uds * (2 * Ugdt + Uds);
     308                 :            :       }
     309                 :            :     }
     310                 :            :   }
     311                 :            : 
     312                 :            :   // compute autonomic current sources
     313                 :       2413 :   IeqG = Igs - ggs * Ugs;
     314                 :       2413 :   IeqD = Igd - ggd * Ugd;
     315                 :       2413 :   IeqS = Ids - gm * Ugs - gds * Uds;
     316         [ +  - ]:       2413 :   setI (NODE_G, (-IeqG - IeqD) * pol);
     317         [ +  - ]:       2413 :   setI (NODE_D, (+IeqD - IeqS) * pol);
     318         [ +  - ]:       2413 :   setI (NODE_S, (+IeqG + IeqS) * pol);
     319                 :            : 
     320                 :            :   // apply admittance matrix elements
     321         [ +  - ]:       2413 :   setY (NODE_G, NODE_G, ggs + ggd);
     322         [ +  - ]:       2413 :   setY (NODE_G, NODE_D, -ggd);
     323         [ +  - ]:       2413 :   setY (NODE_G, NODE_S, -ggs);
     324         [ +  - ]:       2413 :   setY (NODE_D, NODE_G, -ggd + gm);
     325         [ +  - ]:       2413 :   setY (NODE_D, NODE_D, gds + ggd);
     326         [ +  - ]:       2413 :   setY (NODE_D, NODE_S, -gm - gds);
     327         [ +  - ]:       2413 :   setY (NODE_S, NODE_G, -ggs - gm);
     328         [ +  - ]:       2413 :   setY (NODE_S, NODE_D, -gds);
     329         [ +  - ]:       2413 :   setY (NODE_S, NODE_S, ggs + gds + gm);
     330                 :       2413 : }
     331                 :            : 
     332                 :       2406 : void jfet::loadOperatingPoints (void) {
     333                 :       2406 :   Ugs = getOperatingPoint ("Vgs");
     334                 :       2406 :   Ugd = getOperatingPoint ("Vgd");
     335                 :       2406 :   Uds = getOperatingPoint ("Vds");
     336                 :       2406 : }
     337                 :            : 
     338                 :       2406 : void jfet::saveOperatingPoints (void) {
     339                 :            :   nr_double_t Vgs, Vgd;
     340 [ +  - ][ +  - ]:       2406 :   Vgd = real (getV (NODE_G) - getV (NODE_D)) * pol;
     341 [ +  - ][ +  - ]:       2406 :   Vgs = real (getV (NODE_G) - getV (NODE_S)) * pol;
     342                 :       2406 :   setOperatingPoint ("Vgs", Vgs);
     343                 :       2406 :   setOperatingPoint ("Vgd", Vgd);
     344                 :       2406 :   setOperatingPoint ("Vds", Vgs - Vgd);
     345                 :       2406 : }
     346                 :            : 
     347                 :       2406 : void jfet::calcOperatingPoints (void) {
     348                 :            : 
     349                 :            :   // fetch device model parameters
     350                 :       2406 :   nr_double_t z    = getPropertyDouble ("M");
     351                 :       2406 :   nr_double_t Cgd0 = getScaledProperty ("Cgd");
     352                 :       2406 :   nr_double_t Cgs0 = getScaledProperty ("Cgs");
     353                 :       2406 :   nr_double_t Pb   = getScaledProperty ("Pb");
     354                 :       2406 :   nr_double_t Fc   = getPropertyDouble ("Fc");
     355                 :            : 
     356                 :            :   nr_double_t Cgs, Cgd;
     357                 :            : 
     358                 :            :   // capacitance of gate-drain diode
     359                 :       2406 :   Cgd = pnCapacitance (Ugd, Cgd0, Pb, z, Fc);
     360                 :       2406 :   Qgd = pnCharge (Ugd, Cgd0, Pb, z, Fc);
     361                 :            : 
     362                 :            :   // capacitance of gate-source diode
     363                 :       2406 :   Cgs = pnCapacitance (Ugs, Cgs0, Pb, z, Fc);
     364                 :       2406 :   Qgs = pnCharge (Ugs, Cgs0, Pb, z, Fc);
     365                 :            : 
     366                 :            :   // save operating points
     367                 :       2406 :   setOperatingPoint ("ggs", ggs);
     368                 :       2406 :   setOperatingPoint ("ggd", ggd);
     369                 :       2406 :   setOperatingPoint ("gds", gds);
     370                 :       2406 :   setOperatingPoint ("gm", gm);
     371                 :       2406 :   setOperatingPoint ("Id", Ids);
     372                 :       2406 :   setOperatingPoint ("Cgd", Cgd);
     373                 :       2406 :   setOperatingPoint ("Cgs", Cgs);
     374                 :       2406 : }
     375                 :            : 
     376                 :          0 : void jfet::initAC (void) {
     377                 :          0 :   allocMatrixMNA ();
     378                 :          0 :   clearI ();
     379                 :          0 : }
     380                 :            : 
     381                 :          0 : void jfet::calcAC (nr_double_t frequency) {
     382         [ #  # ]:          0 :   setMatrixY (calcMatrixY (frequency));
     383                 :          0 : }
     384                 :            : 
     385                 :          0 : void jfet::calcNoiseAC (nr_double_t frequency) {
     386         [ #  # ]:          0 :   setMatrixN (calcMatrixCy (frequency));
     387                 :          0 : }
     388                 :            : 
     389                 :            : #define qgdState 0 // gate-drain charge state
     390                 :            : #define cgdState 1 // gate-drain current state
     391                 :            : #define qgsState 2 // gate-source charge state
     392                 :            : #define cgsState 3 // gate-source current state
     393                 :            : 
     394                 :          1 : void jfet::initTR (void) {
     395                 :          1 :   setStates (4);
     396                 :          1 :   initDC ();
     397                 :          1 : }
     398                 :            : 
     399                 :       2406 : void jfet::calcTR (nr_double_t) {
     400                 :       2406 :   calcDC ();
     401                 :       2406 :   saveOperatingPoints ();
     402                 :       2406 :   loadOperatingPoints ();
     403                 :       2406 :   calcOperatingPoints ();
     404                 :            : 
     405                 :       2406 :   nr_double_t Cgs = getOperatingPoint ("Cgs");
     406                 :       2406 :   nr_double_t Cgd = getOperatingPoint ("Cgd");
     407                 :            : 
     408                 :       2406 :   transientCapacitance (qgsState, NODE_G, NODE_S, Cgs, Ugs, Qgs);
     409                 :       2406 :   transientCapacitance (qgdState, NODE_G, NODE_D, Cgd, Ugd, Qgd);
     410                 :       2406 : }
     411                 :            : 
     412                 :            : // properties
     413                 :            : PROP_REQ [] = {
     414                 :            :   { "Is", PROP_REAL, { 1e-14, PROP_NO_STR }, PROP_POS_RANGE },
     415                 :            :   { "N", PROP_REAL, { 1, PROP_NO_STR }, PROP_RNGII (1, 100) },
     416                 :            :   { "Vt0", PROP_REAL, { -2, PROP_NO_STR }, PROP_NEG_RANGE },
     417                 :            :   { "Lambda", PROP_REAL, { 0, PROP_NO_STR }, PROP_POS_RANGE },
     418                 :            :   { "Beta", PROP_REAL, { 1e-4, PROP_NO_STR }, PROP_POS_RANGE },
     419                 :            :   { "M", PROP_REAL, { 0.5, PROP_NO_STR }, PROP_RNGII (0, 1) },
     420                 :            :   { "Pb", PROP_REAL, { 1.0, PROP_NO_STR }, PROP_RNGXI (0, 10) },
     421                 :            :   { "Fc", PROP_REAL, { 0.5, PROP_NO_STR }, PROP_RNGIX (0, 1) },
     422                 :            :   { "Cgs", PROP_REAL, { 0, PROP_NO_STR }, PROP_POS_RANGE },
     423                 :            :   { "Cgd", PROP_REAL, { 0, PROP_NO_STR }, PROP_POS_RANGE },
     424                 :            :   PROP_NO_PROP };
     425                 :            : PROP_OPT [] = {
     426                 :            :   { "Rd", PROP_REAL, { 0, PROP_NO_STR }, PROP_POS_RANGE },
     427                 :            :   { "Rs", PROP_REAL, { 0, PROP_NO_STR }, PROP_POS_RANGE },
     428                 :            :   { "Isr", PROP_REAL, { 1e-14, PROP_NO_STR }, PROP_POS_RANGE },
     429                 :            :   { "Nr", PROP_REAL, { 2, PROP_NO_STR }, PROP_RNGII (1, 100) },
     430                 :            :   { "Kf", PROP_REAL, { 0, PROP_NO_STR }, PROP_POS_RANGE },
     431                 :            :   { "Af", PROP_REAL, { 1, PROP_NO_STR }, PROP_POS_RANGE },
     432                 :            :   { "Ffe", PROP_REAL, { 1, PROP_NO_STR }, PROP_POS_RANGE },
     433                 :            :   { "Temp", PROP_REAL, { 26.85, PROP_NO_STR }, PROP_MIN_VAL (K) },
     434                 :            :   { "Type", PROP_STR, { PROP_NO_VAL, "nfet" }, PROP_RNG_FET },
     435                 :            :   { "Xti", PROP_REAL, { 3, PROP_NO_STR }, PROP_POS_RANGE },
     436                 :            :   { "Vt0tc", PROP_REAL, { 0, PROP_NO_STR }, PROP_NO_RANGE },
     437                 :            :   { "Betatce", PROP_REAL, { 0, PROP_NO_STR }, PROP_NO_RANGE },
     438                 :            :   { "Tnom", PROP_REAL, { 26.85, PROP_NO_STR }, PROP_MIN_VAL (K) },
     439                 :            :   { "Area", PROP_REAL, { 1, PROP_NO_STR }, PROP_POS_RANGEX },
     440                 :            :   PROP_NO_PROP };
     441                 :            : struct define_t jfet::cirdef =
     442                 :            :   { "JFET", 3, PROP_COMPONENT, PROP_NO_SUBSTRATE, PROP_NONLINEAR, PROP_DEF };

Generated by: LCOV version 1.11