⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bjt2load.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
📖 第 1 页 / 共 3 页
字号:
                    czsub=here->BJT2tSubcap*here->BJT2areac;                else		    czsub=here->BJT2tSubcap*here->BJT2areab;		    		ps=here->BJT2tSubpot;                xms=model->BJT2exponentialSubstrate;                xtf=model->BJT2transitTimeBiasCoeffF;                ovtf=model->BJT2transitTimeVBCFactor;                xjtf=model->BJT2transitTimeHighCurrentF*here->BJT2area;                if(tf != 0 && vbe >0) {                    argtf=0;                    arg2=0;                    arg3=0;                    if(xtf != 0){                        argtf=xtf;                        if(ovtf != 0) {                            argtf=argtf*exp(vbc*ovtf);                        }                        arg2=argtf;                        if(xjtf != 0) {                            temp=cbe/(cbe+xjtf);                            argtf=argtf*temp*temp;                            arg2=argtf*(3-temp-temp);                        }                        arg3=cbe*argtf*ovtf;                    }                    cbe=cbe*(1+argtf)/qb;                    gbe=(gbe*(1+arg2)-cbe*dqbdve)/qb;                    geqcb=tf*(arg3-cbe*dqbdvc)/qb;                }                if (vbe < fcpe) {                    arg=1-vbe/pe;                    sarg=exp(-xme*log(arg));                    *(ckt->CKTstate0 + here->BJT2qbe)=tf*cbe+pe*czbe*                            (1-arg*sarg)/(1-xme);                    capbe=tf*gbe+czbe*sarg;                } else {                    f1=here->BJT2tf1;                    f2=model->BJT2f2;                    f3=model->BJT2f3;                    czbef2=czbe/f2;                    *(ckt->CKTstate0 + here->BJT2qbe) = tf*cbe+czbe*f1+czbef2*                            (f3*(vbe-fcpe) +(xme/(pe+pe))*(vbe*vbe-fcpe*fcpe));                    capbe=tf*gbe+czbef2*(f3+xme*vbe/pe);                }                fcpc=here->BJT2tf4;                f1=here->BJT2tf5;                f2=model->BJT2f6;                f3=model->BJT2f7;                if (vbc < fcpc) {                    arg=1-vbc/pc;                    sarg=exp(-xmc*log(arg));                    *(ckt->CKTstate0 + here->BJT2qbc) = tr*cbc+pc*czbc*(                            1-arg*sarg)/(1-xmc);                    capbc=tr*gbc+czbc*sarg;                } else {                    czbcf2=czbc/f2;                    *(ckt->CKTstate0 + here->BJT2qbc) = tr*cbc+czbc*f1+czbcf2*                            (f3*(vbc-fcpc) +(xmc/(pc+pc))*(vbc*vbc-fcpc*fcpc));                    capbc=tr*gbc+czbcf2*(f3+xmc*vbc/pc);                }                if(vbx < fcpc) {                    arg=1-vbx/pc;                    sarg=exp(-xmc*log(arg));                    *(ckt->CKTstate0 + here->BJT2qbx)=                         pc*czbx* (1-arg*sarg)/(1-xmc);                    capbx=czbx*sarg;                } else {                    czbxf2=czbx/f2;                    *(ckt->CKTstate0 + here->BJT2qbx)=czbx*f1+czbxf2*                            (f3*(vbx-fcpc)+(xmc/(pc+pc))*(vbx*vbx-fcpc*fcpc));                    capbx=czbxf2*(f3+xmc*vbx/pc);                }                if(vsub < 0){                    arg=1-vsub/ps;                    sarg=exp(-xms*log(arg));                    *(ckt->CKTstate0 + here->BJT2qsub) = ps*czsub*(1-arg*sarg)/                            (1-xms);                    capsub=czsub*sarg;                } else {                    *(ckt->CKTstate0 + here->BJT2qsub) = vsub*czsub*(1+xms*vsub/                            (2*ps));                    capsub=czsub*(1+xms*vsub/ps);		}		here->BJT2capbe = capbe;		here->BJT2capbc = capbc;		here->BJT2capsub = capsub;		here->BJT2capbx = capbx;                /*                 *   store small-signal parameters                 */                if ( (!(ckt->CKTmode & MODETRANOP))||                        (!(ckt->CKTmode & MODEUIC)) ) {                    if(ckt->CKTmode & MODEINITSMSIG) {                        *(ckt->CKTstate0 + here->BJT2cqbe) = capbe;                        *(ckt->CKTstate0 + here->BJT2cqbc) = capbc;                        *(ckt->CKTstate0 + here->BJT2cqsub) = capsub;                        *(ckt->CKTstate0 + here->BJT2cqbx) = capbx;                        *(ckt->CKTstate0 + here->BJT2cexbc) = geqcb;                        if(SenCond){                            *(ckt->CKTstate0 + here->BJT2cc) = cc;                            *(ckt->CKTstate0 + here->BJT2cb) = cb;                            *(ckt->CKTstate0 + here->BJT2gpi) = gpi;                            *(ckt->CKTstate0 + here->BJT2gmu) = gmu;                            *(ckt->CKTstate0 + here->BJT2gm) = gm;                            *(ckt->CKTstate0 + here->BJT2go) = go;                            *(ckt->CKTstate0 + here->BJT2gx) = gx;                            *(ckt->CKTstate0 + here->BJT2gcsub) = gcsub;                            *(ckt->CKTstate0 + here->BJT2geqbx) = geqbx;                        }#ifdef SENSDEBUG                        printf("storing small signal parameters for op\n");                        printf("capbe = %.7e ,capbc = %.7e\n",capbe,capbc);                        printf("capsub = %.7e ,capbx = %.7e\n",capsub,capbx);                        printf("geqcb = %.7e ,gpi = %.7e\n",geqcb,gpi);                        printf("gmu = %.7e ,gm = %.7e\n",gmu,gm);                        printf("go = %.7e ,gx = %.7e\n",go,gx);                        printf("gcsub = %.7e ,geqbx = %.7e\n",gcsub,geqbx);                        printf("cc = %.7e ,cb = %.7e\n",cc,cb);#endif /* SENSDEBUG */                        continue; /* go to 1000 */                    }                    /*                     *   transient analysis                     */                    if(SenCond && ckt->CKTsenInfo->SENmode == TRANSEN){                        *(ckt->CKTstate0 + here->BJT2cc) = cc;                        *(ckt->CKTstate0 + here->BJT2cb) = cb;                        *(ckt->CKTstate0 + here->BJT2gx) = gx;                        continue;                    }                    if(ckt->CKTmode & MODEINITTRAN) {                        *(ckt->CKTstate1 + here->BJT2qbe) =                                *(ckt->CKTstate0 + here->BJT2qbe) ;                        *(ckt->CKTstate1 + here->BJT2qbc) =                                *(ckt->CKTstate0 + here->BJT2qbc) ;                        *(ckt->CKTstate1 + here->BJT2qbx) =                                *(ckt->CKTstate0 + here->BJT2qbx) ;                        *(ckt->CKTstate1 + here->BJT2qsub) =                                *(ckt->CKTstate0 + here->BJT2qsub) ;                    }                    error = NIintegrate(ckt,&geq,&ceq,capbe,here->BJT2qbe);                    if(error) return(error);                    geqcb=geqcb*ckt->CKTag[0];                    gpi=gpi+geq;                    cb=cb+*(ckt->CKTstate0 + here->BJT2cqbe);                    error = NIintegrate(ckt,&geq,&ceq,capbc,here->BJT2qbc);                    if(error) return(error);                    gmu=gmu+geq;                    cb=cb+*(ckt->CKTstate0 + here->BJT2cqbc);                    cc=cc-*(ckt->CKTstate0 + here->BJT2cqbc);                    if(ckt->CKTmode & MODEINITTRAN) {                        *(ckt->CKTstate1 + here->BJT2cqbe) =                                *(ckt->CKTstate0 + here->BJT2cqbe);                        *(ckt->CKTstate1 + here->BJT2cqbc) =                                *(ckt->CKTstate0 + here->BJT2cqbc);                    }                }            }            if(SenCond) goto next2;            /*             *   check convergence             */            if ( (!(ckt->CKTmode & MODEINITFIX))||(!(here->BJT2off))) {                if (icheck == 1) {                    ckt->CKTnoncon++;		    ckt->CKTtroubleElt = (GENinstance *) here;                }            }            /*             *      charge storage for c-s and b-x junctions             */            if(ckt->CKTmode & (MODETRAN | MODEAC)) {                error = NIintegrate(ckt,&gcsub,&ceq,capsub,here->BJT2qsub);                if(error) return(error);                error = NIintegrate(ckt,&geqbx,&ceq,capbx,here->BJT2qbx);                if(error) return(error);                if(ckt->CKTmode & MODEINITTRAN) {                    *(ckt->CKTstate1 + here->BJT2cqbx) =                            *(ckt->CKTstate0 + here->BJT2cqbx);                    *(ckt->CKTstate1 + here->BJT2cqsub) =                            *(ckt->CKTstate0 + here->BJT2cqsub);                }            }next2:            *(ckt->CKTstate0 + here->BJT2vbe) = vbe;            *(ckt->CKTstate0 + here->BJT2vbc) = vbc;            *(ckt->CKTstate0 + here->BJT2cc) = cc;            *(ckt->CKTstate0 + here->BJT2cb) = cb;            *(ckt->CKTstate0 + here->BJT2gpi) = gpi;            *(ckt->CKTstate0 + here->BJT2gmu) = gmu;            *(ckt->CKTstate0 + here->BJT2gm) = gm;            *(ckt->CKTstate0 + here->BJT2go) = go;            *(ckt->CKTstate0 + here->BJT2gx) = gx;            *(ckt->CKTstate0 + here->BJT2geqcb) = geqcb;            *(ckt->CKTstate0 + here->BJT2gcsub) = gcsub;            *(ckt->CKTstate0 + here->BJT2geqbx) = geqbx;            *(ckt->CKTstate0 + here->BJT2vsub) = vsub;            *(ckt->CKTstate0 + here->BJT2gdsub) = gdsub;            *(ckt->CKTstate0 + here->BJT2cdsub) = cdsub;            /* Do not load the Jacobian and the rhs if               perturbation is being carried out */            if(SenCond)continue;load:            m = here->BJT2m;            /*             *  load current excitation vector             */            geqsub = gcsub + gdsub;            ceqsub=model->BJT2type * model->BJT2subs *                   (*(ckt->CKTstate0 + here->BJT2cqsub) + cdsub - vsub*geqsub);/*            ceqsub=model->BJT2type * (*(ckt->CKTstate0 + here->BJT2cqsub) +                                       model->BJT2subs*cdsub - vsub*geqsub);*/            ceqbx=model->BJT2type * (*(ckt->CKTstate0 + here->BJT2cqbx) -                    vbx * geqbx);            ceqbe=model->BJT2type * (cc + cb - vbe * (gm + go + gpi) + vbc *                     (go - geqcb));            ceqbc=model->BJT2type * (-cc + vbe * (gm + go) - vbc * (gmu + go));            *(ckt->CKTrhs + here->BJT2baseNode) +=  m * (-ceqbx);            *(ckt->CKTrhs + here->BJT2colPrimeNode) +=                      m * (ceqbx+ceqbc);            *(ckt->CKTrhs + here->BJT2substConNode) += m * ceqsub;            *(ckt->CKTrhs + here->BJT2basePrimeNode) +=                     m * (-ceqbe-ceqbc);            *(ckt->CKTrhs + here->BJT2emitPrimeNode) += m * (ceqbe);            *(ckt->CKTrhs + here->BJT2substNode) +=  m * (-ceqsub);                        /*             *  load y matrix             */            *(here->BJT2colColPtr) +=               m * (gcpr);            *(here->BJT2baseBasePtr) +=             m * (gx+geqbx);            *(here->BJT2emitEmitPtr) +=             m * (gepr);            *(here->BJT2colPrimeColPrimePtr) +=     m * (gmu+go+gcpr+geqbx);            *(here->BJT2substConSubstConPtr) +=     m * (geqsub);            *(here->BJT2basePrimeBasePrimePtr) +=   m * (gx +gpi+gmu+geqcb);            *(here->BJT2emitPrimeEmitPrimePtr) +=   m * (gpi+gepr+gm+go);            *(here->BJT2colColPrimePtr) +=          m * (-gcpr);            *(here->BJT2baseBasePrimePtr) +=        m * (-gx);            *(here->BJT2emitEmitPrimePtr) +=        m * (-gepr);            *(here->BJT2colPrimeColPtr) +=          m * (-gcpr);            *(here->BJT2colPrimeBasePrimePtr) +=    m * (-gmu+gm);            *(here->BJT2colPrimeEmitPrimePtr) +=    m * (-gm-go);            *(here->BJT2basePrimeBasePtr) +=        m * (-gx);            *(here->BJT2basePrimeColPrimePtr) +=    m * (-gmu-geqcb);            *(here->BJT2basePrimeEmitPrimePtr) +=   m * (-gpi);            *(here->BJT2emitPrimeEmitPtr) +=        m * (-gepr);            *(here->BJT2emitPrimeColPrimePtr) +=    m * (-go+geqcb);            *(here->BJT2emitPrimeBasePrimePtr) +=   m * (-gpi-gm-geqcb);            *(here->BJT2substSubstPtr) +=           m * (geqsub);            *(here->BJT2substConSubstPtr) +=        m * (-geqsub);            *(here->BJT2substSubstConPtr) +=        m * (-geqsub);            *(here->BJT2baseColPrimePtr) +=         m * (-geqbx);            *(here->BJT2colPrimeBasePtr) +=         m * (-geqbx);        }    }    return(OK);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -