b3set.c
来自「ngspice又一个电子CAD仿真软件代码.功能更全」· C语言 代码 · 共 1,097 行 · 第 1/3 页
C
1,097 行
model->BSIM3pelm = 0.0; if (!model->BSIM3pcgslGiven) model->BSIM3pcgsl = 0.0; if (!model->BSIM3pcgdlGiven) model->BSIM3pcgdl = 0.0; if (!model->BSIM3pckappaGiven) model->BSIM3pckappa = 0.0; if (!model->BSIM3pcfGiven) model->BSIM3pcf = 0.0; if (!model->BSIM3pclcGiven) model->BSIM3pclc = 0.0; if (!model->BSIM3pcleGiven) model->BSIM3pcle = 0.0; if (!model->BSIM3pvfbcvGiven) model->BSIM3pvfbcv = 0.0; if (!model->BSIM3pacdeGiven) model->BSIM3pacde = 0.0; if (!model->BSIM3pmoinGiven) model->BSIM3pmoin = 0.0; if (!model->BSIM3pnoffGiven) model->BSIM3pnoff = 0.0; if (!model->BSIM3pvoffcvGiven) model->BSIM3pvoffcv = 0.0; /* unit degree celcius */ if (!model->BSIM3tnomGiven) model->BSIM3tnom = ckt->CKTnomTemp; /* else model->BSIM3tnom = model->BSIM3tnom + 273.15; */ if (!model->BSIM3LintGiven) model->BSIM3Lint = 0.0; if (!model->BSIM3LlGiven) model->BSIM3Ll = 0.0; if (!model->BSIM3LlcGiven) model->BSIM3Llc = model->BSIM3Ll; if (!model->BSIM3LlnGiven) model->BSIM3Lln = 1.0; if (!model->BSIM3LwGiven) model->BSIM3Lw = 0.0; if (!model->BSIM3LwcGiven) model->BSIM3Lwc = model->BSIM3Lw; if (!model->BSIM3LwnGiven) model->BSIM3Lwn = 1.0; if (!model->BSIM3LwlGiven) model->BSIM3Lwl = 0.0; if (!model->BSIM3LwlcGiven) model->BSIM3Lwlc = model->BSIM3Lwl; if (!model->BSIM3LminGiven) model->BSIM3Lmin = 0.0; if (!model->BSIM3LmaxGiven) model->BSIM3Lmax = 1.0; if (!model->BSIM3WintGiven) model->BSIM3Wint = 0.0; if (!model->BSIM3WlGiven) model->BSIM3Wl = 0.0; if (!model->BSIM3WlcGiven) model->BSIM3Wlc = model->BSIM3Wl; if (!model->BSIM3WlnGiven) model->BSIM3Wln = 1.0; if (!model->BSIM3WwGiven) model->BSIM3Ww = 0.0; if (!model->BSIM3WwcGiven) model->BSIM3Wwc = model->BSIM3Ww; if (!model->BSIM3WwnGiven) model->BSIM3Wwn = 1.0; if (!model->BSIM3WwlGiven) model->BSIM3Wwl = 0.0; if (!model->BSIM3WwlcGiven) model->BSIM3Wwlc = model->BSIM3Wwl; if (!model->BSIM3WminGiven) model->BSIM3Wmin = 0.0; if (!model->BSIM3WmaxGiven) model->BSIM3Wmax = 1.0; if (!model->BSIM3dwcGiven) model->BSIM3dwc = model->BSIM3Wint; if (!model->BSIM3dlcGiven) model->BSIM3dlc = model->BSIM3Lint; if (!model->BSIM3xlGiven) model->BSIM3xl = 0.0; if (!model->BSIM3xwGiven) model->BSIM3xw = 0.0; if (!model->BSIM3cfGiven) model->BSIM3cf = 2.0 * EPSOX / PI * log(1.0 + 0.4e-6 / model->BSIM3tox); if (!model->BSIM3cgdoGiven) { if (model->BSIM3dlcGiven && (model->BSIM3dlc > 0.0)) { model->BSIM3cgdo = model->BSIM3dlc * model->BSIM3cox - model->BSIM3cgdl ; } else model->BSIM3cgdo = 0.6 * model->BSIM3xj * model->BSIM3cox; } if (!model->BSIM3cgsoGiven) { if (model->BSIM3dlcGiven && (model->BSIM3dlc > 0.0)) { model->BSIM3cgso = model->BSIM3dlc * model->BSIM3cox - model->BSIM3cgsl ; } else model->BSIM3cgso = 0.6 * model->BSIM3xj * model->BSIM3cox; } if (!model->BSIM3cgboGiven) { model->BSIM3cgbo = 2.0 * model->BSIM3dwc * model->BSIM3cox; } if (!model->BSIM3xpartGiven) model->BSIM3xpart = 0.0; if (!model->BSIM3sheetResistanceGiven) model->BSIM3sheetResistance = 0.0; if (!model->BSIM3unitAreaJctCapGiven) model->BSIM3unitAreaJctCap = 5.0E-4; if (!model->BSIM3unitLengthSidewallJctCapGiven) model->BSIM3unitLengthSidewallJctCap = 5.0E-10; if (!model->BSIM3unitLengthGateSidewallJctCapGiven) model->BSIM3unitLengthGateSidewallJctCap = model->BSIM3unitLengthSidewallJctCap ; if (!model->BSIM3jctSatCurDensityGiven) model->BSIM3jctSatCurDensity = 1.0E-4; if (!model->BSIM3jctSidewallSatCurDensityGiven) model->BSIM3jctSidewallSatCurDensity = 0.0; if (!model->BSIM3bulkJctPotentialGiven) model->BSIM3bulkJctPotential = 1.0; if (!model->BSIM3sidewallJctPotentialGiven) model->BSIM3sidewallJctPotential = 1.0; if (!model->BSIM3GatesidewallJctPotentialGiven) model->BSIM3GatesidewallJctPotential = model->BSIM3sidewallJctPotential; if (!model->BSIM3bulkJctBotGradingCoeffGiven) model->BSIM3bulkJctBotGradingCoeff = 0.5; if (!model->BSIM3bulkJctSideGradingCoeffGiven) model->BSIM3bulkJctSideGradingCoeff = 0.33; if (!model->BSIM3bulkJctGateSideGradingCoeffGiven) model->BSIM3bulkJctGateSideGradingCoeff = model->BSIM3bulkJctSideGradingCoeff; if (!model->BSIM3jctEmissionCoeffGiven) model->BSIM3jctEmissionCoeff = 1.0; if (!model->BSIM3jctTempExponentGiven) model->BSIM3jctTempExponent = 3.0; if (!model->BSIM3oxideTrapDensityAGiven) { if (model->BSIM3type == NMOS) model->BSIM3oxideTrapDensityA = 1e20; else model->BSIM3oxideTrapDensityA=9.9e18; } if (!model->BSIM3oxideTrapDensityBGiven) { if (model->BSIM3type == NMOS) model->BSIM3oxideTrapDensityB = 5e4; else model->BSIM3oxideTrapDensityB = 2.4e3; } if (!model->BSIM3oxideTrapDensityCGiven) { if (model->BSIM3type == NMOS) model->BSIM3oxideTrapDensityC = -1.4e-12; else model->BSIM3oxideTrapDensityC = 1.4e-12; } if (!model->BSIM3emGiven) model->BSIM3em = 4.1e7; /* V/m */ if (!model->BSIM3efGiven) model->BSIM3ef = 1.0; if (!model->BSIM3afGiven) model->BSIM3af = 1.0; if (!model->BSIM3kfGiven) model->BSIM3kf = 0.0; /* loop through all the instances of the model */ for (here = model->BSIM3instances; here != NULL ; here=here->BSIM3nextInstance) { if (here->BSIM3owner == ARCHme) { /* allocate a chunk of the state vector */ here->BSIM3states = *states; *states += BSIM3numStates; } /* perform the parameter defaulting */ if (!here->BSIM3drainAreaGiven) here->BSIM3drainArea = 0.0; if (!here->BSIM3drainPerimeterGiven) here->BSIM3drainPerimeter = 0.0; if (!here->BSIM3drainSquaresGiven) { if (model->BSIM3acmMod == 0) here->BSIM3drainSquares = 1.0; else here->BSIM3drainSquares = 0.0; } if (!here->BSIM3icVBSGiven) here->BSIM3icVBS = 0.0; if (!here->BSIM3icVDSGiven) here->BSIM3icVDS = 0.0; if (!here->BSIM3icVGSGiven) here->BSIM3icVGS = 0.0; if (!here->BSIM3lGiven) here->BSIM3l = 5.0e-6; if (!here->BSIM3sourceAreaGiven) here->BSIM3sourceArea = 0.0; if (!here->BSIM3sourcePerimeterGiven) here->BSIM3sourcePerimeter = 0.0; if (!here->BSIM3sourceSquaresGiven) { if (model->BSIM3acmMod == 0) here->BSIM3sourceSquares = 1.0; else here->BSIM3sourceSquares = 0.0; } if (!here->BSIM3wGiven) here->BSIM3w = 5.0e-6; if (!here->BSIM3nqsModGiven) here->BSIM3nqsMod = 0; if (!here->BSIM3mGiven) here->BSIM3m = 1; /* process drain series resistance */ if ( ((model->BSIM3sheetResistance > 0.0) && (here->BSIM3drainSquares > 0.0) && (here->BSIM3dNodePrime == 0)) ||((model->BSIM3sheetResistance > 0.0) && (model->BSIM3hdif > 0.0) && (here->BSIM3dNodePrime == 0)) ||((model->BSIM3rd > 0.0) && (model->BSIM3ldif > 0.0) && (here->BSIM3dNodePrime == 0)) ||((model->BSIM3rd > 0.0) && (model->BSIM3ld > 0.0) && (here->BSIM3dNodePrime == 0)) ||((model->BSIM3rsc > 0.0) && (here->BSIM3dNodePrime == 0)) ) { error = CKTmkVolt(ckt,&tmp,here->BSIM3name,"drain"); if(error) return(error); here->BSIM3dNodePrime = 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->BSIM3dNodePrime = here->BSIM3dNode; } /* process source series resistance */ if ( ((model->BSIM3sheetResistance > 0.0) && (here->BSIM3sourceSquares > 0.0) && (here->BSIM3sNodePrime == 0)) ||((model->BSIM3sheetResistance > 0.0) && (model->BSIM3hdif > 0.0) && (here->BSIM3sNodePrime == 0)) ||((model->BSIM3rs > 0.0) && (model->BSIM3ldif > 0.0) && (here->BSIM3sNodePrime == 0)) ||((model->BSIM3rs > 0.0) && (model->BSIM3ld > 0.0) && (here->BSIM3sNodePrime == 0)) ||((model->BSIM3rsc > 0.0) && (here->BSIM3sNodePrime == 0)) ) { error = CKTmkVolt(ckt,&tmp,here->BSIM3name,"source"); if(error) return(error); here->BSIM3sNodePrime = 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->BSIM3sNodePrime = here->BSIM3sNode; } /* internal charge node */ if ((here->BSIM3nqsMod) && (here->BSIM3qNode == 0)) { error = CKTmkVolt(ckt,&tmp,here->BSIM3name,"charge"); if(error) return(error); here->BSIM3qNode = tmp->number; } else { here->BSIM3qNode = 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(BSIM3DdPtr, BSIM3dNode, BSIM3dNode) TSTALLOC(BSIM3GgPtr, BSIM3gNode, BSIM3gNode) TSTALLOC(BSIM3SsPtr, BSIM3sNode, BSIM3sNode) TSTALLOC(BSIM3BbPtr, BSIM3bNode, BSIM3bNode) TSTALLOC(BSIM3DPdpPtr, BSIM3dNodePrime, BSIM3dNodePrime) TSTALLOC(BSIM3SPspPtr, BSIM3sNodePrime, BSIM3sNodePrime) TSTALLOC(BSIM3DdpPtr, BSIM3dNode, BSIM3dNodePrime) TSTALLOC(BSIM3GbPtr, BSIM3gNode, BSIM3bNode) TSTALLOC(BSIM3GdpPtr, BSIM3gNode, BSIM3dNodePrime) TSTALLOC(BSIM3GspPtr, BSIM3gNode, BSIM3sNodePrime) TSTALLOC(BSIM3SspPtr, BSIM3sNode, BSIM3sNodePrime) TSTALLOC(BSIM3BdpPtr, BSIM3bNode, BSIM3dNodePrime) TSTALLOC(BSIM3BspPtr, BSIM3bNode, BSIM3sNodePrime) TSTALLOC(BSIM3DPspPtr, BSIM3dNodePrime, BSIM3sNodePrime) TSTALLOC(BSIM3DPdPtr, BSIM3dNodePrime, BSIM3dNode) TSTALLOC(BSIM3BgPtr, BSIM3bNode, BSIM3gNode) TSTALLOC(BSIM3DPgPtr, BSIM3dNodePrime, BSIM3gNode) TSTALLOC(BSIM3SPgPtr, BSIM3sNodePrime, BSIM3gNode) TSTALLOC(BSIM3SPsPtr, BSIM3sNodePrime, BSIM3sNode) TSTALLOC(BSIM3DPbPtr, BSIM3dNodePrime, BSIM3bNode) TSTALLOC(BSIM3SPbPtr, BSIM3sNodePrime, BSIM3bNode) TSTALLOC(BSIM3SPdpPtr, BSIM3sNodePrime, BSIM3dNodePrime) TSTALLOC(BSIM3QqPtr, BSIM3qNode, BSIM3qNode) TSTALLOC(BSIM3QdpPtr, BSIM3qNode, BSIM3dNodePrime) TSTALLOC(BSIM3QspPtr, BSIM3qNode, BSIM3sNodePrime) TSTALLOC(BSIM3QgPtr, BSIM3qNode, BSIM3gNode) TSTALLOC(BSIM3QbPtr, BSIM3qNode, BSIM3bNode) TSTALLOC(BSIM3DPqPtr, BSIM3dNodePrime, BSIM3qNode) TSTALLOC(BSIM3SPqPtr, BSIM3sNodePrime, BSIM3qNode) TSTALLOC(BSIM3GqPtr, BSIM3gNode, BSIM3qNode) TSTALLOC(BSIM3BqPtr, BSIM3bNode, BSIM3qNode) } } return(OK);}intBSIM3unsetup(inModel,ckt) GENmodel *inModel; CKTcircuit *ckt;{ BSIM3model *model; BSIM3instance *here; for (model = (BSIM3model *)inModel; model != NULL; model = model->BSIM3nextModel) { for (here = model->BSIM3instances; here != NULL; here=here->BSIM3nextInstance) { if (here->BSIM3dNodePrime && here->BSIM3dNodePrime != here->BSIM3dNode) { CKTdltNNum(ckt, here->BSIM3dNodePrime); here->BSIM3dNodePrime = 0; } if (here->BSIM3sNodePrime && here->BSIM3sNodePrime != here->BSIM3sNode) { CKTdltNNum(ckt, here->BSIM3sNodePrime); here->BSIM3sNodePrime = 0; } } } return OK;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?