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

📄 twocond.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
📖 第 1 页 / 共 2 页
字号:
      if ( pElem ISNOT NIL(TWOelem) ) {	switch ( i ) {	case 0:	  /* the TL element */	  pHNode = pElem->pBLNode;	  pVNode = pElem->pTRNode;	  pHEdge = pElem->pBotEdge;	  pVEdge = pElem->pRightEdge;	  if ( pElem->elemType IS SEMICON ) {	    /* compute the derivatives with n,p */	    if ( pHNode->nodeType ISNOT CONTACT ) { 	      dnDv = dxDv[ pHNode->nEqn ]; 	      dpDv = dxDv[ pHNode->pEqn ];	      gTotal -= 0.5 * pElem->dy * (pHEdge->dJnDn * dnDv					   + pHEdge->dJpDp * dpDv);	    }	    if ( pVNode->nodeType ISNOT CONTACT ) { 	      dnDv = dxDv[ pVNode->nEqn ]; 	      dpDv = dxDv[ pVNode->pEqn ];	      gTotal -= 0.5 * pElem->dx * (pVEdge->dJnDn * dnDv					   + pVEdge->dJpDp * dpDv);	    }	  }	  break;	case 1:	  /* the TR element */	  pHNode = pElem->pBRNode;	  pVNode = pElem->pTLNode;	  pHEdge = pElem->pBotEdge;	  pVEdge = pElem->pLeftEdge;	  if ( pElem->elemType IS SEMICON ) {	    /* compute the derivatives with n,p */	    if ( pHNode->nodeType ISNOT CONTACT ) { 	      dnDv = dxDv[ pHNode->nEqn ]; 	      dpDv = dxDv[ pHNode->pEqn ];	      gTotal += 0.5 * pElem->dy * (pHEdge->dJnDnP1 * dnDv					   + pHEdge->dJpDpP1 * dpDv);	    }	    if ( pVNode->nodeType ISNOT CONTACT ) { 	      dnDv = dxDv[ pVNode->nEqn ]; 	      dpDv = dxDv[ pVNode->pEqn ];	      gTotal -= 0.5 * pElem->dx * (pVEdge->dJnDn * dnDv					   + pVEdge->dJpDp * dpDv);	    }	  }	  break;	case 2:	  /* the BR element*/	  pHNode = pElem->pTRNode;	  pVNode = pElem->pBLNode;	  pHEdge = pElem->pTopEdge;	  pVEdge = pElem->pLeftEdge;	  if ( pElem->elemType IS SEMICON ) {	    /* compute the derivatives with n,p */	    if ( pHNode->nodeType ISNOT CONTACT ) { 	      dnDv = dxDv[ pHNode->nEqn ]; 	      dpDv = dxDv[ pHNode->pEqn ];	      gTotal += 0.5 * pElem->dy * (pHEdge->dJnDnP1 * dnDv					   + pHEdge->dJpDpP1 * dpDv);	    }	    if ( pVNode->nodeType ISNOT CONTACT ) { 	      dnDv = dxDv[ pVNode->nEqn ]; 	      dpDv = dxDv[ pVNode->pEqn ];	      gTotal += 0.5 * pElem->dx * (pVEdge->dJnDnP1 * dnDv					   + pVEdge->dJpDpP1 * dpDv);	    }	  }	  break;	case 3:	  /* the BL element */	  pHNode = pElem->pTLNode;	  pVNode = pElem->pBRNode;	  pHEdge = pElem->pTopEdge;	  pVEdge = pElem->pRightEdge;	  if ( pElem->elemType IS SEMICON ) {	    /* compute the derivatives with n,p */	    if ( pHNode->nodeType ISNOT CONTACT ) { 	      dnDv = dxDv[ pHNode->nEqn ]; 	      dpDv = dxDv[ pHNode->pEqn ];	      gTotal -= 0.5 * pElem->dy * (pHEdge->dJnDn * dnDv					   + pHEdge->dJpDp * dpDv);	    }	    if ( pVNode->nodeType ISNOT CONTACT ) { 	      dnDv = dxDv[ pVNode->nEqn ]; 	      dpDv = dxDv[ pVNode->pEqn ];	      gTotal += 0.5 * pElem->dx * (pVEdge->dJnDnP1 * dnDv					   + pVEdge->dJpDpP1 * dpDv);	    }	  }	  break;	}	if ( pElem->elemType IS SEMICON ) {	  if ( pHNode->nodeType ISNOT CONTACT ) { 	    dPsiDv = dxDv[ pHNode->psiEqn ];	    gTotal += 0.5 * pElem->dy * dPsiDv * (pHEdge->dJnDpsiP1 + pHEdge->dJpDpsiP1 ); 	    if ( delVContact ) {	      gTotal -= 0.5 * pElem->dy * (pHEdge->dJnDpsiP1 + pHEdge->dJpDpsiP1 );	    }	  }	  if ( pVNode->nodeType ISNOT CONTACT ) { 	    dPsiDv = dxDv[ pVNode->psiEqn ];	    gTotal += 0.5 * pElem->dx * dPsiDv * (pVEdge->dJnDpsiP1 + pVEdge->dJpDpsiP1 ); 	    if ( delVContact ) {	      gTotal -= 0.5 * pElem->dx * (pVEdge->dJnDpsiP1 + pVEdge->dJpDpsiP1 );	    }	  }	}	if ( tranAnalysis ) {	  /* add the displacement current terms */	  if ( pHNode->nodeType ISNOT CONTACT ) { 	    dPsiDv = dxDv[ pHNode->psiEqn ];	    gTotal -= intCoeff[0] * pElem->epsRel * 0.5 * pElem->dyOverDx * dPsiDv;	    if ( delVContact ) {	      gTotal += intCoeff[0] * pElem->epsRel * 0.5 * pElem->dyOverDx;	    }	  }	  if ( pVNode->nodeType ISNOT CONTACT ) { 	    dPsiDv = dxDv[ pVNode->psiEqn ];	    gTotal -= intCoeff[0] * pElem->epsRel * 0.5 * pElem->dxOverDy * dPsiDv;	    if ( delVContact ) {	      gTotal += intCoeff[0] * pElem->epsRel * 0.5 * pElem->dxOverDy;	    }	  }	}      }    }  }    return( gTotal );}double oxideConductance( pDevice, pContact, delVContact, 			dxDv, tranAnalysis, intCoeff )     TWOdevice *pDevice;     TWOcontact *pContact;     BOOLEAN delVContact, tranAnalysis;     double *dxDv, *intCoeff;{  /* computes the conductance of the contact given in pContact */  int index, i, numContactNodes;  TWOnode *pNode, *pHNode, *pVNode;  TWOelem *pElem;  double dPsiDv, dnDv, dpDv;  double gTotal = 0.0;    if ( NOT tranAnalysis ) {    return( gTotal );  }    numContactNodes = pContact->numNodes;  for ( index = 0; index < numContactNodes; index++ ) {    pNode = pContact->pNodes[ index ];    for ( i = 0; i <= 3; i++ ) {      pElem = pNode->pElems[ i ];      if ( pElem ISNOT NIL(TWOelem) ) {	switch ( i ) {	case 0:	  /* the TL element */	  pHNode = pElem->pBLNode;	  pVNode = pElem->pTRNode;	  break;	case 1:	  /* the TR element */	  pHNode = pElem->pBRNode;	  pVNode = pElem->pTLNode;	  break;	case 2:	  /* the BR element*/	  pHNode = pElem->pTRNode;	  pVNode = pElem->pBLNode;	  break;	case 3:	  /* the BL element */	  pHNode = pElem->pTLNode;	  pVNode = pElem->pBRNode;	  break;	}	/* add the displacement current terms */	if ( pHNode->nodeType ISNOT CONTACT ) { 	  dPsiDv = dxDv[ pHNode->psiEqn ];	  gTotal -= intCoeff[0] * pElem->epsRel * 0.5 * pElem->dyOverDx * dPsiDv;	  if ( delVContact ) {	    gTotal += intCoeff[0] * pElem->epsRel * 0.5 * pElem->dyOverDx;	  }	}	if ( pVNode->nodeType ISNOT CONTACT ) { 	  dPsiDv = dxDv[ pVNode->psiEqn ];	  gTotal -= intCoeff[0] * pElem->epsRel * 0.5 * pElem->dxOverDy * dPsiDv;	  if ( delVContact ) {	    gTotal += intCoeff[0] * pElem->epsRel * 0.5 * pElem->dxOverDy;	  }	}      }    }  }    return( gTotal );}/* these functions are used for solving the complete system of  * equations directly using LU decomposition   1/22/88 */void NUMD2current( pDevice, tranAnalysis, intCoeff, id )     TWOdevice *pDevice;     BOOLEAN tranAnalysis;     double *intCoeff;     double *id;{  TWOcontact *pPContact = pDevice->pFirstContact;  TWOcontact *pNContact = pDevice->pLastContact;  int index;  double ip, ipPrime, *solution;  double in;  BOOLEAN deltaVContact = FALSE;    solution = pDevice->dcDeltaSolution;  ip = contactCurrent( pDevice, pPContact );  /*  in = contactCurrent( pDevice, pNContact );  fprintf(stdout, "DIO current: ( %11.4e error )\n", ip+in );  fprintf(stdout, "     Ip = %11.4e     In = %11.4e\n", ip, in );  */  /*    * for the additional contribution to id will make use of    * contactConductance. This function will be called   * with the dcDeltaSolution vector instead of the incremental quantities   */  ipPrime = contactConductance( pDevice, pPContact, deltaVContact,			       solution, tranAnalysis, intCoeff );    ipPrime *= JNorm * pDevice->width * LNorm;  ip += ipPrime;  *id = ip;}void NBJT2current( pDevice, tranAnalysis, intCoeff, ie, ic )     TWOdevice *pDevice;     BOOLEAN tranAnalysis;     double *intCoeff;     double *ie, *ic;{  TWOcontact *pEmitContact = pDevice->pLastContact;  TWOcontact *pColContact = pDevice->pFirstContact;  TWOcontact *pBaseContact = pDevice->pFirstContact->next;  double *solution, iePrime, icPrime;  double ib;    solution = pDevice->dcDeltaSolution;    *ie = contactCurrent( pDevice, pEmitContact );  *ic = contactCurrent( pDevice, pColContact );  /*  ib = contactCurrent( pDevice, pBaseContact );  fprintf(stdout, "BJT current: ( %11.4e error )\n", *ic+ib+*ie );  fprintf(stdout, "     Ic = %11.4e     Ib = %11.4e\n", *ic, ib );  fprintf(stdout, "     Ie = %11.4e\n", *ie );  */    iePrime = contactConductance( pDevice, pEmitContact, FALSE, solution,			       tranAnalysis, intCoeff );    icPrime = contactConductance( pDevice, pColContact, FALSE, solution,			       tranAnalysis, intCoeff );    iePrime *= JNorm * pDevice->width * LNorm;  icPrime *= JNorm * pDevice->width * LNorm;    *ie += iePrime;  *ic += icPrime;}void NUMOScurrent( pDevice, tranAnalysis, intCoeff, id, is, ig )     TWOdevice *pDevice;     BOOLEAN tranAnalysis;     double *intCoeff;     double *id, *is, *ig;{  TWOcontact *pDContact = pDevice->pFirstContact;  TWOcontact *pGContact = pDevice->pFirstContact->next;  TWOcontact *pSContact = pDevice->pFirstContact->next->next;  TWOcontact *pBContact = pDevice->pLastContact;  double *solution, idPrime, isPrime, igPrime;  double ib;    solution = pDevice->dcDeltaSolution;    *id = contactCurrent( pDevice, pDContact );  *ig = GateTypeCurrent( pDevice, pGContact, tranAnalysis );  *is = contactCurrent( pDevice, pSContact );  /*  ib = contactCurrent( pDevice, pBContact );  fprintf(stdout, "MOS current: ( %11.4e error )\n", *id+*ig+*is+ib );  fprintf(stdout, "     Id = %11.4e     Is = %11.4e\n", *id, *is );  fprintf(stdout, "     Ig = %11.4e     Ib = %11.4e\n", *ig, ib );  */  idPrime = contactConductance( pDevice, pDContact, FALSE,			       solution, tranAnalysis, intCoeff );    isPrime = contactConductance( pDevice, pSContact, FALSE,			       solution, tranAnalysis, intCoeff );    igPrime = GateTypeConductance( pDevice, pGContact, FALSE,				solution, tranAnalysis, intCoeff );    idPrime *= JNorm * pDevice->width * LNorm;  isPrime *= JNorm * pDevice->width * LNorm;  igPrime *= JNorm * pDevice->width * LNorm;    *id += idPrime;  *is += isPrime;  *ig += igPrime;}

⌨️ 快捷键说明

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