📄 soi3load.c
字号:
-(xfact * (*(ckt->CKTstate2 + here->SOI3vbs))); *(ckt->CKTstate0 + here->SOI3vgfs) = *(ckt->CKTstate1 + here->SOI3vgfs); vgfs = (1+xfact)* (*(ckt->CKTstate1 + here->SOI3vgfs)) -(xfact * (*(ckt->CKTstate2 + here->SOI3vgfs))); *(ckt->CKTstate0 + here->SOI3vgbs) = *(ckt->CKTstate1 + here->SOI3vgbs); vgbs = (1+xfact)* (*(ckt->CKTstate1 + here->SOI3vgbs)) -(xfact * (*(ckt->CKTstate2 + here->SOI3vgbs))); *(ckt->CKTstate0 + here->SOI3vds) = *(ckt->CKTstate1 + here->SOI3vds); vds = (1+xfact)* (*(ckt->CKTstate1 + here->SOI3vds)) -(xfact * (*(ckt->CKTstate2 + here->SOI3vds))); *(ckt->CKTstate0 + here->SOI3vbd) = *(ckt->CKTstate0 + here->SOI3vbs)- *(ckt->CKTstate0 + here->SOI3vds); *(ckt->CKTstate0 + here->SOI3deltaT) = *(ckt->CKTstate1 + here->SOI3deltaT); deltaT = MAX(0,(1+xfact)* (*(ckt->CKTstate1 + here->SOI3deltaT)) -(xfact * (*(ckt->CKTstate2 + here->SOI3deltaT)))); /* need to stop deltaT being -ve */ /* JimB - 19/5/99 */ if (here->SOI3numThermalNodes == 0) { deltaT1=deltaT2=deltaT3=deltaT4=deltaT5=0.0; } if (here->SOI3numThermalNodes == 1) { deltaT1=deltaT; deltaT2=deltaT3=deltaT4=deltaT5=0.0; } if (here->SOI3numThermalNodes == 2) { deltaT1 = MAX(0,(1+xfact)* (*(ckt->CKTstate1 + here->SOI3deltaT1)) -(xfact * (*(ckt->CKTstate2 + here->SOI3deltaT1)))); deltaT2 = MAX(0,(1+xfact)* (*(ckt->CKTstate1 + here->SOI3deltaT2)) -(xfact * (*(ckt->CKTstate2 + here->SOI3deltaT2)))); deltaT3=deltaT4=deltaT5=0.0; } if (here->SOI3numThermalNodes == 3) { deltaT1 = MAX(0,(1+xfact)* (*(ckt->CKTstate1 + here->SOI3deltaT1)) -(xfact * (*(ckt->CKTstate2 + here->SOI3deltaT1)))); deltaT2 = MAX(0,(1+xfact)* (*(ckt->CKTstate1 + here->SOI3deltaT2)) -(xfact * (*(ckt->CKTstate2 + here->SOI3deltaT2)))); deltaT3 = MAX(0,(1+xfact)* (*(ckt->CKTstate1 + here->SOI3deltaT3)) -(xfact * (*(ckt->CKTstate2 + here->SOI3deltaT3)))); deltaT4=deltaT5=0.0; } if (here->SOI3numThermalNodes == 4) { deltaT1 = MAX(0,(1+xfact)* (*(ckt->CKTstate1 + here->SOI3deltaT1)) -(xfact * (*(ckt->CKTstate2 + here->SOI3deltaT1)))); deltaT2 = MAX(0,(1+xfact)* (*(ckt->CKTstate1 + here->SOI3deltaT2)) -(xfact * (*(ckt->CKTstate2 + here->SOI3deltaT2)))); deltaT3 = MAX(0,(1+xfact)* (*(ckt->CKTstate1 + here->SOI3deltaT3)) -(xfact * (*(ckt->CKTstate2 + here->SOI3deltaT3)))); deltaT4 = MAX(0,(1+xfact)* (*(ckt->CKTstate1 + here->SOI3deltaT4)) -(xfact * (*(ckt->CKTstate2 + here->SOI3deltaT4)))); deltaT5=0.0; } if (here->SOI3numThermalNodes == 5) { deltaT1 = MAX(0,(1+xfact)* (*(ckt->CKTstate1 + here->SOI3deltaT1)) -(xfact * (*(ckt->CKTstate2 + here->SOI3deltaT1)))); deltaT2 = MAX(0,(1+xfact)* (*(ckt->CKTstate1 + here->SOI3deltaT2)) -(xfact * (*(ckt->CKTstate2 + here->SOI3deltaT2)))); deltaT3 = MAX(0,(1+xfact)* (*(ckt->CKTstate1 + here->SOI3deltaT3)) -(xfact * (*(ckt->CKTstate2 + here->SOI3deltaT3)))); deltaT4 = MAX(0,(1+xfact)* (*(ckt->CKTstate1 + here->SOI3deltaT4)) -(xfact * (*(ckt->CKTstate2 + here->SOI3deltaT4)))); deltaT5 =MAX(0,deltaT-deltaT1-deltaT2-deltaT3-deltaT4); } *(ckt->CKTstate0 + here->SOI3idrain) = *(ckt->CKTstate1 + here->SOI3idrain); *(ckt->CKTstate0 + here->SOI3cgfgf) = *(ckt->CKTstate1 + here->SOI3cgfgf); *(ckt->CKTstate0 + here->SOI3cgfd) = *(ckt->CKTstate1 + here->SOI3cgfd); *(ckt->CKTstate0 + here->SOI3cgfs) = *(ckt->CKTstate1 + here->SOI3cgfs); *(ckt->CKTstate0 + here->SOI3cgfdeltaT) = *(ckt->CKTstate1 + here->SOI3cgfdeltaT); *(ckt->CKTstate0 + here->SOI3cgfgb) = *(ckt->CKTstate1 + here->SOI3cgfgb); *(ckt->CKTstate0 + here->SOI3csgf) = *(ckt->CKTstate1 + here->SOI3csgf); *(ckt->CKTstate0 + here->SOI3csd) = *(ckt->CKTstate1 + here->SOI3csd); *(ckt->CKTstate0 + here->SOI3css) = *(ckt->CKTstate1 + here->SOI3css); *(ckt->CKTstate0 + here->SOI3csdeltaT) = *(ckt->CKTstate1 + here->SOI3csdeltaT); *(ckt->CKTstate0 + here->SOI3csgb) = *(ckt->CKTstate1 + here->SOI3csgb); *(ckt->CKTstate0 + here->SOI3cdgf) = *(ckt->CKTstate1 + here->SOI3cdgf); *(ckt->CKTstate0 + here->SOI3cdd) = *(ckt->CKTstate1 + here->SOI3cdd); *(ckt->CKTstate0 + here->SOI3cds) = *(ckt->CKTstate1 + here->SOI3cds); *(ckt->CKTstate0 + here->SOI3cddeltaT) = *(ckt->CKTstate1 + here->SOI3cddeltaT); *(ckt->CKTstate0 + here->SOI3cdgb) = *(ckt->CKTstate1 + here->SOI3cdgb); *(ckt->CKTstate0 + here->SOI3cgbgf) = *(ckt->CKTstate1 + here->SOI3cgbgf); *(ckt->CKTstate0 + here->SOI3cgbd) = *(ckt->CKTstate1 + here->SOI3cgbd); *(ckt->CKTstate0 + here->SOI3cgbs) = *(ckt->CKTstate1 + here->SOI3cgbs); *(ckt->CKTstate0 + here->SOI3cgbdeltaT) = *(ckt->CKTstate1 + here->SOI3cgbdeltaT); *(ckt->CKTstate0 + here->SOI3cgbgb) = *(ckt->CKTstate1 + here->SOI3cgbgb); *(ckt->CKTstate0 + here->SOI3cBJTbsbs) = *(ckt->CKTstate1 + here->SOI3cBJTbsbs); *(ckt->CKTstate0 + here->SOI3cBJTbsdeltaT) = *(ckt->CKTstate1 + here->SOI3cBJTbsdeltaT); *(ckt->CKTstate0 + here->SOI3cBJTbdbd) = *(ckt->CKTstate1 + here->SOI3cBJTbdbd); *(ckt->CKTstate0 + here->SOI3cBJTbddeltaT) = *(ckt->CKTstate1 + here->SOI3cBJTbddeltaT); } else {#endif /* PREDICTOR */ /* general iteration */ vbs = model->SOI3type * ( *(ckt->CKTrhsOld+here->SOI3bNode) - *(ckt->CKTrhsOld+here->SOI3sNodePrime)); vgfs = model->SOI3type * ( *(ckt->CKTrhsOld+here->SOI3gfNode) - *(ckt->CKTrhsOld+here->SOI3sNodePrime)); vgbs = model->SOI3type * ( *(ckt->CKTrhsOld+here->SOI3gbNode) - *(ckt->CKTrhsOld+here->SOI3sNodePrime)); vds = model->SOI3type * ( *(ckt->CKTrhsOld+here->SOI3dNodePrime) - *(ckt->CKTrhsOld+here->SOI3sNodePrime)); deltaT = MAX(0,*(ckt->CKTrhsOld+here->SOI3toutNode)); /* voltage deltaT is V(tout) wrt ground and shoule be positive *//* the next lot are needed for the (extra) thermal capacitances */ /* JimB - 19/5/99 */ if (here->SOI3numThermalNodes == 0) { deltaT1=deltaT2=deltaT3=deltaT4=deltaT5=0; } if (here->SOI3numThermalNodes == 1) { deltaT1=deltaT; deltaT2=deltaT3=deltaT4=deltaT5=0; } if (here->SOI3numThermalNodes == 2) { deltaT2 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout1Node)); deltaT1 = deltaT - deltaT2; deltaT3=deltaT4=deltaT5=0; } if (here->SOI3numThermalNodes == 3) { deltaT3 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout2Node)); deltaT2 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout1Node) - deltaT3); deltaT1 = deltaT - deltaT2 - deltaT3; deltaT4=deltaT5=0; } if (here->SOI3numThermalNodes == 4) { deltaT4 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout3Node)); deltaT3 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout2Node) - deltaT4); deltaT2 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout1Node) - deltaT3 - deltaT4); deltaT1 = deltaT - deltaT2 - deltaT3 - deltaT4; deltaT5=0; } if (here->SOI3numThermalNodes == 5) { deltaT5 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout4Node)); deltaT4 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout3Node) - deltaT5); deltaT3 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout2Node) - deltaT4 - deltaT5); deltaT2 = MAX(0,*(ckt->CKTrhsOld+here->SOI3tout1Node) - deltaT3 - deltaT4 - deltaT5); deltaT1 = deltaT - deltaT2 - deltaT3 - deltaT4 - deltaT5; }#ifndef PREDICTOR }#endif /* PREDICTOR */ /* now some common crunching for some more useful quantities */ /* bloody useful in our case */ vbd=vbs-vds; vdb=-vbd; vsb=-vbs; vgfd=vgfs-vds; vgbd=vgbs-vds; vgbb=vgbs-vbs; vgfdo = *(ckt->CKTstate0 + here->SOI3vgfs) - *(ckt->CKTstate0 + here->SOI3vds); vgbdo = *(ckt->CKTstate0 + here->SOI3vgbs) - *(ckt->CKTstate0 + here->SOI3vds); delvbs = vbs - *(ckt->CKTstate0 + here->SOI3vbs); delvbd = vbd - *(ckt->CKTstate0 + here->SOI3vbd); delvgfs = vgfs - *(ckt->CKTstate0 + here->SOI3vgfs); delvgbs = vgbs - *(ckt->CKTstate0 + here->SOI3vgbs); delvds = vds - *(ckt->CKTstate0 + here->SOI3vds); delvgfd = vgfd-vgfdo; delvgbd = vgbd-vgbdo; deldeltaT = deltaT - *(ckt->CKTstate0 + here->SOI3deltaT); /* these are needed for convergence testing */ /* we're keeping these the same as convergence on vgfs, vbs, vbd, vgbs, deltaT is equiv to conv. on vgfb, vsb, vdb, vgb_b, deltaT */ if (here->SOI3mode >= 0) { /* normal */ idhat= here->SOI3id- here->SOI3gbd * delvbd - here->SOI3gbdT * deldeltaT + /* for -ibd bit of id */ (here->SOI3gmbs + here->SOI3gMmbs) * delvbs + (here->SOI3gmf + here->SOI3gMmf) * delvgfs + (here->SOI3gmb + here->SOI3gMmb) * delvgbs + (here->SOI3gds + here->SOI3gMd) * delvds + (here->SOI3gt + here->SOI3gMdeltaT) * deldeltaT + here->SOI3gBJTdb_bs * delvbs + here->SOI3gBJTdb_deltaT * deldeltaT; ibhat= here->SOI3ibs + here->SOI3ibd + here->SOI3gbd * delvbd + here->SOI3gbdT * deldeltaT + here->SOI3gbs * delvbs + here->SOI3gbsT * deldeltaT - here->SOI3iMdb - here->SOI3gMmbs * delvbs - here->SOI3gMmf * delvgfs - here->SOI3gMmb * delvgbs - here->SOI3gMd * delvds - here->SOI3gMdeltaT * deldeltaT - here->SOI3iBJTsb - here->SOI3gBJTsb_bd * delvbd - here->SOI3gBJTsb_deltaT * deldeltaT - here->SOI3iBJTdb - here->SOI3gBJTdb_bs * delvbs - here->SOI3gBJTdb_deltaT * deldeltaT; } else { /* A over T */ idhat= here->SOI3id - ( here->SOI3gbd + here->SOI3gmbs) * delvbd - (here->SOI3gmf) * delvgfd - (here->SOI3gmb) * delvgbd + (here->SOI3gds) * delvds - (here->SOI3gt + here->SOI3gbdT) * deldeltaT + here->SOI3gBJTdb_bs * delvbs + here->SOI3gBJTdb_deltaT * deldeltaT; ibhat= here->SOI3ibs + here->SOI3ibd + here->SOI3gbd * delvbd + here->SOI3gbdT * deldeltaT + here->SOI3gbs * delvbs + here->SOI3gbsT * deldeltaT - here->SOI3iMsb - here->SOI3gMmbs * delvbd - here->SOI3gMmf * delvgfd - here->SOI3gMmb * delvgbd + here->SOI3gMd * delvds - /* gMd should go with vsd */ here->SOI3gMdeltaT * deldeltaT - here->SOI3iBJTsb - here->SOI3gBJTsb_bd * delvbd - here->SOI3gBJTsb_deltaT * deldeltaT - here->SOI3iBJTdb - here->SOI3gBJTdb_bs * delvbs - here->SOI3gBJTdb_deltaT * deldeltaT; }/* thermal current source comparator */ iPthat =here->SOI3iPt + here->SOI3gPmbs * delvbs + here->SOI3gPmf * delvgfs + here->SOI3gPmb * delvgbs + here->SOI3gPds * delvds * here->SOI3mode + here->SOI3gPdT * deldeltaT;#ifndef NOBYPASS /* now lets see if we can bypass (ugh) */ /* the following mess should be one if statement, but
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -