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 + -
显示快捷键?