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

📄 mos3set.c

📁 linux平台下类似著名的电路板作图软件 Spice的源代码
💻 C
字号:
/**********Copyright 1990 Regents of the University of California.  All rights reserved.Author: 1985 Thomas L. Quarles**********/#include "spice.h"#include <stdio.h>#include "smpdefs.h"#include "cktdefs.h"#include "mos3defs.h"#include "util.h"#include "const.h"#include "sperror.h"#include "suffix.h"/* assuming silicon - make definition for epsilon of silicon */#define EPSSIL (11.7 * 8.854214871e-12)intMOS3setup(matrix,inModel,ckt,states)    register SMPmatrix *matrix;    GENmodel *inModel;    register CKTcircuit *ckt;    int *states;        /* load the MOS3 device structure with those pointers needed later          * for fast matrix loading          */{    register MOS3model *model = (MOS3model *)inModel;    register MOS3instance *here;    int error;    CKTnode *tmp;    /*  loop through all the MOS3 device models */    for( ; model != NULL; model = model->MOS3nextModel ) {        /* perform model defaulting */        if(!model->MOS3typeGiven) {            model->MOS3type = NMOS;        }        if(!model->MOS3latDiffGiven) {            model->MOS3latDiff = 0;        }        if(!model->MOS3jctSatCurDensityGiven) {            model->MOS3jctSatCurDensity = 0;        }        if(!model->MOS3jctSatCurGiven) {            model->MOS3jctSatCur = 1e-14;        }        if(!model->MOS3drainResistanceGiven) {            model->MOS3drainResistance = 0;        }        if(!model->MOS3sourceResistanceGiven) {            model->MOS3sourceResistance = 0;        }        if(!model->MOS3sheetResistanceGiven) {            model->MOS3sheetResistance = 0;        }        if(!model->MOS3transconductanceGiven) {            model->MOS3transconductance = 2e-5;        }        if(!model->MOS3gateSourceOverlapCapFactorGiven) {            model->MOS3gateSourceOverlapCapFactor = 0;        }        if(!model->MOS3gateDrainOverlapCapFactorGiven) {            model->MOS3gateDrainOverlapCapFactor = 0;        }        if(!model->MOS3gateBulkOverlapCapFactorGiven) {            model->MOS3gateBulkOverlapCapFactor = 0;        }        if(!model->MOS3vt0Given) {            model->MOS3vt0 = 0;        }        if(!model->MOS3capBDGiven) {            model->MOS3capBD = 0;        }        if(!model->MOS3capBSGiven) {            model->MOS3capBS = 0;        }        if(!model->MOS3bulkCapFactorGiven) {            model->MOS3bulkCapFactor = 0;        }        if(!model->MOS3sideWallCapFactorGiven) {            model->MOS3sideWallCapFactor = 0;        }        if(!model->MOS3bulkJctPotentialGiven) {            model->MOS3bulkJctPotential = .8;        }        if(!model->MOS3bulkJctBotGradingCoeffGiven) {            model->MOS3bulkJctBotGradingCoeff = .5;        }        if(!model->MOS3bulkJctSideGradingCoeffGiven) {            model->MOS3bulkJctSideGradingCoeff = .33;        }        if(!model->MOS3fwdCapDepCoeffGiven) {            model->MOS3fwdCapDepCoeff = .5;        }        if(!model->MOS3phiGiven) {            model->MOS3phi = .6;        }        if(!model->MOS3gammaGiven) {            model->MOS3gamma = 0;        }        if(!model->MOS3deltaGiven) {            model->MOS3delta = 0;        }        if(!model->MOS3maxDriftVelGiven) {            model->MOS3maxDriftVel = 0;        }        if(!model->MOS3junctionDepthGiven) {            model->MOS3junctionDepth = 0;        }        if(!model->MOS3fastSurfaceStateDensityGiven) {            model->MOS3fastSurfaceStateDensity = 0;        }        if(!model->MOS3etaGiven) {            model->MOS3eta = 0;        }        if(!model->MOS3thetaGiven) {            model->MOS3theta = 0;        }        if(!model->MOS3kappaGiven) {            model->MOS3kappa = .2;        }        if(!model->MOS3oxideThicknessGiven) {            model->MOS3oxideThickness = 1e-7;        } 	if(!model->MOS3fNcoefGiven) {	    model->MOS3fNcoef = 0;	}	if(!model->MOS3fNexpGiven) {	    model->MOS3fNexp = 1;	}        /* loop through all the instances of the model */        for (here = model->MOS3instances; here != NULL ;                here=here->MOS3nextInstance) {            /* allocate a chunk of the state vector */            here->MOS3states = *states;            *states += MOS3NUMSTATES;            if(!here->MOS3drainAreaGiven) {                here->MOS3drainArea = ckt->CKTdefaultMosAD;            }            if(!here->MOS3drainPerimiterGiven) {                here->MOS3drainPerimiter = 0;            }            if(!here->MOS3drainSquaresGiven) {                here->MOS3drainSquares = 1;            }            if(!here->MOS3icVBSGiven) {                here->MOS3icVBS = 0;            }            if(!here->MOS3icVDSGiven) {                here->MOS3icVDS = 0;            }            if(!here->MOS3icVGSGiven) {                here->MOS3icVGS = 0;            }            if(!here->MOS3sourcePerimiterGiven) {                here->MOS3sourcePerimiter = 0;            }            if(!here->MOS3sourceSquaresGiven) {                here->MOS3sourceSquares = 1;            }            if(!here->MOS3vdsatGiven) {                here->MOS3vdsat = 0;            }            if(!here->MOS3vonGiven) {                here->MOS3von = 0;            }            if(!here->MOS3modeGiven) {                here->MOS3mode = 1;            }            if((model->MOS3drainResistance != 0 ||                    (model->MOS3sheetResistance != 0 &&                     here->MOS3drainSquares != 0      ) )  &&                     here->MOS3dNodePrime==0) {                error = CKTmkVolt(ckt,&tmp,here->MOS3name,"internal#drain");                if(error) return(error);                here->MOS3dNodePrime = tmp->number;            } else {                here->MOS3dNodePrime = here->MOS3dNode;            }            if((model->MOS3sourceResistance != 0 ||                    (model->MOS3sheetResistance != 0 &&                      here->MOS3sourceSquares != 0     ) ) &&                    here->MOS3sNodePrime==0) {                error = CKTmkVolt(ckt,&tmp,here->MOS3name,"internal#source");                if(error) return(error);                here->MOS3sNodePrime = tmp->number;            } else {                here->MOS3sNodePrime = here->MOS3sNode;            }/* macro to make elements with built in test for out of memory */#define TSTALLOC(ptr,first,second) \if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\    return(E_NOMEM);\}            TSTALLOC(MOS3DdPtr, MOS3dNode, MOS3dNode)            TSTALLOC(MOS3GgPtr, MOS3gNode, MOS3gNode)            TSTALLOC(MOS3SsPtr, MOS3sNode, MOS3sNode)            TSTALLOC(MOS3BbPtr, MOS3bNode, MOS3bNode)            TSTALLOC(MOS3DPdpPtr, MOS3dNodePrime, MOS3dNodePrime)            TSTALLOC(MOS3SPspPtr, MOS3sNodePrime, MOS3sNodePrime)            TSTALLOC(MOS3DdpPtr, MOS3dNode, MOS3dNodePrime)            TSTALLOC(MOS3GbPtr, MOS3gNode, MOS3bNode)            TSTALLOC(MOS3GdpPtr, MOS3gNode, MOS3dNodePrime)            TSTALLOC(MOS3GspPtr, MOS3gNode, MOS3sNodePrime)            TSTALLOC(MOS3SspPtr, MOS3sNode, MOS3sNodePrime)            TSTALLOC(MOS3BdpPtr, MOS3bNode, MOS3dNodePrime)            TSTALLOC(MOS3BspPtr, MOS3bNode, MOS3sNodePrime)            TSTALLOC(MOS3DPspPtr, MOS3dNodePrime, MOS3sNodePrime)            TSTALLOC(MOS3DPdPtr, MOS3dNodePrime, MOS3dNode)            TSTALLOC(MOS3BgPtr, MOS3bNode, MOS3gNode)            TSTALLOC(MOS3DPgPtr, MOS3dNodePrime, MOS3gNode)            TSTALLOC(MOS3SPgPtr, MOS3sNodePrime, MOS3gNode)            TSTALLOC(MOS3SPsPtr, MOS3sNodePrime, MOS3sNode)            TSTALLOC(MOS3DPbPtr, MOS3dNodePrime, MOS3bNode)            TSTALLOC(MOS3SPbPtr, MOS3sNodePrime, MOS3bNode)            TSTALLOC(MOS3SPdpPtr, MOS3sNodePrime, MOS3dNodePrime)        }    }    return(OK);}intMOS3unsetup(inModel,ckt)    GENmodel *inModel;    CKTcircuit *ckt;{#ifndef HAS_BATCHSIM    MOS3model *model;    MOS3instance *here;    for (model = (MOS3model *)inModel; model != NULL;	    model = model->MOS3nextModel)    {        for (here = model->MOS3instances; here != NULL;                here=here->MOS3nextInstance)	{	    if (here->MOS3dNodePrime		    && here->MOS3dNodePrime != here->MOS3dNode)	    {		CKTdltNNum(ckt, here->MOS3dNodePrime);		here->MOS3dNodePrime= 0;	    }	    if (here->MOS3sNodePrime		    && here->MOS3sNodePrime != here->MOS3sNode)	    {		CKTdltNNum(ckt, here->MOS3sNodePrime);		here->MOS3sNodePrime= 0;	    }	}    }#endif    return OK;}

⌨️ 快捷键说明

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