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

📄 mos2temp.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 "mos2defs.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)intMOS2temp(inModel,ckt)    GENmodel *inModel;    register CKTcircuit *ckt;{    register MOS2model *model = (MOS2model *)inModel;    register MOS2instance *here;    double egfet;    double wkfngs;    double wkfng;    double fermig;    double fermis;    double vfb;    double fact1,fact2;    double vt,vtnom;    double kt,kt1;    double egfet1;    double arg1;    double pbfact,pbfact1;    double ratio,ratio4;    double phio;    double pbo;    double gmaold,gmanew;    double capfact;    /* loop through all the resistor models */    for( ; model != NULL; model = model->MOS2nextModel) {                /* perform model defaulting */    /* now model parameter preprocessing */        if(!model->MOS2tnomGiven) {            model->MOS2tnom = ckt->CKTnomTemp;        }        fact1 = model->MOS2tnom/REFTEMP;        vtnom = model->MOS2tnom*CONSTKoverQ;        kt1 = CONSTboltz * model->MOS2tnom;        egfet1 = 1.16-(7.02e-4*model->MOS2tnom*model->MOS2tnom)/                (model->MOS2tnom+1108);        arg1 = -egfet1/(kt1+kt1)+1.1150877/(CONSTboltz*(REFTEMP+REFTEMP));        pbfact1 = -2*vtnom *(1.5*log(fact1)+CHARGE*arg1);        if(!model->MOS2oxideThicknessGiven) {            model->MOS2oxideThickness = 1e-7;        }         model->MOS2oxideCapFactor = 3.9 * 8.854214871e-12/                model->MOS2oxideThickness;        if(!model->MOS2surfaceMobilityGiven) model->MOS2surfaceMobility=600;        if(!model->MOS2transconductanceGiven) {            model->MOS2transconductance = model->MOS2surfaceMobility                  * 1e-4 /*(m**2/cm**2) */ * model->MOS2oxideCapFactor;        }        if(model->MOS2substrateDopingGiven) {            if(model->MOS2substrateDoping *1e6 /*(cm**3/m**3)*/ >1.45e16) {                if(!model->MOS2phiGiven) {                    model->MOS2phi = 2*vtnom*                            log(model->MOS2substrateDoping*                            1e6 /*(cm**3/m**3)*//1.45e16);                    model->MOS2phi = MAX(.1,model->MOS2phi);                }                fermis = model->MOS2type * .5 * model->MOS2phi;                wkfng = 3.2;                if(!model->MOS2gateTypeGiven) model->MOS2gateType=1;                if(model->MOS2gateType != 0) {                    fermig = model->MOS2type * model->MOS2gateType*.5*egfet1;                    wkfng = 3.25 + .5 * egfet1 - fermig;                }                wkfngs = wkfng - (3.25 + .5 * egfet1 +fermis);                if(!model->MOS2gammaGiven) {                    model->MOS2gamma = sqrt(2 * 11.70 * 8.854214871e-12 *                         CHARGE * model->MOS2substrateDoping *                        1e6 /*(cm**3/m**3)*/)/model->MOS2oxideCapFactor;                }                if(!model->MOS2vt0Given) {                    if(!model->MOS2surfaceStateDensityGiven)                             model->MOS2surfaceStateDensity=0;                    vfb = wkfngs -                         model->MOS2surfaceStateDensity *                         1e4 /*(cm**2/m**2)*/ * CHARGE/model->MOS2oxideCapFactor;                    model->MOS2vt0 = vfb + model->MOS2type *                             (model->MOS2gamma * sqrt(model->MOS2phi)+                            model->MOS2phi);                } else {                    vfb = model->MOS2vt0 - model->MOS2type * (model->MOS2gamma*                        sqrt(model->MOS2phi)+model->MOS2phi);                }                model->MOS2xd = sqrt((EPSSIL+EPSSIL)/                    (CHARGE*model->MOS2substrateDoping *1e6 /*(cm**3/m**3)*/));            } else {                model->MOS2substrateDoping = 0;                (*(SPfrontEnd->IFerror))(ERR_FATAL,"%s: Nsub < Ni",                        &(model->MOS2modName));                return(E_BADPARM);            }        }        if(!model->MOS2bulkCapFactorGiven) {            model->MOS2bulkCapFactor = sqrt(EPSSIL*CHARGE*                model->MOS2substrateDoping* 1e6 /*cm**3/m**3*/                /(2*model->MOS2bulkJctPotential));        }                /* loop through all instances of the model */        for(here = model->MOS2instances; here!= NULL;                 here = here->MOS2nextInstance) {            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->MOS2tempGiven) {                here->MOS2temp = ckt->CKTtemp;            }            here->MOS2mode = 1;            here->MOS2von = 0;            vt = here->MOS2temp * CONSTKoverQ;            ratio = here->MOS2temp/model->MOS2tnom;            fact2 = here->MOS2temp/REFTEMP;            kt = here->MOS2temp * CONSTboltz;            egfet = 1.16-(7.02e-4*here->MOS2temp*here->MOS2temp)/                    (here->MOS2temp+1108);            arg = -egfet/(kt+kt)+1.1150877/(CONSTboltz*(REFTEMP+REFTEMP));            pbfact = -2*vt *(1.5*log(fact2)+CHARGE*arg);            if(!here->MOS2drainAreaGiven) {                here->MOS2drainArea = ckt->CKTdefaultMosAD;            }            if(!here->MOS2lGiven) {                here->MOS2l = ckt->CKTdefaultMosL;            }            if(!here->MOS2sourceAreaGiven) {                here->MOS2sourceArea = ckt->CKTdefaultMosAS;            }            if(!here->MOS2wGiven) {                here->MOS2w = ckt->CKTdefaultMosW;            }            if(model->MOS2drainResistanceGiven) {                if(model->MOS2drainResistance != 0) {                    here->MOS2drainConductance = 1/model->MOS2drainResistance;                } else {                    here->MOS2drainConductance = 0;                }            } else if (model->MOS2sheetResistanceGiven) {                if(model->MOS2sheetResistance != 0) {                    here->MOS2drainConductance =                         1/(model->MOS2sheetResistance*here->MOS2drainSquares);                } else {                    here->MOS2drainConductance = 0;                }            } else {                here->MOS2drainConductance = 0;            }            if(model->MOS2sourceResistanceGiven) {                if(model->MOS2sourceResistance != 0) {                    here->MOS2sourceConductance = 1/model->MOS2sourceResistance;                } else {                    here->MOS2sourceConductance = 0;                }            } else if (model->MOS2sheetResistanceGiven) {                if(model->MOS2sheetResistance != 0) {                    here->MOS2sourceConductance =                         1/(model->MOS2sheetResistance*here->MOS2sourceSquares);                } else {                    here->MOS2sourceConductance = 0;                }            } else {                here->MOS2sourceConductance = 0;            }            if(here->MOS2l - 2 * model->MOS2latDiff <=0) {                (*(SPfrontEnd->IFerror))(ERR_WARNING,                        "%s: effective channel length less than zero",                        &(here->MOS2name));            }            ratio4 = ratio * sqrt(ratio);            here->MOS2tTransconductance = model->MOS2transconductance / ratio4;            here->MOS2tSurfMob = model->MOS2surfaceMobility/ratio4;            phio= (model->MOS2phi-pbfact1)/fact1;            here->MOS2tPhi = fact2 * phio + pbfact;            here->MOS2tVbi =                     model->MOS2vt0 - model->MOS2type *                         (model->MOS2gamma* sqrt(model->MOS2phi))                    +.5*(egfet1-egfet)                     + model->MOS2type*.5* (here->MOS2tPhi-model->MOS2phi);            here->MOS2tVto = here->MOS2tVbi + model->MOS2type *                     model->MOS2gamma * sqrt(here->MOS2tPhi);            here->MOS2tSatCur = model->MOS2jctSatCur*                     exp(-egfet/vt+egfet1/vtnom);            here->MOS2tSatCurDens = model->MOS2jctSatCurDensity *                    exp(-egfet/vt+egfet1/vtnom);            pbo = (model->MOS2bulkJctPotential - pbfact1)/fact1;            gmaold = (model->MOS2bulkJctPotential-pbo)/pbo;            capfact = 1/(1+model->MOS2bulkJctBotGradingCoeff*                    (4e-4*(model->MOS2tnom-REFTEMP)-gmaold));            here->MOS2tCbd = model->MOS2capBD * capfact;            here->MOS2tCbs = model->MOS2capBS * capfact;            here->MOS2tCj = model->MOS2bulkCapFactor * capfact;            capfact = 1/(1+model->MOS2bulkJctSideGradingCoeff*                    (4e-4*(model->MOS2tnom-REFTEMP)-gmaold));            here->MOS2tCjsw = model->MOS2sideWallCapFactor * capfact;            here->MOS2tBulkPot = fact2 * pbo+pbfact;            gmanew = (here->MOS2tBulkPot-pbo)/pbo;            capfact = (1+model->MOS2bulkJctBotGradingCoeff*                    (4e-4*(here->MOS2temp-REFTEMP)-gmanew));            here->MOS2tCbd *= capfact;            here->MOS2tCbs *= capfact;            here->MOS2tCj *= capfact;            capfact = (1+model->MOS2bulkJctSideGradingCoeff*                    (4e-4*(here->MOS2temp-REFTEMP)-gmanew));            here->MOS2tCjsw *= capfact;            here->MOS2tDepCap = model->MOS2fwdCapDepCoeff * here->MOS2tBulkPot;            if( (here->MOS2tSatCurDens == 0) ||                    (here->MOS2drainArea == 0) ||                    (here->MOS2sourceArea == 0) ) {                here->MOS2sourceVcrit = here->MOS2drainVcrit =                        vt*log(vt/(CONSTroot2*here->MOS2tSatCur));            } else {                here->MOS2drainVcrit =                        vt * log( vt / (CONSTroot2 *                        here->MOS2tSatCurDens * here->MOS2drainArea));                here->MOS2sourceVcrit =                        vt * log( vt / (CONSTroot2 *                        here->MOS2tSatCurDens * here->MOS2sourceArea));            }            if(model->MOS2capBDGiven) {                czbd = here->MOS2tCbd;            } else {                if(model->MOS2bulkCapFactorGiven) {                    czbd=here->MOS2tCj*here->MOS2drainArea;                } else {                    czbd=0;                }            }            if(model->MOS2sideWallCapFactorGiven) {                czbdsw= here->MOS2tCjsw * here->MOS2drainPerimiter;            } else {                czbdsw=0;            }            arg = 1-model->MOS2fwdCapDepCoeff;            sarg = exp( (-model->MOS2bulkJctBotGradingCoeff) * log(arg) );            sargsw = exp( (-model->MOS2bulkJctSideGradingCoeff) * log(arg) );            here->MOS2Cbd = czbd;            here->MOS2Cbdsw = czbdsw;            here->MOS2f2d = czbd*(1-model->MOS2fwdCapDepCoeff*                        (1+model->MOS2bulkJctBotGradingCoeff))* sarg/arg                    +  czbdsw*(1-model->MOS2fwdCapDepCoeff*                        (1+model->MOS2bulkJctSideGradingCoeff))*                        sargsw/arg;            here->MOS2f3d = czbd * model->MOS2bulkJctBotGradingCoeff * sarg/arg/                        here->MOS2tBulkPot                    + czbdsw * model->MOS2bulkJctSideGradingCoeff * sargsw/arg /                        here->MOS2tBulkPot;            here->MOS2f4d = czbd*here->MOS2tBulkPot*(1-arg*sarg)/                        (1-model->MOS2bulkJctBotGradingCoeff)                    + czbdsw*here->MOS2tBulkPot*(1-arg*sargsw)/                        (1-model->MOS2bulkJctSideGradingCoeff)                    -here->MOS2f3d/2*                        (here->MOS2tDepCap*here->MOS2tDepCap)                    -here->MOS2tDepCap * here->MOS2f2d;            if(model->MOS2capBSGiven) {                czbs=here->MOS2tCbs;            } else {                if(model->MOS2bulkCapFactorGiven) {                    czbs=here->MOS2tCj*here->MOS2sourceArea;                } else {                    czbs=0;                }            }            if(model->MOS2sideWallCapFactorGiven) {                czbssw = here->MOS2tCjsw * here->MOS2sourcePerimiter;            } else {                czbssw=0;            }            arg = 1-model->MOS2fwdCapDepCoeff;            sarg = exp( (-model->MOS2bulkJctBotGradingCoeff) * log(arg) );            sargsw = exp( (-model->MOS2bulkJctSideGradingCoeff) * log(arg) );            here->MOS2Cbs = czbs;            here->MOS2Cbssw = czbssw;            here->MOS2f2s = czbs*(1-model->MOS2fwdCapDepCoeff*                        (1+model->MOS2bulkJctBotGradingCoeff))* sarg/arg                    +  czbssw*(1-model->MOS2fwdCapDepCoeff*                        (1+model->MOS2bulkJctSideGradingCoeff))*                        sargsw/arg;            here->MOS2f3s = czbs * model->MOS2bulkJctBotGradingCoeff * sarg/arg/                        here->MOS2tBulkPot                    + czbssw * model->MOS2bulkJctSideGradingCoeff * sargsw/arg /                        here->MOS2tBulkPot;            here->MOS2f4s = czbs*here->MOS2tBulkPot*(1-arg*sarg)/                        (1-model->MOS2bulkJctBotGradingCoeff)                    + czbssw*here->MOS2tBulkPot*(1-arg*sargsw)/                        (1-model->MOS2bulkJctSideGradingCoeff)                    -here->MOS2f3s/2*                        (here->MOS2tDepCap*here->MOS2tDepCap)                    -here->MOS2tDepCap * here->MOS2f2s;        }    }    return(OK);}

⌨️ 快捷键说明

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