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

📄 b3soipdset.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
📖 第 1 页 / 共 4 页
字号:
            if (!here->B3SOIPDaebcpGiven)                here->B3SOIPDaebcp = 0;            if (!here->B3SOIPDoffGiven)                here->B3SOIPDoff = 0;            /* process drain series resistance */            if ((model->B3SOIPDsheetResistance > 0.0) &&                 (here->B3SOIPDdrainSquares > 0.0 ) &&                (here->B3SOIPDdNodePrime == 0))	    {   error = CKTmkVolt(ckt,&tmp,here->B3SOIPDname,"drain");                if(error) return(error);                here->B3SOIPDdNodePrime = 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->B3SOIPDdNodePrime = here->B3SOIPDdNode;            }                               /* process source series resistance */            if ((model->B3SOIPDsheetResistance > 0.0) &&                 (here->B3SOIPDsourceSquares > 0.0 ) &&                (here->B3SOIPDsNodePrime == 0)) 	    {   error = CKTmkVolt(ckt,&tmp,here->B3SOIPDname,"source");                if(error) return(error);                here->B3SOIPDsNodePrime = 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->B3SOIPDsNodePrime = here->B3SOIPDsNode;            }            /* process effective silicon film thickness */            model->B3SOIPDcbox = 3.453133e-11 / model->B3SOIPDtbox;            model->B3SOIPDcsi = 1.03594e-10 / model->B3SOIPDtsi;            Cboxt = model->B3SOIPDcbox * model->B3SOIPDcsi / (model->B3SOIPDcbox + model->B3SOIPDcsi);            model->B3SOIPDqsi = Charge_q*model->B3SOIPDnpeak*1e6*model->B3SOIPDtsi;            here->B3SOIPDfloat = 0;            if (here->B3SOIPDpNode == -1) {  /*  floating body case -- 4-node  */                error = CKTmkVolt(ckt,&tmp,here->B3SOIPDname,"Body");                if (error) return(error);                here->B3SOIPDbNode = tmp->number;                here->B3SOIPDpNode = 0;                 here->B3SOIPDfloat = 1;                here->B3SOIPDbodyMod = 0;            }            else /* the 5th Node has been assigned */            {              if (!here->B3SOIPDtnodeoutGiven) { /* if t-node not assigned  */                 if (here->B3SOIPDbNode == -1)                 { /* 5-node body tie, bNode has not been assigned */                    if ((model->B3SOIPDrbody == 0.0) && (model->B3SOIPDrbsh == 0.0))                    { /* ideal body tie, pNode is not used */                       here->B3SOIPDbNode = here->B3SOIPDpNode;                       here->B3SOIPDbodyMod = 2;                    }                    else { /* nonideal body tie */                      error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Body");                      if (error) return(error);                      here->B3SOIPDbNode = tmp->number;                      here->B3SOIPDbodyMod = 1;                    }                 }                 else { /* 6-node body tie, bNode has been assigned */                    if ((model->B3SOIPDrbody == 0.0) && (model->B3SOIPDrbsh == 0.0))                    {                        printf("\n      Warning: model parameter rbody=0!\n");                       model->B3SOIPDrbody = 1e0;                       here->B3SOIPDbodyMod = 1;                    }                    else { /* nonideal body tie */                        here->B3SOIPDbodyMod = 1;                    }                 }              }              else {    /*  t-node assigned   */                 if (here->B3SOIPDbNode == -1)                 { /* 4 nodes & t-node, floating body */                    error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Body");                    if (error) return(error);                    here->B3SOIPDbNode = tmp->number;                    here->B3SOIPDtempNode = here->B3SOIPDpNode;                    here->B3SOIPDpNode = 0;                     here->B3SOIPDfloat = 1;                    here->B3SOIPDbodyMod = 0;                 }                 else { /* 5 or 6 nodes & t-node, body-contact device */                   if (here->B3SOIPDtempNode == -1) { /* 5 nodes & tnode */                     if ((model->B3SOIPDrbody == 0.0) && (model->B3SOIPDrbsh == 0.0))                     { /* ideal body tie, pNode is not used */                        here->B3SOIPDtempNode = here->B3SOIPDbNode;                        here->B3SOIPDbNode = here->B3SOIPDpNode;                        here->B3SOIPDbodyMod = 2;                     }                     else { /* nonideal body tie */                       here->B3SOIPDtempNode = here->B3SOIPDbNode;                       error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Body");                       if (error) return(error);                       here->B3SOIPDbNode = tmp->number;                       here->B3SOIPDbodyMod = 1;                     }                   }                   else {  /* 6 nodes & t-node */                     if ((model->B3SOIPDrbody == 0.0) && (model->B3SOIPDrbsh == 0.0))                     {                         printf("\n      Warning: model parameter rbody=0!\n");                        model->B3SOIPDrbody = 1e0;                        here->B3SOIPDbodyMod = 1;                     }                     else { /* nonideal body tie */                        here->B3SOIPDbodyMod = 1;                     }                   }                 }              }            }            if ((model->B3SOIPDshMod == 1) && (here->B3SOIPDrth0!=0))            {               if (here->B3SOIPDtempNode == -1) {	          error = CKTmkVolt(ckt,&tmp,here->B3SOIPDname,"Temp");                  if (error) return(error);                     here->B3SOIPDtempNode = tmp->number;               }            } else {                here->B3SOIPDtempNode = 0;            }/* here for debugging purpose only */            if (here->B3SOIPDdebugMod != 0)            {               /* The real Vbs value */               error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Vbs");               if(error) return(error);               here->B3SOIPDvbsNode = tmp->number;                  error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Ids");               if(error) return(error);               here->B3SOIPDidsNode = tmp->number;               error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Ic");               if(error) return(error);               here->B3SOIPDicNode = tmp->number;               error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Ibs");               if(error) return(error);               here->B3SOIPDibsNode = tmp->number;               error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Ibd");               if(error) return(error);               here->B3SOIPDibdNode = tmp->number;                      error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Iii");               if(error) return(error);               here->B3SOIPDiiiNode = tmp->number;                    error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Ig");               if(error) return(error);               here->B3SOIPDigNode = tmp->number;               error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Gigg");               if(error) return(error);               here->B3SOIPDgiggNode = tmp->number;                              error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Gigd");               if(error) return(error);               here->B3SOIPDgigdNode = tmp->number;                             error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Gigb");               if(error) return(error);               here->B3SOIPDgigbNode = tmp->number;               error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Igidl");               if(error) return(error);               here->B3SOIPDigidlNode = tmp->number;               error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Itun");               if(error) return(error);               here->B3SOIPDitunNode = tmp->number;               error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Ibp");               if(error) return(error);               here->B3SOIPDibpNode = tmp->number;                      error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Cbb");               if(error) return(error);               here->B3SOIPDcbbNode = tmp->number;               error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Cbd");               if(error) return(error);               here->B3SOIPDcbdNode = tmp->number;               error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Cbg");               if(error) return(error);               here->B3SOIPDcbgNode = tmp->number;               error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Qbf");               if(error) return(error);               here->B3SOIPDqbfNode = tmp->number;               error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Qjs");               if(error) return(error);               here->B3SOIPDqjsNode = tmp->number;               error = CKTmkVolt(ckt, &tmp, here->B3SOIPDname, "Qjd");               if(error) return(error);               here->B3SOIPDqjdNode = 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->B3SOIPDshMod == 1) && (here->B3SOIPDrth0!=0.0)) {            TSTALLOC(B3SOIPDTemptempPtr, B3SOIPDtempNode, B3SOIPDtempNode)            TSTALLOC(B3SOIPDTempdpPtr, B3SOIPDtempNode, B3SOIPDdNodePrime)            TSTALLOC(B3SOIPDTempspPtr, B3SOIPDtempNode, B3SOIPDsNodePrime)            TSTALLOC(B3SOIPDTempgPtr, B3SOIPDtempNode, B3SOIPDgNode)            TSTALLOC(B3SOIPDTempbPtr, B3SOIPDtempNode, B3SOIPDbNode)            TSTALLOC(B3SOIPDGtempPtr, B3SOIPDgNode, B3SOIPDtempNode)            TSTALLOC(B3SOIPDDPtempPtr, B3SOIPDdNodePrime, B3SOIPDtempNode)            TSTALLOC(B3SOIPDSPtempPtr, B3SOIPDsNodePrime, B3SOIPDtempNode)            TSTALLOC(B3SOIPDEtempPtr, B3SOIPDeNode, B3SOIPDtempNode)            TSTALLOC(B3SOIPDBtempPtr, B3SOIPDbNode, B3SOIPDtempNode)            if (here->B3SOIPDbodyMod == 1) {                TSTALLOC(B3SOIPDPtempPtr, B3SOIPDpNode, B3SOIPDtempNode)            }        }        if (here->B3SOIPDbodyMod == 2) {            /* Don't create any Jacobian entry for pNode */        }        else if (here->B3SOIPDbodyMod == 1) {            TSTALLOC(B3SOIPDBpPtr, B3SOIPDbNode, B3SOIPDpNode)            TSTALLOC(B3SOIPDPbPtr, B3SOIPDpNode, B3SOIPDbNode)            TSTALLOC(B3SOIPDPpPtr, B3SOIPDpNode, B3SOIPDpNode)        }        TSTALLOC(B3SOIPDEbPtr, B3SOIPDeNode, B3SOIPDbNode)        TSTALLOC(B3SOIPDGbPtr, B3SOIPDgNode, B3SOIPDbNode)        TSTALLOC(B3SOIPDDPbPtr, B3SOIPDdNodePrime, B3SOIPDbNode)        TSTALLOC(B3SOIPDSPbPtr, B3SOIPDsNodePrime, B3SOIPDbNode)        TSTALLOC(B3SOIPDBePtr, B3SOIPDbNode, B3SOIPDeNode)        TSTALLOC(B3SOIPDBgPtr, B3SOIPDbNode, B3SOIPDgNode)        TSTALLOC(B3SOIPDBdpPtr, B3SOIPDbNode, B3SOIPDdNodePrime)        TSTALLOC(B3SOIPDBspPtr, B3SOIPDbNode, B3SOIPDsNodePrime)        TSTALLOC(B3SOIPDBbPtr, B3SOIPDbNode, B3SOIPDbNode)        TSTALLOC(B3SOIPDEgPtr, B3SOIPDeNode, B3SOIPDgNode)        TSTALLOC(B3SOIPDEdpPtr, B3SOIPDeNode, B3SOIPDdNodePrime)        TSTALLOC(B3SOIPDEspPtr, B3SOIPDeNode, B3SOIPDsNodePrime)        TSTALLOC(B3SOIPDGePtr, B3SOIPDgNode, B3SOIPDeNode)        TSTALLOC(B3SOIPDDPePtr, B3SOIPDdNodePrime, B3SOIPDeNode)        TSTALLOC(B3SOIPDSPePtr, B3SOIPDsNodePrime, B3SOIPDeNode)        TSTALLOC(B3SOIPDEbPtr, B3SOIPDeNode, B3SOIPDbNode)        TSTALLOC(B3SOIPDEePtr, B3SOIPDeNode, B3SOIPDeNode)        TSTALLOC(B3SOIPDGgPtr, B3SOIPDgNode, B3SOIPDgNode)        TSTALLOC(B3SOIPDGdpPtr, B3SOIPDgNode, B3SOIPDdNodePrime)        TSTALLOC(B3SOIPDGspPtr, B3SOIPDgNode, B3SOIPDsNodePrime)        TSTALLOC(B3SOIPDDPgPtr, B3SOIPDdNodePrime, B3SOIPDgNode)        TSTALLOC(B3SOIPDDPdpPtr, B3SOIPDdNodePrime, B3SOIPDdNodePrime)        TSTALLOC(B3SOIPDDPspPtr, B3SOIPDdNodePrime, B3SOIPDsNodePrime)        TSTALLOC(B3SOIPDDPdPtr, B3SOIPDdNodePrime, B3SOIPDdNode)        TSTALLOC(B3SOIPDSPgPtr, B3SOIPDsNodePrime, B3SOIPDgNode)        TSTALLOC(B3SOIPDSPdpPtr, B3SOIPDsNodePrime, B3SOIPDdNodePrime)        TSTALLOC(B3SOIPDSPspPtr, B3SOIPDsNodePrime, B3SOIPDsNodePrime)        TSTALLOC(B3SOIPDSPsPtr, B3SOIPDsNodePrime, B3SOIPDsNode)        TSTALLOC(B3SOIPDDdPtr, B3SOIPDdNode, B3SOIPDdNode)        TSTALLOC(B3SOIPDDdpPtr, B3SOIPDdNode, B3SOIPDdNodePrime)        TSTALLOC(B3SOIPDSsPtr, B3SOIPDsNode, B3SOIPDsNode)        TSTALLOC(B3SOIPDSspPtr, B3SOIPDsNode, B3SOIPDsNodePrime)/* here for debugging purpose only */         if (here->B3SOIPDdebugMod != 0)         {            TSTALLOC(B3SOIPDVbsPtr, B3SOIPDvbsNode, B3SOIPDvbsNode)             TSTALLOC(B3SOIPDIdsPtr, B3SOIPDidsNode, B3SOIPDidsNode)            TSTALLOC(B3SOIPDIcPtr, B3SOIPDicNode, B3SOIPDicNode)            TSTALLOC(B3SOIPDIbsPtr, B3SOIPDibsNode, B3SOIPDibsNode)            TSTALLOC(B3SOIPDIbdPtr, B3SOIPDibdNode, B3SOIPDibdNode)            TSTALLOC(B3SOIPDIiiPtr, B3SOIPDiiiNode, B3SOIPDiiiNode)            TSTALLOC(B3SOIPDIgPtr, B3SOIPDigNode, B3SOIPDigNode)            TSTALLOC(B3SOIPDGiggPtr, B3SOIPDgiggNode, B3SOIPDgiggNode)            TSTALLOC(B3SOIPDGigdPtr, B3SOIPDgigdNode, B3SOIPDgigdNode)            TSTALLOC(B3SOIPDGigbPtr, B3SOIPDgigbNode, B3SOIPDgigbNode)            TSTALLOC(B3SOIPDIgidlPtr, B3SOIPDigidlNode, B3SOIPDigidlNode)            TSTALLOC(B3SOIPDItunPtr, B3SOIPDitunNode, B3SOIPDitunNode)            TSTALLOC(B3SOIPDIbpPtr, B3SOIPDibpNode, B3SOIPDibpNode)            TSTALLOC(B3SOIPDCbbPtr, B3SOIPDcbbNode, B3SOIPDcbbNode)            TSTALLOC(B3SOIPDCbdPtr, B3SOIPDcbdNode, B3SOIPDcbdNode)            TSTALLOC(B3SOIPDCbgPtr, B3SOIPDcbgNode, B3SOIPDcbgNode)            TSTALLOC(B3SOIPDQbfPtr, B3SOIPDqbfNode, B3SOIPDqbfNode)            TSTALLOC(B3SOIPDQjsPtr, B3SOIPDqjsNode, B3SOIPDqjsNode)            TSTALLOC(B3SOIPDQjdPtr, B3SOIPDqjdNode, B3SOIPDqjdNode)         }        }    }    return(OK);}  intB3SOIPDunsetup(inModel,ckt)    GENmodel *inModel;    CKTcircuit *ckt;{    B3SOIPDmodel *model;    B3SOIPDinstance *here;     for (model = (B3SOIPDmodel *)inModel; model != NULL;            model = model->B3SOIPDnextModel)    {        for (here = model->B3SOIPDinstances; here != NULL;                here=here->B3SOIPDnextInstance)        {            if (here->B3SOIPDdNodePrime                    && here->B3SOIPDdNodePrime != here->B3SOIPDdNode)            {                CKTdltNNum(ckt, here->B3SOIPDdNodePrime);                here->B3SOIPDdNodePrime = 0;            }            if (here->B3SOIPDsNodePrime                    && here->B3SOIPDsNodePrime != here->B3SOIPDsNode)            {                CKTdltNNum(ckt, here->B3SOIPDsNodePrime);                here->B3SOIPDsNodePrime = 0;            }        }    }    return OK;}

⌨️ 快捷键说明

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