📄 b3soiset.c
字号:
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 + -