1 /*************************************************************************** 2 JSPICE3 adaptation of Spice3f2 - Copyright (c) Stephen R. Whiteley 1992 3 Copyright 1990 Regents of the University of California. All rights reserved. 4 Authors: 1985 Thomas L. Quarles 5 1993 Stephen R. Whiteley 6 ****************************************************************************/ 7 8 /* 9 * This routine performs the device convergence test for 10 * BJTs in the circuit. 11 */ 12 13 #include "spice.h" 14 #include <stdio.h> 15 #include "bjtdefs.h" 16 #include "sperror.h" 17 #include "util.h" 18 19 20 int BJTconvTest(inModel,ckt)21BJTconvTest(inModel,ckt) 22 23 GENmodel *inModel; 24 CKTcircuit *ckt; 25 { 26 BJTinstance *here; 27 BJTmodel *model = (BJTmodel *) inModel; 28 double tol; 29 double c0; 30 double chat; 31 double vbe; 32 double vbc; 33 double delvbe; 34 double delvbc; 35 double A1, A2; 36 37 for ( ; model != NULL; model = model->BJTnextModel) { 38 for (here = model->BJTinstances; here != NULL; 39 here = here->BJTnextInstance) { 40 41 if (model->BJTtype > 0) { 42 vbe = *(ckt->CKTrhsOld + here->BJTbasePrimeNode) - 43 *(ckt->CKTrhsOld + here->BJTemitPrimeNode); 44 vbc = *(ckt->CKTrhsOld + here->BJTbasePrimeNode) - 45 *(ckt->CKTrhsOld + here->BJTcolPrimeNode); 46 } 47 else { 48 vbe = *(ckt->CKTrhsOld + here->BJTemitPrimeNode) - 49 *(ckt->CKTrhsOld + here->BJTbasePrimeNode); 50 vbc = *(ckt->CKTrhsOld + here->BJTcolPrimeNode) - 51 *(ckt->CKTrhsOld + here->BJTbasePrimeNode); 52 } 53 delvbe = vbe - *(ckt->CKTstate0 + here->BJTvbe); 54 delvbc = vbc - *(ckt->CKTstate0 + here->BJTvbc); 55 56 /* 57 * check convergence, collector current 58 */ 59 c0 = here->BJTcc; 60 chat = c0 + 61 (here->BJTgm + here->BJTgo)*delvbe - 62 (here->BJTgo + here->BJTgmu)*delvbc; 63 64 A1 = FABS(chat); 65 A2 = FABS(c0); 66 tol = ckt->CKTreltol*MAX(A1,A2) + ckt->CKTabstol; 67 68 A1 = chat - c0; 69 if (FABS(A1) > tol) { 70 ckt->CKTnoncon++; 71 ckt->CKTtroubleElt = (GENinstance *) here; 72 return (OK); /* no reason to continue - we've failed... */ 73 } 74 75 /* 76 * check convergence, base current 77 */ 78 c0 = here->BJTcb; 79 chat = c0 + 80 here->BJTgpi*delvbe + 81 here->BJTgmu*delvbc; 82 83 A1 = FABS(chat); 84 A2 = FABS(c0); 85 tol = ckt->CKTreltol*MAX(A1,A2) + ckt->CKTabstol; 86 87 A1 = chat - c0; 88 if (FABS(A1) > tol) { 89 ckt->CKTnoncon++; 90 ckt->CKTtroubleElt = (GENinstance *) here; 91 return (OK); /* no reason to continue - we've failed... */ 92 } 93 } 94 } 95 return (OK); 96 } 97