update `bsim3soi' aka `b4soi'
This commit is contained in:
parent
5bb4c56165
commit
1c4f960b45
|
|
@ -15,15 +15,15 @@ and redistribute the software and documentation, both within the user's
|
|||
organization and externally, subject to the following restrictions
|
||||
|
||||
1. The users agree not to charge for the University of California code
|
||||
itself but may charge for additions, extensions, or support.
|
||||
itself but may charge for additions, extensions, or support.
|
||||
|
||||
2. In any product based on the software, the users agree to acknowledge
|
||||
the UC Berkeley BSIM Research Group that developed the software. This
|
||||
acknowledgment shall appear in the product documentation.
|
||||
the UC Berkeley BSIM Research Group that developed the software. This
|
||||
acknowledgment shall appear in the product documentation.
|
||||
|
||||
3. The users agree to obey all U.S. Government restrictions governing
|
||||
redistribution or export of the software.
|
||||
redistribution or export of the software.
|
||||
|
||||
4. The users agree to reproduce any copyright notice which appears on
|
||||
the software on any copy or modification of such made available
|
||||
to others.
|
||||
the software on any copy or modification of such made available
|
||||
to others.
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/
|
||||
|
||||
/*** B4SOI 04/27/2010 Released by Tanvir Morshed ***/
|
||||
|
||||
/**********
|
||||
* Copyright 2010 Regents of the University of California. All rights reserved.
|
||||
|
|
@ -7,11 +7,13 @@
|
|||
* Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soi.c
|
||||
* Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2010- Tanvir Morshed, Ali Niknejad, Chenming Hu.
|
||||
* File: b4soi.c
|
||||
* Modified by Hui Wan, Xuemei Xi 11/30/2005
|
||||
* Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009
|
||||
* Modified by Tanvir Morshed 09/22/2009
|
||||
* Modified by Tanvir Morshed 12/31/2009
|
||||
* Modified by Tanvir Morshed 12/16/2010
|
||||
**********/
|
||||
|
||||
#include "ngspice/ngspice.h"
|
||||
|
|
@ -236,6 +238,8 @@ IOP( "etsi", B4SOI_MOD_ETSI, IF_REAL, "Effective Silicon-on-insulator thickness
|
|||
IOP( "xj", B4SOI_MOD_XJ, IF_REAL, "Junction Depth"),
|
||||
IOP( "rth0", B4SOI_MOD_RTH0, IF_REAL, "Self-heating thermal resistance"),
|
||||
IOP( "cth0", B4SOI_MOD_CTH0, IF_REAL, "Self-heating thermal capacitance"),
|
||||
|
||||
IOP( "cfrcoeff", B4SOI_MOD_CFRCOEFF, IF_REAL, "Fringe Cap parameter"), /* v4.4 */
|
||||
IOP( "egidl", B4SOI_MOD_EGIDL, IF_REAL, "GIDL first parameter"),
|
||||
IOP( "agidl", B4SOI_MOD_AGIDL, IF_REAL, "GIDL second parameter"),
|
||||
IOP( "bgidl", B4SOI_MOD_BGIDL, IF_REAL, "GIDL third parameter"),
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
/*** B4SOI 04/27/2010 Released by Tanvir Morshed ***/
|
||||
/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/
|
||||
|
||||
|
||||
/**********
|
||||
* Copyright 2010 Regents of the University of California. All rights reserved.
|
||||
|
|
@ -6,6 +7,7 @@
|
|||
* Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soiacld.c
|
||||
* Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2010- Tanvir Morshed, Ali Niknejad, Chenming Hu.
|
||||
* File: b4soiacld.c
|
||||
* Modified by Hui Wan, Xuemei Xi 11/30/2005
|
||||
* Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009
|
||||
|
|
@ -21,7 +23,9 @@
|
|||
|
||||
|
||||
int
|
||||
B4SOIacLoad(GENmodel *inModel, CKTcircuit *ckt)
|
||||
B4SOIacLoad(
|
||||
GENmodel *inModel,
|
||||
CKTcircuit *ckt)
|
||||
{
|
||||
register B4SOImodel *model = (B4SOImodel*)inModel;
|
||||
register B4SOIinstance *here;
|
||||
|
|
@ -77,6 +81,7 @@ double m;
|
|||
for (here = model->B4SOIinstances; here!= NULL;
|
||||
here = here->B4SOInextInstance)
|
||||
{
|
||||
if (here->B4SOIowner != ARCHme) continue;
|
||||
selfheat = (model->B4SOIshMod == 1) && (here->B4SOIrth0 != 0.0);
|
||||
if (here->B4SOImode >= 0)
|
||||
{ Gm = here->B4SOIgm;
|
||||
|
|
@ -806,7 +811,6 @@ double m;
|
|||
(*(here->B4SOIBbPtr) += m * (here->B4SOIgrbsb
|
||||
+ here->B4SOIgrbdb));
|
||||
|
||||
|
||||
}
|
||||
|
||||
if (here->B4SOIdebugMod != 0)
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
/*** B4SOI 04/27/2010 Released by Tanvir Morshed ***/
|
||||
/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/
|
||||
|
||||
|
||||
/**********
|
||||
* Copyright 2010 Regents of the University of California. All rights reserved.
|
||||
|
|
@ -20,12 +21,15 @@
|
|||
#include "ngspice/devdefs.h"
|
||||
#include "b4soidef.h"
|
||||
#include "ngspice/sperror.h"
|
||||
|
||||
#include "ngspice/suffix.h"
|
||||
|
||||
int
|
||||
B4SOIask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, IFvalue *select)
|
||||
|
||||
B4SOIask(
|
||||
CKTcircuit *ckt,
|
||||
GENinstance *inst,
|
||||
int which,
|
||||
IFvalue *value,
|
||||
IFvalue *select)
|
||||
{
|
||||
B4SOIinstance *here = (B4SOIinstance*)inst;
|
||||
|
||||
|
|
@ -81,9 +85,6 @@ B4SOIinstance *here = (B4SOIinstance*)inst;
|
|||
case B4SOI_QB:
|
||||
value->rValue = here->B4SOIqbulk;
|
||||
return(OK);
|
||||
case B4SOI_QG:
|
||||
value->rValue = here->B4SOIqgate;
|
||||
return(OK);
|
||||
case B4SOI_QD:
|
||||
value->rValue = here->B4SOIqdrn;
|
||||
return(OK);
|
||||
|
|
@ -368,9 +369,6 @@ B4SOIinstance *here = (B4SOIinstance*)inst;
|
|||
case B4SOI_QBD:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B4SOIqbd);
|
||||
return(OK);
|
||||
case B4SOI_DEBUG:
|
||||
value->iValue = here->B4SOIdebugMod;
|
||||
return(OK);
|
||||
#ifdef B4SOI_DEBUG_OUT
|
||||
case B4SOI_DEBUG1:
|
||||
value->rValue = here->B4SOIdebug1;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
/*** B4SOI 04/27/2010 Released by Tanvir Morshed ***/
|
||||
/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/
|
||||
|
||||
|
||||
/**********
|
||||
* Copyright 2010 Regents of the University of California. All rights reserved.
|
||||
|
|
@ -6,11 +7,13 @@
|
|||
* Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soicheck.c
|
||||
* Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2010- Tanvir Morshed, Ali Niknejad, Chenming Hu.
|
||||
* File: b4soicheck.c
|
||||
* Modified by Hui Wan, Xuemei Xi 11/30/2005
|
||||
* Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009
|
||||
* Modified by Tanvir Morshed 09/22/2009
|
||||
* Modified by Tanvir Morshed 12/31/2009
|
||||
* Modified by Tanvir Morshed 12/16/2010
|
||||
**********/
|
||||
|
||||
#include "ngspice/ngspice.h"
|
||||
|
|
@ -23,8 +26,10 @@
|
|||
#include "ngspice/suffix.h"
|
||||
|
||||
int
|
||||
B4SOIcheckModel(B4SOImodel *model, B4SOIinstance *here, CKTcircuit *ckt)
|
||||
|
||||
B4SOIcheckModel(
|
||||
B4SOImodel *model,
|
||||
B4SOIinstance *here,
|
||||
CKTcircuit *ckt)
|
||||
{
|
||||
struct b4soiSizeDependParam *pParam;
|
||||
int Fatal_Flag = 0;
|
||||
|
|
@ -371,6 +376,28 @@ FILE *fplog;
|
|||
printf("Fatal: Deltavox = %g is not positive.\n", model->B4SOIdeltavox);
|
||||
}
|
||||
|
||||
/* v4.4 Tanvir */
|
||||
if (pParam->B4SOIrdsw < 0.0)
|
||||
{ fprintf(fplog, "Warning: Rdsw = %g is negative. Set to zero.\n",
|
||||
pParam->B4SOIrdsw);
|
||||
printf("Warning: Rdsw = %g is negative. Set to zero.\n",
|
||||
pParam->B4SOIrdsw);
|
||||
pParam->B4SOIrdsw = 0.0;
|
||||
pParam->B4SOIrds0 = 0.0;
|
||||
}
|
||||
else if (pParam->B4SOIrds0 < 0.001)
|
||||
{ fprintf(fplog, "Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n",
|
||||
pParam->B4SOIrds0);
|
||||
printf("Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n",
|
||||
pParam->B4SOIrds0);
|
||||
pParam->B4SOIrds0 = 0.0;
|
||||
} /* v4.4 */
|
||||
if ((model->B4SOIcfrcoeff < 1.0)||(model->B4SOIcfrcoeff > 2.0))
|
||||
{ fprintf(fplog, "Warning: CfrCoeff = %g is out of range.\n",
|
||||
model->B4SOIcfrcoeff);
|
||||
printf("Warning: CfrCoeff = %g is outside valid range [1,2], set to 1.\n", model->B4SOIcfrcoeff);
|
||||
model->B4SOIcfrcoeff = 1;
|
||||
} /* v4.4 */
|
||||
if (model->B4SOIparamChk ==1)
|
||||
{
|
||||
/* Check L and W parameters */
|
||||
|
|
@ -512,7 +539,7 @@ if (model->B4SOInpeak > 1.0e20)
|
|||
pParam->B4SOIa1 = 0.0;
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
if (pParam->B4SOIrdsw < 0.0)
|
||||
{ fprintf(fplog, "Warning: Rdsw = %g is negative. Set to zero.\n",
|
||||
pParam->B4SOIrdsw);
|
||||
|
|
@ -527,7 +554,7 @@ if (model->B4SOInpeak > 1.0e20)
|
|||
printf("Warning: Rds at current temperature = %g is less than 0.001 ohm. Set to zero.\n",
|
||||
pParam->B4SOIrds0);
|
||||
pParam->B4SOIrds0 = 0.0;
|
||||
}
|
||||
} v4.4 */
|
||||
if (pParam->B4SOIvsattemp < 1.0e3)
|
||||
{ fprintf(fplog, "Warning: Vsat at current temperature = %g may be too small.\n", pParam->B4SOIvsattemp);
|
||||
printf("Warning: Vsat at current temperature = %g may be too small.\n", pParam->B4SOIvsattemp);
|
||||
|
|
@ -915,8 +942,6 @@ if (model->B4SOInpeak > 1.0e20)
|
|||
model->B4SOIdlbg);
|
||||
printf("Warning: dlbg = %g is negative.\n", model->B4SOIdlbg);
|
||||
}
|
||||
|
||||
|
||||
if (model->B4SOIagidl < 0.0)
|
||||
{ fprintf(fplog, "Warning: AGIDL = %g is negative.\n",
|
||||
model->B4SOIagidl);
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
/*** B4SOI 04/27/2010 Released by Tanvir Morshed ***/
|
||||
/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/
|
||||
|
||||
|
||||
/**********
|
||||
* Copyright 2010 Regents of the University of California. All rights reserved.
|
||||
|
|
@ -25,8 +26,9 @@
|
|||
|
||||
|
||||
int
|
||||
B4SOIconvTest(GENmodel *inModel, CKTcircuit *ckt)
|
||||
|
||||
B4SOIconvTest(
|
||||
GENmodel *inModel,
|
||||
CKTcircuit *ckt)
|
||||
{
|
||||
register B4SOImodel *model = (B4SOImodel*)inModel;
|
||||
register B4SOIinstance *here;
|
||||
|
|
@ -38,7 +40,9 @@ double cbd, cbhat, cbs, cd, cdhat, tol, vgd, vgdo, vgs;
|
|||
{ /* loop through all the instances of the model */
|
||||
for (here = model->B4SOIinstances; here != NULL ;
|
||||
here=here->B4SOInextInstance)
|
||||
{ vbs = model->B4SOItype
|
||||
{
|
||||
if (here->B4SOIowner != ARCHme) continue;
|
||||
vbs = model->B4SOItype
|
||||
* (*(ckt->CKTrhsOld+here->B4SOIbNode)
|
||||
- *(ckt->CKTrhsOld+here->B4SOIsNodePrime));
|
||||
vgs = model->B4SOItype
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ authors:1999-2004 Pin Su, Hui Wan b3soidef.h
|
|||
Authors:2005- Hui Wan, Jane Xi
|
||||
Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu
|
||||
Authors: 2009- Tanvir Morshed, Ali Niknejad, Chenming Hu
|
||||
Authors: 2010- Tanvir Morshed, Ali Niknejad, Chenming Hu
|
||||
File: b4soidef.h
|
||||
**********/
|
||||
|
||||
|
|
@ -23,7 +24,6 @@ File: b4soidef.h
|
|||
#include "ngspice/complex.h"
|
||||
#include "ngspice/noisedef.h"
|
||||
|
||||
|
||||
#ifdef USE_OMP
|
||||
#define USE_OMP4SOI
|
||||
#endif
|
||||
|
|
@ -290,11 +290,13 @@ typedef struct sB4SOIinstance
|
|||
double B4SOIgIgcsd;
|
||||
double B4SOIgIgcss;
|
||||
double B4SOIgIgcsb;
|
||||
double B4SOIgIgcse;
|
||||
double B4SOIIgcd;
|
||||
double B4SOIgIgcdg;
|
||||
double B4SOIgIgcdd;
|
||||
double B4SOIgIgcds;
|
||||
double B4SOIgIgcdb;
|
||||
double B4SOIgIgcde;
|
||||
|
||||
double B4SOIIgs;
|
||||
double B4SOIgIgsg;
|
||||
|
|
@ -336,6 +338,7 @@ typedef struct sB4SOIinstance
|
|||
double B4SOIcggb;
|
||||
double B4SOIcgdb;
|
||||
double B4SOIcgsb;
|
||||
double B4SOIcgeb;
|
||||
double B4SOIcgT;
|
||||
|
||||
double B4SOIcbgb;
|
||||
|
|
@ -1233,6 +1236,7 @@ typedef struct sB4SOImodel
|
|||
double B4SOIrth0;
|
||||
double B4SOIcth0;
|
||||
double B4SOIegidl;
|
||||
double B4SOIcfrcoeff; /* v4.4 */
|
||||
double B4SOIagidl;
|
||||
double B4SOIbgidl;
|
||||
double B4SOIcgidl; /* v4.0 */
|
||||
|
|
@ -2115,7 +2119,6 @@ typedef struct sB4SOImodel
|
|||
|
||||
struct b4soiSizeDependParam *pSizeDependParamKnot;
|
||||
|
||||
|
||||
#ifdef USE_OMP4SOI
|
||||
int B4SOIInstCount;
|
||||
struct sB4SOIinstance **B4SOIInstanceArray;
|
||||
|
|
@ -2161,6 +2164,7 @@ typedef struct sB4SOImodel
|
|||
unsigned B4SOIkb1Given :1;
|
||||
unsigned B4SOIrth0Given :1;
|
||||
unsigned B4SOIcth0Given :1;
|
||||
unsigned B4SOIcfrcoeffGiven :1; /* v4.4 */
|
||||
unsigned B4SOIegidlGiven :1;
|
||||
unsigned B4SOIagidlGiven :1;
|
||||
unsigned B4SOIbgidlGiven :1;
|
||||
|
|
@ -3501,6 +3505,7 @@ typedef struct sB4SOImodel
|
|||
#define B4SOI_MOD_XGW 392
|
||||
#define B4SOI_MOD_XGL 393
|
||||
/* v3.1 added for RF end */
|
||||
#define B4SOI_MOD_CFRCOEFF 394 /* v4.4 */
|
||||
|
||||
/* Width dependence */
|
||||
#define B4SOI_MOD_WNPEAK 401
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
/*** B4SOI 04/27/2010 Released by Tanvir Morshed ***/
|
||||
/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/
|
||||
|
||||
|
||||
/**********
|
||||
* Copyright 2010 Regents of the University of California. All rights reserved.
|
||||
|
|
@ -22,8 +23,10 @@
|
|||
|
||||
|
||||
int
|
||||
B4SOIdelete(GENmodel *inModel, IFuid name, GENinstance **inInst)
|
||||
|
||||
B4SOIdelete(
|
||||
GENmodel *inModel,
|
||||
IFuid name,
|
||||
GENinstance **inInst)
|
||||
{
|
||||
B4SOIinstance **fast = (B4SOIinstance**)inInst;
|
||||
B4SOImodel *model = (B4SOImodel*)inModel;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
/*** B4SOI 04/27/2010 Released by Tanvir Morshed ***/
|
||||
/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/
|
||||
|
||||
|
||||
/**********
|
||||
* Copyright 2010 Regents of the University of California. All rights reserved.
|
||||
|
|
@ -19,8 +20,8 @@
|
|||
#include "ngspice/suffix.h"
|
||||
|
||||
void
|
||||
B4SOIdestroy(GENmodel **inModel)
|
||||
|
||||
B4SOIdestroy(
|
||||
GENmodel **inModel)
|
||||
{
|
||||
B4SOImodel **model = (B4SOImodel**)inModel;
|
||||
B4SOIinstance *here;
|
||||
|
|
@ -31,9 +32,11 @@ B4SOImodel *oldmod = NULL;
|
|||
for (; mod ; mod = mod->B4SOInextModel)
|
||||
{ if(oldmod) FREE(oldmod);
|
||||
oldmod = mod;
|
||||
prev = NULL;
|
||||
prev = (B4SOIinstance *)NULL;
|
||||
for (here = mod->B4SOIinstances; here; here = here->B4SOInextInstance)
|
||||
{ if(prev) FREE(prev);
|
||||
{
|
||||
if (here->B4SOIowner != ARCHme) continue;
|
||||
if(prev) FREE(prev);
|
||||
prev = here;
|
||||
}
|
||||
if(prev) FREE(prev);
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ Copyright 2010 Regents of the University of California. All rights reserved.
|
|||
Author: 2005 Hui Wan (based on Samuel Fung's b3soiext.h)
|
||||
Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu.
|
||||
Authors: 2009- Tanvir Morshed, Ali Niknejad, Chenming Hu.
|
||||
Authors: 2010- Tanvir Morshed, Ali Niknejad, Chenming Hu.
|
||||
File: b4soiext.h
|
||||
**********/
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
/*** B4SOI 04/27/2010 Released by Tanvir Morshed ***/
|
||||
/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/
|
||||
|
||||
|
||||
/**********
|
||||
* Copyright 2010 Regents of the University of California. All rights reserved.
|
||||
|
|
@ -22,15 +23,18 @@
|
|||
|
||||
|
||||
int
|
||||
B4SOIgetic(GENmodel *inModel, CKTcircuit *ckt)
|
||||
|
||||
B4SOIgetic(
|
||||
GENmodel *inModel,
|
||||
CKTcircuit *ckt)
|
||||
{
|
||||
B4SOImodel *model = (B4SOImodel*)inModel;
|
||||
B4SOIinstance *here;
|
||||
|
||||
for (; model ; model = model->B4SOInextModel)
|
||||
{ for (here = model->B4SOIinstances; here; here = here->B4SOInextInstance)
|
||||
{ if(!here->B4SOIicVBSGiven)
|
||||
{
|
||||
if (here->B4SOIowner != ARCHme) continue;
|
||||
if(!here->B4SOIicVBSGiven)
|
||||
{ here->B4SOIicVBS = *(ckt->CKTrhs + here->B4SOIbNode)
|
||||
- *(ckt->CKTrhs + here->B4SOIsNode);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
SPICEdev B4SOIinfo = {
|
||||
{ "B4SOI",
|
||||
"Berkeley SOI MOSFET model version 4.3.1",
|
||||
"Berkeley SOI MOSFET model version 4.4.0",
|
||||
|
||||
&B4SOInSize,
|
||||
&B4SOInSize,
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
/**********
|
||||
Copyright 2009 Regents of the University of California. All rights reserved.
|
||||
Copyright 2010 Regents of the University of California. All rights reserved.
|
||||
Author: 2005 Hui Wan (based on Samuel Fung's b3soiitf.h)
|
||||
Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu.
|
||||
Authors: 2009- Tanvir Morshed, Ali Niknejad, Chenming Hu.
|
||||
Authors: 2010- Tanvir Morshed, Ali Niknejad, Chenming Hu.
|
||||
File: b4soiitf.h
|
||||
**********/
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,4 +1,5 @@
|
|||
/** B4SOI 04/27/2010 Released by Tanvir Morshed ***/
|
||||
/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/
|
||||
|
||||
|
||||
/**********
|
||||
* Copyright 2010 Regents of the University of California. All rights reserved.
|
||||
|
|
@ -11,9 +12,11 @@
|
|||
* Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009
|
||||
* Modified by Tanvir Morshed 09/22/2009
|
||||
* Modified by Tanvir Morshed 12/31/2009
|
||||
* Modified by Tanvir Morshed 12/16/2010
|
||||
**********/
|
||||
|
||||
#include "ngspice/ngspice.h"
|
||||
|
||||
#include "ngspice/ifsim.h"
|
||||
#include "ngspice/cktdefs.h"
|
||||
#include "ngspice/devdefs.h"
|
||||
|
|
@ -29,9 +32,7 @@ int which,
|
|||
IFvalue *value)
|
||||
{
|
||||
B4SOImodel *model = (B4SOImodel *)inst;
|
||||
|
||||
NG_IGNORE(ckt);
|
||||
|
||||
switch(which)
|
||||
{ case B4SOI_MOD_MOBMOD:
|
||||
value->iValue = model->B4SOImobMod;
|
||||
|
|
@ -896,7 +897,10 @@ IFvalue *value)
|
|||
case B4SOI_MOD_DLBG:
|
||||
value->rValue = model->B4SOIdlbg;
|
||||
return(OK);
|
||||
|
||||
/* v4.4 */
|
||||
case B4SOI_MOD_CFRCOEFF:
|
||||
value->rValue = model->B4SOIcfrcoeff;
|
||||
return(OK);
|
||||
case B4SOI_MOD_EGIDL:
|
||||
value->rValue = model->B4SOIegidl;
|
||||
return(OK);
|
||||
|
|
@ -1234,10 +1238,10 @@ IFvalue *value)
|
|||
value->iValue = model->B4SOIrgateMod;
|
||||
return(OK);
|
||||
case B4SOI_MOD_XRCRG1:
|
||||
value->rValue = model->B4SOIxrcrg1; /* Changed from iValue to rvalue */
|
||||
value->rValue = model->B4SOIxrcrg1;
|
||||
return(OK);
|
||||
case B4SOI_MOD_XRCRG2:
|
||||
value->rValue = model->B4SOIxrcrg2; /* Changed from iValue to rvalue */
|
||||
value->rValue = model->B4SOIxrcrg2;
|
||||
return(OK);
|
||||
case B4SOI_MOD_RSHG:
|
||||
value->rValue = model->B4SOIrshg;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
/*** B4SOI 04/27/2010 Released by Tanvir Morshed ***/
|
||||
/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/
|
||||
|
||||
|
||||
/**********
|
||||
* Copyright 2010 Regents of the University of California. All rights reserved.
|
||||
|
|
@ -43,7 +44,9 @@ B4SOImodel **oldmod;
|
|||
delgot:
|
||||
*oldmod = (*model)->B4SOInextModel; /* cut deleted device out of list */
|
||||
for (here = (*model)->B4SOIinstances; here; here = here->B4SOInextInstance)
|
||||
{ if(prev) FREE(prev);
|
||||
{
|
||||
if (here->B4SOIowner != ARCHme) continue;
|
||||
if(prev) FREE(prev);
|
||||
prev = here;
|
||||
}
|
||||
if(prev) FREE(prev);
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
/*** B4SOI 04/27/2010 Released by Tanvir Morshed ***/
|
||||
/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/
|
||||
|
||||
|
||||
/**********
|
||||
* Copyright 2010 Regents of the University of California. All rights reserved.
|
||||
|
|
@ -6,11 +7,13 @@
|
|||
* Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soimpar.c
|
||||
* Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2010- Tanvir Morshed, Ali Niknejad, Chenming Hu.
|
||||
* File: b4soimpar.c
|
||||
* Modified by Hui Wan, Xuemei Xi 11/30/2005
|
||||
* Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009
|
||||
* Modified by Tanvir Morshed 09/22/2009
|
||||
* Modified by Tanvir Morshed 12/31/2009
|
||||
* Modified by Tanvir Morshed 12/16/2010
|
||||
**********/
|
||||
|
||||
#include "ngspice/ngspice.h"
|
||||
|
|
@ -30,7 +33,6 @@ GENmodel *inMod)
|
|||
B4SOImodel *mod = (B4SOImodel*)inMod;
|
||||
switch(param)
|
||||
{
|
||||
|
||||
case B4SOI_MOD_MOBMOD :
|
||||
mod->B4SOImobMod = value->iValue;
|
||||
mod->B4SOImobModGiven = TRUE;
|
||||
|
|
@ -606,6 +608,10 @@ case B4SOI_MOD_UD:
|
|||
mod->B4SOIcth0 = value->rValue;
|
||||
mod->B4SOIcth0Given = TRUE;
|
||||
break;
|
||||
case B4SOI_MOD_CFRCOEFF : /* v4.4 */
|
||||
mod->B4SOIcfrcoeff = value->rValue;
|
||||
mod->B4SOIcfrcoeffGiven = TRUE;
|
||||
break;
|
||||
case B4SOI_MOD_EGIDL :
|
||||
mod->B4SOIegidl = value->rValue;
|
||||
mod->B4SOIegidlGiven = TRUE;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
/** B4SOI 04/27/2010 Released by Tanvir Morshed ***/
|
||||
/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/
|
||||
|
||||
|
||||
/**********
|
||||
* Copyright 2010 Regents of the University of California. All rights reserved.
|
||||
|
|
@ -45,14 +46,12 @@
|
|||
Flicker noise = Unified model
|
||||
*/
|
||||
|
||||
|
||||
static double
|
||||
B4SOIEval1ovFNoise(
|
||||
double vds,
|
||||
B4SOImodel *model,
|
||||
B4SOIinstance *here,
|
||||
double freq,
|
||||
double temp)
|
||||
double freq, double temp)
|
||||
{
|
||||
struct b4soiSizeDependParam *pParam;
|
||||
double cd, esat, DelClm, EffFreq, N0, Nl;
|
||||
|
|
@ -104,8 +103,6 @@ CKTcircuit *ckt,
|
|||
Ndata *data,
|
||||
double *OnDens)
|
||||
{
|
||||
NOISEAN *job = (NOISEAN *) ckt->CKTcurJob;
|
||||
|
||||
register B4SOImodel *model = (B4SOImodel *)inModel;
|
||||
register B4SOIinstance *here;
|
||||
struct b4soiSizeDependParam *pParam;
|
||||
|
|
@ -127,6 +124,8 @@ double tempRatioSH, Vdseffovcd; /* v4.2 bugfix */
|
|||
|
||||
int i;
|
||||
|
||||
double m;
|
||||
|
||||
/* define the names of the noise sources */
|
||||
static char *B4SOInNames[B4SOINSRCS] =
|
||||
{ /* Note that we have to keep the order */
|
||||
|
|
@ -152,13 +151,18 @@ int i;
|
|||
for (; model != NULL; model = model->B4SOInextModel)
|
||||
{ for (here = model->B4SOIinstances; here != NULL;
|
||||
here = here->B4SOInextInstance)
|
||||
{ pParam = here->pParam;
|
||||
{
|
||||
if (here->B4SOIowner != ARCHme) continue;
|
||||
|
||||
m = here->B4SOIm;
|
||||
|
||||
pParam = here->pParam;
|
||||
switch (operation)
|
||||
{ case N_OPEN:
|
||||
/* see if we have to to produce a summary report */
|
||||
/* if so, name all the noise generators */
|
||||
|
||||
if (job->NStpsSm != 0)
|
||||
if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0)
|
||||
{ switch (mode)
|
||||
{ case N_DENS:
|
||||
for (i = 0; i < B4SOINSRCS; i++)
|
||||
|
|
@ -168,9 +172,9 @@ int i;
|
|||
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1);
|
||||
if (!data->namelist)
|
||||
return(E_NOMEM);
|
||||
SPfrontEnd->IFnewUid (ckt,
|
||||
(*(SPfrontEnd->IFnewUid)) (ckt,
|
||||
&(data->namelist[data->numPlots++]),
|
||||
NULL, name, UID_OTHER,
|
||||
(IFuid) NULL, name, UID_OTHER,
|
||||
NULL);
|
||||
/* we've added one more plot */
|
||||
}
|
||||
|
|
@ -183,9 +187,9 @@ int i;
|
|||
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1);
|
||||
if (!data->namelist)
|
||||
return(E_NOMEM);
|
||||
SPfrontEnd->IFnewUid (ckt,
|
||||
(*(SPfrontEnd->IFnewUid)) (ckt,
|
||||
&(data->namelist[data->numPlots++]),
|
||||
NULL, name, UID_OTHER,
|
||||
(IFuid) NULL, name, UID_OTHER,
|
||||
NULL);
|
||||
/* we've added one more plot */
|
||||
|
||||
|
|
@ -195,9 +199,9 @@ int i;
|
|||
data->namelist = TREALLOC(IFuid, data->namelist, data->numPlots + 1);
|
||||
if (!data->namelist)
|
||||
return(E_NOMEM);
|
||||
SPfrontEnd->IFnewUid (ckt,
|
||||
(*(SPfrontEnd->IFnewUid)) (ckt,
|
||||
&(data->namelist[data->numPlots++]),
|
||||
NULL, name, UID_OTHER,
|
||||
(IFuid) NULL, name, UID_OTHER,
|
||||
NULL);
|
||||
/* we've added one more plot */
|
||||
}
|
||||
|
|
@ -274,12 +278,12 @@ int i;
|
|||
NevalSrc(&noizDens[B4SOIRDNOIZ],
|
||||
&lnNdens[B4SOIRDNOIZ], ckt, THERMNOISE,
|
||||
here->B4SOIdNodePrime, here->B4SOIdNode,
|
||||
gdpr * tempRatioSH * here->B4SOIm); /* v4.2 self-heating temp */
|
||||
gdpr * tempRatioSH * m); /* v4.2 self-heating temp */
|
||||
|
||||
NevalSrc(&noizDens[B4SOIRSNOIZ],
|
||||
&lnNdens[B4SOIRSNOIZ], ckt, THERMNOISE,
|
||||
here->B4SOIsNodePrime, here->B4SOIsNode,
|
||||
gspr * tempRatioSH * here->B4SOIm); /* v4.2 self-heating temp */
|
||||
gspr * tempRatioSH * m); /* v4.2 self-heating temp */
|
||||
|
||||
/* v4.2 bugfix: implement correct thermal noise model (bsim4.6.0)*/
|
||||
/* if ((here->B4SOIrgateMod == 1) ||
|
||||
|
|
@ -289,7 +293,7 @@ int i;
|
|||
&lnNdens[B4SOIRGNOIZ], ckt, THERMNOISE,
|
||||
here->B4SOIgNode,
|
||||
here->B4SOIgNodeExt,
|
||||
here->B4SOIgrgeltd * tempRatioSH * here->B4SOIm); /* v4.2 self-heating temp */
|
||||
here->B4SOIgrgeltd * tempRatioSH * m); /* v4.2 self-heating temp */
|
||||
}
|
||||
else if (here->B4SOIrgateMod == 2) /*v4.2*/
|
||||
{
|
||||
|
|
@ -299,14 +303,14 @@ int i;
|
|||
&lnNdens[B4SOIRGNOIZ], ckt, THERMNOISE,
|
||||
here->B4SOIgNode,
|
||||
here->B4SOIgNodeExt,
|
||||
here->B4SOIgrgeltd/T1 * tempRatioSH * here->B4SOIm); /*v4.2*/
|
||||
here->B4SOIgrgeltd/T1 * tempRatioSH * m); /*v4.2*/
|
||||
}
|
||||
else if (here->B4SOIrgateMod == 3)
|
||||
{ NevalSrc(&noizDens[B4SOIRGNOIZ],
|
||||
&lnNdens[B4SOIRGNOIZ], ckt, THERMNOISE,
|
||||
here->B4SOIgNodeMid,
|
||||
here->B4SOIgNodeExt,
|
||||
here->B4SOIgrgeltd * tempRatioSH * here->B4SOIm); /* v4.2 self-heating temp */
|
||||
here->B4SOIgrgeltd * tempRatioSH * m); /* v4.2 self-heating temp */
|
||||
}
|
||||
else
|
||||
{ noizDens[B4SOIRGNOIZ] = 0.0;
|
||||
|
|
@ -320,11 +324,11 @@ int i;
|
|||
NevalSrc(&noizDens[B4SOIRBSBNOIZ],
|
||||
&lnNdens[B4SOIRBSBNOIZ], ckt, THERMNOISE,
|
||||
here->B4SOIbNode, here->B4SOIsbNode,
|
||||
here->B4SOIgrbsb * here->B4SOIm);
|
||||
here->B4SOIgrbsb * m);
|
||||
NevalSrc(&noizDens[B4SOIRBDBNOIZ],
|
||||
&lnNdens[B4SOIRBDBNOIZ], ckt, THERMNOISE,
|
||||
here->B4SOIbNode, here->B4SOIdbNode,
|
||||
here->B4SOIgrbdb * tempRatioSH * here->B4SOIm); /* v4.2 self-heating temp */
|
||||
here->B4SOIgrbdb * tempRatioSH * m); /* v4.2 self-heating temp */
|
||||
}
|
||||
else
|
||||
{ noizDens[B4SOIRBSBNOIZ] = 0.0;
|
||||
|
|
@ -341,7 +345,7 @@ int i;
|
|||
&lnNdens[B4SOIRBODYNOIZ], ckt, THERMNOISE,
|
||||
here->B4SOIbNode, here->B4SOIpNode,
|
||||
tempRatioSH / (here->B4SOIrbodyext + /* v4.2 self-heating temp */
|
||||
pParam->B4SOIrbody) * here->B4SOIm);
|
||||
pParam->B4SOIrbody) * m);
|
||||
}
|
||||
else
|
||||
{ noizDens[B4SOIRBODYNOIZ] = 0.0;
|
||||
|
|
@ -365,7 +369,7 @@ int i;
|
|||
(here->B4SOIqinv)
|
||||
* here->B4SOIrds)))
|
||||
* tempRatioSH /* v4.2 self-heating temp */
|
||||
* model->B4SOIntnoi * here->B4SOIm);
|
||||
* model->B4SOIntnoi * m );
|
||||
break;
|
||||
|
||||
/* v2.2.3 bug fix */
|
||||
|
|
@ -397,7 +401,7 @@ int i;
|
|||
here->B4SOIdNodePrime,
|
||||
here->B4SOIsNodePrime,
|
||||
/* (T2 - igsquare)); */
|
||||
(T2 - igsquare) * tempRatioSH * here->B4SOIm); /* v4.2 self-heating temp */
|
||||
(T2 - igsquare) * tempRatioSH * m); /* v4.2 self-heating temp */
|
||||
break;
|
||||
|
||||
case 2:
|
||||
|
|
@ -410,11 +414,11 @@ int i;
|
|||
tempRatioSH * /* v4.2 self-heating temp */
|
||||
(2.0 / 3.0 * fabs(here->B4SOIgm
|
||||
+ here->B4SOIgds
|
||||
+ here->B4SOIgmbs)) * here->B4SOIm);
|
||||
+ here->B4SOIgmbs)) * m);
|
||||
break;
|
||||
}
|
||||
|
||||
NevalSrc(&noizDens[B4SOIFLNOIZ], NULL,
|
||||
NevalSrc(&noizDens[B4SOIFLNOIZ], (double*) NULL,
|
||||
ckt, N_GAIN, here->B4SOIdNodePrime,
|
||||
here->B4SOIsNodePrime, (double) 0.0);
|
||||
|
||||
|
|
@ -487,17 +491,17 @@ int i;
|
|||
NevalSrc(&noizDens[B4SOIIGSNOIZ],
|
||||
&lnNdens[B4SOIIGSNOIZ], ckt, SHOTNOISE,
|
||||
here->B4SOIgNode, here->B4SOIsNodePrime,
|
||||
(here->B4SOIIgs + here->B4SOIIgcs) * here->B4SOIm);
|
||||
(here->B4SOIIgs + here->B4SOIIgcs) * m);
|
||||
|
||||
NevalSrc(&noizDens[B4SOIIGDNOIZ],
|
||||
&lnNdens[B4SOIIGDNOIZ], ckt, SHOTNOISE,
|
||||
here->B4SOIgNode, here->B4SOIdNodePrime,
|
||||
(here->B4SOIIgd + here->B4SOIIgcd) * here->B4SOIm);
|
||||
(here->B4SOIIgd + here->B4SOIIgcd) * m);
|
||||
|
||||
NevalSrc(&noizDens[B4SOIIGBNOIZ],
|
||||
&lnNdens[B4SOIIGBNOIZ], ckt, SHOTNOISE,
|
||||
here->B4SOIgNode, here->B4SOIbNode,
|
||||
here->B4SOIig * here->B4SOIm);
|
||||
here->B4SOIig * m);
|
||||
/* v3.2 for gate tunneling shot noise end */
|
||||
|
||||
/* Low frequency excess noise due to FBE */
|
||||
|
|
@ -509,7 +513,7 @@ int i;
|
|||
NevalSrc(&noizDens[B4SOIFB_IBSNOIZ],
|
||||
&lnNdens[B4SOIFB_IBSNOIZ], ckt, SHOTNOISE,
|
||||
here->B4SOIsNodePrime, here->B4SOIbNode,
|
||||
model->B4SOInoif * here->B4SOIibs * here->B4SOIm);
|
||||
model->B4SOInoif * here->B4SOIibs * m);
|
||||
|
||||
/* NevalSrc(&noizDens[B4SOIFB_IBDNOIZ],
|
||||
&lnNdens[B4SOIFB_IBDNOIZ], ckt, SHOTNOISE,
|
||||
|
|
@ -519,8 +523,7 @@ int i;
|
|||
NevalSrc(&noizDens[B4SOIFB_IBDNOIZ],
|
||||
&lnNdens[B4SOIFB_IBDNOIZ], ckt, SHOTNOISE,
|
||||
here->B4SOIdNodePrime, here->B4SOIbNode,
|
||||
|
||||
model->B4SOInoif * (here->B4SOIibd) * here->B4SOIm); /*v4.2 extra fabs()removed */
|
||||
model->B4SOInoif * (here->B4SOIibd) * m); /*v4.2 extra fabs()removed */
|
||||
|
||||
noizDens[B4SOITOTNOIZ] = noizDens[B4SOIRDNOIZ]
|
||||
+ noizDens[B4SOIRSNOIZ]
|
||||
|
|
@ -556,7 +559,7 @@ int i;
|
|||
if it's the first pass
|
||||
*/
|
||||
if (data->freq ==
|
||||
job->NstartFreq)
|
||||
((NOISEAN*) ckt->CKTcurJob)->NstartFreq)
|
||||
{ for (i = 0; i < B4SOINSRCS; i++)
|
||||
{ here->B4SOInVar[OUTNOIZ][i] = 0.0;
|
||||
here->B4SOInVar[INNOIZ][i] = 0.0;
|
||||
|
|
@ -582,7 +585,8 @@ int i;
|
|||
lnNdens[i];
|
||||
data->outNoiz += tempOnoise;
|
||||
data->inNoise += tempInoise;
|
||||
if (job->NStpsSm != 0)
|
||||
if (((NOISEAN*)
|
||||
ckt->CKTcurJob)->NStpsSm != 0)
|
||||
{ here->B4SOInVar[OUTNOIZ][i]
|
||||
+= tempOnoise;
|
||||
here->B4SOInVar[OUTNOIZ][B4SOITOTNOIZ]
|
||||
|
|
@ -605,7 +609,7 @@ int i;
|
|||
break;
|
||||
case INT_NOIZ:
|
||||
/* already calculated, just output */
|
||||
if (job->NStpsSm != 0)
|
||||
if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0)
|
||||
{ for (i = 0; i < B4SOINSRCS; i++)
|
||||
{ data->outpVector[data->outNumber++]
|
||||
= here->B4SOInVar[OUTNOIZ][i];
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
/*** B4SOI 04/27/2010 Released by Tanvir Morshed ***/
|
||||
/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/
|
||||
|
||||
|
||||
/**********
|
||||
* Copyright 2010 Regents of the University of California. All rights reserved.
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
/*** B4SOI 04/27/2010 Released by Tanvir Morshed ***/
|
||||
/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/
|
||||
|
||||
|
||||
/**********
|
||||
* Copyright 2010 Regents of the University of California. All rights reserved.
|
||||
|
|
@ -14,6 +15,7 @@
|
|||
**********/
|
||||
|
||||
#include "ngspice/ngspice.h"
|
||||
|
||||
#include "ngspice/cktdefs.h"
|
||||
#include "ngspice/complex.h"
|
||||
#include "ngspice/sperror.h"
|
||||
|
|
@ -23,8 +25,8 @@
|
|||
int
|
||||
B4SOIpzLoad(
|
||||
GENmodel *inModel,
|
||||
register CKTcircuit *ckt,
|
||||
register SPcomplex *s)
|
||||
CKTcircuit *ckt,
|
||||
SPcomplex *s)
|
||||
{
|
||||
register B4SOImodel *model = (B4SOImodel*)inModel;
|
||||
register B4SOIinstance *here;
|
||||
|
|
@ -42,6 +44,7 @@ double m;
|
|||
{ for (here = model->B4SOIinstances; here!= NULL;
|
||||
here = here->B4SOInextInstance)
|
||||
{
|
||||
if (here->B4SOIowner != ARCHme) continue;
|
||||
if (here->B4SOImode >= 0)
|
||||
{ Gm = here->B4SOIgm;
|
||||
Gmbs = here->B4SOIgmbs;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
/*** B4SOI 04/27/2010 Released by Tanvir Morshed ***/
|
||||
/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/
|
||||
|
||||
|
||||
/**********
|
||||
* Copyright 2010 Regents of the University of California. All rights reserved.
|
||||
|
|
@ -6,12 +7,14 @@
|
|||
* Authors: 1999-2004 Pin Su, Hui Wan, Wei Jin, b3soiset.c
|
||||
* Authors: 2005- Hui Wan, Xuemei Xi, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2009- Wenwei Yang, Chung-Hsun Lin, Ali Niknejad, Chenming Hu.
|
||||
* Authors: 2009- Tanvir Morshed, Ali Niknejad, Chenming Hu.
|
||||
* File: b4soiset.c
|
||||
* Modified by Hui Wan, Xuemei Xi 11/30/2005
|
||||
* Modified by Wenwei Yang, Chung-Hsun Lin, Darsen Lu 03/06/2009
|
||||
* Modified by Tanvir Morshed 09/22/2009
|
||||
* Modified by Tanvir Morshed 12/31/2009
|
||||
* Modified by Tanvir Morshed 04/27/2010
|
||||
* Modified by Tanvir Morshed 12/16/2010
|
||||
**********/
|
||||
|
||||
#include "ngspice/ngspice.h"
|
||||
|
|
@ -36,6 +39,7 @@ int nthreads;
|
|||
#define EPS0 8.85418e-12
|
||||
|
||||
double epsrox, toxe, epssub;
|
||||
double NchMax; /* v4.4 */
|
||||
|
||||
int
|
||||
B4SOIsetup(
|
||||
|
|
@ -48,6 +52,7 @@ register B4SOImodel *model = (B4SOImodel*)inModel;
|
|||
register B4SOIinstance *here;
|
||||
int error;
|
||||
CKTnode *tmp;
|
||||
|
||||
double Cboxt;
|
||||
|
||||
/* v3.2 */
|
||||
|
|
@ -122,7 +127,7 @@ int nthreads;
|
|||
if (!model->B4SOIshModGiven)
|
||||
model->B4SOIshMod = 0;
|
||||
if (!model->B4SOIversionGiven)
|
||||
model->B4SOIversion = 4.31;
|
||||
model->B4SOIversion = 4.4;
|
||||
if (!model->B4SOItoxGiven)
|
||||
model->B4SOItox = 100.0e-10;
|
||||
/*model->B4SOIcox = 3.453133e-11 / model->B4SOItox;*/
|
||||
|
|
@ -131,7 +136,7 @@ int nthreads;
|
|||
epsrox = 3.9;
|
||||
toxe = model->B4SOIeot;
|
||||
epssub = EPS0 * model->B4SOIepsrsub;
|
||||
//model->B4SOIcox = 3.453133e-11 / model->B4SOItox;
|
||||
/*model->B4SOIcox = 3.453133e-11 / model->B4SOItox;*/
|
||||
model->B4SOIcox = epsrox * EPS0 / toxe;
|
||||
}
|
||||
else
|
||||
|
|
@ -139,7 +144,7 @@ int nthreads;
|
|||
epsrox = model->B4SOIepsrox;
|
||||
toxe = model->B4SOItox;
|
||||
epssub = EPSSI;
|
||||
//model->B4SOIcox = epsrox * EPS0 / toxe;
|
||||
/*model->B4SOIcox = epsrox * EPS0 / toxe;*/
|
||||
model->B4SOIcox = 3.453133e-11 / model->B4SOItox;
|
||||
}
|
||||
|
||||
|
|
@ -433,6 +438,8 @@ int nthreads;
|
|||
/* v3.0 bug fix */
|
||||
if (!model->B4SOIcth0Given)
|
||||
model->B4SOIcth0 = 1e-5;
|
||||
if (!model->B4SOIcfrcoeffGiven) /* v4.4 */
|
||||
model->B4SOIcfrcoeff = 1.0;
|
||||
|
||||
if (!model->B4SOIagidlGiven)
|
||||
model->B4SOIagidl = 0.0;
|
||||
|
|
@ -2168,6 +2175,27 @@ int nthreads;
|
|||
{ here->B4SOIsNodePrime = here->B4SOIsNode;
|
||||
}
|
||||
|
||||
/* v4.4 -- Check of TsiMax for SOIMOD = 2 */
|
||||
if (model->B4SOIsoiMod == 2){
|
||||
if (model->B4SOImtrlMod){
|
||||
NchMax = (model->B4SOIbg0sub - 0.1) / Charge_q * 2.0e-6 * epssub / (model->B4SOIetsi * model->B4SOIetsi);
|
||||
if (model->B4SOInpeak > NchMax ){
|
||||
printf("Warning: SOIMOD=2 can not support given Nch=%g cm^-3 and Etsi=%g m. \n ", model->B4SOInpeak, model->B4SOIetsi);
|
||||
printf("Exceeds maximum allowed band bending of (Eg-0.1)eV. \n");
|
||||
printf("Nch is set to %g cm^-3. \n",NchMax);
|
||||
model->B4SOInpeak = NchMax;
|
||||
}
|
||||
} else {
|
||||
NchMax = (1.12 - 0.1) / Charge_q * 2.0e-6 * epssub / (model->B4SOItsi * model->B4SOItsi);
|
||||
if (model->B4SOInpeak > NchMax ) {
|
||||
printf("Warning: SOIMOD=2 can not support given Nch=%g cm^-3 and Tsi=%g m. \n", model->B4SOInpeak, model->B4SOItsi);
|
||||
printf("Exceeds maximum allowed band bending of (Eg-0.1)eV. \n");
|
||||
printf("Nch is set to %g cm^-3. \n",NchMax);
|
||||
model->B4SOInpeak = NchMax;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* process effective silicon film thickness */
|
||||
model->B4SOIcbox = 3.453133e-11 / model->B4SOItbox;
|
||||
if(model->B4SOImtrlMod)
|
||||
|
|
@ -2493,7 +2521,7 @@ int nthreads;
|
|||
|
||||
/* 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)) == NULL){\
|
||||
if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
|
||||
return(E_NOMEM);\
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
/*** B4SOI 05/14/2010 Released by Tanvir Morshed ***/
|
||||
/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/
|
||||
|
||||
|
||||
/**********
|
||||
* Copyright 2010 Regents of the University of California. All rights reserved.
|
||||
|
|
@ -12,6 +13,7 @@
|
|||
* Modified by Tanvir Morshed 09/22/2009
|
||||
* Modified by Tanvir Morshed 12/31/2009
|
||||
* Modified by Tanvir Morshed 05/14/2010
|
||||
* Modified by Tanvir Morshed 12/16/2010
|
||||
**********/
|
||||
|
||||
/* Lmin, Lmax, Wmin, Wmax */
|
||||
|
|
@ -46,7 +48,6 @@
|
|||
B = exp(A); \
|
||||
} \
|
||||
}
|
||||
|
||||
int
|
||||
B4SOItemp(
|
||||
GENmodel *inModel,
|
||||
|
|
@ -121,7 +122,6 @@ B4SOItemp(
|
|||
eggdep = 1.12;
|
||||
}
|
||||
|
||||
|
||||
/*model->B4SOIcox = epsrox * EPS0 / toxe;*/
|
||||
|
||||
model->B4SOIvcrit = CONSTvt0 * log(CONSTvt0 / (CONSTroot2 * 1.0e-14));
|
||||
|
|
@ -163,6 +163,7 @@ B4SOItemp(
|
|||
for (here = model->B4SOIinstances; here != NULL;
|
||||
here = here->B4SOInextInstance)
|
||||
{
|
||||
if (here->B4SOIowner != ARCHme) continue;
|
||||
here->B4SOIrbodyext = here->B4SOIbodySquares *
|
||||
model->B4SOIrbsh;
|
||||
pSizeDependParamKnot = model->pSizeDependParamKnot;
|
||||
|
|
@ -185,7 +186,8 @@ B4SOItemp(
|
|||
}
|
||||
|
||||
if (Size_Not_Found)
|
||||
{ pParam = TMALLOC(struct b4soiSizeDependParam, 1);
|
||||
{ pParam = (struct b4soiSizeDependParam *)malloc(
|
||||
sizeof(struct b4soiSizeDependParam));
|
||||
if (pLastKnot == NULL)
|
||||
model->pSizeDependParamKnot = pParam;
|
||||
else
|
||||
|
|
@ -233,7 +235,7 @@ B4SOItemp(
|
|||
{ IFuid namarray[2];
|
||||
namarray[0] = model->B4SOImodName;
|
||||
namarray[1] = here->B4SOIname;
|
||||
SPfrontEnd->IFerror (ERR_FATAL,
|
||||
(*(SPfrontEnd->IFerror))(ERR_FATAL,
|
||||
"B4SOI: mosfet %s, model %s: Effective channel length <= 0",
|
||||
namarray);
|
||||
return(E_BADPARM);
|
||||
|
|
@ -246,7 +248,7 @@ B4SOItemp(
|
|||
{ IFuid namarray[2];
|
||||
namarray[0] = model->B4SOImodName;
|
||||
namarray[1] = here->B4SOIname;
|
||||
SPfrontEnd->IFerror (ERR_FATAL,
|
||||
(*(SPfrontEnd->IFerror))(ERR_FATAL,
|
||||
"B4SOI: mosfet %s, model %s: Effective channel width <= 0",
|
||||
namarray);
|
||||
return(E_BADPARM);
|
||||
|
|
@ -262,7 +264,7 @@ B4SOItemp(
|
|||
{ IFuid namarray[2];
|
||||
namarray[0] = model->B4SOImodName;
|
||||
namarray[1] = here->B4SOIname;
|
||||
SPfrontEnd->IFerror (ERR_FATAL,
|
||||
(*(SPfrontEnd->IFerror))(ERR_FATAL,
|
||||
"B4SOI: mosfet %s, model %s: Effective channel length for C-V <= 0",
|
||||
namarray);
|
||||
return(E_BADPARM);
|
||||
|
|
@ -275,7 +277,7 @@ B4SOItemp(
|
|||
{ IFuid namarray[2];
|
||||
namarray[0] = model->B4SOImodName;
|
||||
namarray[1] = here->B4SOIname;
|
||||
SPfrontEnd->IFerror (ERR_FATAL,
|
||||
(*(SPfrontEnd->IFerror))(ERR_FATAL,
|
||||
"B4SOI: mosfet %s, model %s: Effective channel width for C-V <= 0",
|
||||
namarray);
|
||||
return(E_BADPARM);
|
||||
|
|
@ -293,7 +295,7 @@ B4SOItemp(
|
|||
IFuid namarray[2];
|
||||
namarray[0] = model->B4SOImodName;
|
||||
namarray[1] = here->B4SOIname;
|
||||
SPfrontEnd->IFerror (ERR_FATAL,
|
||||
(*(SPfrontEnd->IFerror))(ERR_FATAL,
|
||||
"B4SOI: mosfet %s, model %s: Effective channel length for C-V (body) <= 0",
|
||||
namarray);
|
||||
return(E_BADPARM);
|
||||
|
|
@ -305,7 +307,7 @@ B4SOItemp(
|
|||
IFuid namarray[2];
|
||||
namarray[0] = model->B4SOImodName;
|
||||
namarray[1] = here->B4SOIname;
|
||||
SPfrontEnd->IFerror (ERR_FATAL,
|
||||
(*(SPfrontEnd->IFerror))(ERR_FATAL,
|
||||
"B4SOI: mosfet %s, model %s: Effective channel length for C-V (backgate) <= 0",
|
||||
namarray);
|
||||
return(E_BADPARM);
|
||||
|
|
@ -1190,7 +1192,7 @@ B4SOItemp(
|
|||
{ IFuid namarray[2];
|
||||
namarray[0] = model->B4SOImodName;
|
||||
namarray[1] = here->B4SOIname;
|
||||
SPfrontEnd->IFerror (ERR_FATAL, "Fatal error(s) detected during B4SOIV3 parameter checking for %s in model %s", namarray);
|
||||
(*(SPfrontEnd->IFerror)) (ERR_FATAL, "Fatal error(s) detected during B4SOIV3 parameter checking for %s in model %s", namarray);
|
||||
return(E_BADPARM);
|
||||
}
|
||||
|
||||
|
|
@ -1641,8 +1643,8 @@ B4SOItemp(
|
|||
}
|
||||
|
||||
/* v2.2.2 bug fix */
|
||||
T0 = model->B4SOIcsdesw * log(1 + model->B4SOItsi /
|
||||
model->B4SOItbox);
|
||||
T0 = model->B4SOIcsdesw * log(model->B4SOIcfrcoeff * (1 + model->B4SOItsi /
|
||||
model->B4SOItbox)); /* v4.4 */
|
||||
T1 = here->B4SOIsourcePerimeter - here->B4SOIw;
|
||||
if (T1 > 0.0)
|
||||
here->B4SOIcsesw = T0 * T1;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
/*** B4SOI 04/27/2010 Released by Tanvir Morshed ***/
|
||||
/*** B4SOI 12/16/2010 Released by Tanvir Morshed ***/
|
||||
|
||||
|
||||
/**********
|
||||
* Copyright 2010 Regents of the University of California. All rights reserved.
|
||||
|
|
@ -23,7 +24,7 @@
|
|||
int
|
||||
B4SOItrunc(
|
||||
GENmodel *inModel,
|
||||
register CKTcircuit *ckt,
|
||||
CKTcircuit *ckt,
|
||||
double *timeStep)
|
||||
{
|
||||
register B4SOImodel *model = (B4SOImodel*)inModel;
|
||||
|
|
@ -37,6 +38,7 @@ register B4SOIinstance *here;
|
|||
{ for (here = model->B4SOIinstances; here != NULL;
|
||||
here = here->B4SOInextInstance)
|
||||
{
|
||||
if (here->B4SOIowner != ARCHme) continue;
|
||||
#ifdef STEPDEBUG
|
||||
debugtemp = *timeStep;
|
||||
#endif /* STEPDEBUG */
|
||||
|
|
|
|||
Loading…
Reference in New Issue