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

📄 mos9set.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
字号:
/**********Copyright 1990 Regents of the University of California.  All rights reserved.Author: 1985 Thomas L. QuarlesModified: Alan Gillespie**********/#include "ngspice.h"#include "smpdefs.h"#include "cktdefs.h"#include "mos9defs.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)intMOS9setup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states)        /* load the MOS9 device structure with those pointers needed later          * for fast matrix loading          */{    register MOS9model *model = (MOS9model *)inModel;    register MOS9instance *here;    int error;    CKTnode *tmp;    /*  loop through all the MOS9 device models */    for( ; model != NULL; model = model->MOS9nextModel ) {        /* perform model defaulting */        if(!model->MOS9typeGiven) {            model->MOS9type = NMOS;        }        if(!model->MOS9latDiffGiven) {            model->MOS9latDiff = 0;        }        if(!model->MOS9lengthAdjustGiven) {            model->MOS9lengthAdjust = 0;        }        if(!model->MOS9widthNarrowGiven) {            model->MOS9widthNarrow = 0;        }        if(!model->MOS9widthAdjustGiven) {            model->MOS9widthAdjust = 0;        }        if(!model->MOS9delvt0Given) {            model->MOS9delvt0 = 0;        }        if(!model->MOS9jctSatCurDensityGiven) {            model->MOS9jctSatCurDensity = 0;        }        if(!model->MOS9jctSatCurGiven) {            model->MOS9jctSatCur = 1e-14;        }        if(!model->MOS9drainResistanceGiven) {            model->MOS9drainResistance = 0;        }        if(!model->MOS9sourceResistanceGiven) {            model->MOS9sourceResistance = 0;        }        if(!model->MOS9sheetResistanceGiven) {            model->MOS9sheetResistance = 0;        }        if(!model->MOS9transconductanceGiven) {            model->MOS9transconductance = 2e-5;        }        if(!model->MOS9gateSourceOverlapCapFactorGiven) {            model->MOS9gateSourceOverlapCapFactor = 0;        }        if(!model->MOS9gateDrainOverlapCapFactorGiven) {            model->MOS9gateDrainOverlapCapFactor = 0;        }        if(!model->MOS9gateBulkOverlapCapFactorGiven) {            model->MOS9gateBulkOverlapCapFactor = 0;        }        if(!model->MOS9vt0Given) {            model->MOS9vt0 = 0;        }        if(!model->MOS9capBDGiven) {            model->MOS9capBD = 0;        }        if(!model->MOS9capBSGiven) {            model->MOS9capBS = 0;        }        if(!model->MOS9bulkCapFactorGiven) {            model->MOS9bulkCapFactor = 0;        }        if(!model->MOS9sideWallCapFactorGiven) {            model->MOS9sideWallCapFactor = 0;        }        if(!model->MOS9bulkJctPotentialGiven) {            model->MOS9bulkJctPotential = .8;        }        if(!model->MOS9bulkJctBotGradingCoeffGiven) {            model->MOS9bulkJctBotGradingCoeff = .5;        }        if(!model->MOS9bulkJctSideGradingCoeffGiven) {            model->MOS9bulkJctSideGradingCoeff = .33;        }        if(!model->MOS9fwdCapDepCoeffGiven) {            model->MOS9fwdCapDepCoeff = .5;        }        if(!model->MOS9phiGiven) {            model->MOS9phi = .6;        }        if(!model->MOS9gammaGiven) {            model->MOS9gamma = 0;        }        if(!model->MOS9deltaGiven) {            model->MOS9delta = 0;        }        if(!model->MOS9maxDriftVelGiven) {            model->MOS9maxDriftVel = 0;        }        if(!model->MOS9junctionDepthGiven) {            model->MOS9junctionDepth = 0;        }        if(!model->MOS9fastSurfaceStateDensityGiven) {            model->MOS9fastSurfaceStateDensity = 0;        }        if(!model->MOS9etaGiven) {            model->MOS9eta = 0;        }        if(!model->MOS9thetaGiven) {            model->MOS9theta = 0;        }        if(!model->MOS9kappaGiven) {            model->MOS9kappa = .2;        }        if(!model->MOS9oxideThicknessGiven) {            model->MOS9oxideThickness = 1e-7;        } 	if(!model->MOS9fNcoefGiven) {	    model->MOS9fNcoef = 0;	}	if(!model->MOS9fNexpGiven) {	    model->MOS9fNexp = 1;	}        /* loop through all the instances of the model */        for (here = model->MOS9instances; here != NULL ;                here=here->MOS9nextInstance) {            CKTnode *tmpNode;            IFuid tmpName;            if (here->MOS9owner == ARCHme) {                /* allocate a chunk of the state vector */                here->MOS9states = *states;                *states += MOS9NUMSTATES;            }            if(!here->MOS9drainAreaGiven) {                here->MOS9drainArea = ckt->CKTdefaultMosAD;            }            if(!here->MOS9drainPerimiterGiven) {                here->MOS9drainPerimiter = 0;            }            if(!here->MOS9drainSquaresGiven) {                here->MOS9drainSquares = 1;            }            if(!here->MOS9icVBSGiven) {                here->MOS9icVBS = 0;            }            if(!here->MOS9icVDSGiven) {                here->MOS9icVDS = 0;            }            if(!here->MOS9icVGSGiven) {                here->MOS9icVGS = 0;            }            if(!here->MOS9sourcePerimiterGiven) {                here->MOS9sourcePerimiter = 0;            }            if(!here->MOS9sourceSquaresGiven) {                here->MOS9sourceSquares = 1;            }            if(!here->MOS9vdsatGiven) {                here->MOS9vdsat = 0;            }            if(!here->MOS9vonGiven) {                here->MOS9von = 0;            }            if(!here->MOS9modeGiven) {                here->MOS9mode = 1;            }            if((model->MOS9drainResistance != 0 ||                    (model->MOS9sheetResistance != 0 &&                     here->MOS9drainSquares != 0      ) )  &&                     here->MOS9dNodePrime==0) {                error = CKTmkVolt(ckt,&tmp,here->MOS9name,"internal#drain");                if(error) return(error);                here->MOS9dNodePrime = tmp->number;                if (ckt->CKTcopyNodesets) {                  if (CKTinst2Node(ckt,here,1,&tmpNode,&tmpName)==OK) {                     if (tmpNode->nsGiven) {                       tmp->nodeset=tmpNode->nodeset;                        tmp->nsGiven=tmpNode->nsGiven;                      }                  }                }            } else {                here->MOS9dNodePrime = here->MOS9dNode;            }            if((model->MOS9sourceResistance != 0 ||                    (model->MOS9sheetResistance != 0 &&                      here->MOS9sourceSquares != 0     ) ) &&                    here->MOS9sNodePrime==0) {                error = CKTmkVolt(ckt,&tmp,here->MOS9name,"internal#source");                if(error) return(error);                here->MOS9sNodePrime = tmp->number;                if (ckt->CKTcopyNodesets) {                  if (CKTinst2Node(ckt,here,3,&tmpNode,&tmpName)==OK) {                     if (tmpNode->nsGiven) {                       tmp->nodeset=tmpNode->nodeset;                        tmp->nsGiven=tmpNode->nsGiven;                      }                  }                }            } else {                here->MOS9sNodePrime = here->MOS9sNode;            }/* 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(MOS9DdPtr, MOS9dNode, MOS9dNode)            TSTALLOC(MOS9GgPtr, MOS9gNode, MOS9gNode)            TSTALLOC(MOS9SsPtr, MOS9sNode, MOS9sNode)            TSTALLOC(MOS9BbPtr, MOS9bNode, MOS9bNode)            TSTALLOC(MOS9DPdpPtr, MOS9dNodePrime, MOS9dNodePrime)            TSTALLOC(MOS9SPspPtr, MOS9sNodePrime, MOS9sNodePrime)            TSTALLOC(MOS9DdpPtr, MOS9dNode, MOS9dNodePrime)            TSTALLOC(MOS9GbPtr, MOS9gNode, MOS9bNode)            TSTALLOC(MOS9GdpPtr, MOS9gNode, MOS9dNodePrime)            TSTALLOC(MOS9GspPtr, MOS9gNode, MOS9sNodePrime)            TSTALLOC(MOS9SspPtr, MOS9sNode, MOS9sNodePrime)            TSTALLOC(MOS9BdpPtr, MOS9bNode, MOS9dNodePrime)            TSTALLOC(MOS9BspPtr, MOS9bNode, MOS9sNodePrime)            TSTALLOC(MOS9DPspPtr, MOS9dNodePrime, MOS9sNodePrime)            TSTALLOC(MOS9DPdPtr, MOS9dNodePrime, MOS9dNode)            TSTALLOC(MOS9BgPtr, MOS9bNode, MOS9gNode)            TSTALLOC(MOS9DPgPtr, MOS9dNodePrime, MOS9gNode)            TSTALLOC(MOS9SPgPtr, MOS9sNodePrime, MOS9gNode)            TSTALLOC(MOS9SPsPtr, MOS9sNodePrime, MOS9sNode)            TSTALLOC(MOS9DPbPtr, MOS9dNodePrime, MOS9bNode)            TSTALLOC(MOS9SPbPtr, MOS9sNodePrime, MOS9bNode)            TSTALLOC(MOS9SPdpPtr, MOS9sNodePrime, MOS9dNodePrime)        }    }    return(OK);}intMOS9unsetup(GENmodel *inModel, CKTcircuit *ckt){    MOS9model *model;    MOS9instance *here;    for (model = (MOS9model *)inModel; model != NULL;	    model = model->MOS9nextModel)    {        for (here = model->MOS9instances; here != NULL;                here=here->MOS9nextInstance)	{	    if (here->MOS9dNodePrime		    && here->MOS9dNodePrime != here->MOS9dNode)	    {		CKTdltNNum(ckt, here->MOS9dNodePrime);		here->MOS9dNodePrime= 0;	    }	    if (here->MOS9sNodePrime		    && here->MOS9sNodePrime != here->MOS9sNode)	    {		CKTdltNNum(ckt, here->MOS9sNodePrime);		here->MOS9sNodePrime= 0;	    }	}    }    return OK;}

⌨️ 快捷键说明

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