int BSIM4v7soaCheck(CKTcircuit *ckt, GENmodel *inModel) { BSIM4v7model *model = (BSIM4v7model *) inModel; BSIM4v7instance *here; double vgs, vgd, vgb, vds, vbs, vbd; /* actual mos voltages */ int maxwarns; static int warns_vgs = 0, warns_vgd = 0, warns_vgb = 0, warns_vds = 0, warns_vbs = 0, warns_vbd = 0; if (!ckt) { warns_vgs = 0; warns_vgd = 0; warns_vgb = 0; warns_vds = 0; warns_vbs = 0; warns_vbd = 0; return OK; } maxwarns = ckt->CKTsoaMaxWarns; for (; model; model = model->BSIM4v7nextModel) { for (here = model->BSIM4v7instances; here; here = here->BSIM4v7nextInstance) { vgs = fabs(ckt->CKTrhsOld [here->BSIM4v7gNodePrime] - ckt->CKTrhsOld [here->BSIM4v7sNodePrime]); vgd = fabs(ckt->CKTrhsOld [here->BSIM4v7gNodePrime] - ckt->CKTrhsOld [here->BSIM4v7dNodePrime]); vgb = fabs(ckt->CKTrhsOld [here->BSIM4v7gNodePrime] - ckt->CKTrhsOld [here->BSIM4v7bNodePrime]); vds = fabs(ckt->CKTrhsOld [here->BSIM4v7dNodePrime] - ckt->CKTrhsOld [here->BSIM4v7sNodePrime]); vbs = fabs(ckt->CKTrhsOld [here->BSIM4v7bNodePrime] - ckt->CKTrhsOld [here->BSIM4v7sNodePrime]); vbd = fabs(ckt->CKTrhsOld [here->BSIM4v7bNodePrime] - ckt->CKTrhsOld [here->BSIM4v7dNodePrime]); if (vgs > model->BSIM4v7vgsMax) if (warns_vgs < maxwarns) { soa_printf(ckt, (GENinstance*) here, "|Vgs|=%g has exceeded Vgs_max=%g\n", vgs, model->BSIM4v7vgsMax); warns_vgs++; } if (vgd > model->BSIM4v7vgdMax) if (warns_vgd < maxwarns) { soa_printf(ckt, (GENinstance*) here, "|Vgd|=%g has exceeded Vgd_max=%g\n", vgd, model->BSIM4v7vgdMax); warns_vgd++; } if (vgb > model->BSIM4v7vgbMax) if (warns_vgb < maxwarns) { soa_printf(ckt, (GENinstance*) here, "|Vgb|=%g has exceeded Vgb_max=%g\n", vgb, model->BSIM4v7vgbMax); warns_vgb++; } if (vds > model->BSIM4v7vdsMax) if (warns_vds < maxwarns) { soa_printf(ckt, (GENinstance*) here, "|Vds|=%g has exceeded Vds_max=%g\n", vds, model->BSIM4v7vdsMax); warns_vds++; } if (vbs > model->BSIM4v7vbsMax) if (warns_vbs < maxwarns) { soa_printf(ckt, (GENinstance*) here, "|Vbs|=%g has exceeded Vbs_max=%g\n", vbs, model->BSIM4v7vbsMax); warns_vbs++; } if (vbd > model->BSIM4v7vbdMax) if (warns_vbd < maxwarns) { soa_printf(ckt, (GENinstance*) here, "|Vbd|=%g has exceeded Vbd_max=%g\n", vbd, model->BSIM4v7vbdMax); warns_vbd++; } } } return OK; }
int B4SOIsoaCheck(CKTcircuit *ckt, GENmodel *inModel) { B4SOImodel *model = (B4SOImodel *) inModel; B4SOIinstance *here; double vgs, vgd, vgb, vds, vbs, vbd; /* actual mos voltages */ int maxwarns; static int warns_vgs = 0, warns_vgd = 0, warns_vgb = 0, warns_vds = 0, warns_vbs = 0, warns_vbd = 0; if (!ckt) { warns_vgs = 0; warns_vgd = 0; warns_vgb = 0; warns_vds = 0; warns_vbs = 0; warns_vbd = 0; return OK; } maxwarns = ckt->CKTsoaMaxWarns; for (; model; model = B4SOInextModel(model)) { for (here = B4SOIinstances(model); here; here = B4SOInextInstance(here)) { vgs = ckt->CKTrhsOld [here->B4SOIgNode] - ckt->CKTrhsOld [here->B4SOIsNodePrime]; vgd = ckt->CKTrhsOld [here->B4SOIgNode] - ckt->CKTrhsOld [here->B4SOIdNodePrime]; vgb = ckt->CKTrhsOld [here->B4SOIgNode] - ckt->CKTrhsOld [here->B4SOIbNode]; vds = ckt->CKTrhsOld [here->B4SOIdNodePrime] - ckt->CKTrhsOld [here->B4SOIsNodePrime]; vbs = ckt->CKTrhsOld [here->B4SOIbNode] - ckt->CKTrhsOld [here->B4SOIsNodePrime]; vbd = ckt->CKTrhsOld [here->B4SOIbNode] - ckt->CKTrhsOld [here->B4SOIdNodePrime]; if (!model->B4SOIvgsrMaxGiven) { if (fabs(vgs) > model->B4SOIvgsMax) if (warns_vgs < maxwarns) { soa_printf(ckt, (GENinstance*) here, "Vgs=%g has exceeded Vgs_max=%g\n", vgs, model->B4SOIvgsMax); warns_vgs++; } if (!model->B4SOIvgbMaxGiven) { if (fabs(vgb) > model->B4SOIvgsMax) if (warns_vgb < maxwarns) { soa_printf(ckt, (GENinstance*) here, "Vgb=%g has exceeded Vgs_max=%g\n", vgb, model->B4SOIvgsMax); warns_vgb++; } } else { if (fabs(vgb) > model->B4SOIvgbMax) if (warns_vgb < maxwarns) { soa_printf(ckt, (GENinstance*) here, "Vgb=%g has exceeded Vgb_max=%g\n", vgb, model->B4SOIvgbMax); warns_vgb++; } } } else { if (model->B4SOItype > 0) { if (vgs > model->B4SOIvgsMax) if (warns_vgs < maxwarns) { soa_printf(ckt, (GENinstance*) here, "Vgs=%g has exceeded Vgs_max=%g\n", vgs, model->B4SOIvgsMax); warns_vgs++; } if (-1*vgs > model->B4SOIvgsrMax) if (warns_vgs < maxwarns) { soa_printf(ckt, (GENinstance*) here, "Vgs=%g has exceeded Vgsr_max=%g\n", vgs, model->B4SOIvgsrMax); warns_vgs++; } } else { if (vgs > model->B4SOIvgsrMax) if (warns_vgs < maxwarns) { soa_printf(ckt, (GENinstance*) here, "Vgs=%g has exceeded Vgsr_max=%g\n", vgs, model->B4SOIvgsrMax); warns_vgs++; } if (-1*vgs > model->B4SOIvgsMax) if (warns_vgs < maxwarns) { soa_printf(ckt, (GENinstance*) here, "Vgs=%g has exceeded Vgs_max=%g\n", vgs, model->B4SOIvgsMax); warns_vgs++; } } } if (!model->B4SOIvgdrMaxGiven) { if (fabs(vgd) > model->B4SOIvgdMax) if (warns_vgd < maxwarns) { soa_printf(ckt, (GENinstance*) here, "Vgd=%g has exceeded Vgd_max=%g\n", vgd, model->B4SOIvgdMax); warns_vgd++; } } else { if (model->B4SOItype > 0) { if (vgd > model->B4SOIvgdMax) if (warns_vgd < maxwarns) { soa_printf(ckt, (GENinstance*) here, "Vgd=%g has exceeded Vgd_max=%g\n", vgd, model->B4SOIvgdMax); warns_vgd++; } if (-1*vgd > model->B4SOIvgdrMax) if (warns_vgd < maxwarns) { soa_printf(ckt, (GENinstance*) here, "Vgd=%g has exceeded Vgdr_max=%g\n", vgd, model->B4SOIvgdrMax); warns_vgd++; } } else { if (vgd > model->B4SOIvgdrMax) if (warns_vgd < maxwarns) { soa_printf(ckt, (GENinstance*) here, "Vgd=%g has exceeded Vgdr_max=%g\n", vgd, model->B4SOIvgdrMax); warns_vgd++; } if (-1*vgd > model->B4SOIvgdMax) if (warns_vgd < maxwarns) { soa_printf(ckt, (GENinstance*) here, "Vgd=%g has exceeded Vgd_max=%g\n", vgd, model->B4SOIvgdMax); warns_vgd++; } } } if (fabs(vds) > model->B4SOIvdsMax) if (warns_vds < maxwarns) { soa_printf(ckt, (GENinstance*) here, "Vds=%g has exceeded Vds_max=%g\n", vds, model->B4SOIvdsMax); warns_vds++; } if (!model->B4SOIvgbrMaxGiven) { if (fabs(vgb) > model->B4SOIvgbMax) if (warns_vgb < maxwarns) { soa_printf(ckt, (GENinstance*) here, "Vgb=%g has exceeded Vgb_max=%g\n", vgb, model->B4SOIvgbMax); warns_vgb++; } } else { if (model->B4SOItype > 0) { if (vgb > model->B4SOIvgbMax) if (warns_vgb < maxwarns) { soa_printf(ckt, (GENinstance*) here, "Vgb=%g has exceeded Vgb_max=%g\n", vgb, model->B4SOIvgbMax); warns_vgb++; } if (-1*vgb > model->B4SOIvgbrMax) if (warns_vgb < maxwarns) { soa_printf(ckt, (GENinstance*) here, "Vgb=%g has exceeded Vgbr_max=%g\n", vgb, model->B4SOIvgbrMax); warns_vgb++; } } else { if (vgb > model->B4SOIvgbrMax) if (warns_vgb < maxwarns) { soa_printf(ckt, (GENinstance*) here, "Vgb=%g has exceeded Vgbr_max=%g\n", vgb, model->B4SOIvgbrMax); warns_vgb++; } if (-1*vgb > model->B4SOIvgbMax) if (warns_vgb < maxwarns) { soa_printf(ckt, (GENinstance*) here, "Vgb=%g has exceeded Vgb_max=%g\n", vgb, model->B4SOIvgbMax); warns_vgb++; } } } if (!model->B4SOIvbsrMaxGiven) { if (!model->B4SOIvbsMaxGiven) { if (fabs(vbs) > model->B4SOIvbdMax) if (warns_vbs < maxwarns) { soa_printf(ckt, (GENinstance*) here, "Vbs=%g has exceeded Vbd_max=%g\n", vbs, model->B4SOIvbdMax); warns_vbs++; } } else { if (fabs(vbs) > model->B4SOIvbsMax) if (warns_vbs < maxwarns) { soa_printf(ckt, (GENinstance*) here, "Vbs=%g has exceeded Vbs_max=%g\n", vbs, model->B4SOIvbsMax); warns_vbs++; } } } else { if (!model->B4SOIvbsMaxGiven) { if (model->B4SOItype > 0) { if (vbs > model->B4SOIvbdMax) if (warns_vbs < maxwarns) { soa_printf(ckt, (GENinstance*) here, "Vbs=%g has exceeded Vbd_max=%g\n", vbs, model->B4SOIvbdMax); warns_vbs++; } if (-1*vbs > model->B4SOIvbsrMax) if (warns_vbs < maxwarns) { soa_printf(ckt, (GENinstance*) here, "Vbs=%g has exceeded Vbsr_max=%g\n", vbs, model->B4SOIvbsrMax); warns_vbs++; } } else { if (vbs > model->B4SOIvbsrMax) if (warns_vbs < maxwarns) { soa_printf(ckt, (GENinstance*) here, "Vbs=%g has exceeded Vbsr_max=%g\n", vbs, model->B4SOIvbsrMax); warns_vbs++; } if (-1*vbs > model->B4SOIvbdMax) if (warns_vbs < maxwarns) { soa_printf(ckt, (GENinstance*) here, "Vbs=%g has exceeded Vbd_max=%g\n", vbs, model->B4SOIvbdMax); warns_vbs++; } } } else { if (model->B4SOItype > 0) { if (vbs > model->B4SOIvbsMax) if (warns_vbs < maxwarns) { soa_printf(ckt, (GENinstance*) here, "Vbs=%g has exceeded Vbs_max=%g\n", vbs, model->B4SOIvbsMax); warns_vbs++; } if (-1*vbs > model->B4SOIvbsrMax) if (warns_vbs < maxwarns) { soa_printf(ckt, (GENinstance*) here, "Vbs=%g has exceeded Vbsr_max=%g\n", vbs, model->B4SOIvbsrMax); warns_vbs++; } } else { if (vbs > model->B4SOIvbsrMax) if (warns_vbs < maxwarns) { soa_printf(ckt, (GENinstance*) here, "Vbs=%g has exceeded Vbsr_max=%g\n", vbs, model->B4SOIvbsrMax); warns_vbs++; } if (-1*vbs > model->B4SOIvbsMax) if (warns_vbs < maxwarns) { soa_printf(ckt, (GENinstance*) here, "Vbs=%g has exceeded Vbs_max=%g\n", vbs, model->B4SOIvbsMax); warns_vbs++; } } } } if (!model->B4SOIvbdrMaxGiven) { if (fabs(vbd) > model->B4SOIvbdMax) if (warns_vbd < maxwarns) { soa_printf(ckt, (GENinstance*) here, "Vbd=%g has exceeded Vbd_max=%g\n", vbd, model->B4SOIvbdMax); warns_vbd++; } } else { if (model->B4SOItype > 0) { if (vbd > model->B4SOIvbdMax) if (warns_vbd < maxwarns) { soa_printf(ckt, (GENinstance*) here, "Vbd=%g has exceeded Vbd_max=%g\n", vbd, model->B4SOIvbdMax); warns_vbd++; } if (-1*vbd > model->B4SOIvbdrMax) if (warns_vbd < maxwarns) { soa_printf(ckt, (GENinstance*) here, "Vbd=%g has exceeded Vbdr_max=%g\n", vbd, model->B4SOIvbdrMax); warns_vbd++; } } else { if (vbd > model->B4SOIvbdrMax) if (warns_vbd < maxwarns) { soa_printf(ckt, (GENinstance*) here, "Vbd=%g has exceeded Vbdr_max=%g\n", vbd, model->B4SOIvbdrMax); warns_vbd++; } if (-1*vbd > model->B4SOIvbdMax) if (warns_vbd < maxwarns) { soa_printf(ckt, (GENinstance*) here, "Vbd=%g has exceeded Vbd_max=%g\n", vbd, model->B4SOIvbdMax); warns_vbd++; } } } } } return OK; }