Jspice3
bjtload.c File Reference
#include "spice.h"
#include <stdio.h>
#include <math.h>
#include "util.h"
#include "bjtdefs.h"
#include "const.h"
#include "sperror.h"
#include "niext.h"
Include dependency graph for bjtload.c:

Go to the source code of this file.

Data Structures

struct  bjtstuff
 

Functions

static int bjt_bypass ()
 
static int bjt_limiting ()
 
static int bjt_pnjlim ()
 
static void bjt_iv ()
 
static void bjt_cap ()
 
static int bjt_integ ()
 
static void bjt_load ()
 
int BJTload (GENmodel *inModel, CKTcircuit *ckt)
 
static int bjt_bypass (CKTcircuit *ckt, BJTmodel *model, BJTinstance *here, struct bjtstuff *bj)
 
static int bjt_limiting (CKTcircuit *ckt, BJTmodel *model, BJTinstance *here, struct bjtstuff *bj)
 
static int bjt_pnjlim (double *vnew, double vold, double vt, double vcrit)
 
static void bjt_iv (CKTcircuit *ckt, BJTmodel *model, BJTinstance *here, struct bjtstuff *bj)
 
static void bjt_cap (CKTcircuit *ckt, BJTmodel *model, BJTinstance *here, struct bjtstuff *bj)
 
static int bjt_integ (CKTcircuit *ckt, BJTmodel *model, BJTinstance *here, struct bjtstuff *bj)
 
static void bjt_load (CKTcircuit *ckt, BJTmodel *model, BJTinstance *here, struct bjtstuff *bj)
 

Function Documentation

static int bjt_bypass ( )
static
static int bjt_bypass ( CKTcircuit ckt,
BJTmodel model,
BJTinstance here,
struct bjtstuff bj 
)
static

Definition at line 334 of file bjtload.c.

340 {
341  double delvbe;
342  double delvbc;
343  double cchat;
344  double cbhat;
345  double A1, A2, A3;
346 
347  /*
348  * bypass if solution has not changed
349  */
350  delvbe = bj->bj_vbe - *(ckt->CKTstate0 + here->BJTvbe);
351  A1 = FABS(bj->bj_vbe);
352  A2 = FABS(*(ckt->CKTstate0 + here->BJTvbe));
353  if (FABS(delvbe) >= ckt->CKTreltol*MAX(A1,A2) + ckt->CKTvoltTol)
354  return (0);
355 
356  delvbc = bj->bj_vbc - *(ckt->CKTstate0 + here->BJTvbc);
357  A1 = FABS(bj->bj_vbc);
358  A2 = FABS(*(ckt->CKTstate0 + here->BJTvbc));
359  if (FABS(delvbc) >= ckt->CKTreltol*MAX(A1,A2) + ckt->CKTvoltTol)
360  return (0);
361 
362  cchat = here->BJTcc +
363  (here->BJTgm + here->BJTgo)*delvbe -
364  (here->BJTgo + here->BJTgmu)*delvbc;
365 
366  A1 = cchat - here->BJTcc;
367  A2 = FABS(cchat);
368  A3 = FABS(here->BJTcc);
369  if (FABS(A1) >= ckt->CKTreltol*MAX(A2,A3) + ckt->CKTabstol)
370  return (0);
371 
372  cbhat = here->BJTcb +
373  here->BJTgpi*delvbe +
374  here->BJTgmu*delvbc;
375 
376  A1 = cbhat - here->BJTcb;
377  A2 = FABS(cbhat);
378  A3 = FABS(here->BJTcb);
379  if (FABS(A1) >= ckt->CKTreltol*MAX(A2,A3) + ckt->CKTabstol)
380  return (0);
381 
382  /*
383  * bypassing....
384  */
385  bj->bj_vbe = *(ckt->CKTstate0 + here->BJTvbe);
386  bj->bj_vbc = *(ckt->CKTstate0 + here->BJTvbc);
387  bj->bj_vbx = *(ckt->CKTstate0 + here->BJTvbx);
388  bj->bj_vcs = *(ckt->CKTstate0 + here->BJTvcs);
389 
390  bjt_load(ckt,model,here,bj);
391  return (1);
392 }
double BJTcc
Definition: bjtdefs.h:54
double bj_vbc
Definition: bjtload.c:25
#define MAX(a, b)
Definition: spdefs.h:135
double CKTreltol
Definition: cktdefs.h:183
static void bjt_load()
double bj_vcs
Definition: bjtload.c:26
double CKTabstol
Definition: cktdefs.h:180
double bj_vbx
Definition: bjtload.c:27
double BJTgmu
Definition: bjtdefs.h:57
double BJTgo
Definition: bjtdefs.h:59
double BJTgpi
Definition: bjtdefs.h:56
double BJTgm
Definition: bjtdefs.h:58
#define FABS(a)
Definition: util.h:41
double CKTvoltTol
Definition: cktdefs.h:185
double bj_vbe
Definition: bjtload.c:24
double BJTcb
Definition: bjtdefs.h:55
static void bjt_cap ( )
static
static void bjt_cap ( CKTcircuit ckt,
BJTmodel model,
BJTinstance here,
struct bjtstuff bj 
)
static

Definition at line 684 of file bjtload.c.

690 {
691  /*
692  * charge storage elements
693  */
694  double tf;
695  double tr;
696  double arg;
697  double sarg;
698  double xm;
699  double pt;
700  double fcp;
701  double cap;
702  double vx;
703  double f1, f2, f3;
704  double czf2;
705 
706  tf = model->BJTtransitTimeF;
707  tr = model->BJTtransitTimeR;
708 
709  xm = model->BJTjunctionExpBE;
710  pt = here->BJTtBEpot;
711  fcp = here->BJTtDepCap;
712  cap = here->BJTtBEcap*here->BJTarea;
713  vx = bj->bj_vbe;
714 
715  if (vx < fcp) {
716  arg = 1 - vx/pt;
717  sarg = exp(-xm*log(arg));
718  *(ckt->CKTstate0 + here->BJTqbe) =
719  tf*bj->bj_cbe + pt*cap*(1 - arg*sarg)/(1 - xm);
720  here->BJTcapbe = tf*bj->bj_gbe + cap*sarg;
721  }
722  else {
723  f1 = here->BJTtf1;
724  f2 = model->BJTf2;
725  f3 = model->BJTf3;
726  czf2 = cap/f2;
727  *(ckt->CKTstate0 + here->BJTqbe) = tf*bj->bj_cbe + cap*f1 +
728  czf2*(f3*(vx - fcp) + (xm/(pt + pt))*(vx*vx - fcp*fcp));
729  here->BJTcapbe = tf*bj->bj_gbe + czf2*(f3 + xm*vx/pt);
730  }
731 
732  xm = model->BJTjunctionExpBC;
733  pt = here->BJTtBCpot;
734  fcp = here->BJTtf4;
735  cap = here->BJTtBCcap * model->BJTbaseFractionBCcap * here->BJTarea;
736  vx = bj->bj_vbc;
737 
738  if (vx < fcp) {
739  arg = 1 - vx/pt;
740  sarg = exp(-xm*log(arg));
741  *(ckt->CKTstate0 + here->BJTqbc) = tr*bj->bj_cbc +
742  pt*cap*(1 - arg*sarg)/(1 - xm);
743  here->BJTcapbc = tr*bj->bj_gbc + cap*sarg;
744  }
745  else {
746  f1 = here->BJTtf5;
747  f2 = model->BJTf6;
748  f3 = model->BJTf7;
749  czf2 = cap/f2;
750  *(ckt->CKTstate0 + here->BJTqbc) = tr*bj->bj_cbc + cap*f1 +
751  czf2*(f3*(vx - fcp) + (xm/(pt + pt))*(vx*vx - fcp*fcp));
752  here->BJTcapbc = tr*bj->bj_gbc + czf2*(f3 + xm*vx/pt);
753  }
754 
755  cap = here->BJTtBCcap * here->BJTarea - cap;
756  vx = bj->bj_vbx;
757 
758  if (vx < fcp) {
759  arg = 1 - vx/pt;
760  sarg = exp(-xm*log(arg));
761  *(ckt->CKTstate0 + here->BJTqbx) = pt*cap*(1 - arg*sarg)/(1 - xm);
762  here->BJTcapbx = cap*sarg;
763  }
764  else {
765  f1 = here->BJTtf5;
766  f2 = model->BJTf6;
767  f3 = model->BJTf7;
768  czf2 = cap/f2;
769  *(ckt->CKTstate0 + here->BJTqbx) = cap*f1 +
770  czf2*(f3*(vx - fcp) + (xm/(pt + pt))*(vx*vx - fcp*fcp));
771  here->BJTcapbx = czf2*(f3 + xm*vx/pt);
772  }
773 
774  xm = model->BJTexponentialSubstrate;
775  pt = model->BJTpotentialSubstrate;
776  cap = model->BJTcapCS;
777  vx = bj->bj_vcs;
778 
779  if (vx < 0) {
780  arg = 1 - vx/pt;
781  sarg = exp(-xm*log(arg));
782  *(ckt->CKTstate0 + here->BJTqcs) = pt*cap*(1 - arg*sarg)/(1 - xm);
783  here->BJTcapcs = cap*sarg;
784  }
785  else {
786  *(ckt->CKTstate0 + here->BJTqcs) = vx*cap*(1 + xm*vx/(pt + pt));
787  here->BJTcapcs = cap*(1 + xm*vx/pt);
788  }
789 }
double BJTjunctionExpBC
Definition: bjtdefs.h:293
double bj_vbc
Definition: bjtload.c:25
double BJTtransitTimeR
Definition: bjtdefs.h:295
double BJTtBCcap
Definition: bjtdefs.h:43
double BJTf6
Definition: bjtdefs.h:316
double BJTcapbc
Definition: bjtdefs.h:51
double BJTarea
Definition: bjtdefs.h:32
double BJTtf4
Definition: bjtdefs.h:47
double bj_cbe
Definition: bjtload.c:28
double BJTjunctionExpBE
Definition: bjtdefs.h:285
double BJTexponentialSubstrate
Definition: bjtdefs.h:298
double bj_vcs
Definition: bjtload.c:26
double bj_vbx
Definition: bjtload.c:27
double BJTcapbe
Definition: bjtdefs.h:50
double BJTpotentialSubstrate
Definition: bjtdefs.h:297
double BJTtf1
Definition: bjtdefs.h:46
double BJTtransitTimeF
Definition: bjtdefs.h:286
double bj_gbc
Definition: bjtload.c:31
double BJTtBEcap
Definition: bjtdefs.h:41
double BJTtBCpot
Definition: bjtdefs.h:44
double bj_gbe
Definition: bjtload.c:30
double BJTtDepCap
Definition: bjtdefs.h:45
double BJTcapcs
Definition: bjtdefs.h:52
double BJTtBEpot
Definition: bjtdefs.h:42
double bj_cbc
Definition: bjtload.c:29
double BJTcapbx
Definition: bjtdefs.h:53
double BJTf7
Definition: bjtdefs.h:317
double bj_vbe
Definition: bjtload.c:24
double BJTf3
Definition: bjtdefs.h:315
double BJTf2
Definition: bjtdefs.h:314
double BJTtf5
Definition: bjtdefs.h:48
double BJTbaseFractionBCcap
Definition: bjtdefs.h:294
double BJTcapCS
Definition: bjtdefs.h:296
static int bjt_integ ( )
static
static int bjt_integ ( CKTcircuit ckt,
BJTmodel model,
BJTinstance here,
struct bjtstuff bj 
)
static

Definition at line 793 of file bjtload.c.

799 {
800  double geq, ceq;
801  int error; /* in NI_INTEG macro */
802 
803  here->BJTgeqcb *= ckt->CKTag[0];
804 
805  NI_INTEG(ckt,geq,ceq,here->BJTcapbe,here->BJTqbe);
806  here->BJTgpi += geq;
807  here->BJTcb += *(ckt->CKTstate0 + here->BJTcqbe);
808 
809  NI_INTEG(ckt,geq,ceq,here->BJTcapbc,here->BJTqbc);
810  here->BJTgmu += geq;
811  here->BJTcb += *(ckt->CKTstate0 + here->BJTcqbc);
812  here->BJTcc -= *(ckt->CKTstate0 + here->BJTcqbc);
813  /*
814  * charge storage for c-s and b-x junctions
815  */
816  NI_INTEG(ckt,here->BJTgccs,ceq,here->BJTcapcs,here->BJTqcs);
817  NI_INTEG(ckt,here->BJTgeqbx,ceq,here->BJTcapbx,here->BJTqbx);
818  return (OK);
819 }
double BJTcc
Definition: bjtdefs.h:54
double BJTcapbc
Definition: bjtdefs.h:51
double BJTgccs
Definition: bjtdefs.h:62
#define OK
Definition: iferrmsg.h:17
double BJTcapbe
Definition: bjtdefs.h:50
double BJTgmu
Definition: bjtdefs.h:57
#define NI_INTEG(ckt, geq, ceq, cap, qcap)
Definition: devdefs.h:141
double CKTag[7]
Definition: cktdefs.h:83
double BJTgpi
Definition: bjtdefs.h:56
double BJTcapcs
Definition: bjtdefs.h:52
double BJTcapbx
Definition: bjtdefs.h:53
double BJTgeqcb
Definition: bjtdefs.h:61
double BJTcb
Definition: bjtdefs.h:55
double BJTgeqbx
Definition: bjtdefs.h:63
static void bjt_iv ( )
static
static void bjt_iv ( CKTcircuit ckt,
BJTmodel model,
BJTinstance here,
struct bjtstuff bj 
)
static

Definition at line 451 of file bjtload.c.

457 {
458  double td;
459  double vte;
460  double vtc;
461  double csat;
462  double c2;
463  double c4;
464  double rbpr;
465  double rbpi;
466  double xjrb;
467  double vtn;
468  double cbe;
469  double gbe;
470  double cben;
471  double gben;
472  double cbc;
473  double gbc;
474  double cbcn;
475  double gbcn;
476  double dqbdve;
477  double dqbdvc;
478  double qb;
479  double vbe;
480  double vbc;
481  double temp, temp1;
482  double arg1, arg2, arg3;
483 
484  here->BJTgeqbx = 0;
485  here->BJTgccs = 0;
486  here->BJTgeqcb = 0;
487 
488  vte = model->BJTleakBEemissionCoeff*bj->bj_vt;
489  vtc = model->BJTleakBCemissionCoeff*bj->bj_vt;
490  vbe = bj->bj_vbe;
491  vbc = bj->bj_vbc;
492 
493  csat = here->BJTtSatCur;
494  c2 = here->BJTtBEleakCur;
495  c4 = here->BJTtBCleakCur;
496  rbpr = model->BJTminBaseResist;
497  rbpi = model->BJTbaseResist;
498  xjrb = model->BJTbaseCurrentHalfResist;
499 
500  temp = here->BJTarea;
501  if (temp != 1.0) {
502  csat *= temp;
503  c2 *= temp;
504  c4 *= temp;
505  rbpr /= temp;
506  rbpi /= temp;
507  xjrb *= temp;
508  }
509  rbpi -= rbpr;
510 
511  /*
512  * determine dc current and derivitives
513  */
514  vtn = bj->bj_vt*model->BJTemissionCoeffF;
515  if (vbe > -5*vtn) {
516  temp = exp(vbe/vtn);
517  cbe = csat*(temp - 1) + ckt->CKTgmin*vbe;
518  gbe = csat*temp/vtn + ckt->CKTgmin;
519  if (c2 == 0) {
520  cben = 0;
521  gben = 0;
522  }
523  else {
524  temp = exp(vbe/vte);
525  cben = c2*(temp - 1);
526  gben = c2*temp/vte;
527  }
528  }
529  else {
530  gbe = -csat/vbe + ckt->CKTgmin;
531  cbe = gbe*vbe;
532  gben = -c2/vbe;
533  cben = gben*vbe;
534  }
535 
536  vtn = bj->bj_vt*model->BJTemissionCoeffR;
537  if (vbc > -5*vtn) {
538  temp = exp(vbc/vtn);
539  cbc = csat*(temp - 1) + ckt->CKTgmin*vbc;
540  gbc = csat*temp/vtn + ckt->CKTgmin;
541  if (c4 == 0) {
542  cbcn = 0;
543  gbcn = 0;
544  }
545  else {
546  temp = exp(vbc/vtc);
547  cbcn = c4*(temp - 1);
548  gbcn = c4*temp/vtc;
549  }
550  }
551  else {
552  gbc = -csat/vbc + ckt->CKTgmin;
553  cbc = gbc*vbc;
554  gbcn = -c4/vbc;
555  cbcn = gbcn*vbc;
556  }
557 
558  /*
559  * determine base charge terms
560  */
561  temp = 1/(1 - model->BJTinvEarlyVoltF*vbc -
562  model->BJTinvEarlyVoltR*vbe);
563 
564  if (model->BJTinvRollOffF == 0 && model->BJTinvRollOffR == 0) {
565  qb = temp;
566  temp *= temp;
567  dqbdve = temp*model->BJTinvEarlyVoltR;
568  dqbdvc = temp*model->BJTinvEarlyVoltF;
569  }
570  else {
571  double arg, sqarg, oik, oikr;
572 
573  oik = model->BJTinvRollOffF/here->BJTarea;
574  oikr = model->BJTinvRollOffR/here->BJTarea;
575 
576  arg = 1 + 4*(oik*cbe + oikr*cbc);
577  if (arg < 0) arg = 0;
578  sqarg = 1;
579  if (arg != 0) sqarg = sqrt(arg);
580  qb = .5*temp*(1 + sqarg);
581  dqbdve = temp*(qb*model->BJTinvEarlyVoltR + oik*gbe/sqarg);
582  dqbdvc = temp*(qb*model->BJTinvEarlyVoltF + oikr*gbc/sqarg);
583  }
584 
585  qb = 1/qb;
586 
587  here->BJTcb = cbe/here->BJTtBetaF + cben + cbc/here->BJTtBetaR + cbcn;
588 
589  /*
590  * determine dc incremental conductances
591  */
592  if (xjrb != 0) {
593  temp = here->BJTcb/xjrb;
594  arg1 = MAX(temp,1e-9);
595  arg2 = (-1 + sqrt(1 + 14.59025*arg1))/(2.4317*sqrt(arg1));
596  arg1 = tan(arg2);
597  temp = rbpr + 3*rbpi*(arg1 - arg2)/(arg2*arg1*arg1);
598  }
599  else
600  temp = rbpr + rbpi*qb;
601 
602  if (temp != 0)
603  here->BJTgx = 1/temp;
604  else
605  here->BJTgx = 0;
606 
607  here->BJTgpi = gbe/here->BJTtBetaF + gben;
608  here->BJTgmu = gbc/here->BJTtBetaR + gbcn;
609 
610  /*
611  * weil's approx. for excess phase applied with backward-
612  * euler integration
613  */
614  td = model->BJTexcessPhaseFactor;
615  if (ckt->CKTmode & (MODETRAN | MODEAC) && td != 0) {
616  double denom, xf1, xf2, cex, gex;
617 
618  arg1 = ckt->CKTdelta/td;
619  arg2 = 3*arg1;
620  arg1 = arg2*arg1;
621  denom = 1 + arg1 + arg2;
622  arg3 = arg1/denom;
623  if (ckt->CKTmode & MODEINITTRAN) {
624  *(ckt->CKTstate1 + here->BJTcexbc) = cbe*qb;
625  *(ckt->CKTstate2 + here->BJTcexbc) =
626  *(ckt->CKTstate1 + here->BJTcexbc);
627  }
628  xf2 = -ckt->CKTdelta/ckt->CKTdeltaOld[1];
629  xf1 = 1 - xf2;
630  here->BJTcc = (*(ckt->CKTstate1 + here->BJTcexbc)*(xf1 + arg2) +
631  *(ckt->CKTstate2 + here->BJTcexbc)*xf2)/denom;
632  cex = cbe*arg3;
633  gex = gbe*arg3;
634  *(ckt->CKTstate0 + here->BJTcexbc) = here->BJTcc + cex*qb;
635  temp = (cex - cbc)*qb;
636  here->BJTcc += temp - cbc/here->BJTtBetaR - cbcn;
637  here->BJTgo = (gbc + temp*dqbdvc)*qb;
638  here->BJTgm = (gex - temp*dqbdve)*qb - here->BJTgo;
639  }
640  else {
641  temp = (cbe - cbc)*qb;
642  here->BJTcc = temp - cbc/here->BJTtBetaR - cbcn;
643  here->BJTgo = (gbc + temp*dqbdvc)*qb;
644  here->BJTgm = (gbe - temp*dqbdve)*qb - here->BJTgo;
645  }
646 
647  if (ckt->CKTmode & (MODETRAN | MODEAC)) {
648  double tf = model->BJTtransitTimeF;
649  double xtf = model->BJTtransitTimeBiasCoeffF;
650  double ovtf = model->BJTtransitTimeVBCFactor;
651  double xjtf = model->BJTtransitTimeHighCurrentF;
652 
653  if (tf != 0 && vbe > 0) {
654 
655  arg1 = 0;
656  arg2 = 0;
657  arg3 = 0;
658  if (xtf != 0) {
659  arg1 = xtf;
660  if (ovtf != 0) {
661  arg1 *= exp(bj->bj_vbc*ovtf);
662  }
663  arg2 = arg1;
664  if (xjtf != 0) {
665  temp = cbe/(cbe + xjtf*here->BJTarea);
666  arg1 *= temp*temp;
667  arg2 = arg1*(3 - temp - temp);
668  }
669  arg3 = cbe*arg1*ovtf;
670  }
671  cbe *= (1 + arg1)*qb;
672  gbe = (gbe*(1 + arg2) - cbe*dqbdve)*qb;
673  here->BJTgeqcb = tf*(arg3 - cbe*dqbdvc)*qb;
674  }
675  }
676  bj->bj_cbe = cbe;
677  bj->bj_gbe = gbe;
678  bj->bj_cbc = cbc;
679  bj->bj_gbc = gbc;
680 }
#define MODEAC
Definition: cktdefs.h:146
double BJTcc
Definition: bjtdefs.h:54
double bj_vbc
Definition: bjtload.c:25
double BJTtBCleakCur
Definition: bjtdefs.h:40
double BJTbaseCurrentHalfResist
Definition: bjtdefs.h:279
#define MODETRAN
Definition: cktdefs.h:145
#define MAX(a, b)
Definition: spdefs.h:135
double BJTtransitTimeHighCurrentF
Definition: bjtdefs.h:289
double CKTdelta
Definition: cktdefs.h:78
if(TDesc==NULL)
Definition: cd.c:1326
double BJTemissionCoeffF
Definition: bjtdefs.h:267
#define MODEINITTRAN
Definition: cktdefs.h:160
double BJTarea
Definition: bjtdefs.h:32
double BJTemissionCoeffR
Definition: bjtdefs.h:273
double bj_cbe
Definition: bjtload.c:28
double BJTgccs
Definition: bjtdefs.h:62
static double e
Definition: vectors.c:17
double BJTtSatCur
Definition: bjtdefs.h:36
double BJTtBEleakCur
Definition: bjtdefs.h:39
double bj_vt
Definition: bjtload.c:23
double BJTgmu
Definition: bjtdefs.h:57
double BJTtBetaR
Definition: bjtdefs.h:38
double BJTexcessPhaseFactor
Definition: bjtdefs.h:313
double BJTtransitTimeVBCFactor
Definition: bjtdefs.h:312
double BJTleakBEemissionCoeff
Definition: bjtdefs.h:271
double BJTtransitTimeF
Definition: bjtdefs.h:286
double bj_gbc
Definition: bjtload.c:31
double BJTgo
Definition: bjtdefs.h:59
double BJTgpi
Definition: bjtdefs.h:56
double BJTinvEarlyVoltR
Definition: bjtdefs.h:307
double BJTtransitTimeBiasCoeffF
Definition: bjtdefs.h:287
double BJTinvEarlyVoltF
Definition: bjtdefs.h:306
double BJTgm
Definition: bjtdefs.h:58
double bj_gbe
Definition: bjtload.c:30
double BJTbaseResist
Definition: bjtdefs.h:278
double bj_cbc
Definition: bjtload.c:29
double BJTtBetaF
Definition: bjtdefs.h:37
double BJTgeqcb
Definition: bjtdefs.h:61
double CKTgmin
Definition: cktdefs.h:190
double bj_vbe
Definition: bjtload.c:24
double CKTdeltaOld[7]
Definition: cktdefs.h:79
double BJTcb
Definition: bjtdefs.h:55
double BJTleakBCemissionCoeff
Definition: bjtdefs.h:277
double BJTinvRollOffF
Definition: bjtdefs.h:308
double BJTminBaseResist
Definition: bjtdefs.h:280
long CKTmode
Definition: cktdefs.h:139
double BJTinvRollOffR
Definition: bjtdefs.h:309
double BJTgx
Definition: bjtdefs.h:60
double BJTgeqbx
Definition: bjtdefs.h:63
static int bjt_limiting ( )
static
static int bjt_limiting ( CKTcircuit ckt,
BJTmodel model,
BJTinstance here,
struct bjtstuff bj 
)
static

Definition at line 396 of file bjtload.c.

405 {
406  int i = 0;
407 
408  i += bjt_pnjlim(&bj->bj_vbe,*(ckt->CKTstate0 + here->BJTvbe),bj->bj_vt,
409  here->BJTtVcrit);
410  i += bjt_pnjlim(&bj->bj_vbc,*(ckt->CKTstate0 + here->BJTvbc),bj->bj_vt,
411  here->BJTtVcrit);
412  return (i);
413 }
double bj_vbc
Definition: bjtload.c:25
static int bjt_pnjlim()
double bj_vt
Definition: bjtload.c:23
double BJTtVcrit
Definition: bjtdefs.h:49
double bj_vbe
Definition: bjtload.c:24
static void bjt_load ( )
static
static void bjt_load ( CKTcircuit ckt,
BJTmodel model,
BJTinstance here,
struct bjtstuff bj 
)
static

Definition at line 823 of file bjtload.c.

829 {
830  double gcpr;
831  double gepr;
832  double ceqcs;
833  double ceqbx;
834  double ceqbe;
835  double ceqbc;
836  double geqbx;
837  double gccs;
838  double geqcb;
839  double cc;
840  double cb;
841  double gx;
842  double gpi;
843  double gmu;
844  double gm;
845  double go;
846 
847  cc = here->BJTcc;
848  cb = here->BJTcb;
849  gx = here->BJTgx;
850  gpi = here->BJTgpi;
851  gmu = here->BJTgmu;
852  gm = here->BJTgm;
853  go = here->BJTgo;
854  geqbx = here->BJTgeqbx;
855  gccs = here->BJTgccs;
856  geqcb = here->BJTgeqcb;
857 
858  gcpr = model->BJTcollectorConduct*here->BJTarea;
859  gepr = model->BJTemitterConduct*here->BJTarea;
860 
861  *(ckt->CKTstate0 + here->BJTvbe) = bj->bj_vbe;
862  *(ckt->CKTstate0 + here->BJTvbc) = bj->bj_vbc;
863  *(ckt->CKTstate0 + here->BJTvbx) = bj->bj_vbx;
864  *(ckt->CKTstate0 + here->BJTvcs) = bj->bj_vcs;
865 
866  /*
867  * load current excitation vector
868  */
869  if (model->BJTtype > 0) {
870  ceqcs = (*(ckt->CKTstate0 + here->BJTcqcs) - bj->bj_vcs*gccs);
871  ceqbx = (*(ckt->CKTstate0 + here->BJTcqbx) - bj->bj_vbx*geqbx);
872  ceqbe = (cc + cb -
873  bj->bj_vbe*(gm + go + gpi) +
874  bj->bj_vbc*(go - geqcb));
875  ceqbc = (-cc + bj->bj_vbe*(gm + go) -
876  bj->bj_vbc*(gmu + go));
877  }
878  else {
879  ceqcs = -(*(ckt->CKTstate0 + here->BJTcqcs) - bj->bj_vcs*gccs);
880  ceqbx = -(*(ckt->CKTstate0 + here->BJTcqbx) - bj->bj_vbx*geqbx);
881  ceqbe = -(cc + cb -
882  bj->bj_vbe*(gm + go + gpi) +
883  bj->bj_vbc*(go - geqcb));
884  ceqbc = -(-cc + bj->bj_vbe*(gm + go) -
885  bj->bj_vbc*(gmu + go));
886  }
887 
888  *(ckt->CKTrhs + here->BJTbaseNode) -= ceqbx;
889  *(ckt->CKTrhs + here->BJTcolPrimeNode) += ceqcs + ceqbx + ceqbc;
890  *(ckt->CKTrhs + here->BJTbasePrimeNode) -= ceqbe + ceqbc;
891  *(ckt->CKTrhs + here->BJTemitPrimeNode) += ceqbe;
892  *(ckt->CKTrhs + here->BJTsubstNode) -= ceqcs;
893 
894  /*
895  * load y matrix
896  */
897  *(here->BJTcolColPtr) += gcpr;
898  *(here->BJTbaseBasePtr) += gx + geqbx;
899  *(here->BJTemitEmitPtr) += gepr;
900  *(here->BJTcolPrimeColPrimePtr) += gmu + go + gcpr + gccs + geqbx;
901  *(here->BJTbasePrimeBasePrimePtr) += gx + gpi + gmu + geqcb;
902  *(here->BJTemitPrimeEmitPrimePtr) += gpi + gepr + gm + go;
903  *(here->BJTcolColPrimePtr) -= gcpr;
904  *(here->BJTbaseBasePrimePtr) -= gx;
905  *(here->BJTemitEmitPrimePtr) -= gepr;
906  *(here->BJTcolPrimeColPtr) -= gcpr;
907  *(here->BJTcolPrimeBasePrimePtr) += -gmu + gm;
908  *(here->BJTcolPrimeEmitPrimePtr) -= gm + go;
909  *(here->BJTbasePrimeBasePtr) -= gx;
910  *(here->BJTbasePrimeColPrimePtr) -= gmu + geqcb;
911  *(here->BJTbasePrimeEmitPrimePtr) -= gpi;
912  *(here->BJTemitPrimeEmitPtr) -= gepr;
913  *(here->BJTemitPrimeColPrimePtr) += -go + geqcb;
914  *(here->BJTemitPrimeBasePrimePtr) -= gpi + gm + geqcb;
915  *(here->BJTsubstSubstPtr) += gccs;
916  *(here->BJTcolPrimeSubstPtr) -= gccs;
917  *(here->BJTsubstColPrimePtr) -= gccs;
918  *(here->BJTbaseColPrimePtr) -= geqbx;
919  *(here->BJTcolPrimeBasePtr) -= geqbx;
920 }
double * BJTcolPrimeColPtr
Definition: bjtdefs.h:71
int BJTemitPrimeNode
Definition: bjtdefs.h:30
double BJTcc
Definition: bjtdefs.h:54
double * BJTemitPrimeEmitPrimePtr
Definition: bjtdefs.h:99
Definition: subckt.c:18
double bj_vbc
Definition: bjtload.c:25
int BJTtype
Definition: bjtdefs.h:262
double * BJTcolColPrimePtr
Definition: bjtdefs.h:65
double * BJTbaseBasePtr
Definition: bjtdefs.h:91
double * BJTbasePrimeBasePtr
Definition: bjtdefs.h:77
double * BJTemitPrimeBasePrimePtr
Definition: bjtdefs.h:87
double * BJTsubstSubstPtr
Definition: bjtdefs.h:101
double BJTarea
Definition: bjtdefs.h:32
double BJTcollectorConduct
Definition: bjtdefs.h:310
double BJTgccs
Definition: bjtdefs.h:62
double * BJTbaseColPrimePtr
Definition: bjtdefs.h:107
int BJTbasePrimeNode
Definition: bjtdefs.h:29
double * BJTemitEmitPtr
Definition: bjtdefs.h:93
double * BJTcolPrimeBasePrimePtr
Definition: bjtdefs.h:73
double * BJTemitPrimeEmitPtr
Definition: bjtdefs.h:83
double bj_vcs
Definition: bjtload.c:26
double * BJTcolPrimeBasePtr
Definition: bjtdefs.h:109
double * BJTcolColPtr
Definition: bjtdefs.h:89
double * BJTcolPrimeColPrimePtr
Definition: bjtdefs.h:95
double * BJTemitPrimeColPrimePtr
Definition: bjtdefs.h:85
double * BJTbasePrimeEmitPrimePtr
Definition: bjtdefs.h:81
double bj_vbx
Definition: bjtload.c:27
double BJTgmu
Definition: bjtdefs.h:57
double * BJTcolPrimeSubstPtr
Definition: bjtdefs.h:103
int BJTcolPrimeNode
Definition: bjtdefs.h:28
double * BJTbasePrimeColPrimePtr
Definition: bjtdefs.h:79
double BJTgo
Definition: bjtdefs.h:59
double * BJTemitEmitPrimePtr
Definition: bjtdefs.h:69
double BJTgpi
Definition: bjtdefs.h:56
int BJTbaseNode
Definition: bjtdefs.h:25
double BJTgm
Definition: bjtdefs.h:58
int BJTsubstNode
Definition: bjtdefs.h:27
double * BJTcolPrimeEmitPrimePtr
Definition: bjtdefs.h:75
double * BJTbasePrimeBasePrimePtr
Definition: bjtdefs.h:97
double * BJTsubstColPrimePtr
Definition: bjtdefs.h:105
double BJTgeqcb
Definition: bjtdefs.h:61
double BJTemitterConduct
Definition: bjtdefs.h:311
double bj_vbe
Definition: bjtload.c:24
double BJTcb
Definition: bjtdefs.h:55
double * BJTbaseBasePrimePtr
Definition: bjtdefs.h:67
double * CKTrhs
Definition: cktdefs.h:97
double BJTgx
Definition: bjtdefs.h:60
double BJTgeqbx
Definition: bjtdefs.h:63
static int bjt_pnjlim ( )
static
static int bjt_pnjlim ( double *  vnew,
double  vold,
double  vt,
double  vcrit 
)
static

Definition at line 417 of file bjtload.c.

426 {
427  double arg;
428  double vn;
429 
430  vn = *vnew;
431  if ((vn > vcrit) && (FABS(vn - vold) > (vt + vt))) {
432  if (vold > 0) {
433  arg = 1 + (vn - vold)/vt;
434  if (arg > 0) {
435  *vnew = vold + vt*log(arg);
436  }
437  else {
438  *vnew = vcrit;
439  }
440  }
441  else {
442  *vnew = vt*log(vn/vt);
443  }
444  return (1);
445  }
446  return (0);
447 }
#define FABS(a)
Definition: util.h:41
int BJTload ( GENmodel inModel,
CKTcircuit ckt 
)

Definition at line 54 of file bjtload.c.

61 {
62  BJTmodel *model = (BJTmodel*)inModel;
63  BJTinstance *here;
64  struct bjtstuff bj;
65  int error;
66 
67  if (ckt->CKTmode & MODEINITFLOAT) {
68 
69  /* loop through all the models */
70  for ( ; model != NULL; model = model->BJTnextModel) {
71 
72  /* loop through all the instances of the model */
73  for (here = model->BJTinstances; here != NULL;
74  here = here->BJTnextInstance) {
75 
76  bj.bj_vt = here->BJTtemp * CONSTKoverQ;
77 
78  if (model->BJTtype > 0) {
79  bj.bj_vbe =
80  *(ckt->CKTrhsOld + here->BJTbasePrimeNode) -
81  *(ckt->CKTrhsOld + here->BJTemitPrimeNode);
82  bj.bj_vbc =
83  *(ckt->CKTrhsOld + here->BJTbasePrimeNode) -
84  *(ckt->CKTrhsOld + here->BJTcolPrimeNode);
85  bj.bj_vbx =
86  *(ckt->CKTrhsOld + here->BJTbaseNode) -
87  *(ckt->CKTrhsOld + here->BJTcolPrimeNode);
88  bj.bj_vcs =
89  *(ckt->CKTrhsOld + here->BJTsubstNode) -
90  *(ckt->CKTrhsOld + here->BJTcolPrimeNode);
91  }
92  else {
93  bj.bj_vbe =
94  *(ckt->CKTrhsOld + here->BJTemitPrimeNode) -
95  *(ckt->CKTrhsOld + here->BJTbasePrimeNode);
96  bj.bj_vbc =
97  *(ckt->CKTrhsOld + here->BJTcolPrimeNode) -
98  *(ckt->CKTrhsOld + here->BJTbasePrimeNode);
99  bj.bj_vbx =
100  *(ckt->CKTrhsOld + here->BJTcolPrimeNode) -
101  *(ckt->CKTrhsOld + here->BJTbaseNode);
102  bj.bj_vcs =
103  *(ckt->CKTrhsOld + here->BJTcolPrimeNode) -
104  *(ckt->CKTrhsOld + here->BJTsubstNode);
105  }
106  if (ckt->CKTbypass && bjt_bypass(ckt,model,here,&bj))
107  continue;
108  (void)bjt_limiting(ckt,model,here,&bj);
109  bjt_iv(ckt,model,here,&bj);
110  if (ckt->CKTmode & MODETRAN) {
111  bjt_cap(ckt,model,here,&bj);
112  (void)bjt_integ(ckt,model,here,&bj);
113  }
114  bjt_load(ckt,model,here,&bj);
115  }
116  }
117  return (OK);
118  }
119 
120  if (ckt->CKTmode & MODEINITPRED) {
121  double xf1;
122  double xf2;
123 
124  xf2 = -ckt->CKTdelta/ckt->CKTdeltaOld[1];
125  xf1 = 1 - xf2;
126 
127  /* loop through all the models */
128  for ( ; model != NULL; model = model->BJTnextModel) {
129 
130  /* loop through all the instances of the model */
131  for (here = model->BJTinstances; here != NULL;
132  here = here->BJTnextInstance) {
133 
134  bj.bj_vt = here->BJTtemp * CONSTKoverQ;
135 
136  bj.bj_vbe = xf1* *(ckt->CKTstate1 + here->BJTvbe) +
137  xf2* *(ckt->CKTstate2 + here->BJTvbe);
138  bj.bj_vbc = xf1* *(ckt->CKTstate1 + here->BJTvbc) +
139  xf2* *(ckt->CKTstate2 + here->BJTvbc);
140  bj.bj_vbx = xf1* *(ckt->CKTstate1 + here->BJTvbx) +
141  xf2* *(ckt->CKTstate2 + here->BJTvbx);
142  bj.bj_vcs = xf1* *(ckt->CKTstate1 + here->BJTvcs) +
143  xf2* *(ckt->CKTstate2 + here->BJTvcs);
144  *(ckt->CKTstate0 + here->BJTvbe) =
145  *(ckt->CKTstate1 + here->BJTvbe);
146  *(ckt->CKTstate0 + here->BJTvbc) =
147  *(ckt->CKTstate1 + here->BJTvbc);
148 
149  (void)bjt_limiting(ckt,model,here,&bj);
150  bjt_iv(ckt,model,here,&bj);
151  if (ckt->CKTmode & MODETRAN) {
152  bjt_cap(ckt,model,here,&bj);
153  (void)bjt_integ(ckt,model,here,&bj);
154  }
155  bjt_load(ckt,model,here,&bj);
156  }
157  }
158  return (OK);
159  }
160 
161  if (ckt->CKTmode & MODEINITFIX) {
162 
163  /* loop through all the models */
164  for ( ; model != NULL; model = model->BJTnextModel) {
165 
166  /* loop through all the instances of the model */
167  for (here = model->BJTinstances; here != NULL;
168  here = here->BJTnextInstance) {
169 
170  bj.bj_vt = here->BJTtemp * CONSTKoverQ;
171 
172  if (here->BJToff) {
173  bj.bj_vbe = 0;
174  bj.bj_vbc = 0;
175  bj.bj_vcs = 0;
176  bj.bj_vbx = 0;
177  }
178  else {
179  if (model->BJTtype > 0) {
180  bj.bj_vbe =
181  *(ckt->CKTrhsOld + here->BJTbasePrimeNode) -
182  *(ckt->CKTrhsOld + here->BJTemitPrimeNode);
183  bj.bj_vbc =
184  *(ckt->CKTrhsOld + here->BJTbasePrimeNode) -
185  *(ckt->CKTrhsOld + here->BJTcolPrimeNode);
186  bj.bj_vbx =
187  *(ckt->CKTrhsOld + here->BJTbaseNode) -
188  *(ckt->CKTrhsOld + here->BJTcolPrimeNode);
189  bj.bj_vcs =
190  *(ckt->CKTrhsOld + here->BJTsubstNode) -
191  *(ckt->CKTrhsOld + here->BJTcolPrimeNode);
192  }
193  else {
194  bj.bj_vbe =
195  *(ckt->CKTrhsOld + here->BJTemitPrimeNode) -
196  *(ckt->CKTrhsOld + here->BJTbasePrimeNode);
197  bj.bj_vbc =
198  *(ckt->CKTrhsOld + here->BJTcolPrimeNode) -
199  *(ckt->CKTrhsOld + here->BJTbasePrimeNode);
200  bj.bj_vbx =
201  *(ckt->CKTrhsOld + here->BJTcolPrimeNode) -
202  *(ckt->CKTrhsOld + here->BJTbaseNode);
203  bj.bj_vcs =
204  *(ckt->CKTrhsOld + here->BJTcolPrimeNode) -
205  *(ckt->CKTrhsOld + here->BJTsubstNode);
206  }
207  if (bjt_limiting(ckt,model,here,&bj))
208  ckt->CKTnoncon++;
209  }
210  bjt_iv(ckt,model,here,&bj);
211  bjt_load(ckt,model,here,&bj);
212  }
213  }
214  return (OK);
215  }
216 
217  if (ckt->CKTmode & MODEINITTRAN) {
218 
219  /* loop through all the models */
220  for ( ; model != NULL; model = model->BJTnextModel) {
221 
222  /* loop through all the instances of the model */
223  for (here = model->BJTinstances; here != NULL;
224  here = here->BJTnextInstance) {
225 
226  bj.bj_vt = here->BJTtemp * CONSTKoverQ;
227 
228  bj.bj_vbe = *(ckt->CKTstate1 + here->BJTvbe);
229  bj.bj_vbc = *(ckt->CKTstate1 + here->BJTvbc);
230  bj.bj_vbx = *(ckt->CKTstate1 + here->BJTvbx);
231  bj.bj_vcs = *(ckt->CKTstate1 + here->BJTvcs);
232 
233  bjt_iv(ckt,model,here,&bj);
234  bjt_cap(ckt,model,here,&bj);
235 
236  *(ckt->CKTstate1 + here->BJTqbe) =
237  *(ckt->CKTstate0 + here->BJTqbe);
238  *(ckt->CKTstate1 + here->BJTqbc) =
239  *(ckt->CKTstate0 + here->BJTqbc);
240  *(ckt->CKTstate1 + here->BJTqbx) =
241  *(ckt->CKTstate0 + here->BJTqbx);
242  *(ckt->CKTstate1 + here->BJTqcs) =
243  *(ckt->CKTstate0 + here->BJTqcs);
244 
245  (void)bjt_integ(ckt,model,here,&bj);
246  bjt_load(ckt,model,here,&bj);
247  }
248  }
249  return (OK);
250  }
251 
252  if (ckt->CKTmode & MODEINITSMSIG) {
253 
254  /* loop through all the models */
255  for ( ; model != NULL; model = model->BJTnextModel) {
256 
257  /* loop through all the instances of the model */
258  for (here = model->BJTinstances; here != NULL;
259  here = here->BJTnextInstance) {
260 
261  bj.bj_vt = here->BJTtemp * CONSTKoverQ;
262 
263  bj.bj_vbe = *(ckt->CKTstate0 + here->BJTvbe);
264  bj.bj_vbc = *(ckt->CKTstate0 + here->BJTvbc);
265  bj.bj_vbx = *(ckt->CKTstate0 + here->BJTvbx);
266  bj.bj_vcs = *(ckt->CKTstate0 + here->BJTvcs);
267 
268  bjt_iv(ckt,model,here,&bj);
269  bjt_cap(ckt,model,here,&bj);
270  }
271  }
272  return (OK);
273  }
274 
275  if ((ckt->CKTmode & MODEINITJCT) &&
276  (ckt->CKTmode & MODETRANOP) && (ckt->CKTmode & MODEUIC)) {
277 
278  /* loop through all the models */
279  for ( ; model != NULL; model = model->BJTnextModel) {
280 
281  /* loop through all the instances of the model */
282  for (here = model->BJTinstances; here != NULL;
283  here = here->BJTnextInstance) {
284 
285  if (model->BJTtype > 0) {
286  *(ckt->CKTstate0 + here->BJTvbe) = here->BJTicVBE;
287  *(ckt->CKTstate0 + here->BJTvbc) =
288  (here->BJTicVBE - here->BJTicVCE);
289  *(ckt->CKTstate0 + here->BJTvbx) =
290  (here->BJTicVBE - here->BJTicVCE);
291  }
292  else {
293  *(ckt->CKTstate0 + here->BJTvbe) = -here->BJTicVBE;
294  *(ckt->CKTstate0 + here->BJTvbc) =
295  -(here->BJTicVBE - here->BJTicVCE);
296  *(ckt->CKTstate0 + here->BJTvbx) =
297  -(here->BJTicVBE - here->BJTicVCE);
298  }
299  *(ckt->CKTstate0 + here->BJTvcs) = 0;
300  }
301  }
302  return (OK);
303  }
304 
305  if (ckt->CKTmode & MODEINITJCT) {
306 
307  /* loop through all the models */
308  for ( ; model != NULL; model = model->BJTnextModel) {
309 
310  /* loop through all the instances of the model */
311  for (here = model->BJTinstances; here != NULL;
312  here = here->BJTnextInstance) {
313 
314  bj.bj_vt = here->BJTtemp * CONSTKoverQ;
315 
316  if (here->BJToff)
317  bj.bj_vbe = 0;
318  else
319  bj.bj_vbe = here->BJTtVcrit;
320  bj.bj_vbc = 0;
321  bj.bj_vcs = 0;
322  bj.bj_vbx = 0;
323 
324  bjt_iv(ckt,model,here,&bj);
325  bjt_load(ckt,model,here,&bj);
326  }
327  }
328  }
329  return (OK);
330 }
BJTinstance * BJTinstances
Definition: bjtdefs.h:259
static int bjt_integ()
int BJTemitPrimeNode
Definition: bjtdefs.h:30
static int bjt_bypass()
#define MODEINITPRED
Definition: cktdefs.h:161
#define MODETRAN
Definition: cktdefs.h:145
int BJTtype
Definition: bjtdefs.h:262
struct sBJTmodel * BJTnextModel
Definition: bjtdefs.h:257
double CKTdelta
Definition: cktdefs.h:78
#define MODEINITFLOAT
Definition: cktdefs.h:156
#define MODEINITTRAN
Definition: cktdefs.h:160
double BJTtemp
Definition: bjtdefs.h:35
double CONSTKoverQ
Definition: main.c:915
int BJTbasePrimeNode
Definition: bjtdefs.h:29
static void bjt_load()
double bj_vt
Definition: bjtload.c:23
struct sBJTinstance * BJTnextInstance
Definition: bjtdefs.h:20
static void bjt_iv()
#define OK
Definition: iferrmsg.h:17
static void bjt_cap()
double * CKTrhsOld
Definition: cktdefs.h:98
double BJTtVcrit
Definition: bjtdefs.h:49
int BJTcolPrimeNode
Definition: bjtdefs.h:28
#define NULL
Definition: spdefs.h:121
#define MODEINITSMSIG
Definition: cktdefs.h:159
#define MODETRANOP
Definition: cktdefs.h:151
int BJTbaseNode
Definition: bjtdefs.h:25
int BJTsubstNode
Definition: bjtdefs.h:27
static char model[32]
Definition: subckt.c:76
#define MODEINITFIX
Definition: cktdefs.h:158
int CKTbypass
Definition: cktdefs.h:169
double BJTicVBE
Definition: bjtdefs.h:33
double CKTdeltaOld[7]
Definition: cktdefs.h:79
int CKTnoncon
Definition: cktdefs.h:203
double BJTicVCE
Definition: bjtdefs.h:34
long CKTmode
Definition: cktdefs.h:139
#define MODEINITJCT
Definition: cktdefs.h:157
#define MODEUIC
Definition: cktdefs.h:166
static int bjt_limiting()
unsigned BJToff
Definition: bjtdefs.h:228