📄 b3v1aset.c
字号:
model->BSIM3v1Apb0 = 0.0; if (!model->BSIM3v1Apb1Given) model->BSIM3v1Apb1 = 0.0; if (!model->BSIM3v1Apalpha0Given) model->BSIM3v1Apalpha0 = 0.0; if (!model->BSIM3v1Apbeta0Given) model->BSIM3v1Apbeta0 = 0.0; if (!model->BSIM3v1ApelmGiven) model->BSIM3v1Apelm = 0.0; if (!model->BSIM3v1ApcgslGiven) model->BSIM3v1Apcgsl = 0.0; if (!model->BSIM3v1ApcgdlGiven) model->BSIM3v1Apcgdl = 0.0; if (!model->BSIM3v1ApckappaGiven) model->BSIM3v1Apckappa = 0.0; if (!model->BSIM3v1ApcfGiven) model->BSIM3v1Apcf = 0.0; if (!model->BSIM3v1ApclcGiven) model->BSIM3v1Apclc = 0.0; if (!model->BSIM3v1ApcleGiven) model->BSIM3v1Apcle = 0.0; /* unit degree celcius */ if (!model->BSIM3v1AtnomGiven) model->BSIM3v1Atnom = ckt->CKTnomTemp; if (!model->BSIM3v1ALintGiven) model->BSIM3v1ALint = 0.0; if (!model->BSIM3v1ALlGiven) model->BSIM3v1ALl = 0.0; if (!model->BSIM3v1ALlnGiven) model->BSIM3v1ALln = 1.0; if (!model->BSIM3v1ALwGiven) model->BSIM3v1ALw = 0.0; if (!model->BSIM3v1ALwnGiven) model->BSIM3v1ALwn = 1.0; if (!model->BSIM3v1ALwlGiven) model->BSIM3v1ALwl = 0.0; if (!model->BSIM3v1ALminGiven) model->BSIM3v1ALmin = 0.0; if (!model->BSIM3v1ALmaxGiven) model->BSIM3v1ALmax = 1.0; if (!model->BSIM3v1AWintGiven) model->BSIM3v1AWint = 0.0; if (!model->BSIM3v1AWlGiven) model->BSIM3v1AWl = 0.0; if (!model->BSIM3v1AWlnGiven) model->BSIM3v1AWln = 1.0; if (!model->BSIM3v1AWwGiven) model->BSIM3v1AWw = 0.0; if (!model->BSIM3v1AWwnGiven) model->BSIM3v1AWwn = 1.0; if (!model->BSIM3v1AWwlGiven) model->BSIM3v1AWwl = 0.0; if (!model->BSIM3v1AWminGiven) model->BSIM3v1AWmin = 0.0; if (!model->BSIM3v1AWmaxGiven) model->BSIM3v1AWmax = 1.0; if (!model->BSIM3v1AdwcGiven) model->BSIM3v1Adwc = model->BSIM3v1AWint; if (!model->BSIM3v1AdlcGiven) model->BSIM3v1Adlc = model->BSIM3v1ALint; if (!model->BSIM3v1AcfGiven) model->BSIM3v1Acf = 2.0 * EPSOX / PI * log(1.0 + 0.4e-6 / model->BSIM3v1Atox); if (!model->BSIM3v1AcgdoGiven) { if (model->BSIM3v1AdlcGiven && (model->BSIM3v1Adlc > 0.0)) { model->BSIM3v1Acgdo = model->BSIM3v1Adlc * model->BSIM3v1Acox - model->BSIM3v1Acgdl ; if (model->BSIM3v1Acgdo < 0.0) model->BSIM3v1Acgdo = 0.0; } else model->BSIM3v1Acgdo = 0.6 * model->BSIM3v1Axj * model->BSIM3v1Acox; } if (!model->BSIM3v1AcgsoGiven) { if (model->BSIM3v1AdlcGiven && (model->BSIM3v1Adlc > 0.0)) { model->BSIM3v1Acgso = model->BSIM3v1Adlc * model->BSIM3v1Acox - model->BSIM3v1Acgsl ; if (model->BSIM3v1Acgso < 0.0) model->BSIM3v1Acgso = 0.0; } else model->BSIM3v1Acgso = 0.6 * model->BSIM3v1Axj * model->BSIM3v1Acox; } if (!model->BSIM3v1AcgboGiven) model->BSIM3v1Acgbo = 0.0; if (!model->BSIM3v1AxpartGiven) model->BSIM3v1Axpart = 0.0; if (!model->BSIM3v1AsheetResistanceGiven) model->BSIM3v1AsheetResistance = 0.0; if (!model->BSIM3v1AunitAreaJctCapGiven) model->BSIM3v1AunitAreaJctCap = 5.0E-4; if (!model->BSIM3v1AunitLengthSidewallJctCapGiven) model->BSIM3v1AunitLengthSidewallJctCap = 5.0E-10; if (!model->BSIM3v1AjctSatCurDensityGiven) model->BSIM3v1AjctSatCurDensity = 1.0E-4; if (!model->BSIM3v1AbulkJctPotentialGiven) model->BSIM3v1AbulkJctPotential = 1.0; if (!model->BSIM3v1AsidewallJctPotentialGiven) model->BSIM3v1AsidewallJctPotential = 1.0; if (!model->BSIM3v1AbulkJctBotGradingCoeffGiven) model->BSIM3v1AbulkJctBotGradingCoeff = 0.5; if (!model->BSIM3v1AbulkJctSideGradingCoeffGiven) model->BSIM3v1AbulkJctSideGradingCoeff = 0.33; if (!model->BSIM3v1AoxideTrapDensityAGiven) { if (model->BSIM3v1Atype == NMOS) model->BSIM3v1AoxideTrapDensityA = 1e20; else model->BSIM3v1AoxideTrapDensityA=9.9e18; } if (!model->BSIM3v1AoxideTrapDensityBGiven) { if (model->BSIM3v1Atype == NMOS) model->BSIM3v1AoxideTrapDensityB = 5e4; else model->BSIM3v1AoxideTrapDensityB = 2.4e3; } if (!model->BSIM3v1AoxideTrapDensityCGiven) { if (model->BSIM3v1Atype == NMOS) model->BSIM3v1AoxideTrapDensityC = -1.4e-12; else model->BSIM3v1AoxideTrapDensityC = 1.4e-12; } if (!model->BSIM3v1AemGiven) model->BSIM3v1Aem = 4.1e7; /* V/m */ if (!model->BSIM3v1AefGiven) model->BSIM3v1Aef = 1.0; if (!model->BSIM3v1AafGiven) model->BSIM3v1Aaf = 1.0; if (!model->BSIM3v1AkfGiven) model->BSIM3v1Akf = 0.0; /* loop through all the instances of the model */ for (here = model->BSIM3v1Ainstances; here != NULL ; here=here->BSIM3v1AnextInstance) { if (here->BSIM3v1Aowner == ARCHme) { /* allocate a chunk of the state vector */ here->BSIM3v1Astates = *states; *states += BSIM3v1AnumStates; } /* perform the parameter defaulting */ if (!here->BSIM3v1AdrainAreaGiven) here->BSIM3v1AdrainArea = 0.0; if (!here->BSIM3v1AdrainPerimeterGiven) here->BSIM3v1AdrainPerimeter = 0.0; if (!here->BSIM3v1AdrainSquaresGiven) here->BSIM3v1AdrainSquares = 1.0; if (!here->BSIM3v1AicVBSGiven) here->BSIM3v1AicVBS = 0; if (!here->BSIM3v1AicVDSGiven) here->BSIM3v1AicVDS = 0; if (!here->BSIM3v1AicVGSGiven) here->BSIM3v1AicVGS = 0; if (!here->BSIM3v1AlGiven) here->BSIM3v1Al = 5e-6; if (!here->BSIM3v1AsourceAreaGiven) here->BSIM3v1AsourceArea = 0; if (!here->BSIM3v1AsourcePerimeterGiven) here->BSIM3v1AsourcePerimeter = 0; if (!here->BSIM3v1AsourceSquaresGiven) here->BSIM3v1AsourceSquares = 1; if (!here->BSIM3v1AwGiven) here->BSIM3v1Aw = 5e-6; if (!here->BSIM3v1AmGiven) here->BSIM3v1Am = 1; if (!here->BSIM3v1AnqsModGiven) here->BSIM3v1AnqsMod = model->BSIM3v1AnqsMod; /* process drain series resistance */ if ((model->BSIM3v1AsheetResistance > 0.0) && (here->BSIM3v1AdrainSquares > 0.0 ) && (here->BSIM3v1AdNodePrime == 0)) { error = CKTmkVolt(ckt,&tmp,here->BSIM3v1Aname,"drain"); if(error) return(error); here->BSIM3v1AdNodePrime = tmp->number; if (ckt->CKTcopyNodesets) { if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) { if (tmpNode->nsGiven) { tmp->nodeset=tmpNode->nodeset; tmp->nsGiven=tmpNode->nsGiven; } } } } else { here->BSIM3v1AdNodePrime = here->BSIM3v1AdNode; } /* process source series resistance */ if ((model->BSIM3v1AsheetResistance > 0.0) && (here->BSIM3v1AsourceSquares > 0.0 ) && (here->BSIM3v1AsNodePrime == 0)) { error = CKTmkVolt(ckt,&tmp,here->BSIM3v1Aname,"source"); if(error) return(error); here->BSIM3v1AsNodePrime = tmp->number; if (ckt->CKTcopyNodesets) { if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) { if (tmpNode->nsGiven) { tmp->nodeset=tmpNode->nodeset; tmp->nsGiven=tmpNode->nsGiven; } } } } else { here->BSIM3v1AsNodePrime = here->BSIM3v1AsNode; } /* internal charge node */ if ((here->BSIM3v1AnqsMod) && (here->BSIM3v1AqNode == 0)) { error = CKTmkVolt(ckt,&tmp,here->BSIM3v1Aname,"charge"); if(error) return(error); here->BSIM3v1AqNode = tmp->number; } else { here->BSIM3v1AqNode = 0; } /* set Sparse Matrix Pointers *//* macro to make elements with built in test for out of memory */#define TSTALLOC(ptr,first,second) \if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ return(E_NOMEM);\} TSTALLOC(BSIM3v1ADdPtr, BSIM3v1AdNode, BSIM3v1AdNode) TSTALLOC(BSIM3v1AGgPtr, BSIM3v1AgNode, BSIM3v1AgNode) TSTALLOC(BSIM3v1ASsPtr, BSIM3v1AsNode, BSIM3v1AsNode) TSTALLOC(BSIM3v1ABbPtr, BSIM3v1AbNode, BSIM3v1AbNode) TSTALLOC(BSIM3v1ADPdpPtr, BSIM3v1AdNodePrime, BSIM3v1AdNodePrime) TSTALLOC(BSIM3v1ASPspPtr, BSIM3v1AsNodePrime, BSIM3v1AsNodePrime) TSTALLOC(BSIM3v1ADdpPtr, BSIM3v1AdNode, BSIM3v1AdNodePrime) TSTALLOC(BSIM3v1AGbPtr, BSIM3v1AgNode, BSIM3v1AbNode) TSTALLOC(BSIM3v1AGdpPtr, BSIM3v1AgNode, BSIM3v1AdNodePrime) TSTALLOC(BSIM3v1AGspPtr, BSIM3v1AgNode, BSIM3v1AsNodePrime) TSTALLOC(BSIM3v1ASspPtr, BSIM3v1AsNode, BSIM3v1AsNodePrime) TSTALLOC(BSIM3v1ABdpPtr, BSIM3v1AbNode, BSIM3v1AdNodePrime) TSTALLOC(BSIM3v1ABspPtr, BSIM3v1AbNode, BSIM3v1AsNodePrime) TSTALLOC(BSIM3v1ADPspPtr, BSIM3v1AdNodePrime, BSIM3v1AsNodePrime) TSTALLOC(BSIM3v1ADPdPtr, BSIM3v1AdNodePrime, BSIM3v1AdNode) TSTALLOC(BSIM3v1ABgPtr, BSIM3v1AbNode, BSIM3v1AgNode) TSTALLOC(BSIM3v1ADPgPtr, BSIM3v1AdNodePrime, BSIM3v1AgNode) TSTALLOC(BSIM3v1ASPgPtr, BSIM3v1AsNodePrime, BSIM3v1AgNode) TSTALLOC(BSIM3v1ASPsPtr, BSIM3v1AsNodePrime, BSIM3v1AsNode) TSTALLOC(BSIM3v1ADPbPtr, BSIM3v1AdNodePrime, BSIM3v1AbNode) TSTALLOC(BSIM3v1ASPbPtr, BSIM3v1AsNodePrime, BSIM3v1AbNode) TSTALLOC(BSIM3v1ASPdpPtr, BSIM3v1AsNodePrime, BSIM3v1AdNodePrime) TSTALLOC(BSIM3v1AQqPtr, BSIM3v1AqNode, BSIM3v1AqNode) TSTALLOC(BSIM3v1AQdpPtr, BSIM3v1AqNode, BSIM3v1AdNodePrime) TSTALLOC(BSIM3v1AQspPtr, BSIM3v1AqNode, BSIM3v1AsNodePrime) TSTALLOC(BSIM3v1AQgPtr, BSIM3v1AqNode, BSIM3v1AgNode) TSTALLOC(BSIM3v1AQbPtr, BSIM3v1AqNode, BSIM3v1AbNode) TSTALLOC(BSIM3v1ADPqPtr, BSIM3v1AdNodePrime, BSIM3v1AqNode) TSTALLOC(BSIM3v1ASPqPtr, BSIM3v1AsNodePrime, BSIM3v1AqNode) TSTALLOC(BSIM3v1AGqPtr, BSIM3v1AgNode, BSIM3v1AqNode) TSTALLOC(BSIM3v1ABqPtr, BSIM3v1AbNode, BSIM3v1AqNode) } } return(OK);} intBSIM3v1Aunsetup(GENmodel *inModel, CKTcircuit *ckt){ BSIM3v1Amodel *model; BSIM3v1Ainstance *here; for (model = (BSIM3v1Amodel *)inModel; model != NULL; model = model->BSIM3v1AnextModel) { for (here = model->BSIM3v1Ainstances; here != NULL; here=here->BSIM3v1AnextInstance) { if (here->BSIM3v1AdNodePrime && here->BSIM3v1AdNodePrime != here->BSIM3v1AdNode) { CKTdltNNum(ckt, here->BSIM3v1AdNodePrime); here->BSIM3v1AdNodePrime = 0; } if (here->BSIM3v1AsNodePrime && here->BSIM3v1AsNodePrime != here->BSIM3v1AsNode) { CKTdltNNum(ckt, here->BSIM3v1AsNodePrime); here->BSIM3v1AsNodePrime = 0; } } } return OK;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -