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

📄 mos3temp.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 "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)intMOS3temp(inModel,ckt)    GENmodel *inModel;    register CKTcircuit *ckt;{    register MOS3model *model = (MOS3model *)inModel;    register MOS3instance *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;    /* loop through all the mosfet models */    for( ; model != NULL; model = model->MOS3nextModel) {                if(!model->MOS3tnomGiven) {            model->MOS3tnom = ckt->CKTnomTemp;        }        fact1 = model->MOS3tnom/REFTEMP;        vtnom = model->MOS3tnom*CONSTKoverQ;        kt1 = CONSTboltz * model->MOS3tnom;        egfet1 = 1.16-(7.02e-4*model->MOS3tnom*model->MOS3tnom)/                (model->MOS3tnom+1108);        arg1 = -egfet1/(kt1+kt1)+1.1150877/(CONSTboltz*(REFTEMP+REFTEMP));        pbfact1 = -2*vtnom *(1.5*log(fact1)+CHARGE*arg1);        model->MOS3oxideCapFactor = 3.9 * 8.854214871e-12/                model->MOS3oxideThickness;        if(!model->MOS3surfaceMobilityGiven) model->MOS3surfaceMobility=600;        if(!model->MOS3transconductanceGiven) {            model->MOS3transconductance = model->MOS3surfaceMobility *                    model->MOS3oxideCapFactor * 1e-4;        }        if(model->MOS3substrateDopingGiven) {            if(model->MOS3substrateDoping*1e6 /*(cm**3/m**3)*/ >1.45e16) {                if(!model->MOS3phiGiven) {                    model->MOS3phi = 2*vtnom*                            log(model->MOS3substrateDoping*                            1e6/*(cm**3/m**3)*//1.45e16);                    model->MOS3phi = MAX(.1,model->MOS3phi);                }                fermis = model->MOS3type * .5 * model->MOS3phi;                wkfng = 3.2;                if(!model->MOS3gateTypeGiven) model->MOS3gateType=1;                if(model->MOS3gateType != 0) {                    fermig = model->MOS3type * model->MOS3gateType*.5*egfet1;                    wkfng = 3.25 + .5 * egfet1 - fermig;                }                wkfngs = wkfng - (3.25 + .5 * egfet1 +fermis);                if(!model->MOS3gammaGiven) {                    model->MOS3gamma = sqrt(2 * EPSSIL *                        CHARGE * model->MOS3substrateDoping*                        1e6 /*(cm**3/m**3)*/ )/ model->MOS3oxideCapFactor;                }                if(!model->MOS3vt0Given) {                    if(!model->MOS3surfaceStateDensityGiven)                             model->MOS3surfaceStateDensity=0;                    vfb = wkfngs - model->MOS3surfaceStateDensity * 1e4                             * CHARGE/model->MOS3oxideCapFactor;                    model->MOS3vt0 = vfb + model->MOS3type *                             (model->MOS3gamma * sqrt(model->MOS3phi)+                             model->MOS3phi);                } else {                    vfb = model->MOS3vt0 - model->MOS3type * (model->MOS3gamma*                        sqrt(model->MOS3phi)+model->MOS3phi);                }                model->MOS3alpha = (EPSSIL+EPSSIL)/                    (CHARGE*model->MOS3substrateDoping*1e6 /*(cm**3/m**3)*/ );                model->MOS3coeffDepLayWidth = sqrt(model->MOS3alpha);            } else {                model->MOS3substrateDoping = 0;                (*(SPfrontEnd->IFerror))(ERR_FATAL,                        "%s: Nsub < Ni ",&(model->MOS3modName));                return(E_BADPARM);            }        }    /* now model parameter preprocessing */        model->MOS3narrowFactor = model->MOS3delta * 0.5 * M_PI * EPSSIL /             model->MOS3oxideCapFactor ;            /* loop through all instances of the model */        for(here = model->MOS3instances; here!= NULL;                 here = here->MOS3nextInstance) {            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) */            /* perform the parameter defaulting */            if(!here->MOS3tempGiven) {                here->MOS3temp = ckt->CKTtemp;            }            vt = here->MOS3temp * CONSTKoverQ;            ratio = here->MOS3temp/model->MOS3tnom;            fact2 = here->MOS3temp/REFTEMP;            kt = here->MOS3temp * CONSTboltz;            egfet = 1.16-(7.02e-4*here->MOS3temp*here->MOS3temp)/                    (here->MOS3temp+1108);            arg = -egfet/(kt+kt)+1.1150877/(CONSTboltz*(REFTEMP+REFTEMP));            pbfact = -2*vt *(1.5*log(fact2)+CHARGE*arg);            if(!here->MOS3lGiven) {                here->MOS3l = ckt->CKTdefaultMosL;            }            if(!here->MOS3sourceAreaGiven) {                here->MOS3sourceArea = ckt->CKTdefaultMosAS;            }            if(!here->MOS3wGiven) {                here->MOS3w = ckt->CKTdefaultMosW;            }            if(model->MOS3drainResistanceGiven) {                if(model->MOS3drainResistance != 0) {                    here->MOS3drainConductance = 1/model->MOS3drainResistance;                } else {                    here->MOS3drainConductance = 0;                }            } else if (model->MOS3sheetResistanceGiven) {                if(model->MOS3sheetResistance != 0) {                    here->MOS3drainConductance =                         1/(model->MOS3sheetResistance*here->MOS3drainSquares);                } else {                    here->MOS3drainConductance = 0;                }            } else {                here->MOS3drainConductance = 0;            }            if(model->MOS3sourceResistanceGiven) {                if(model->MOS3sourceResistance != 0) {                    here->MOS3sourceConductance = 1/model->MOS3sourceResistance;                } else {                    here->MOS3sourceConductance = 0;                }            } else if (model->MOS3sheetResistanceGiven) {                if(model->MOS3sheetResistance != 0) {                    here->MOS3sourceConductance =                         1/(model->MOS3sheetResistance*here->MOS3sourceSquares);                } else {                    here->MOS3sourceConductance = 0;                }            } else {                here->MOS3sourceConductance = 0;            }            if(here->MOS3l - 2 * model->MOS3latDiff <=0) {                (*(SPfrontEnd->IFerror))(ERR_FATAL,                        "%s: effective channel length less than zero",                        &(here->MOS3name));                return(E_BADPARM);            }            ratio4 = ratio * sqrt(ratio);            here->MOS3tTransconductance = model->MOS3transconductance / ratio4;            here->MOS3tSurfMob = model->MOS3surfaceMobility/ratio4;            phio= (model->MOS3phi-pbfact1)/fact1;            here->MOS3tPhi = fact2 * phio + pbfact;            here->MOS3tVbi =                     model->MOS3vt0 - model->MOS3type *                         (model->MOS3gamma* sqrt(model->MOS3phi))                    +.5*(egfet1-egfet)                     + model->MOS3type*.5* (here->MOS3tPhi-model->MOS3phi);            here->MOS3tVto = here->MOS3tVbi + model->MOS3type *                     model->MOS3gamma * sqrt(here->MOS3tPhi);            here->MOS3tSatCur = model->MOS3jctSatCur*                     exp(-egfet/vt+egfet1/vtnom);            here->MOS3tSatCurDens = model->MOS3jctSatCurDensity *                    exp(-egfet/vt+egfet1/vtnom);            pbo = (model->MOS3bulkJctPotential - pbfact1)/fact1;            gmaold = (model->MOS3bulkJctPotential-pbo)/pbo;            capfact = 1/(1+model->MOS3bulkJctBotGradingCoeff*                    (4e-4*(model->MOS3tnom-REFTEMP)-gmaold));            here->MOS3tCbd = model->MOS3capBD * capfact;            here->MOS3tCbs = model->MOS3capBS * capfact;            here->MOS3tCj = model->MOS3bulkCapFactor * capfact;            capfact = 1/(1+model->MOS3bulkJctSideGradingCoeff*                    (4e-4*(model->MOS3tnom-REFTEMP)-gmaold));            here->MOS3tCjsw = model->MOS3sideWallCapFactor * capfact;            here->MOS3tBulkPot = fact2 * pbo+pbfact;            gmanew = (here->MOS3tBulkPot-pbo)/pbo;            capfact = (1+model->MOS3bulkJctBotGradingCoeff*                    (4e-4*(here->MOS3temp-REFTEMP)-gmanew));            here->MOS3tCbd *= capfact;            here->MOS3tCbs *= capfact;            here->MOS3tCj *= capfact;            capfact = (1+model->MOS3bulkJctSideGradingCoeff*                    (4e-4*(here->MOS3temp-REFTEMP)-gmanew));            here->MOS3tCjsw *= capfact;            here->MOS3tDepCap = model->MOS3fwdCapDepCoeff * here->MOS3tBulkPot;            if( (model->MOS3jctSatCurDensity == 0) ||                    (here->MOS3drainArea == 0) ||                    (here->MOS3sourceArea == 0) ) {                here->MOS3sourceVcrit = here->MOS3drainVcrit =                        vt*log(vt/(CONSTroot2*model->MOS3jctSatCur));            } else {                here->MOS3drainVcrit =                        vt * log( vt / (CONSTroot2 *                        model->MOS3jctSatCurDensity * here->MOS3drainArea));                here->MOS3sourceVcrit =                        vt * log( vt / (CONSTroot2 *                        model->MOS3jctSatCurDensity * here->MOS3sourceArea));            }            if(model->MOS3capBDGiven) {                czbd = here->MOS3tCbd;            } else {                if(model->MOS3bulkCapFactorGiven) {                    czbd=here->MOS3tCj*here->MOS3drainArea;                } else {                    czbd=0;                }            }            if(model->MOS3sideWallCapFactorGiven) {                czbdsw= here->MOS3tCjsw * here->MOS3drainPerimiter;            } else {                czbdsw=0;            }            arg = 1-model->MOS3fwdCapDepCoeff;            sarg = exp( (-model->MOS3bulkJctBotGradingCoeff) * log(arg) );            sargsw = exp( (-model->MOS3bulkJctSideGradingCoeff) * log(arg) );            here->MOS3Cbd = czbd;            here->MOS3Cbdsw = czbdsw;            here->MOS3f2d = czbd*(1-model->MOS3fwdCapDepCoeff*                        (1+model->MOS3bulkJctBotGradingCoeff))* sarg/arg                    +  czbdsw*(1-model->MOS3fwdCapDepCoeff*                        (1+model->MOS3bulkJctSideGradingCoeff))*                        sargsw/arg;            here->MOS3f3d = czbd * model->MOS3bulkJctBotGradingCoeff * sarg/arg/                        model->MOS3bulkJctPotential                    + czbdsw * model->MOS3bulkJctSideGradingCoeff * sargsw/arg /                        model->MOS3bulkJctPotential;            here->MOS3f4d = czbd*model->MOS3bulkJctPotential*(1-arg*sarg)/                        (1-model->MOS3bulkJctBotGradingCoeff)                    + czbdsw*model->MOS3bulkJctPotential*(1-arg*sargsw)/                        (1-model->MOS3bulkJctSideGradingCoeff)                    -here->MOS3f3d/2*                        (here->MOS3tDepCap*here->MOS3tDepCap)                    -here->MOS3tDepCap * here->MOS3f2d;            if(model->MOS3capBSGiven) {                czbs=here->MOS3tCbs;            } else {                if(model->MOS3bulkCapFactorGiven) {                    czbs=here->MOS3tCj*here->MOS3sourceArea;                } else {                    czbs=0;                }            }            if(model->MOS3sideWallCapFactorGiven) {                czbssw = here->MOS3tCjsw * here->MOS3sourcePerimiter;            } else {                czbssw=0;            }            arg = 1-model->MOS3fwdCapDepCoeff;            sarg = exp( (-model->MOS3bulkJctBotGradingCoeff) * log(arg) );            sargsw = exp( (-model->MOS3bulkJctSideGradingCoeff) * log(arg) );            here->MOS3Cbs = czbs;            here->MOS3Cbssw = czbssw;            here->MOS3f2s = czbs*(1-model->MOS3fwdCapDepCoeff*                        (1+model->MOS3bulkJctBotGradingCoeff))* sarg/arg                    +  czbssw*(1-model->MOS3fwdCapDepCoeff*                        (1+model->MOS3bulkJctSideGradingCoeff))*                        sargsw/arg;            here->MOS3f3s = czbs * model->MOS3bulkJctBotGradingCoeff * sarg/arg/                        model->MOS3bulkJctPotential                    + czbssw * model->MOS3bulkJctSideGradingCoeff * sargsw/arg /                        model->MOS3bulkJctPotential;            here->MOS3f4s = czbs*model->MOS3bulkJctPotential*(1-arg*sarg)/                        (1-model->MOS3bulkJctBotGradingCoeff)                    + czbssw*model->MOS3bulkJctPotential*(1-arg*sargsw)/                        (1-model->MOS3bulkJctSideGradingCoeff)                    -here->MOS3f3s/2*                        (here->MOS3tBulkPot*here->MOS3tBulkPot)                    -here->MOS3tBulkPot * here->MOS3f2s;        }    }    return(OK);}

⌨️ 快捷键说明

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