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

📄 mos9temp.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 "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)intMOS9temp(GENmodel *inModel, CKTcircuit *ckt){    MOS9model *model = (MOS9model *)inModel;    MOS9instance *here;    double wkfngs;    double wkfng;    double fermig;    double fermis;    double vfb;    double fact1,fact2;    double vt,vtnom;    double kt,kt1;    double ratio,ratio4;    double egfet,egfet1;    double pbfact,pbfact1,pbo;    double phio;    double arg1;    double capfact;    double gmanew,gmaold;    double ni_temp, nifact;    /* loop through all the mosfet models */    for( ; model != NULL; model = model->MOS9nextModel) {                if(!model->MOS9tnomGiven) {            model->MOS9tnom = ckt->CKTnomTemp;        }        fact1 = model->MOS9tnom/REFTEMP;        vtnom = model->MOS9tnom*CONSTKoverQ;        kt1 = CONSTboltz * model->MOS9tnom;        egfet1 = 1.16-(7.02e-4*model->MOS9tnom*model->MOS9tnom)/                (model->MOS9tnom+1108);        arg1 = -egfet1/(kt1+kt1)+1.1150877/(CONSTboltz*(REFTEMP+REFTEMP));        pbfact1 = -2*vtnom *(1.5*log(fact1)+CHARGE*arg1);        nifact=(model->MOS9tnom/300)*sqrt(model->MOS9tnom/300);        nifact*=exp(0.5*egfet1*((1/(double)300)-(1/model->MOS9tnom))/                                                                  CONSTKoverQ);        ni_temp=1.45e16*nifact;
          model->MOS9oxideCapFactor = 3.9 * 8.854214871e-12/                model->MOS9oxideThickness;        if(!model->MOS9surfaceMobilityGiven) model->MOS9surfaceMobility=600;        if(!model->MOS9transconductanceGiven) {            model->MOS9transconductance = model->MOS9surfaceMobility *                    model->MOS9oxideCapFactor * 1e-4;        }        if(model->MOS9substrateDopingGiven) {            if(model->MOS9substrateDoping*1e6 /*(cm**3/m**3)*/ >ni_temp) {                if(!model->MOS9phiGiven) {                    model->MOS9phi = 2*vtnom*                            log(model->MOS9substrateDoping*                            1e6/*(cm**3/m**3)*//ni_temp);                    model->MOS9phi = MAX(.1,model->MOS9phi);                }                fermis = model->MOS9type * .5 * model->MOS9phi;                wkfng = 3.2;                if(!model->MOS9gateTypeGiven) model->MOS9gateType=1;                if(model->MOS9gateType != 0) {                    fermig = model->MOS9type * model->MOS9gateType*.5*egfet1;                    wkfng = 3.25 + .5 * egfet1 - fermig;                }                wkfngs = wkfng - (3.25 + .5 * egfet1 +fermis);                if(!model->MOS9gammaGiven) {                    model->MOS9gamma = sqrt(2 * EPSSIL *                        CHARGE * model->MOS9substrateDoping*                        1e6 /*(cm**3/m**3)*/ )/ model->MOS9oxideCapFactor;                }                if(!model->MOS9vt0Given) {                    if(!model->MOS9surfaceStateDensityGiven)                             model->MOS9surfaceStateDensity=0;                    vfb = wkfngs - model->MOS9surfaceStateDensity * 1e4                             * CHARGE/model->MOS9oxideCapFactor;                    model->MOS9vt0 = vfb + model->MOS9type *                             (model->MOS9gamma * sqrt(model->MOS9phi)+                             model->MOS9phi);                } else {                    vfb = model->MOS9vt0 - model->MOS9type * (model->MOS9gamma*                        sqrt(model->MOS9phi)+model->MOS9phi);                }                model->MOS9alpha = (EPSSIL+EPSSIL)/                    (CHARGE*model->MOS9substrateDoping*1e6 /*(cm**3/m**3)*/ );                model->MOS9coeffDepLayWidth = sqrt(model->MOS9alpha);            } else {                model->MOS9substrateDoping = 0;                (*(SPfrontEnd->IFerror))(ERR_FATAL,                        "%s: Nsub < Ni ",&(model->MOS9modName));                return(E_BADPARM);            }        }    /* now model parameter preprocessing */        model->MOS9narrowFactor = model->MOS9delta * 0.5 * M_PI * EPSSIL /             model->MOS9oxideCapFactor ;            /* loop through all instances of the model */        for(here = model->MOS9instances; here!= NULL;                 here = here->MOS9nextInstance) {            double czbd;    /* zero voltage bulk-drain capacitance */            double czbdsw;  /* zero voltage bulk-drain sidewall capacitance */            double czbs;    /* zero voltage bulk-source capacitance */            double czbssw;  /* zero voltage bulk-source sidewall capacitance */            double arg;     /* 1 - fc */            double sarg;    /* (1-fc) ^^ (-mj) */            double sargsw;  /* (1-fc) ^^ (-mjsw) */            if (here->MOS9owner != ARCHme) continue;            /* perform the parameter defaulting */             if(!here->MOS9dtempGiven) {                here->MOS9dtemp = 0.0;            }            if(!here->MOS9tempGiven) {                here->MOS9temp = ckt->CKTtemp + here->MOS9dtemp;            }            vt = here->MOS9temp * CONSTKoverQ;            ratio = here->MOS9temp/model->MOS9tnom;            fact2 = here->MOS9temp/REFTEMP;            kt = here->MOS9temp * CONSTboltz;            egfet = 1.16-(7.02e-4*here->MOS9temp*here->MOS9temp)/                    (here->MOS9temp+1108);            arg = -egfet/(kt+kt)+1.1150877/(CONSTboltz*(REFTEMP+REFTEMP));            pbfact = -2*vt *(1.5*log(fact2)+CHARGE*arg);            if(!here->MOS9mGiven) {                here->MOS9m = ckt->CKTdefaultMosM;            }            if(!here->MOS9lGiven) {                here->MOS9l = ckt->CKTdefaultMosL;            }            if(!here->MOS9sourceAreaGiven) {                here->MOS9sourceArea = ckt->CKTdefaultMosAS;            }            if(!here->MOS9wGiven) {                here->MOS9w = ckt->CKTdefaultMosW;            }            if(model->MOS9drainResistanceGiven) {                if(model->MOS9drainResistance != 0) {                    here->MOS9drainConductance = here->MOS9m /                                                   model->MOS9drainResistance;                } else {                    here->MOS9drainConductance = 0;                }            } else if (model->MOS9sheetResistanceGiven) {                if ((model->MOS9sheetResistance != 0) &&                                              (here->MOS9drainSquares != 0)) {                    here->MOS9drainConductance =                         here->MOS9m /                          (model->MOS9sheetResistance*here->MOS9drainSquares);                } else {                    here->MOS9drainConductance = 0;                }            } else {                here->MOS9drainConductance = 0;            }            if(model->MOS9sourceResistanceGiven) {                if(model->MOS9sourceResistance != 0) {                    here->MOS9sourceConductance = here->MOS9m /                                                    model->MOS9sourceResistance;                } else {                    here->MOS9sourceConductance = 0;                }            } else if (model->MOS9sheetResistanceGiven) {                if ((model->MOS9sheetResistance != 0) &&                                              (here->MOS9sourceSquares != 0)) {                    here->MOS9sourceConductance =                         here->MOS9m /                          (model->MOS9sheetResistance*here->MOS9sourceSquares);                } else {                    here->MOS9sourceConductance = 0;                }            } else {                here->MOS9sourceConductance = 0;            }            if(here->MOS9l - 2 * model->MOS9latDiff +                                 model->MOS9lengthAdjust <1e-6) {                (*(SPfrontEnd->IFerror))(ERR_FATAL,                        "%s: effective channel length less than zero",                        &(here->MOS9name));                return(E_PARMVAL);            }            if(here->MOS9w - 2 * model->MOS9widthNarrow +                                 model->MOS9widthAdjust <1e-6) {                (*(SPfrontEnd->IFerror))(ERR_FATAL,                        "%s: effective channel width less than zero",                        &(here->MOS9name));                return(E_PARMVAL);            }            ratio4 = ratio * sqrt(ratio);            here->MOS9tTransconductance = model->MOS9transconductance / ratio4;            here->MOS9tSurfMob = model->MOS9surfaceMobility/ratio4;            phio= (model->MOS9phi-pbfact1)/fact1;            here->MOS9tPhi = fact2 * phio + pbfact;            here->MOS9tVbi =                     model->MOS9delvt0 +                    model->MOS9vt0 - model->MOS9type *                         (model->MOS9gamma* sqrt(model->MOS9phi))                    +.5*(egfet1-egfet)                     + model->MOS9type*.5* (here->MOS9tPhi-model->MOS9phi);            here->MOS9tVto = here->MOS9tVbi + model->MOS9type *                     model->MOS9gamma * sqrt(here->MOS9tPhi);            here->MOS9tSatCur = model->MOS9jctSatCur*                     exp(-egfet/vt+egfet1/vtnom);            here->MOS9tSatCurDens = model->MOS9jctSatCurDensity *                    exp(-egfet/vt+egfet1/vtnom);            pbo = (model->MOS9bulkJctPotential - pbfact1)/fact1;            gmaold = (model->MOS9bulkJctPotential-pbo)/pbo;            capfact = 1/(1+model->MOS9bulkJctBotGradingCoeff*                    (4e-4*(model->MOS9tnom-REFTEMP)-gmaold));            here->MOS9tCbd = model->MOS9capBD * capfact;            here->MOS9tCbs = model->MOS9capBS * capfact;            here->MOS9tCj = model->MOS9bulkCapFactor * capfact;            capfact = 1/(1+model->MOS9bulkJctSideGradingCoeff*                    (4e-4*(model->MOS9tnom-REFTEMP)-gmaold));            here->MOS9tCjsw = model->MOS9sideWallCapFactor * capfact;            here->MOS9tBulkPot = fact2 * pbo+pbfact;            gmanew = (here->MOS9tBulkPot-pbo)/pbo;            capfact = (1+model->MOS9bulkJctBotGradingCoeff*                    (4e-4*(here->MOS9temp-REFTEMP)-gmanew));            here->MOS9tCbd *= capfact;            here->MOS9tCbs *= capfact;            here->MOS9tCj *= capfact;            capfact = (1+model->MOS9bulkJctSideGradingCoeff*                    (4e-4*(here->MOS9temp-REFTEMP)-gmanew));            here->MOS9tCjsw *= capfact;            here->MOS9tDepCap = model->MOS9fwdCapDepCoeff * here->MOS9tBulkPot;            if( (model->MOS9jctSatCurDensity == 0) ||                    (here->MOS9drainArea == 0) ||                    (here->MOS9sourceArea == 0) ) {                here->MOS9sourceVcrit = here->MOS9drainVcrit =                       vt*log(vt/(CONSTroot2*here->MOS9m*here->MOS9tSatCur));            } else {                here->MOS9drainVcrit =                        vt * log( vt / (CONSTroot2 *                        here->MOS9m *                        here->MOS9tSatCurDens * here->MOS9drainArea));                here->MOS9sourceVcrit =                        vt * log( vt / (CONSTroot2 *                        here->MOS9m *                        here->MOS9tSatCurDens * here->MOS9sourceArea));            }            if(model->MOS9capBDGiven) {                czbd = here->MOS9tCbd * here->MOS9m;            } else {                if(model->MOS9bulkCapFactorGiven) {                    czbd=here->MOS9tCj*here->MOS9drainArea * here->MOS9m;                } else {                    czbd=0;                }            }            if(model->MOS9sideWallCapFactorGiven) {                czbdsw= here->MOS9tCjsw * here->MOS9drainPerimiter *                         here->MOS9m;            } else {                czbdsw=0;            }            arg = 1-model->MOS9fwdCapDepCoeff;            sarg = exp( (-model->MOS9bulkJctBotGradingCoeff) * log(arg) );            sargsw = exp( (-model->MOS9bulkJctSideGradingCoeff) * log(arg) );            here->MOS9Cbd = czbd;            here->MOS9Cbdsw = czbdsw;            here->MOS9f2d = czbd*(1-model->MOS9fwdCapDepCoeff*                        (1+model->MOS9bulkJctBotGradingCoeff))* sarg/arg                    +  czbdsw*(1-model->MOS9fwdCapDepCoeff*                        (1+model->MOS9bulkJctSideGradingCoeff))*                        sargsw/arg;            here->MOS9f3d = czbd * model->MOS9bulkJctBotGradingCoeff * sarg/arg/                        here->MOS9tBulkPot                    + czbdsw * model->MOS9bulkJctSideGradingCoeff * sargsw/arg /                        here->MOS9tBulkPot;            here->MOS9f4d = czbd*here->MOS9tBulkPot*(1-arg*sarg)/                        (1-model->MOS9bulkJctBotGradingCoeff)                    + czbdsw*here->MOS9tBulkPot*(1-arg*sargsw)/                        (1-model->MOS9bulkJctSideGradingCoeff)                    -here->MOS9f3d/2*                        (here->MOS9tDepCap*here->MOS9tDepCap)                    -here->MOS9tDepCap * here->MOS9f2d;            if(model->MOS9capBSGiven) {                czbs = here->MOS9tCbs * here->MOS9m;            } else {                if(model->MOS9bulkCapFactorGiven) {                    czbs=here->MOS9tCj*here->MOS9sourceArea * here->MOS9m;                } else {                    czbs=0;                }            }            if(model->MOS9sideWallCapFactorGiven) {                czbssw = here->MOS9tCjsw * here->MOS9sourcePerimiter *                         here->MOS9m;            } else {                czbssw=0;            }            arg = 1-model->MOS9fwdCapDepCoeff;            sarg = exp( (-model->MOS9bulkJctBotGradingCoeff) * log(arg) );            sargsw = exp( (-model->MOS9bulkJctSideGradingCoeff) * log(arg) );            here->MOS9Cbs = czbs;            here->MOS9Cbssw = czbssw;            here->MOS9f2s = czbs*(1-model->MOS9fwdCapDepCoeff*                        (1+model->MOS9bulkJctBotGradingCoeff))* sarg/arg                    +  czbssw*(1-model->MOS9fwdCapDepCoeff*                        (1+model->MOS9bulkJctSideGradingCoeff))*                        sargsw/arg;            here->MOS9f3s = czbs * model->MOS9bulkJctBotGradingCoeff * sarg/arg/                        here->MOS9tBulkPot                    + czbssw * model->MOS9bulkJctSideGradingCoeff * sargsw/arg /                        here->MOS9tBulkPot;            here->MOS9f4s = czbs*here->MOS9tBulkPot*(1-arg*sarg)/                        (1-model->MOS9bulkJctBotGradingCoeff)                    + czbssw*here->MOS9tBulkPot*(1-arg*sargsw)/                        (1-model->MOS9bulkJctSideGradingCoeff)                    -here->MOS9f3s/2*                        (here->MOS9tDepCap*here->MOS9tDepCap)                    -here->MOS9tDepCap * here->MOS9f2s;        }    }    return(OK);}

⌨️ 快捷键说明

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