update `bsim3soi' aka `b4soi'

This commit is contained in:
dwarning 2012-05-20 00:26:39 +02:00
parent 5bb4c56165
commit 1c4f960b45
24 changed files with 6585 additions and 5496 deletions

View File

@ -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.

View File

@ -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"),

View File

@ -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)

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -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
**********/

View File

@ -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);
}

View File

@ -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,

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -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];

View File

@ -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.

View File

@ -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;

View File

@ -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);\
}

View File

@ -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;

View File

@ -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 */