Reconstruct NEWCONV macro

This commit is contained in:
dwarning 2008-04-20 09:33:06 +00:00
parent 389b1662ef
commit af3afcca38
9 changed files with 103 additions and 48 deletions

View File

@ -66,9 +66,12 @@ NIconvTest(CKTcircuit *ckt)
}
}
#ifdef NEWCONV
i = CKTconvTest(ckt);
if (i)
ckt->CKTtroubleNode = 0;
return(i);
#else /* NEWCONV */
return(0);
#endif /* NEWCONV */
}

View File

@ -46,7 +46,10 @@ double czbd, czbdsw, czbdswg, czbs, czbssw, czbsswg, evbd, evbs, arg, sarg;
double delvbd, delvbs, delvds, delvgd, delvgs;
double Vfbeff, dVfbeff_dVg, dVfbeff_dVb, V3, V4;
double gcbdb, gcbgb, gcbsb, gcddb, gcdgb, gcdsb, gcgdb, gcggb, gcgsb, gcsdb;
double gcsgb, gcssb, tol, MJ, MJSW, MJSWG;
#ifndef NEWCONV
double tol;
#endif
double gcsgb, gcssb, MJ, MJSW, MJSWG;
double vbd, vbs, vds, vgb, vgd, vgs, vgdo, xfact;
double qgate, qbulk, qdrn, qsrc, qinoi, cqgate, cqbulk, cqdrn;
double Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum;

View File

@ -1853,7 +1853,7 @@ IFuid tmpName;
printf("Warning: soiMod has been set to its global value %d.\n", model->B4SOIsoiMod);
}
if (here->B4SOIsoiMod == 3) /* auto selection */
if (here->B4SOIsoiMod == 3) { /* auto selection */
if (Vbs0t > model->B4SOIvbs0fd)
here->B4SOIsoiMod = 2; /* ideal FD mode */
else
@ -1861,7 +1861,7 @@ IFuid tmpName;
here->B4SOIsoiMod = 0; /* BSIMPD */
else
here->B4SOIsoiMod = 1;
}
here->B4SOIfloat = 0;
if (here->B4SOIsoiMod == 2) /* v3.2 */

View File

@ -38,7 +38,10 @@ double czbd, czbdsw, czbs, czbssw, evbd, evbs, arg, sarg;
double delvbd, delvbs, delvds, delvgd, delvgs;
double Vfbeff, dVfbeff_dVg, dVfbeff_dVd, dVfbeff_dVb, V3, V4;
double gcbdb, gcbgb, gcbsb, gcddb, gcdgb, gcdsb, gcgdb, gcggb, gcgsb, gcsdb;
double gcsgb, gcssb, tol, PhiB, PhiBSW, MJ, MJSW;
#ifndef NEWCONV
double tol;
#endif
double gcsgb, gcssb, PhiB, PhiBSW, MJ, MJSW;
double vbd, vbs, vds, vgb, vgd, vgs, vgdo, xfact;
double qgate = 0.0, qbulk = 0.0, qdrn = 0.0, qsrc, cqgate, cqbulk, cqdrn;
double Vds, Vgs, Vbs, Gmbs, FwdSum, RevSum;

View File

@ -74,7 +74,9 @@ double dRs_dvg, dRd_dvg, dRs_dvb, dRd_dvb;
double dT0_dvg, dT1_dvb, dT3_dvg, dT3_dvb;
double vses, vdes, vdedo, delvses, delvded, delvdes;
double Isestot=0.0, cseshat=0.0, Idedtot=0.0, cdedhat=0.0;
#ifndef NEWCONV
double tol0, tol1, tol2, tol3, tol4, tol5, tol6;
#endif
double geltd, gcrg, gcrgg, gcrgd, gcrgs, gcrgb, ceqgcrg;
double vges, vgms, vgedo, vgmdo, vged, vgmd, delvged, delvgmd;

View File

@ -3376,6 +3376,46 @@ finished:
if ((here->BSIM4v2off == 0) || (!(ckt->CKTmode & MODEINITFIX)))
{ if (Check == 1)
{ ckt->CKTnoncon++;
#ifndef NEWCONV
}
else
{ if (here->BSIM4v2mode >= 0)
{ Idtot = here->BSIM4v2cd + here->BSIM4v2csub
+ here->BSIM4v2Igidl - here->BSIM4v2cbd;
}
else
{ Idtot = here->BSIM4v2cd + here->BSIM4v2cbd;
}
tol0 = ckt->CKTreltol * MAX(FABS(cdhat), FABS(Idtot))
+ ckt->CKTabstol;
tol1 = ckt->CKTreltol * MAX(FABS(cseshat), FABS(Isestot))
+ ckt->CKTabstol;
tol2 = ckt->CKTreltol * MAX(FABS(cdedhat), FABS(Idedtot))
+ ckt->CKTabstol;
tol3 = ckt->CKTreltol * MAX(FABS(cgshat), FABS(Igstot))
+ ckt->CKTabstol;
tol4 = ckt->CKTreltol * MAX(FABS(cgdhat), FABS(Igdtot))
+ ckt->CKTabstol;
tol5 = ckt->CKTreltol * MAX(FABS(cgbhat), FABS(Igbtot))
+ ckt->CKTabstol;
if ((FABS(cdhat - Idtot) >= tol0) || (FABS(cseshat - Isestot) >= tol1)
|| (FABS(cdedhat - Idedtot) >= tol2))
{ ckt->CKTnoncon++;
}
else if ((FABS(cgshat - Igstot) >= tol3) || (FABS(cgdhat - Igdtot) >= tol4)
|| (FABS(cgbhat - Igbtot) >= tol5))
{ ckt->CKTnoncon++;
}
else
{ Ibtot = here->BSIM4v2cbs + here->BSIM4v2cbd
- here->BSIM4v2Igidl - here->BSIM4v2csub;
tol6 = ckt->CKTreltol * MAX(FABS(cbhat), FABS(Ibtot))
+ ckt->CKTabstol;
if (FABS(cbhat - Ibtot) > tol6)
{ ckt->CKTnoncon++;
}
}
#endif /* NEWCONV */
}
}
*(ckt->CKTstate0 + here->BSIM4v2vds) = vds;

View File

@ -50,7 +50,9 @@ double dRs_dvg, dRd_dvg, dRs_dvb, dRd_dvb;
double dT0_dvg, dT1_dvb, dT3_dvg, dT3_dvb;
double vses, vdes, vdedo, delvses, delvded, delvdes;
double Isestot, cseshat, Idedtot, cdedhat;
#ifndef NEWCONV
double tol0, tol1, tol2, tol3, tol4, tol5, tol6;
#endif
double geltd, gcrg, gcrgg, gcrgd, gcrgs, gcrgb, ceqgcrg;
double vges, vgms, vgedo, vgmdo, vged, vgmd, delvged, delvgmd;

View File

@ -67,9 +67,9 @@ double dRs_dvg, dRd_dvg, dRs_dvb, dRd_dvb;
double dT0_dvg, dT1_dvb, dT3_dvg, dT3_dvb;
double vses, vdes, vdedo, delvses, delvded, delvdes;
double Isestot=0.0, cseshat=0.0, Idedtot=0.0, cdedhat=0.0;
//#ifndef NEWCONV
//double tol0, tol1, tol2, tol3, tol4, tol5, tol6;
//#endif
#ifndef NEWCONV
double tol0, tol1, tol2, tol3, tol4, tol5, tol6;
#endif
double geltd, gcrg, gcrgg, gcrgd, gcrgs, gcrgb, ceqgcrg;
double vges, vgms, vgedo, vgmdo, vged, vgmd, delvged, delvgmd;
@ -3576,46 +3576,46 @@ finished:
if ((here->BSIM4v4off == 0) || (!(ckt->CKTmode & MODEINITFIX)))
{ if (Check == 1)
{ ckt->CKTnoncon++;
// #ifndef NEWCONV
// }
// else
// { if (here->BSIM4v4mode >= 0)
// { Idtot = here->BSIM4v4cd + here->BSIM4v4csub
// + here->BSIM4v4Igidl - here->BSIM4v4cbd;
// }
// else
// { Idtot = here->BSIM4v4cd + here->BSIM4v4cbd - here->BSIM4v4Igidl; /* bugfix */
// }
// tol0 = ckt->CKTreltol * MAX(fabs(cdhat), fabs(Idtot))
// + ckt->CKTabstol;
// tol1 = ckt->CKTreltol * MAX(fabs(cseshat), fabs(Isestot))
// + ckt->CKTabstol;
// tol2 = ckt->CKTreltol * MAX(fabs(cdedhat), fabs(Idedtot))
// + ckt->CKTabstol;
// tol3 = ckt->CKTreltol * MAX(fabs(cgshat), fabs(Igstot))
// + ckt->CKTabstol;
// tol4 = ckt->CKTreltol * MAX(fabs(cgdhat), fabs(Igdtot))
// + ckt->CKTabstol;
// tol5 = ckt->CKTreltol * MAX(fabs(cgbhat), fabs(Igbtot))
// + ckt->CKTabstol;
// if ((fabs(cdhat - Idtot) >= tol0) || (fabs(cseshat - Isestot) >= tol1)
// || (fabs(cdedhat - Idedtot) >= tol2))
// { ckt->CKTnoncon++;
// }
// else if ((fabs(cgshat - Igstot) >= tol3) || (fabs(cgdhat - Igdtot) >= tol4)
// || (fabs(cgbhat - Igbtot) >= tol5))
// { ckt->CKTnoncon++;
// }
// else
// { Ibtot = here->BSIM4v4cbs + here->BSIM4v4cbd
// - here->BSIM4v4Igidl - here->BSIM4v4Igisl - here->BSIM4v4csub;
// tol6 = ckt->CKTreltol * MAX(fabs(cbhat), fabs(Ibtot))
// + ckt->CKTabstol;
// if (fabs(cbhat - Ibtot) > tol6)
// { ckt->CKTnoncon++;
// }
// }
// #endif /* NEWCONV */
#ifndef NEWCONV
}
else
{ if (here->BSIM4v4mode >= 0)
{ Idtot = here->BSIM4v4cd + here->BSIM4v4csub
+ here->BSIM4v4Igidl - here->BSIM4v4cbd;
}
else
{ Idtot = here->BSIM4v4cd + here->BSIM4v4cbd - here->BSIM4v4Igidl; /* bugfix */
}
tol0 = ckt->CKTreltol * MAX(fabs(cdhat), fabs(Idtot))
+ ckt->CKTabstol;
tol1 = ckt->CKTreltol * MAX(fabs(cseshat), fabs(Isestot))
+ ckt->CKTabstol;
tol2 = ckt->CKTreltol * MAX(fabs(cdedhat), fabs(Idedtot))
+ ckt->CKTabstol;
tol3 = ckt->CKTreltol * MAX(fabs(cgshat), fabs(Igstot))
+ ckt->CKTabstol;
tol4 = ckt->CKTreltol * MAX(fabs(cgdhat), fabs(Igdtot))
+ ckt->CKTabstol;
tol5 = ckt->CKTreltol * MAX(fabs(cgbhat), fabs(Igbtot))
+ ckt->CKTabstol;
if ((fabs(cdhat - Idtot) >= tol0) || (fabs(cseshat - Isestot) >= tol1)
|| (fabs(cdedhat - Idedtot) >= tol2))
{ ckt->CKTnoncon++;
}
else if ((fabs(cgshat - Igstot) >= tol3) || (fabs(cgdhat - Igdtot) >= tol4)
|| (fabs(cgbhat - Igbtot) >= tol5))
{ ckt->CKTnoncon++;
}
else
{ Ibtot = here->BSIM4v4cbs + here->BSIM4v4cbd
- here->BSIM4v4Igidl - here->BSIM4v4Igisl - here->BSIM4v4csub;
tol6 = ckt->CKTreltol * MAX(fabs(cbhat), fabs(Ibtot))
+ ckt->CKTabstol;
if (fabs(cbhat - Ibtot) > tol6)
{ ckt->CKTnoncon++;
}
}
#endif /* NEWCONV */
}
}
*(ckt->CKTstate0 + here->BSIM4v4vds) = vds;

View File

@ -69,7 +69,9 @@ double dRs_dvg, dRd_dvg, dRs_dvb, dRd_dvb;
double dT0_dvg, dT1_dvb, dT3_dvg, dT3_dvb;
double vses, vdes, vdedo, delvses, delvded, delvdes;
double Isestot=0.0, cseshat=0.0, Idedtot=0.0, cdedhat=0.0;
#ifndef NEWCONV
double tol0, tol1, tol2, tol3, tol4, tol5, tol6;
#endif
double geltd, gcrg, gcrgg, gcrgd, gcrgs, gcrgb, ceqgcrg;
double vges, vgms, vgedo, vgmdo, vged, vgmd, delvged, delvgmd;