Added noise analysis to bsim1, and parallel multiplier. (Do not rely on distortion analysis).
This commit is contained in:
parent
951fb233d8
commit
d7ecff455d
|
|
@ -19,6 +19,7 @@ libbsim1_a_SOURCES = \
|
|||
b1moscap.c \
|
||||
b1mpar.c \
|
||||
b1par.c \
|
||||
b1noi.c \
|
||||
b1pzld.c \
|
||||
b1set.c \
|
||||
b1temp.c \
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@ Author: 1985 Hong J. Park, Thomas L. Quarles
|
|||
**********/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include <stdio.h>
|
||||
#include "devdefs.h"
|
||||
#include "bsim1def.h"
|
||||
#include "suffix.h"
|
||||
|
|
@ -12,6 +11,7 @@ Author: 1985 Hong J. Park, Thomas L. Quarles
|
|||
IFparm B1pTable[] = { /* parameters */
|
||||
IOP( "l", BSIM1_L, IF_REAL , "Length"),
|
||||
IOP( "w", BSIM1_W, IF_REAL , "Width"),
|
||||
IOP( "m", BSIM1_M, IF_REAL , "Parallel Multiplier"),
|
||||
IOP( "ad", BSIM1_AD, IF_REAL , "Drain area"),
|
||||
IOP( "as", BSIM1_AS, IF_REAL , "Source area"),
|
||||
IOP( "pd", BSIM1_PD, IF_REAL , "Drain perimeter"),
|
||||
|
|
@ -124,6 +124,8 @@ IFparm B1mPTable[] = { /* model parameters */
|
|||
"Default width of source drain diffusion in um"),
|
||||
IOP( "dell", BSIM1_MOD_DELLENGTH, IF_REAL,
|
||||
"Length reduction of source drain diffusion"),
|
||||
IOP("kf", BSIM1_MOD_KF, IF_REAL ,"Flicker noise coefficient"),
|
||||
IOP("af", BSIM1_MOD_AF, IF_REAL ,"Flicker noise exponent"),
|
||||
IP( "nmos", BSIM1_MOD_NMOS, IF_FLAG, "Flag to indicate NMOS"),
|
||||
IP( "pmos", BSIM1_MOD_PMOS, IF_FLAG, "Flag to indicate PMOS"),
|
||||
};
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@ Author: 1985 Hong J. Park, Thomas L. Quarles
|
|||
*/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include <stdio.h>
|
||||
#include "cktdefs.h"
|
||||
#include "bsim1def.h"
|
||||
#include "sperror.h"
|
||||
|
|
@ -14,9 +13,7 @@ Author: 1985 Hong J. Park, Thomas L. Quarles
|
|||
|
||||
|
||||
int
|
||||
B1acLoad(inModel,ckt)
|
||||
GENmodel *inModel;
|
||||
CKTcircuit *ckt;
|
||||
B1acLoad(GENmodel *inModel, CKTcircuit *ckt)
|
||||
{
|
||||
B1model *model = (B1model*)inModel;
|
||||
B1instance *here;
|
||||
|
|
@ -53,6 +50,7 @@ B1acLoad(inModel,ckt)
|
|||
double cdgb;
|
||||
double cdsb;
|
||||
double omega; /* angular fequency of the signal */
|
||||
double m; /* parallel multiplier */
|
||||
|
||||
omega = ckt->CKTomega;
|
||||
for( ; model != NULL; model = model->B1nextModel) {
|
||||
|
|
@ -106,40 +104,41 @@ B1acLoad(inModel,ckt)
|
|||
xcbdb = (cbdb - capbd ) * omega;
|
||||
xcbsb = (cbsb - capbs ) * omega;
|
||||
|
||||
m = here->B1m;
|
||||
|
||||
*(here->B1GgPtr +1) += xcggb;
|
||||
*(here->B1BbPtr +1) += -xcbgb-xcbdb-xcbsb;
|
||||
*(here->B1DPdpPtr +1) += xcddb;
|
||||
*(here->B1SPspPtr +1) += xcssb;
|
||||
*(here->B1GbPtr +1) += -xcggb-xcgdb-xcgsb;
|
||||
*(here->B1GdpPtr +1) += xcgdb;
|
||||
*(here->B1GspPtr +1) += xcgsb;
|
||||
*(here->B1BgPtr +1) += xcbgb;
|
||||
*(here->B1BdpPtr +1) += xcbdb;
|
||||
*(here->B1BspPtr +1) += xcbsb;
|
||||
*(here->B1DPgPtr +1) += xcdgb;
|
||||
*(here->B1DPbPtr +1) += -xcdgb-xcddb-xcdsb;
|
||||
*(here->B1DPspPtr +1) += xcdsb;
|
||||
*(here->B1SPgPtr +1) += xcsgb;
|
||||
*(here->B1SPbPtr +1) += -xcsgb-xcsdb-xcssb;
|
||||
*(here->B1SPdpPtr +1) += xcsdb;
|
||||
*(here->B1DdPtr) += gdpr;
|
||||
*(here->B1SsPtr) += gspr;
|
||||
*(here->B1BbPtr) += gbd+gbs;
|
||||
*(here->B1DPdpPtr) += gdpr+gds+gbd+xrev*(gm+gmbs);
|
||||
*(here->B1SPspPtr) += gspr+gds+gbs+xnrm*(gm+gmbs);
|
||||
*(here->B1DdpPtr) -= gdpr;
|
||||
*(here->B1SspPtr) -= gspr;
|
||||
*(here->B1BdpPtr) -= gbd;
|
||||
*(here->B1BspPtr) -= gbs;
|
||||
*(here->B1DPdPtr) -= gdpr;
|
||||
*(here->B1DPgPtr) += (xnrm-xrev)*gm;
|
||||
*(here->B1DPbPtr) += -gbd+(xnrm-xrev)*gmbs;
|
||||
*(here->B1DPspPtr) += -gds-xnrm*(gm+gmbs);
|
||||
*(here->B1SPgPtr) += -(xnrm-xrev)*gm;
|
||||
*(here->B1SPsPtr) -= gspr;
|
||||
*(here->B1SPbPtr) += -gbs-(xnrm-xrev)*gmbs;
|
||||
*(here->B1SPdpPtr) += -gds-xrev*(gm+gmbs);
|
||||
*(here->B1GgPtr +1) += m * xcggb;
|
||||
*(here->B1BbPtr +1) += m * (-xcbgb-xcbdb-xcbsb);
|
||||
*(here->B1DPdpPtr +1) += m * xcddb;
|
||||
*(here->B1SPspPtr +1) += m * xcssb;
|
||||
*(here->B1GbPtr +1) += m * (-xcggb-xcgdb-xcgsb);
|
||||
*(here->B1GdpPtr +1) += m * xcgdb;
|
||||
*(here->B1GspPtr +1) += m * xcgsb;
|
||||
*(here->B1BgPtr +1) += m * xcbgb;
|
||||
*(here->B1BdpPtr +1) += m * xcbdb;
|
||||
*(here->B1BspPtr +1) += m * xcbsb;
|
||||
*(here->B1DPgPtr +1) += m * xcdgb;
|
||||
*(here->B1DPbPtr +1) += m * (-xcdgb-xcddb-xcdsb);
|
||||
*(here->B1DPspPtr +1) += m * xcdsb;
|
||||
*(here->B1SPgPtr +1) += m * xcsgb;
|
||||
*(here->B1SPbPtr +1) += m * (-xcsgb-xcsdb-xcssb);
|
||||
*(here->B1SPdpPtr +1) += m * xcsdb;
|
||||
*(here->B1DdPtr) += m * gdpr;
|
||||
*(here->B1SsPtr) += m * gspr;
|
||||
*(here->B1BbPtr) += m * (gbd+gbs);
|
||||
*(here->B1DPdpPtr) += m * (gdpr+gds+gbd+xrev*(gm+gmbs));
|
||||
*(here->B1SPspPtr) += m * (gspr+gds+gbs+xnrm*(gm+gmbs));
|
||||
*(here->B1DdpPtr) -= m * gdpr;
|
||||
*(here->B1SspPtr) -= m * gspr;
|
||||
*(here->B1BdpPtr) -= m * gbd;
|
||||
*(here->B1BspPtr) -= m * gbs;
|
||||
*(here->B1DPdPtr) -= m * gdpr;
|
||||
*(here->B1DPgPtr) += m * (xnrm-xrev)*gm;
|
||||
*(here->B1DPbPtr) += m * (-gbd+(xnrm-xrev)*gmbs);
|
||||
*(here->B1DPspPtr) += m * (-gds-xnrm*(gm+gmbs));
|
||||
*(here->B1SPgPtr) += m * (-(xnrm-xrev)*gm);
|
||||
*(here->B1SPsPtr) -= m * gspr;
|
||||
*(here->B1SPbPtr) += m * (-gbs-(xnrm-xrev)*gmbs);
|
||||
*(here->B1SPdpPtr) += m * (-gds-xrev*(gm+gmbs));
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@ Author: 1988 Hong J. Park
|
|||
**********/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include <stdio.h>
|
||||
#include "ifsim.h"
|
||||
#include "cktdefs.h"
|
||||
#include "devdefs.h"
|
||||
|
|
@ -14,12 +13,8 @@ Author: 1988 Hong J. Park
|
|||
|
||||
/*ARGSUSED*/
|
||||
int
|
||||
B1ask(ckt,inst,which,value,select)
|
||||
CKTcircuit *ckt;
|
||||
GENinstance *inst;
|
||||
int which;
|
||||
IFvalue *value;
|
||||
IFvalue *select;
|
||||
B1ask(CKTcircuit *ckt, GENinstance *inst, int which,
|
||||
IFvalue *value, IFvalue *select)
|
||||
{
|
||||
B1instance *here = (B1instance*)inst;
|
||||
|
||||
|
|
@ -29,24 +24,34 @@ B1ask(ckt,inst,which,value,select)
|
|||
return(OK);
|
||||
case BSIM1_W:
|
||||
value->rValue = here->B1w;
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_M:
|
||||
value->rValue = here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_AS:
|
||||
value->rValue = here->B1sourceArea;
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_AD:
|
||||
value->rValue = here->B1drainArea;
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_PS:
|
||||
value->rValue = here->B1sourcePerimeter;
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_PD:
|
||||
value->rValue = here->B1drainPerimeter;
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_NRS:
|
||||
value->rValue = here->B1sourceSquares;
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_NRD:
|
||||
value->rValue = here->B1drainSquares;
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_OFF:
|
||||
value->rValue = here->B1off;
|
||||
|
|
@ -80,9 +85,11 @@ B1ask(ckt,inst,which,value,select)
|
|||
return(OK);
|
||||
case BSIM1_SOURCECONDUCT:
|
||||
value->rValue = here->B1sourceConductance;
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_DRAINCONDUCT:
|
||||
value->rValue = here->B1drainConductance;
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_VBD:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1vbd);
|
||||
|
|
@ -97,88 +104,115 @@ B1ask(ckt,inst,which,value,select)
|
|||
value->rValue = *(ckt->CKTstate0 + here->B1vds);
|
||||
return(OK);
|
||||
case BSIM1_CD:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1cd);
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1cd);
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_CBS:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1cbs);
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_CBD:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1cbd);
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_GM:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1gm);
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_GDS:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1gds);
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1gds);
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_GMBS:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1gmbs);
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_GBD:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1gbd);
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1gbd);
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_GBS:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1gbs);
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_QB:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1qb);
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_CQB:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1cqb);
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1cqb);
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_QG:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1qg);
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_CQG:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1cqg);
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_QD:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1qd);
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_CQD:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1cqd);
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_CGG:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1cggb);
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1cggb);
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_CGD:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1cgdb);
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1cgdb);
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_CGS:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1cgsb);
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_CBG:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1cbgb);
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_CAPBD:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1capbd);
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_CQBD:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1cqbd);
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_CAPBS:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1capbs);
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1capbs);
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_CQBS:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1cqbs);
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1cqbs);
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_CDG:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1cdgb);
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_CDD:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1cddb);
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_CDS:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1cdsb);
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_VON:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1vono);
|
||||
return(OK);
|
||||
case BSIM1_QBS:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1qbs);
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
case BSIM1_QBD:
|
||||
value->rValue = *(ckt->CKTstate0 + here->B1qbd);
|
||||
value->rValue *= here->B1m;
|
||||
return(OK);
|
||||
default:
|
||||
return(E_BADPARM);
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@ Author: 1985 Hong J. Park, Thomas L. Quarles
|
|||
**********/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include <stdio.h>
|
||||
#include "cktdefs.h"
|
||||
#include "bsim1def.h"
|
||||
#include "trandefs.h"
|
||||
|
|
@ -14,10 +13,7 @@ Author: 1985 Hong J. Park, Thomas L. Quarles
|
|||
#include "suffix.h"
|
||||
|
||||
int
|
||||
B1convTest(inModel,ckt)
|
||||
|
||||
GENmodel *inModel;
|
||||
CKTcircuit *ckt;
|
||||
B1convTest(GENmodel *inModel, CKTcircuit *ckt)
|
||||
|
||||
/* actually load the current value into the
|
||||
* sparse matrix previously provided
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@ Author: 1985 Hong J. Park, Thomas L. Quarles
|
|||
*/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include <stdio.h>
|
||||
#include "bsim1def.h"
|
||||
#include "sperror.h"
|
||||
#include "gendefs.h"
|
||||
|
|
@ -14,10 +13,7 @@ Author: 1985 Hong J. Park, Thomas L. Quarles
|
|||
|
||||
|
||||
int
|
||||
B1delete(inModel,name,inInst)
|
||||
GENmodel *inModel;
|
||||
IFuid name;
|
||||
GENinstance **inInst;
|
||||
B1delete(GENmodel *inModel, IFuid name, GENinstance **inInst)
|
||||
|
||||
{
|
||||
|
||||
|
|
|
|||
|
|
@ -6,15 +6,12 @@ Author: 1985 Hong J. Park, Thomas L. Quarles
|
|||
*/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include <stdio.h>
|
||||
#include "bsim1def.h"
|
||||
#include "suffix.h"
|
||||
|
||||
|
||||
void
|
||||
B1destroy(inModel)
|
||||
GENmodel **inModel;
|
||||
|
||||
B1destroy(GENmodel **inModel)
|
||||
{
|
||||
|
||||
B1model **model = (B1model**)inModel;
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@ Modified: AlansFixes
|
|||
**********/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include <stdio.h>
|
||||
#include "cktdefs.h"
|
||||
#include "bsim1def.h"
|
||||
#include "sperror.h"
|
||||
|
|
@ -13,11 +12,7 @@ Modified: AlansFixes
|
|||
#include "suffix.h"
|
||||
|
||||
int
|
||||
B1disto(mode,genmodel,ckt)
|
||||
GENmodel *genmodel;
|
||||
CKTcircuit *ckt;
|
||||
int mode;
|
||||
|
||||
B1disto(int mode, GENmodel *genmodel, CKTcircuit *ckt)
|
||||
/* assuming here that ckt->CKTomega has been initialised to
|
||||
* the correct value
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@ Author: 1985 Hong J. Park, Thomas L. Quarles
|
|||
**********/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include <stdio.h>
|
||||
#include "cktdefs.h"
|
||||
#include "bsim1def.h"
|
||||
#include "trandefs.h"
|
||||
|
|
@ -15,11 +14,7 @@ Author: 1985 Hong J. Park, Thomas L. Quarles
|
|||
#include "devdefs.h"
|
||||
|
||||
int
|
||||
B1dSetup(inModel,ckt)
|
||||
|
||||
GENmodel *inModel;
|
||||
CKTcircuit *ckt;
|
||||
|
||||
B1dSetup(GENmodel *inModel, CKTcircuit *ckt)
|
||||
{
|
||||
B1model* model = (B1model*)inModel;
|
||||
B1instance *here;
|
||||
|
|
@ -135,13 +130,14 @@ B1dSetup(inModel,ckt)
|
|||
/* loop through all the instances of the model */
|
||||
for (here = model->B1instances; here != NULL ;
|
||||
here=here->B1nextInstance) {
|
||||
if (here->B1owner != ARCHme) continue;
|
||||
|
||||
if (here->B1owner != ARCHme) continue;
|
||||
|
||||
EffectiveLength=here->B1l - model->B1deltaL * 1.e-6;/* m */
|
||||
DrainArea = here->B1drainArea;
|
||||
SourceArea = here->B1sourceArea;
|
||||
DrainPerimeter = here->B1drainPerimeter;
|
||||
SourcePerimeter = here->B1sourcePerimeter;
|
||||
DrainArea = here->B1m * here->B1drainArea;
|
||||
SourceArea = here->B1m * here->B1sourceArea;
|
||||
DrainPerimeter = here->B1m * here->B1drainPerimeter;
|
||||
SourcePerimeter = here->B1m * here->B1sourcePerimeter;
|
||||
if( (DrainSatCurrent=DrainArea*model->B1jctSatCurDensity)
|
||||
< 1e-15){
|
||||
DrainSatCurrent = 1.0e-15;
|
||||
|
|
@ -150,8 +146,8 @@ B1dSetup(inModel,ckt)
|
|||
<1.0e-15){
|
||||
SourceSatCurrent = 1.0e-15;
|
||||
}
|
||||
GateSourceOverlapCap = model->B1gateSourceOverlapCap *here->B1w;
|
||||
GateDrainOverlapCap = model->B1gateDrainOverlapCap * here->B1w;
|
||||
GateSourceOverlapCap = model->B1gateSourceOverlapCap * here->B1w * here->B1m;
|
||||
GateDrainOverlapCap = model->B1gateDrainOverlapCap * here->B1w * here-> B1m;
|
||||
GateBulkOverlapCap = model->B1gateBulkOverlapCap *EffectiveLength;
|
||||
vt0 = model->B1type * here->B1vt0;
|
||||
|
||||
|
|
@ -194,7 +190,7 @@ B1dSetup(inModel,ckt)
|
|||
lgbd2 = lgbd3 = 0.0;
|
||||
} else {
|
||||
evbd = exp(vbd/CONSTvt0);
|
||||
lgbd1 = DrainSatCurrent*evbd/CONSTvt0 +ckt->CKTgmin;
|
||||
lgbd1 = DrainSatCurrent*evbd/CONSTvt0 + ckt->CKTgmin;
|
||||
lgbd2 = (lgbd1 - ckt->CKTgmin)/(CONSTvt0*2);
|
||||
lgbd3 = lgbd2/(CONSTvt0*3);
|
||||
}
|
||||
|
|
@ -545,7 +541,7 @@ B1dSetup(inModel,ckt)
|
|||
|
||||
WLCox = model->B1Cox *
|
||||
(here->B1l - model->B1deltaL * 1.e-6) *
|
||||
(here->B1w - model->B1deltaW * 1.e-6) * 1.e4; /* F */
|
||||
((here->B1w - model->B1deltaW * 1.e-6) * here->B1m) * 1.e4; /* F */
|
||||
|
||||
if( ! ChargeComputationNeeded ) {
|
||||
qg = 0;
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@ Author: 1985 Hong J. Park, Thomas L. Quarles
|
|||
**********/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include <stdio.h>
|
||||
#include "cktdefs.h"
|
||||
#include "bsim1def.h"
|
||||
#include "trandefs.h"
|
||||
|
|
@ -16,36 +15,14 @@ Author: 1985 Hong J. Park, Thomas L. Quarles
|
|||
* using the B1 (Berkeley Short-Channel IGFET Model) Equations.
|
||||
*/
|
||||
void
|
||||
B1evaluate(vds,vbs,vgs,here,model,gmPointer,gdsPointer,gmbsPointer,
|
||||
qgPointer,qbPointer,qdPointer,cggbPointer,cgdbPointer,cgsbPointer,
|
||||
cbgbPointer,cbdbPointer,cbsbPointer,cdgbPointer,cddbPointer,
|
||||
cdsbPointer,cdrainPointer,vonPointer,vdsatPointer,ckt)
|
||||
|
||||
CKTcircuit *ckt;
|
||||
B1model *model;
|
||||
B1instance *here;
|
||||
double vds;
|
||||
double vbs;
|
||||
double vgs;
|
||||
double *gmPointer;
|
||||
double *gdsPointer;
|
||||
double *gmbsPointer;
|
||||
double *qgPointer;
|
||||
double *qbPointer;
|
||||
double *qdPointer;
|
||||
double *cggbPointer;
|
||||
double *cgdbPointer;
|
||||
double *cgsbPointer;
|
||||
double *cbgbPointer;
|
||||
double *cbdbPointer;
|
||||
double *cbsbPointer;
|
||||
double *cdgbPointer;
|
||||
double *cddbPointer;
|
||||
double *cdsbPointer;
|
||||
double *cdrainPointer;
|
||||
double *vonPointer;
|
||||
double *vdsatPointer;
|
||||
|
||||
B1evaluate(double vds, double vbs, double vgs, B1instance *here, B1model *model,
|
||||
double *gmPointer, double *gdsPointer, double *gmbsPointer,
|
||||
double *qgPointer, double *qbPointer, double *qdPointer,
|
||||
double *cggbPointer, double *cgdbPointer, double *cgsbPointer,
|
||||
double *cbgbPointer, double *cbdbPointer, double *cbsbPointer,
|
||||
double *cdgbPointer, double *cddbPointer, double *cdsbPointer,
|
||||
double *cdrainPointer, double *vonPointer, double *vdsatPointer,
|
||||
CKTcircuit *ckt)
|
||||
{
|
||||
double gm;
|
||||
double gds;
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@ Author: 1985 Hong J. Park, Thomas L. Quarles
|
|||
*/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include <stdio.h>
|
||||
#include "cktdefs.h"
|
||||
#include "bsim1def.h"
|
||||
#include "sperror.h"
|
||||
|
|
@ -14,10 +13,7 @@ Author: 1985 Hong J. Park, Thomas L. Quarles
|
|||
|
||||
|
||||
int
|
||||
B1getic(inModel,ckt)
|
||||
GENmodel *inModel;
|
||||
CKTcircuit *ckt;
|
||||
|
||||
B1getic(GENmodel *inModel, CKTcircuit *ckt)
|
||||
{
|
||||
|
||||
B1model *model = (B1model*)inModel;
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@ Author: 1985 Hong J. Park, Thomas L. Quarles
|
|||
**********/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include <stdio.h>
|
||||
#include "cktdefs.h"
|
||||
#include "bsim1def.h"
|
||||
#include "trandefs.h"
|
||||
|
|
@ -14,10 +13,7 @@ Author: 1985 Hong J. Park, Thomas L. Quarles
|
|||
#include "suffix.h"
|
||||
|
||||
int
|
||||
B1load(inModel,ckt)
|
||||
|
||||
GENmodel *inModel;
|
||||
CKTcircuit *ckt;
|
||||
B1load(GENmodel *inModel, CKTcircuit *ckt)
|
||||
|
||||
/* actually load the current value into the
|
||||
* sparse matrix previously provided
|
||||
|
|
@ -126,6 +122,7 @@ B1load(inModel,ckt)
|
|||
double tempv = 0.0;
|
||||
int error = 0;
|
||||
|
||||
double m; /* parallel multiplier */
|
||||
|
||||
/* loop through all the B1 device models */
|
||||
for( ; model != NULL; model = model->B1nextModel ) {
|
||||
|
|
@ -661,7 +658,8 @@ line860:
|
|||
* load current vector
|
||||
*/
|
||||
line900:
|
||||
|
||||
m = here->B1m;
|
||||
|
||||
ceqbs = model->B1type * (cbs-(gbs-ckt->CKTgmin)*vbs);
|
||||
ceqbd = model->B1type * (cbd-(gbd-ckt->CKTgmin)*vbd);
|
||||
|
||||
|
|
@ -678,41 +676,41 @@ line900:
|
|||
cdreq = -(model->B1type)*(cdrain+gds*vds-gm*vgd-gmbs*vbd);
|
||||
}
|
||||
|
||||
*(ckt->CKTrhs + here->B1gNode) -= ceqqg;
|
||||
*(ckt->CKTrhs + here->B1bNode) -=(ceqbs+ceqbd+ceqqb);
|
||||
*(ckt->CKTrhs + here->B1gNode) -= m * ceqqg;
|
||||
*(ckt->CKTrhs + here->B1bNode) -= m * (ceqbs+ceqbd+ceqqb);
|
||||
*(ckt->CKTrhs + here->B1dNodePrime) +=
|
||||
(ceqbd-cdreq-ceqqd);
|
||||
m * (ceqbd-cdreq-ceqqd);
|
||||
*(ckt->CKTrhs + here->B1sNodePrime) +=
|
||||
(cdreq+ceqbs+ceqqg+ceqqb+ceqqd);
|
||||
m * (cdreq+ceqbs+ceqqg+ceqqb+ceqqd);
|
||||
|
||||
/*
|
||||
* load y matrix
|
||||
*/
|
||||
|
||||
*(here->B1DdPtr) += (here->B1drainConductance);
|
||||
*(here->B1GgPtr) += (gcggb);
|
||||
*(here->B1SsPtr) += (here->B1sourceConductance);
|
||||
*(here->B1BbPtr) += (gbd+gbs-gcbgb-gcbdb-gcbsb);
|
||||
*(here->B1DdPtr) += m * (here->B1drainConductance);
|
||||
*(here->B1GgPtr) += m * (gcggb);
|
||||
*(here->B1SsPtr) += m * (here->B1sourceConductance);
|
||||
*(here->B1BbPtr) += m * (gbd+gbs-gcbgb-gcbdb-gcbsb);
|
||||
*(here->B1DPdpPtr) +=
|
||||
(here->B1drainConductance+gds+gbd+xrev*(gm+gmbs)+gcddb);
|
||||
m * (here->B1drainConductance+gds+gbd+xrev*(gm+gmbs)+gcddb);
|
||||
*(here->B1SPspPtr) +=
|
||||
(here->B1sourceConductance+gds+gbs+xnrm*(gm+gmbs)+gcssb);
|
||||
*(here->B1DdpPtr) += (-here->B1drainConductance);
|
||||
*(here->B1GbPtr) += (-gcggb-gcgdb-gcgsb);
|
||||
*(here->B1GdpPtr) += (gcgdb);
|
||||
*(here->B1GspPtr) += (gcgsb);
|
||||
*(here->B1SspPtr) += (-here->B1sourceConductance);
|
||||
*(here->B1BgPtr) += (gcbgb);
|
||||
*(here->B1BdpPtr) += (-gbd+gcbdb);
|
||||
*(here->B1BspPtr) += (-gbs+gcbsb);
|
||||
*(here->B1DPdPtr) += (-here->B1drainConductance);
|
||||
*(here->B1DPgPtr) += ((xnrm-xrev)*gm+gcdgb);
|
||||
*(here->B1DPbPtr) += (-gbd+(xnrm-xrev)*gmbs-gcdgb-gcddb-gcdsb);
|
||||
*(here->B1DPspPtr) += (-gds-xnrm*(gm+gmbs)+gcdsb);
|
||||
*(here->B1SPgPtr) += (-(xnrm-xrev)*gm+gcsgb);
|
||||
*(here->B1SPsPtr) += (-here->B1sourceConductance);
|
||||
*(here->B1SPbPtr) += (-gbs-(xnrm-xrev)*gmbs-gcsgb-gcsdb-gcssb);
|
||||
*(here->B1SPdpPtr) += (-gds-xrev*(gm+gmbs)+gcsdb);
|
||||
m * (here->B1sourceConductance+gds+gbs+xnrm*(gm+gmbs)+gcssb);
|
||||
*(here->B1DdpPtr) += m * (-here->B1drainConductance);
|
||||
*(here->B1GbPtr) += m * (-gcggb-gcgdb-gcgsb);
|
||||
*(here->B1GdpPtr) += m * (gcgdb);
|
||||
*(here->B1GspPtr) += m * (gcgsb);
|
||||
*(here->B1SspPtr) += m * (-here->B1sourceConductance);
|
||||
*(here->B1BgPtr) += m * (gcbgb);
|
||||
*(here->B1BdpPtr) += m * (-gbd+gcbdb);
|
||||
*(here->B1BspPtr) += m * (-gbs+gcbsb);
|
||||
*(here->B1DPdPtr) += m * (-here->B1drainConductance);
|
||||
*(here->B1DPgPtr) += m * ((xnrm-xrev)*gm+gcdgb);
|
||||
*(here->B1DPbPtr) += m * (-gbd+(xnrm-xrev)*gmbs-gcdgb-gcddb-gcdsb);
|
||||
*(here->B1DPspPtr) += m * (-gds-xnrm*(gm+gmbs)+gcdsb);
|
||||
*(here->B1SPgPtr) += m * (-(xnrm-xrev)*gm+gcsgb);
|
||||
*(here->B1SPsPtr) += m * (-here->B1sourceConductance);
|
||||
*(here->B1SPbPtr) += m * (-gbs-(xnrm-xrev)*gmbs-gcsgb-gcsdb-gcssb);
|
||||
*(here->B1SPdpPtr) += m * (-gds-xrev*(gm+gmbs)+gcsdb);
|
||||
|
||||
|
||||
line1000: ;
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@ Author: 1988 Hong J. Park
|
|||
*/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include <stdio.h>
|
||||
#include "ifsim.h"
|
||||
#include "cktdefs.h"
|
||||
#include "devdefs.h"
|
||||
|
|
@ -17,11 +16,7 @@ Author: 1988 Hong J. Park
|
|||
|
||||
/*ARGSUSED*/
|
||||
int
|
||||
B1mAsk(ckt,inst,which,value)
|
||||
CKTcircuit *ckt;
|
||||
GENmodel *inst;
|
||||
int which;
|
||||
IFvalue *value;
|
||||
B1mAsk(CKTcircuit *ckt, GENmodel *inst, int which, IFvalue *value)
|
||||
{
|
||||
B1model *model = (B1model *)inst;
|
||||
switch(which) {
|
||||
|
|
@ -256,6 +251,12 @@ B1mAsk(ckt,inst,which,value)
|
|||
case BSIM1_MOD_DELLENGTH:
|
||||
value->rValue = model->B1deltaLength;
|
||||
return(OK);
|
||||
case BSIM1_MOD_AF:
|
||||
value->rValue = model->B1fNexp;
|
||||
return(OK);
|
||||
case BSIM1_MOD_KF:
|
||||
value->rValue = model->B1fNcoef;
|
||||
return(OK);
|
||||
default:
|
||||
return(E_BADPARM);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,18 +6,13 @@ Author: 1985 Hong J. Park, Thomas L. Quarles
|
|||
*/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include <stdio.h>
|
||||
#include "bsim1def.h"
|
||||
#include "sperror.h"
|
||||
#include "suffix.h"
|
||||
|
||||
|
||||
int
|
||||
B1mDelete(inModel,modname,kill)
|
||||
GENmodel **inModel;
|
||||
IFuid modname;
|
||||
GENmodel *kill;
|
||||
|
||||
B1mDelete(GENmodel **inModel, IFuid modname, GENmodel *kill)
|
||||
{
|
||||
B1model **model = (B1model**)inModel;
|
||||
B1model *modfast = (B1model*)kill;
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@ Author: 1985 Hong J. Park, Thomas L. Quarles
|
|||
**********/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include <stdio.h>
|
||||
#include "cktdefs.h"
|
||||
#include "bsim1def.h"
|
||||
#include "suffix.h"
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@ Author: 1985 Hong J. Park, Thomas L. Quarles
|
|||
*/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include <stdio.h>
|
||||
#include "bsim1def.h"
|
||||
#include "ifsim.h"
|
||||
#include "sperror.h"
|
||||
|
|
@ -14,10 +13,7 @@ Author: 1985 Hong J. Park, Thomas L. Quarles
|
|||
|
||||
|
||||
int
|
||||
B1mParam(param,value,inMod)
|
||||
int param;
|
||||
IFvalue *value;
|
||||
GENmodel *inMod;
|
||||
B1mParam(int param, IFvalue *value, GENmodel *inMod)
|
||||
{
|
||||
B1model *mod = (B1model*)inMod;
|
||||
switch(param) {
|
||||
|
|
@ -329,6 +325,14 @@ B1mParam(param,value,inMod)
|
|||
mod->B1deltaLength = value->rValue;
|
||||
mod->B1deltaLengthGiven = TRUE;
|
||||
break;
|
||||
case BSIM1_MOD_AF :
|
||||
mod->B1fNexp = value->rValue;
|
||||
mod->B1fNexpGiven = TRUE;
|
||||
break;
|
||||
case BSIM1_MOD_KF :
|
||||
mod->B1fNcoef = value->rValue;
|
||||
mod->B1fNcoefGiven = TRUE;
|
||||
break;
|
||||
case BSIM1_MOD_NMOS :
|
||||
if(value->iValue) {
|
||||
mod->B1type = 1;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,212 @@
|
|||
/**********
|
||||
Copyright 2003 ??. All rights reserved.
|
||||
Author: 2003 Paolo Nenzi
|
||||
**********/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include "bsim1def.h"
|
||||
#include "cktdefs.h"
|
||||
#include "iferrmsg.h"
|
||||
#include "noisedef.h"
|
||||
#include "suffix.h"
|
||||
|
||||
/*
|
||||
* B1noise (mode, operation, firstModel, ckt, data, OnDens)
|
||||
* This routine names and evaluates all of the noise sources
|
||||
* associated with MOSFET's. It starts with the model *firstModel and
|
||||
* traverses all of its insts. It then proceeds to any other models
|
||||
* on the linked list. The total output noise density generated by
|
||||
* all of the MOSFET's is summed with the variable "OnDens".
|
||||
*/
|
||||
|
||||
extern void NevalSrc();
|
||||
extern double Nintegrate();
|
||||
|
||||
int
|
||||
B1noise (int mode, int operation, GENmodel *genmodel, CKTcircuit *ckt,
|
||||
Ndata *data, double *OnDens)
|
||||
{
|
||||
B1model *firstModel = (B1model *) genmodel;
|
||||
B1model *model;
|
||||
B1instance *inst;
|
||||
char name[N_MXVLNTH];
|
||||
double tempOnoise;
|
||||
double tempInoise;
|
||||
double noizDens[B1NSRCS];
|
||||
double lnNdens[B1NSRCS];
|
||||
int i;
|
||||
|
||||
/* define the names of the noise sources */
|
||||
|
||||
static char *B1nNames[B1NSRCS] = { /* Note that we have to keep the order */
|
||||
"_rd", /* noise due to rd */ /* consistent with thestrchr definitions */
|
||||
"_rs", /* noise due to rs */ /* in bsim1defs.h */
|
||||
"_id", /* noise due to id */
|
||||
"_1overf", /* flicker (1/f) noise */
|
||||
"" /* total transistor noise */
|
||||
};
|
||||
|
||||
for (model=firstModel; model != NULL; model=model->B1nextModel) {
|
||||
for (inst=model->B1instances; inst != NULL; inst=inst->B1nextInstance) {
|
||||
if (inst->B1owner != ARCHme) continue;
|
||||
|
||||
switch (operation) {
|
||||
|
||||
case N_OPEN:
|
||||
|
||||
/* see if we have to to produce a summary report */
|
||||
/* if so, name all the noise generators */
|
||||
|
||||
if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0) {
|
||||
switch (mode) {
|
||||
|
||||
case N_DENS:
|
||||
for (i=0; i < B1NSRCS; i++) {
|
||||
(void)sprintf(name,"onoise_%s%s",inst->B1name,B1nNames[i]);
|
||||
|
||||
|
||||
data->namelist = (IFuid *)trealloc((char *)data->namelist,(data->numPlots + 1)*sizeof(IFuid));
|
||||
if (!data->namelist) return(E_NOMEM);
|
||||
(*(SPfrontEnd->IFnewUid))(ckt,
|
||||
&(data->namelist[data->numPlots++]),
|
||||
(IFuid)NULL,name,UID_OTHER,(void **)NULL);
|
||||
/* we've added one more plot */
|
||||
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case INT_NOIZ:
|
||||
for (i=0; i < B1NSRCS; i++) {
|
||||
(void)sprintf(name,"onoise_total_%s%s",inst->B1name,B1nNames[i]);
|
||||
|
||||
|
||||
data->namelist = (IFuid *)trealloc((char *)data->namelist,(data->numPlots + 1)*sizeof(IFuid));
|
||||
if (!data->namelist) return(E_NOMEM);
|
||||
(*(SPfrontEnd->IFnewUid))(ckt,
|
||||
&(data->namelist[data->numPlots++]),
|
||||
(IFuid)NULL,name,UID_OTHER,(void **)NULL);
|
||||
/* we've added one more plot */
|
||||
|
||||
|
||||
(void)sprintf(name,"inoise_total_%s%s",inst->B1name,B1nNames[i]);
|
||||
|
||||
|
||||
data->namelist = (IFuid *)trealloc((char *)data->namelist,(data->numPlots + 1)*sizeof(IFuid));
|
||||
if (!data->namelist) return(E_NOMEM);
|
||||
(*(SPfrontEnd->IFnewUid))(ckt,
|
||||
&(data->namelist[data->numPlots++]),
|
||||
(IFuid)NULL,name,UID_OTHER,(void **)NULL);
|
||||
/* we've added one more plot */
|
||||
|
||||
|
||||
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case N_CALC:
|
||||
switch (mode) {
|
||||
|
||||
case N_DENS:
|
||||
NevalSrc(&noizDens[B1RDNOIZ],&lnNdens[B1RDNOIZ],
|
||||
ckt,THERMNOISE,inst->B1dNodePrime,inst->B1dNode,
|
||||
inst->B1drainConductance * inst->B1m);
|
||||
|
||||
NevalSrc(&noizDens[B1RSNOIZ],&lnNdens[B1RSNOIZ],
|
||||
ckt,THERMNOISE,inst->B1sNodePrime,inst->B1sNode,
|
||||
inst->B1sourceConductance * inst->B1m);
|
||||
|
||||
NevalSrc(&noizDens[B1IDNOIZ],&lnNdens[B1IDNOIZ],
|
||||
ckt,THERMNOISE,inst->B1dNodePrime,inst->B1sNodePrime,
|
||||
(2.0/3.0 * fabs(inst->B1gm * inst->B1m)));
|
||||
|
||||
NevalSrc(&noizDens[B1FLNOIZ],(double*)NULL,ckt,
|
||||
N_GAIN,inst->B1dNodePrime, inst->B1sNodePrime,
|
||||
(double)0.0);
|
||||
noizDens[B1FLNOIZ] *= model->B1fNcoef * inst->B1m *
|
||||
exp(model->B1fNexp *
|
||||
log(MAX(fabs(inst->B1cd),N_MINLOG))) /
|
||||
(data->freq *
|
||||
(inst->B1w - model->B1deltaW * 1e-6) *
|
||||
(inst->B1l - model->B1deltaL * 1e-6) *
|
||||
model->B1Cox * model->B1Cox);
|
||||
lnNdens[B1FLNOIZ] =
|
||||
log(MAX(noizDens[B1FLNOIZ],N_MINLOG));
|
||||
|
||||
noizDens[B1TOTNOIZ] = noizDens[B1RDNOIZ] +
|
||||
noizDens[B1RSNOIZ] +
|
||||
noizDens[B1IDNOIZ] +
|
||||
noizDens[B1FLNOIZ];
|
||||
lnNdens[B1TOTNOIZ] =
|
||||
log(MAX(noizDens[B1TOTNOIZ], N_MINLOG));
|
||||
|
||||
*OnDens += noizDens[B1TOTNOIZ];
|
||||
|
||||
if (data->delFreq == 0.0) {
|
||||
|
||||
/* if we haven't done any previous integration, we need to */
|
||||
/* initialize our "history" variables */
|
||||
|
||||
for (i=0; i < B1NSRCS; i++) {
|
||||
inst->B1nVar[LNLSTDENS][i] = lnNdens[i];
|
||||
}
|
||||
|
||||
/* clear out our integration variables if it's the first pass */
|
||||
|
||||
if (data->freq == ((NOISEAN*)ckt->CKTcurJob)->NstartFreq) {
|
||||
for (i=0; i < B1NSRCS; i++) {
|
||||
inst->B1nVar[OUTNOIZ][i] = 0.0;
|
||||
inst->B1nVar[INNOIZ][i] = 0.0;
|
||||
}
|
||||
}
|
||||
} else { /* data->delFreq != 0.0 (we have to integrate) */
|
||||
for (i=0; i < B1NSRCS; i++) {
|
||||
if (i != B1TOTNOIZ) {
|
||||
tempOnoise = Nintegrate(noizDens[i], lnNdens[i],
|
||||
inst->B1nVar[LNLSTDENS][i], data);
|
||||
tempInoise = Nintegrate(noizDens[i] * data->GainSqInv ,
|
||||
lnNdens[i] + data->lnGainInv,
|
||||
inst->B1nVar[LNLSTDENS][i] + data->lnGainInv,
|
||||
data);
|
||||
inst->B1nVar[LNLSTDENS][i] = lnNdens[i];
|
||||
data->outNoiz += tempOnoise;
|
||||
data->inNoise += tempInoise;
|
||||
if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0) {
|
||||
inst->B1nVar[OUTNOIZ][i] += tempOnoise;
|
||||
inst->B1nVar[OUTNOIZ][B1TOTNOIZ] += tempOnoise;
|
||||
inst->B1nVar[INNOIZ][i] += tempInoise;
|
||||
inst->B1nVar[INNOIZ][B1TOTNOIZ] += tempInoise;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (data->prtSummary) {
|
||||
for (i=0; i < B1NSRCS; i++) { /* print a summary report */
|
||||
data->outpVector[data->outNumber++] = noizDens[i];
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case INT_NOIZ: /* already calculated, just output */
|
||||
if (((NOISEAN*)ckt->CKTcurJob)->NStpsSm != 0) {
|
||||
for (i=0; i < B1NSRCS; i++) {
|
||||
data->outpVector[data->outNumber++] = inst->B1nVar[OUTNOIZ][i];
|
||||
data->outpVector[data->outNumber++] = inst->B1nVar[INNOIZ][i];
|
||||
}
|
||||
} /* if */
|
||||
break;
|
||||
} /* switch (mode) */
|
||||
break;
|
||||
|
||||
case N_CLOSE:
|
||||
return (OK); /* do nothing, the main calling routine will close */
|
||||
break; /* the plots */
|
||||
} /* switch (operation) */
|
||||
} /* for inst */
|
||||
} /* for model */
|
||||
|
||||
return(OK);
|
||||
}
|
||||
|
|
@ -6,7 +6,6 @@ Author: 1985 Hong J. Park, Thomas L. Quarles
|
|||
*/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include <stdio.h>
|
||||
#include "ifsim.h"
|
||||
#include "bsim1def.h"
|
||||
#include "sperror.h"
|
||||
|
|
@ -15,11 +14,8 @@ Author: 1985 Hong J. Park, Thomas L. Quarles
|
|||
|
||||
/* ARGSUSED */
|
||||
int
|
||||
B1param(param,value,inst,select)
|
||||
int param;
|
||||
IFvalue *value;
|
||||
GENinstance *inst;
|
||||
IFvalue *select;
|
||||
B1param(int param, IFvalue *value, GENinstance *inst,
|
||||
IFvalue *select)
|
||||
{
|
||||
B1instance *here = (B1instance*)inst;
|
||||
switch(param) {
|
||||
|
|
@ -31,6 +27,10 @@ B1param(param,value,inst,select)
|
|||
here->B1l = value->rValue;
|
||||
here->B1lGiven = TRUE;
|
||||
break;
|
||||
case BSIM1_M:
|
||||
here->B1m = value->rValue;
|
||||
here->B1mGiven = TRUE;
|
||||
break;
|
||||
case BSIM1_AS:
|
||||
here->B1sourceArea = value->rValue;
|
||||
here->B1sourceAreaGiven = TRUE;
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@ Author: 1985 Thomas L. Quarles
|
|||
*/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include <stdio.h>
|
||||
#include "cktdefs.h"
|
||||
#include "complex.h"
|
||||
#include "sperror.h"
|
||||
|
|
@ -15,10 +14,7 @@ Author: 1985 Thomas L. Quarles
|
|||
|
||||
|
||||
int
|
||||
B1pzLoad(inModel,ckt,s)
|
||||
GENmodel *inModel;
|
||||
CKTcircuit *ckt;
|
||||
SPcomplex *s;
|
||||
B1pzLoad(GENmodel *inModel, CKTcircuit *ckt, SPcomplex *s)
|
||||
{
|
||||
B1model *model = (B1model*)inModel;
|
||||
B1instance *here;
|
||||
|
|
@ -55,6 +51,8 @@ B1pzLoad(inModel,ckt,s)
|
|||
double cdgb;
|
||||
double cdsb;
|
||||
|
||||
double m;
|
||||
|
||||
for( ; model != NULL; model = model->B1nextModel) {
|
||||
for(here = model->B1instances; here!= NULL;
|
||||
here = here->B1nextInstance) {
|
||||
|
|
@ -106,56 +104,57 @@ B1pzLoad(inModel,ckt,s)
|
|||
xcbdb = (cbdb - capbd ) ;
|
||||
xcbsb = (cbsb - capbs ) ;
|
||||
|
||||
m = here->B1m;
|
||||
|
||||
*(here->B1GgPtr ) += xcggb * s->real;
|
||||
*(here->B1GgPtr +1) += xcggb * s->imag;
|
||||
*(here->B1BbPtr ) += (-xcbgb-xcbdb-xcbsb) * s->real;
|
||||
*(here->B1BbPtr +1) += (-xcbgb-xcbdb-xcbsb) * s->imag;
|
||||
*(here->B1DPdpPtr ) += xcddb * s->real;
|
||||
*(here->B1DPdpPtr +1) += xcddb * s->imag;
|
||||
*(here->B1SPspPtr ) += xcssb * s->real;
|
||||
*(here->B1SPspPtr +1) += xcssb * s->imag;
|
||||
*(here->B1GbPtr ) += (-xcggb-xcgdb-xcgsb) * s->real;
|
||||
*(here->B1GbPtr +1) += (-xcggb-xcgdb-xcgsb) * s->imag;
|
||||
*(here->B1GdpPtr ) += xcgdb * s->real;
|
||||
*(here->B1GdpPtr +1) += xcgdb * s->imag;
|
||||
*(here->B1GspPtr ) += xcgsb * s->real;
|
||||
*(here->B1GspPtr +1) += xcgsb * s->imag;
|
||||
*(here->B1BgPtr ) += xcbgb * s->real;
|
||||
*(here->B1BgPtr +1) += xcbgb * s->imag;
|
||||
*(here->B1BdpPtr ) += xcbdb * s->real;
|
||||
*(here->B1BdpPtr +1) += xcbdb * s->imag;
|
||||
*(here->B1BspPtr ) += xcbsb * s->real;
|
||||
*(here->B1BspPtr +1) += xcbsb * s->imag;
|
||||
*(here->B1DPgPtr ) += xcdgb * s->real;
|
||||
*(here->B1DPgPtr +1) += xcdgb * s->imag;
|
||||
*(here->B1DPbPtr ) += (-xcdgb-xcddb-xcdsb) * s->real;
|
||||
*(here->B1DPbPtr +1) += (-xcdgb-xcddb-xcdsb) * s->imag;
|
||||
*(here->B1DPspPtr ) += xcdsb * s->real;
|
||||
*(here->B1DPspPtr +1) += xcdsb * s->imag;
|
||||
*(here->B1SPgPtr ) += xcsgb * s->real;
|
||||
*(here->B1SPgPtr +1) += xcsgb * s->imag;
|
||||
*(here->B1SPbPtr ) += (-xcsgb-xcsdb-xcssb) * s->real;
|
||||
*(here->B1SPbPtr +1) += (-xcsgb-xcsdb-xcssb) * s->imag;
|
||||
*(here->B1SPdpPtr ) += xcsdb * s->real;
|
||||
*(here->B1SPdpPtr +1) += xcsdb * s->imag;
|
||||
*(here->B1DdPtr) += gdpr;
|
||||
*(here->B1SsPtr) += gspr;
|
||||
*(here->B1BbPtr) += gbd+gbs;
|
||||
*(here->B1DPdpPtr) += gdpr+gds+gbd+xrev*(gm+gmbs);
|
||||
*(here->B1SPspPtr) += gspr+gds+gbs+xnrm*(gm+gmbs);
|
||||
*(here->B1DdpPtr) -= gdpr;
|
||||
*(here->B1SspPtr) -= gspr;
|
||||
*(here->B1BdpPtr) -= gbd;
|
||||
*(here->B1BspPtr) -= gbs;
|
||||
*(here->B1DPdPtr) -= gdpr;
|
||||
*(here->B1DPgPtr) += (xnrm-xrev)*gm;
|
||||
*(here->B1DPbPtr) += -gbd+(xnrm-xrev)*gmbs;
|
||||
*(here->B1DPspPtr) += -gds-xnrm*(gm+gmbs);
|
||||
*(here->B1SPgPtr) += -(xnrm-xrev)*gm;
|
||||
*(here->B1SPsPtr) -= gspr;
|
||||
*(here->B1SPbPtr) += -gbs-(xnrm-xrev)*gmbs;
|
||||
*(here->B1SPdpPtr) += -gds-xrev*(gm+gmbs);
|
||||
*(here->B1GgPtr ) += m * (xcggb * s->real);
|
||||
*(here->B1GgPtr +1) += m * (xcggb * s->imag);
|
||||
*(here->B1BbPtr ) += m * ((-xcbgb-xcbdb-xcbsb) * s->real);
|
||||
*(here->B1BbPtr +1) += m * ((-xcbgb-xcbdb-xcbsb) * s->imag);
|
||||
*(here->B1DPdpPtr ) += m * (xcddb * s->real);
|
||||
*(here->B1DPdpPtr +1) += m * (xcddb * s->imag);
|
||||
*(here->B1SPspPtr ) += m * (xcssb * s->real);
|
||||
*(here->B1SPspPtr +1) += m * (xcssb * s->imag);
|
||||
*(here->B1GbPtr ) += m * ((-xcggb-xcgdb-xcgsb) * s->real);
|
||||
*(here->B1GbPtr +1) += m * ((-xcggb-xcgdb-xcgsb) * s->imag);
|
||||
*(here->B1GdpPtr ) += m * (xcgdb * s->real);
|
||||
*(here->B1GdpPtr +1) += m * (xcgdb * s->imag);
|
||||
*(here->B1GspPtr ) += m * (xcgsb * s->real);
|
||||
*(here->B1GspPtr +1) += m * (xcgsb * s->imag);
|
||||
*(here->B1BgPtr ) += m * (xcbgb * s->real);
|
||||
*(here->B1BgPtr +1) += m * (xcbgb * s->imag);
|
||||
*(here->B1BdpPtr ) += m * (xcbdb * s->real);
|
||||
*(here->B1BdpPtr +1) += m * (xcbdb * s->imag);
|
||||
*(here->B1BspPtr ) += m * (xcbsb * s->real);
|
||||
*(here->B1BspPtr +1) += m * (xcbsb * s->imag);
|
||||
*(here->B1DPgPtr ) += m * (xcdgb * s->real);
|
||||
*(here->B1DPgPtr +1) += m * (xcdgb * s->imag);
|
||||
*(here->B1DPbPtr ) += m * ((-xcdgb-xcddb-xcdsb) * s->real);
|
||||
*(here->B1DPbPtr +1) += m * ((-xcdgb-xcddb-xcdsb) * s->imag);
|
||||
*(here->B1DPspPtr ) += m * (xcdsb * s->real);
|
||||
*(here->B1DPspPtr +1) += m * (xcdsb * s->imag);
|
||||
*(here->B1SPgPtr ) += m * (xcsgb * s->real);
|
||||
*(here->B1SPgPtr +1) += m * (xcsgb * s->imag);
|
||||
*(here->B1SPbPtr ) += m * ((-xcsgb-xcsdb-xcssb) * s->real);
|
||||
*(here->B1SPbPtr +1) += m * ((-xcsgb-xcsdb-xcssb) * s->imag);
|
||||
*(here->B1SPdpPtr ) += m * (xcsdb * s->real);
|
||||
*(here->B1SPdpPtr +1) += m * (xcsdb * s->imag);
|
||||
*(here->B1DdPtr) += m * (gdpr);
|
||||
*(here->B1SsPtr) += m * (gspr);
|
||||
*(here->B1BbPtr) += m * (gbd+gbs);
|
||||
*(here->B1DPdpPtr) += m * (gdpr+gds+gbd+xrev*(gm+gmbs));
|
||||
*(here->B1SPspPtr) += m * (gspr+gds+gbs+xnrm*(gm+gmbs));
|
||||
*(here->B1DdpPtr) -= m * (gdpr);
|
||||
*(here->B1SspPtr) -= m * (gspr);
|
||||
*(here->B1BdpPtr) -= m * (gbd);
|
||||
*(here->B1BspPtr) -= m * (gbs);
|
||||
*(here->B1DPdPtr) -= m * (gdpr);
|
||||
*(here->B1DPgPtr) += m * ((xnrm-xrev)*gm);
|
||||
*(here->B1DPbPtr) += m * (-gbd+(xnrm-xrev)*gmbs);
|
||||
*(here->B1DPspPtr) += m * (-gds-xnrm*(gm+gmbs));
|
||||
*(here->B1SPgPtr) += m * (-(xnrm-xrev)*gm);
|
||||
*(here->B1SPsPtr) -= m * (gspr);
|
||||
*(here->B1SPbPtr) += m * (-gbs-(xnrm-xrev)*gmbs);
|
||||
*(here->B1SPdpPtr) += m * (-gds-xrev*(gm+gmbs));
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@ Author: 1985 Hong J. Park, Thomas L. Quarles
|
|||
**********/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include <stdio.h>
|
||||
#include "smpdefs.h"
|
||||
#include "cktdefs.h"
|
||||
#include "bsim1def.h"
|
||||
|
|
@ -13,11 +12,8 @@ Author: 1985 Hong J. Park, Thomas L. Quarles
|
|||
#include "suffix.h"
|
||||
|
||||
int
|
||||
B1setup(matrix,inModel,ckt,states)
|
||||
SMPmatrix *matrix;
|
||||
GENmodel *inModel;
|
||||
CKTcircuit *ckt;
|
||||
int *states;
|
||||
B1setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt,
|
||||
int *states)
|
||||
/* load the B1 device structure with those pointers needed later
|
||||
* for fast matrix loading
|
||||
*/
|
||||
|
|
@ -266,6 +262,12 @@ B1setup(matrix,inModel,ckt,states)
|
|||
if( ! model->B1deltaLengthGiven) {
|
||||
model->B1deltaLength = 0.0;
|
||||
}
|
||||
if( ! model->B1fNcoefGiven) {
|
||||
model->B1fNcoef = 0.0;
|
||||
}
|
||||
if( ! model->B1fNexpGiven) {
|
||||
model->B1fNexp = 1.0;
|
||||
}
|
||||
|
||||
/* loop through all the instances of the model */
|
||||
for (here = model->B1instances; here != NULL ;
|
||||
|
|
@ -320,7 +322,10 @@ B1setup(matrix,inModel,ckt,states)
|
|||
if(!here->B1wGiven) {
|
||||
here->B1w = 5e-6;
|
||||
}
|
||||
|
||||
if(!here->B1mGiven) {
|
||||
here->B1m = 1.0;
|
||||
}
|
||||
|
||||
/* process drain series resistance */
|
||||
if( (model->B1sheetResistance != 0) &&
|
||||
(here->B1drainSquares != 0.0 ) &&
|
||||
|
|
@ -398,9 +403,7 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
|
|||
}
|
||||
|
||||
int
|
||||
B1unsetup(inModel,ckt)
|
||||
GENmodel *inModel;
|
||||
CKTcircuit *ckt;
|
||||
B1unsetup(GENmodel *inModel, CKTcircuit *ckt)
|
||||
{
|
||||
B1model *model;
|
||||
B1instance *here;
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@ Author: 1985 Hong J. Park, Thomas L. Quarles
|
|||
**********/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include <stdio.h>
|
||||
#include "smpdefs.h"
|
||||
#include "cktdefs.h"
|
||||
#include "bsim1def.h"
|
||||
|
|
@ -14,13 +13,10 @@ Author: 1985 Hong J. Park, Thomas L. Quarles
|
|||
|
||||
/* ARGSUSED */
|
||||
int
|
||||
B1temp(inModel,ckt)
|
||||
GENmodel *inModel;
|
||||
CKTcircuit *ckt;
|
||||
B1temp(GENmodel *inModel, CKTcircuit *ckt)
|
||||
/* load the B1 device structure with those pointers needed later
|
||||
* for fast matrix loading
|
||||
*/
|
||||
|
||||
{
|
||||
B1model *model = (B1model*) inModel;
|
||||
B1instance *here;
|
||||
|
|
@ -49,6 +45,7 @@ B1temp(inModel,ckt)
|
|||
/* loop through all the instances of the model */
|
||||
for (here = model->B1instances; here != NULL ;
|
||||
here=here->B1nextInstance) {
|
||||
|
||||
if (here->B1owner != ARCHme) continue;
|
||||
|
||||
if( (EffChanLength = here->B1l - model->B1deltaL *1e-6 )<=0) {
|
||||
|
|
|
|||
|
|
@ -4,17 +4,13 @@ Author: 1985 Hong J. Park, Thomas L. Quarles
|
|||
**********/
|
||||
|
||||
#include "ngspice.h"
|
||||
#include <stdio.h>
|
||||
#include "cktdefs.h"
|
||||
#include "bsim1def.h"
|
||||
#include "sperror.h"
|
||||
#include "suffix.h"
|
||||
|
||||
int
|
||||
B1trunc(inModel,ckt,timeStep)
|
||||
GENmodel *inModel;
|
||||
CKTcircuit *ckt;
|
||||
double *timeStep;
|
||||
B1trunc(GENmodel *inModel, CKTcircuit *ckt, double *timeStep)
|
||||
|
||||
{
|
||||
B1model *model = (B1model*)inModel;
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ Author: 1985 Hong June Park, Thomas L. Quarles
|
|||
#include "gendefs.h"
|
||||
#include "cktdefs.h"
|
||||
#include "complex.h"
|
||||
#include "noisedef.h"
|
||||
|
||||
/* declarations for B1 MOSFETs */
|
||||
|
||||
|
|
@ -34,7 +35,8 @@ typedef struct sBSIM1instance {
|
|||
int B1sNodePrime; /* number of the internal source node of the mosfet */
|
||||
|
||||
double B1l; /* the length of the channel region */
|
||||
double B1w; /* the width of the channel region */
|
||||
double B1w; /* the width of the channel region */
|
||||
double B1m; /* the parallel multiplier */
|
||||
double B1drainArea; /* the area of the drain diffusion */
|
||||
double B1sourceArea; /* the area of the source diffusion */
|
||||
double B1drainSquares; /* the length of the drain in squares */
|
||||
|
|
@ -82,6 +84,7 @@ typedef struct sBSIM1instance {
|
|||
unsigned B1channelChargePartitionFlag :1;
|
||||
unsigned B1lGiven :1;
|
||||
unsigned B1wGiven :1;
|
||||
unsigned B1mGiven :1;
|
||||
unsigned B1drainAreaGiven :1;
|
||||
unsigned B1sourceAreaGiven :1;
|
||||
unsigned B1drainSquaresGiven :1;
|
||||
|
|
@ -148,6 +151,22 @@ typedef struct sBSIM1instance {
|
|||
#else /* NODISTO */
|
||||
double *B1dCoeffs;
|
||||
#endif /* NODISTO */
|
||||
/* indices to the array of BSIM1 noise sources */
|
||||
|
||||
#define B1RDNOIZ 0
|
||||
#define B1RSNOIZ 1
|
||||
#define B1IDNOIZ 2
|
||||
#define B1FLNOIZ 3
|
||||
#define B1TOTNOIZ 4
|
||||
|
||||
#define B1NSRCS 5 /* the number of BSIM1 noise sources */
|
||||
|
||||
#ifndef NONOISE
|
||||
double B1nVar[NSTATVARS][B1NSRCS];
|
||||
#else /* NONOISE */
|
||||
double **B1nVar;
|
||||
#endif /* NONOISE */
|
||||
|
||||
|
||||
} B1instance ;
|
||||
|
||||
|
|
@ -385,6 +404,10 @@ typedef struct sBSIM1model { /* model structure for a resistor */
|
|||
double B1defaultWidth;
|
||||
double B1deltaLength;
|
||||
|
||||
double B1fNcoef;
|
||||
double B1fNexp;
|
||||
|
||||
|
||||
|
||||
unsigned B1vfb0Given :1;
|
||||
unsigned B1vfbLGiven :1;
|
||||
|
|
@ -463,6 +486,10 @@ typedef struct sBSIM1model { /* model structure for a resistor */
|
|||
unsigned B1unitLengthSidewallJctCapGiven :1;
|
||||
unsigned B1defaultWidthGiven :1;
|
||||
unsigned B1deltaLengthGiven :1;
|
||||
|
||||
unsigned B1fNcoefGiven :1;
|
||||
unsigned B1fNexpGiven :1;
|
||||
|
||||
unsigned B1typeGiven :1;
|
||||
|
||||
} B1model;
|
||||
|
|
@ -488,6 +515,7 @@ typedef struct sBSIM1model { /* model structure for a resistor */
|
|||
#define BSIM1_IC_VDS 11
|
||||
#define BSIM1_IC_VGS 12
|
||||
#define BSIM1_IC 13
|
||||
#define BSIM1_M 14
|
||||
|
||||
/* model parameters */
|
||||
#define BSIM1_MOD_VFB0 101
|
||||
|
|
@ -570,6 +598,9 @@ typedef struct sBSIM1model { /* model structure for a resistor */
|
|||
#define BSIM1_MOD_NMOS 178
|
||||
#define BSIM1_MOD_PMOS 179
|
||||
|
||||
#define BSIM1_MOD_KF 180
|
||||
#define BSIM1_MOD_AF 181
|
||||
|
||||
/* device questions */
|
||||
#define BSIM1_DNODE 201
|
||||
#define BSIM1_GNODE 202
|
||||
|
|
@ -616,13 +647,9 @@ typedef struct sBSIM1model { /* model structure for a resistor */
|
|||
|
||||
#include "bsim1ext.h"
|
||||
|
||||
#ifdef __STDC__
|
||||
extern void B1evaluate(double,double,double,B1instance*,B1model*,
|
||||
double*,double*,double*, double*, double*, double*, double*,
|
||||
double*, double*, double*, double*, double*, double*, double*,
|
||||
double*, double*, double*, double*, CKTcircuit*);
|
||||
#else /* stdc */
|
||||
extern void B1evaluate();
|
||||
#endif /* stdc */
|
||||
|
||||
#endif /*B1*/
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ Author: 1985 Hong June Park, Thomas L. Quarles
|
|||
Modified: 2000 AlansFixes
|
||||
**********/
|
||||
|
||||
#ifdef __STDC__
|
||||
|
||||
extern int B1acLoad(GENmodel *,CKTcircuit*);
|
||||
extern int B1ask(CKTcircuit *,GENinstance*,int,IFvalue*,IFvalue*);
|
||||
extern int B1convTest(GENmodel *,CKTcircuit*);
|
||||
|
|
@ -20,6 +20,7 @@ extern void B1mosCap(CKTcircuit*, double, double, double, double*,
|
|||
double*, double*, double*, double*, double*, double*, double*, double*,
|
||||
double*, double*, double*, double*, double*, double*, double*,
|
||||
double*);
|
||||
extern int B1noise (int, int, GENmodel *, CKTcircuit *, Ndata *, double *);
|
||||
extern int B1param(int,IFvalue*,GENinstance*,IFvalue*);
|
||||
extern int B1pzLoad(GENmodel*,CKTcircuit*,SPcomplex*);
|
||||
extern int B1setup(SMPmatrix*,GENmodel*,CKTcircuit*,int*);
|
||||
|
|
@ -28,24 +29,3 @@ extern int B1temp(GENmodel*,CKTcircuit*);
|
|||
extern int B1trunc(GENmodel*,CKTcircuit*,double*);
|
||||
extern int B1disto(int,GENmodel*,CKTcircuit*);
|
||||
extern int B1dSetup(GENmodel*, register CKTcircuit*);
|
||||
#else /* stdc */
|
||||
extern int B1acLoad();
|
||||
extern int B1ask();
|
||||
extern int B1convTest();
|
||||
extern int B1delete();
|
||||
extern void B1destroy();
|
||||
extern int B1getic();
|
||||
extern int B1load();
|
||||
extern int B1mAsk();
|
||||
extern int B1mDelete();
|
||||
extern int B1mParam();
|
||||
extern void B1mosCap();
|
||||
extern int B1param();
|
||||
extern int B1pzLoad();
|
||||
extern int B1setup();
|
||||
extern int B1unsetup();
|
||||
extern int B1temp();
|
||||
extern int B1trunc();
|
||||
extern int B1disto();
|
||||
#endif /* stdc */
|
||||
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ SPICEdev B1info = {
|
|||
DEVsenPrint : NULL,
|
||||
DEVsenTrunc : NULL,
|
||||
DEVdisto : B1disto,
|
||||
DEVnoise : NULL, /* NOISE */
|
||||
DEVnoise : B1noise, /* NOISE */
|
||||
#ifdef CIDER
|
||||
DEVdump : NULL,
|
||||
DEVacct : NULL,
|
||||
|
|
|
|||
Loading…
Reference in New Issue