⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 b3soiset.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
📖 第 1 页 / 共 4 页
字号:
            if (!here->B3SOIsourceAreaGiven)                here->B3SOIsourceArea = 0;            if (!here->B3SOIsourcePerimeterGiven)                here->B3SOIsourcePerimeter = 0;            if (!here->B3SOIsourceSquaresGiven)                here->B3SOIsourceSquares = 1;            if (!here->B3SOIwGiven)                here->B3SOIw = 5e-6;            if (!here->B3SOImGiven)                here->B3SOIm = 1;/* v2.0 release */            if (!here->B3SOInbcGiven)                here->B3SOInbc = 0;            if (!here->B3SOInsegGiven)                here->B3SOInseg = 1;            if (!here->B3SOIpdbcpGiven)                here->B3SOIpdbcp = 0;            if (!here->B3SOIpsbcpGiven)                here->B3SOIpsbcp = 0;            if (!here->B3SOIagbcpGiven)                here->B3SOIagbcp = 0;            if (!here->B3SOIaebcpGiven)                here->B3SOIaebcp = 0;            if (!here->B3SOIoffGiven)                here->B3SOIoff = 0;            /* process drain series resistance */            if ((model->B3SOIsheetResistance > 0.0) &&                 (here->B3SOIdrainSquares > 0.0 ) &&                (here->B3SOIdNodePrime == 0))	    {   error = CKTmkVolt(ckt,&tmp,here->B3SOIname,"drain");                if(error) return(error);                here->B3SOIdNodePrime = 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->B3SOIdNodePrime = here->B3SOIdNode;            }                               /* process source series resistance */            if ((model->B3SOIsheetResistance > 0.0) &&                 (here->B3SOIsourceSquares > 0.0 ) &&                (here->B3SOIsNodePrime == 0)) 	    {   error = CKTmkVolt(ckt,&tmp,here->B3SOIname,"source");                if(error) return(error);                here->B3SOIsNodePrime = 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->B3SOIsNodePrime = here->B3SOIsNode;            }            /* process effective silicon film thickness */            model->B3SOIcbox = 3.453133e-11 / model->B3SOItbox;            model->B3SOIcsi = 1.03594e-10 / model->B3SOItsi;            Cboxt = model->B3SOIcbox * model->B3SOIcsi / (model->B3SOIcbox + model->B3SOIcsi);            model->B3SOIqsi = Charge_q*model->B3SOInpeak*1e6*model->B3SOItsi;            here->B3SOIfloat = 0;            if (here->B3SOIpNode == -1) {  /*  floating body case -- 4-node  */                error = CKTmkVolt(ckt,&tmp,here->B3SOIname,"Body");                if (error) return(error);                here->B3SOIbNode = tmp->number;                here->B3SOIpNode = 0;                 here->B3SOIfloat = 1;                here->B3SOIbodyMod = 0;            }            else /* the 5th Node has been assigned */            {              if (!here->B3SOItnodeoutGiven) { /* if t-node not assigned  */                 if (here->B3SOIbNode == -1)                 { /* 5-node body tie, bNode has not been assigned */                    if ((model->B3SOIrbody == 0.0) && (model->B3SOIrbsh == 0.0))                    { /* ideal body tie, pNode is not used */                       here->B3SOIbNode = here->B3SOIpNode;                       here->B3SOIbodyMod = 2;                    }                    else { /* nonideal body tie */                      error = CKTmkVolt(ckt, &tmp, here->B3SOIname, "Body");                      if (error) return(error);                      here->B3SOIbNode = tmp->number;                      here->B3SOIbodyMod = 1;                    }                 }                 else { /* 6-node body tie, bNode has been assigned */                    if ((model->B3SOIrbody == 0.0) && (model->B3SOIrbsh == 0.0))                    {                        printf("\n      Warning: model parameter rbody=0!\n");                       model->B3SOIrbody = 1e0;                       here->B3SOIbodyMod = 1;                    }                    else { /* nonideal body tie */                        here->B3SOIbodyMod = 1;                    }                 }              }              else {    /*  t-node assigned   */                 if (here->B3SOIbNode == -1)                 { /* 4 nodes & t-node, floating body */                    error = CKTmkVolt(ckt, &tmp, here->B3SOIname, "Body");                    if (error) return(error);                    here->B3SOIbNode = tmp->number;                    here->B3SOItempNode = here->B3SOIpNode;                    here->B3SOIpNode = 0;                     here->B3SOIfloat = 1;                    here->B3SOIbodyMod = 0;                 }                 else { /* 5 or 6 nodes & t-node, body-contact device */                   if (here->B3SOItempNode == -1) { /* 5 nodes & tnode */                     if ((model->B3SOIrbody == 0.0) && (model->B3SOIrbsh == 0.0))                     { /* ideal body tie, pNode is not used */                        here->B3SOItempNode = here->B3SOIbNode;                        here->B3SOIbNode = here->B3SOIpNode;                        here->B3SOIbodyMod = 2;                     }                     else { /* nonideal body tie */                       here->B3SOItempNode = here->B3SOIbNode;                       error = CKTmkVolt(ckt, &tmp, here->B3SOIname, "Body");                       if (error) return(error);                       here->B3SOIbNode = tmp->number;                       here->B3SOIbodyMod = 1;                     }                   }                   else {  /* 6 nodes & t-node */                     if ((model->B3SOIrbody == 0.0) && (model->B3SOIrbsh == 0.0))                     {                         printf("\n      Warning: model parameter rbody=0!\n");                        model->B3SOIrbody = 1e0;                        here->B3SOIbodyMod = 1;                     }                     else { /* nonideal body tie */                        here->B3SOIbodyMod = 1;                     }                   }                 }              }            }            if ((model->B3SOIshMod == 1) && (here->B3SOIrth0!=0))            {               if (here->B3SOItempNode == -1) {	          error = CKTmkVolt(ckt,&tmp,here->B3SOIname,"Temp");                  if (error) return(error);                     here->B3SOItempNode = tmp->number;               }            } else {                here->B3SOItempNode = 0;            }/* here for debugging purpose only */            if (here->B3SOIdebugMod != 0)            {               /* The real Vbs value */               error = CKTmkVolt(ckt, &tmp, here->B3SOIname, "Vbs");               if(error) return(error);               here->B3SOIvbsNode = tmp->number;                  error = CKTmkVolt(ckt, &tmp, here->B3SOIname, "Ids");               if(error) return(error);               here->B3SOIidsNode = tmp->number;               error = CKTmkVolt(ckt, &tmp, here->B3SOIname, "Ic");               if(error) return(error);               here->B3SOIicNode = tmp->number;               error = CKTmkVolt(ckt, &tmp, here->B3SOIname, "Ibs");               if(error) return(error);               here->B3SOIibsNode = tmp->number;               error = CKTmkVolt(ckt, &tmp, here->B3SOIname, "Ibd");               if(error) return(error);               here->B3SOIibdNode = tmp->number;                      error = CKTmkVolt(ckt, &tmp, here->B3SOIname, "Iii");               if(error) return(error);               here->B3SOIiiiNode = tmp->number;                    error = CKTmkVolt(ckt, &tmp, here->B3SOIname, "Ig");               if(error) return(error);               here->B3SOIigNode = tmp->number;               error = CKTmkVolt(ckt, &tmp, here->B3SOIname, "Gigg");               if(error) return(error);               here->B3SOIgiggNode = tmp->number;                              error = CKTmkVolt(ckt, &tmp, here->B3SOIname, "Gigd");               if(error) return(error);               here->B3SOIgigdNode = tmp->number;                             error = CKTmkVolt(ckt, &tmp, here->B3SOIname, "Gigb");               if(error) return(error);               here->B3SOIgigbNode = tmp->number;               error = CKTmkVolt(ckt, &tmp, here->B3SOIname, "Igidl");               if(error) return(error);               here->B3SOIigidlNode = tmp->number;               error = CKTmkVolt(ckt, &tmp, here->B3SOIname, "Itun");               if(error) return(error);               here->B3SOIitunNode = tmp->number;               error = CKTmkVolt(ckt, &tmp, here->B3SOIname, "Ibp");               if(error) return(error);               here->B3SOIibpNode = tmp->number;                      error = CKTmkVolt(ckt, &tmp, here->B3SOIname, "Cbb");               if(error) return(error);               here->B3SOIcbbNode = tmp->number;               error = CKTmkVolt(ckt, &tmp, here->B3SOIname, "Cbd");               if(error) return(error);               here->B3SOIcbdNode = tmp->number;               error = CKTmkVolt(ckt, &tmp, here->B3SOIname, "Cbg");               if(error) return(error);               here->B3SOIcbgNode = tmp->number;               error = CKTmkVolt(ckt, &tmp, here->B3SOIname, "Qbf");               if(error) return(error);               here->B3SOIqbfNode = tmp->number;               error = CKTmkVolt(ckt, &tmp, here->B3SOIname, "Qjs");               if(error) return(error);               here->B3SOIqjsNode = tmp->number;               error = CKTmkVolt(ckt, &tmp, here->B3SOIname, "Qjd");               if(error) return(error);               here->B3SOIqjdNode = tmp->number;           }        /* 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);\}        if ((model->B3SOIshMod == 1) && (here->B3SOIrth0!=0.0)) {            TSTALLOC(B3SOITemptempPtr, B3SOItempNode, B3SOItempNode)            TSTALLOC(B3SOITempdpPtr, B3SOItempNode, B3SOIdNodePrime)            TSTALLOC(B3SOITempspPtr, B3SOItempNode, B3SOIsNodePrime)            TSTALLOC(B3SOITempgPtr, B3SOItempNode, B3SOIgNode)            TSTALLOC(B3SOITempbPtr, B3SOItempNode, B3SOIbNode)            TSTALLOC(B3SOIGtempPtr, B3SOIgNode, B3SOItempNode)            TSTALLOC(B3SOIDPtempPtr, B3SOIdNodePrime, B3SOItempNode)            TSTALLOC(B3SOISPtempPtr, B3SOIsNodePrime, B3SOItempNode)            TSTALLOC(B3SOIEtempPtr, B3SOIeNode, B3SOItempNode)            TSTALLOC(B3SOIBtempPtr, B3SOIbNode, B3SOItempNode)            if (here->B3SOIbodyMod == 1) {                TSTALLOC(B3SOIPtempPtr, B3SOIpNode, B3SOItempNode)            }/* v3.0 */            if (model->B3SOIsoiMod != 0) {               TSTALLOC(B3SOITempePtr, B3SOItempNode, B3SOIeNode)             }        }        if (here->B3SOIbodyMod == 2) {            /* Don't create any Jacobian entry for pNode */        }        else if (here->B3SOIbodyMod == 1) {            TSTALLOC(B3SOIBpPtr, B3SOIbNode, B3SOIpNode)            TSTALLOC(B3SOIPbPtr, B3SOIpNode, B3SOIbNode)            TSTALLOC(B3SOIPpPtr, B3SOIpNode, B3SOIpNode)        }        TSTALLOC(B3SOIEbPtr, B3SOIeNode, B3SOIbNode)        TSTALLOC(B3SOIGbPtr, B3SOIgNode, B3SOIbNode)        TSTALLOC(B3SOIDPbPtr, B3SOIdNodePrime, B3SOIbNode)        TSTALLOC(B3SOISPbPtr, B3SOIsNodePrime, B3SOIbNode)        TSTALLOC(B3SOIBePtr, B3SOIbNode, B3SOIeNode)        TSTALLOC(B3SOIBgPtr, B3SOIbNode, B3SOIgNode)        TSTALLOC(B3SOIBdpPtr, B3SOIbNode, B3SOIdNodePrime)        TSTALLOC(B3SOIBspPtr, B3SOIbNode, B3SOIsNodePrime)        TSTALLOC(B3SOIBbPtr, B3SOIbNode, B3SOIbNode)        TSTALLOC(B3SOIEgPtr, B3SOIeNode, B3SOIgNode)        TSTALLOC(B3SOIEdpPtr, B3SOIeNode, B3SOIdNodePrime)        TSTALLOC(B3SOIEspPtr, B3SOIeNode, B3SOIsNodePrime)        TSTALLOC(B3SOIGePtr, B3SOIgNode, B3SOIeNode)        TSTALLOC(B3SOIDPePtr, B3SOIdNodePrime, B3SOIeNode)        TSTALLOC(B3SOISPePtr, B3SOIsNodePrime, B3SOIeNode)        TSTALLOC(B3SOIEbPtr, B3SOIeNode, B3SOIbNode)        TSTALLOC(B3SOIEePtr, B3SOIeNode, B3SOIeNode)        TSTALLOC(B3SOIGgPtr, B3SOIgNode, B3SOIgNode)        TSTALLOC(B3SOIGdpPtr, B3SOIgNode, B3SOIdNodePrime)        TSTALLOC(B3SOIGspPtr, B3SOIgNode, B3SOIsNodePrime)        TSTALLOC(B3SOIDPgPtr, B3SOIdNodePrime, B3SOIgNode)        TSTALLOC(B3SOIDPdpPtr, B3SOIdNodePrime, B3SOIdNodePrime)        TSTALLOC(B3SOIDPspPtr, B3SOIdNodePrime, B3SOIsNodePrime)        TSTALLOC(B3SOIDPdPtr, B3SOIdNodePrime, B3SOIdNode)        TSTALLOC(B3SOISPgPtr, B3SOIsNodePrime, B3SOIgNode)        TSTALLOC(B3SOISPdpPtr, B3SOIsNodePrime, B3SOIdNodePrime)        TSTALLOC(B3SOISPspPtr, B3SOIsNodePrime, B3SOIsNodePrime)        TSTALLOC(B3SOISPsPtr, B3SOIsNodePrime, B3SOIsNode)        TSTALLOC(B3SOIDdPtr, B3SOIdNode, B3SOIdNode)        TSTALLOC(B3SOIDdpPtr, B3SOIdNode, B3SOIdNodePrime)        TSTALLOC(B3SOISsPtr, B3SOIsNode, B3SOIsNode)        TSTALLOC(B3SOISspPtr, B3SOIsNode, B3SOIsNodePrime)/* here for debugging purpose only */         if (here->B3SOIdebugMod != 0)         {            TSTALLOC(B3SOIVbsPtr, B3SOIvbsNode, B3SOIvbsNode)             TSTALLOC(B3SOIIdsPtr, B3SOIidsNode, B3SOIidsNode)            TSTALLOC(B3SOIIcPtr, B3SOIicNode, B3SOIicNode)            TSTALLOC(B3SOIIbsPtr, B3SOIibsNode, B3SOIibsNode)            TSTALLOC(B3SOIIbdPtr, B3SOIibdNode, B3SOIibdNode)            TSTALLOC(B3SOIIiiPtr, B3SOIiiiNode, B3SOIiiiNode)            TSTALLOC(B3SOIIgPtr, B3SOIigNode, B3SOIigNode)            TSTALLOC(B3SOIGiggPtr, B3SOIgiggNode, B3SOIgiggNode)            TSTALLOC(B3SOIGigdPtr, B3SOIgigdNode, B3SOIgigdNode)            TSTALLOC(B3SOIGigbPtr, B3SOIgigbNode, B3SOIgigbNode)            TSTALLOC(B3SOIIgidlPtr, B3SOIigidlNode, B3SOIigidlNode)            TSTALLOC(B3SOIItunPtr, B3SOIitunNode, B3SOIitunNode)            TSTALLOC(B3SOIIbpPtr, B3SOIibpNode, B3SOIibpNode)            TSTALLOC(B3SOICbbPtr, B3SOIcbbNode, B3SOIcbbNode)            TSTALLOC(B3SOICbdPtr, B3SOIcbdNode, B3SOIcbdNode)            TSTALLOC(B3SOICbgPtr, B3SOIcbgNode, B3SOIcbgNode)            TSTALLOC(B3SOIQbfPtr, B3SOIqbfNode, B3SOIqbfNode)            TSTALLOC(B3SOIQjsPtr, B3SOIqjsNode, B3SOIqjsNode)            TSTALLOC(B3SOIQjdPtr, B3SOIqjdNode, B3SOIqjdNode)         }        }    }    return(OK);}  intB3SOIunsetup(GENmodel *inModel, CKTcircuit *ckt){    B3SOImodel *model;    B3SOIinstance *here;     for (model = (B3SOImodel *)inModel; model != NULL;            model = model->B3SOInextModel)    {        for (here = model->B3SOIinstances; here != NULL;                here=here->B3SOInextInstance)        {            if (here->B3SOIdNodePrime                    && here->B3SOIdNodePrime != here->B3SOIdNode)            {                CKTdltNNum(ckt, here->B3SOIdNodePrime);                here->B3SOIdNodePrime = 0;            }            if (here->B3SOIsNodePrime                    && here->B3SOIsNodePrime != here->B3SOIsNode)            {                CKTdltNNum(ckt, here->B3SOIsNodePrime);                here->B3SOIsNodePrime = 0;            }        }    }    return OK;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -