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

📄 mos6temp.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
字号:
/**********Copyright 1990 Regents of the University of California.  All rights reserved.Author: 1989 Takayasu Sakurai**********/#include "spice.h"#include <stdio.h>#include "cktdefs.h"#include "mos6defs.h"#include "util.h"#include "const.h"#include "sperror.h"#include "suffix.h"intMOS6temp(inModel,ckt)    GENmodel *inModel;    register CKTcircuit *ckt;{    register MOS6model *model = (MOS6model *)inModel;    register MOS6instance *here;    double egfet,egfet1;    double fact1,fact2;    double kt,kt1;    double arg1;    double ratio,ratio4;    double phio;    double pbo;    double gmanew,gmaold;    double capfact;    double pbfact1,pbfact;    double vt,vtnom;    double wkfngs;    double wkfng;    double fermig;    double fermis;    double vfb;    /* loop through all the resistor models */    for( ; model != NULL; model = model->MOS6nextModel) {                /* perform model defaulting */        if(!model->MOS6tnomGiven) {            model->MOS6tnom = ckt->CKTnomTemp;        }        fact1 = model->MOS6tnom/REFTEMP;        vtnom = model->MOS6tnom*CONSTKoverQ;        kt1 = CONSTboltz * model->MOS6tnom;        egfet1 = 1.16-(7.02e-4*model->MOS6tnom*model->MOS6tnom)/                (model->MOS6tnom+1108);        arg1 = -egfet1/(kt1+kt1)+1.1150877/(CONSTboltz*(REFTEMP+REFTEMP));        pbfact1 = -2*vtnom *(1.5*log(fact1)+CHARGE*arg1);    /* now model parameter preprocessing */        if(!model->MOS6oxideThicknessGiven || model->MOS6oxideThickness == 0) {            model->MOS6oxideCapFactor = 0;        } else {            model->MOS6oxideCapFactor = 3.9 * 8.854214871e-12/                    model->MOS6oxideThickness;            if(!model->MOS6kcGiven) {                if(!model->MOS6surfaceMobilityGiven) {                    model->MOS6surfaceMobility=600;                }                model->MOS6kc = 0.5 * model->MOS6surfaceMobility *                        model->MOS6oxideCapFactor * 1e-4 /*(m**2/cm**2)*/;            }            if(model->MOS6substrateDopingGiven) {                if(model->MOS6substrateDoping*1e6 /*(cm**3/m**3)*/ >1.45e16) {                    if(!model->MOS6phiGiven) {                        model->MOS6phi = 2*vtnom*                                log(model->MOS6substrateDoping*                                1e6/*(cm**3/m**3)*//1.45e16);                        model->MOS6phi = MAX(.1,model->MOS6phi);                    }                    fermis = model->MOS6type * .5 * model->MOS6phi;                    wkfng = 3.2;                    if(!model->MOS6gateTypeGiven) model->MOS6gateType=1;                    if(model->MOS6gateType != 0) {                        fermig = model->MOS6type *model->MOS6gateType*.5*egfet1;                        wkfng = 3.25 + .5 * egfet1 - fermig;                    }                    wkfngs = wkfng - (3.25 + .5 * egfet1 +fermis);                    if(!model->MOS6gammaGiven) {                        model->MOS6gamma = sqrt(2 * 11.70 * 8.854214871e-12 *                                 CHARGE * model->MOS6substrateDoping*                                1e6/*(cm**3/m**3)*/)/                                model->MOS6oxideCapFactor;                    }                    if(!model->MOS6gamma1Given) {                        model->MOS6gamma1 = 0.0;                    }                    if(!model->MOS6vt0Given) {                        if(!model->MOS6surfaceStateDensityGiven)                                 model->MOS6surfaceStateDensity=0;                        vfb = wkfngs -                                 model->MOS6surfaceStateDensity *                                 1e4 /*(cm**2/m**2)*/ *                                 CHARGE/model->MOS6oxideCapFactor;                        model->MOS6vt0 = vfb + model->MOS6type *                                 (model->MOS6gamma * sqrt(model->MOS6phi)+                                model->MOS6phi);                    }                } else {                    model->MOS6substrateDoping = 0;                    (*(SPfrontEnd->IFerror))(ERR_FATAL,                            "%s: Nsub < Ni",&model->MOS6modName);                    return(E_BADPARM);                }            }        }                /* loop through all instances of the model */        for(here = model->MOS6instances; here!= NULL;                 here = here->MOS6nextInstance) {            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->MOS6owner != ARCHme) continue;            /* perform the parameter defaulting */            if(!here->MOS6tempGiven) {                here->MOS6temp = ckt->CKTtemp;            }            vt = here->MOS6temp * CONSTKoverQ;            ratio = here->MOS6temp/model->MOS6tnom;            fact2 = here->MOS6temp/REFTEMP;            kt = here->MOS6temp * CONSTboltz;            egfet = 1.16-(7.02e-4*here->MOS6temp*here->MOS6temp)/                    (here->MOS6temp+1108);            arg = -egfet/(kt+kt)+1.1150877/(CONSTboltz*(REFTEMP+REFTEMP));            pbfact = -2*vt *(1.5*log(fact2)+CHARGE*arg);            if(!here->MOS6drainAreaGiven) {                here->MOS6drainArea = ckt->CKTdefaultMosAD;            }            if(!here->MOS6lGiven) {                here->MOS6l = ckt->CKTdefaultMosL;            }            if(!here->MOS6sourceAreaGiven) {                here->MOS6sourceArea = ckt->CKTdefaultMosAS;            }            if(!here->MOS6wGiven) {                here->MOS6w = ckt->CKTdefaultMosW;            }            if(here->MOS6l - 2 * model->MOS6latDiff <=0) {                (*(SPfrontEnd->IFerror))(ERR_WARNING,                        "%s: effective channel length less than zero",                        &(model->MOS6modName));            }            ratio4 = ratio * sqrt(ratio);            here->MOS6tKv = model->MOS6kv;            here->MOS6tKc = model->MOS6kc / ratio4;            here->MOS6tSurfMob = model->MOS6surfaceMobility/ratio4;            phio= (model->MOS6phi-pbfact1)/fact1;            here->MOS6tPhi = fact2 * phio + pbfact;            here->MOS6tVbi =                     model->MOS6vt0 - model->MOS6type *                         (model->MOS6gamma* sqrt(model->MOS6phi))                    +.5*(egfet1-egfet)                     + model->MOS6type*.5* (here->MOS6tPhi-model->MOS6phi);            here->MOS6tVto = here->MOS6tVbi + model->MOS6type *                     model->MOS6gamma * sqrt(here->MOS6tPhi);            here->MOS6tSatCur = model->MOS6jctSatCur*                     exp(-egfet/vt+egfet1/vtnom);            here->MOS6tSatCurDens = model->MOS6jctSatCurDensity *                    exp(-egfet/vt+egfet1/vtnom);            pbo = (model->MOS6bulkJctPotential - pbfact1)/fact1;            gmaold = (model->MOS6bulkJctPotential-pbo)/pbo;            capfact = 1/(1+model->MOS6bulkJctBotGradingCoeff*                    (4e-4*(model->MOS6tnom-REFTEMP)-gmaold));            here->MOS6tCbd = model->MOS6capBD * capfact;            here->MOS6tCbs = model->MOS6capBS * capfact;            here->MOS6tCj = model->MOS6bulkCapFactor * capfact;            capfact = 1/(1+model->MOS6bulkJctSideGradingCoeff*                    (4e-4*(model->MOS6tnom-REFTEMP)-gmaold));            here->MOS6tCjsw = model->MOS6sideWallCapFactor * capfact;            here->MOS6tBulkPot = fact2 * pbo+pbfact;            gmanew = (here->MOS6tBulkPot-pbo)/pbo;            capfact = (1+model->MOS6bulkJctBotGradingCoeff*                    (4e-4*(here->MOS6temp-REFTEMP)-gmanew));            here->MOS6tCbd *= capfact;            here->MOS6tCbs *= capfact;            here->MOS6tCj *= capfact;            capfact = (1+model->MOS6bulkJctSideGradingCoeff*                    (4e-4*(here->MOS6temp-REFTEMP)-gmanew));            here->MOS6tCjsw *= capfact;            here->MOS6tDepCap = model->MOS6fwdCapDepCoeff * here->MOS6tBulkPot;            if( (here->MOS6tSatCurDens == 0) ||                    (here->MOS6drainArea == 0) ||                    (here->MOS6sourceArea == 0) ) {                here->MOS6sourceVcrit = here->MOS6drainVcrit =                        vt*log(vt/(CONSTroot2*here->MOS6tSatCur));            } else {                here->MOS6drainVcrit =                        vt * log( vt / (CONSTroot2 *                        here->MOS6tSatCurDens * here->MOS6drainArea));                here->MOS6sourceVcrit =                        vt * log( vt / (CONSTroot2 *                        here->MOS6tSatCurDens * here->MOS6sourceArea));            }            if(model->MOS6capBDGiven) {                czbd = here->MOS6tCbd;            } else {                if(model->MOS6bulkCapFactorGiven) {                    czbd=here->MOS6tCj*here->MOS6drainArea;                } else {                    czbd=0;                }            }            if(model->MOS6sideWallCapFactorGiven) {                czbdsw= here->MOS6tCjsw * here->MOS6drainPerimiter;            } else {                czbdsw=0;            }            arg = 1-model->MOS6fwdCapDepCoeff;            sarg = exp( (-model->MOS6bulkJctBotGradingCoeff) * log(arg) );            sargsw = exp( (-model->MOS6bulkJctSideGradingCoeff) * log(arg) );            here->MOS6Cbd = czbd;            here->MOS6Cbdsw = czbdsw;            here->MOS6f2d = czbd*(1-model->MOS6fwdCapDepCoeff*                        (1+model->MOS6bulkJctBotGradingCoeff))* sarg/arg                    +  czbdsw*(1-model->MOS6fwdCapDepCoeff*                        (1+model->MOS6bulkJctSideGradingCoeff))*                        sargsw/arg;            here->MOS6f3d = czbd * model->MOS6bulkJctBotGradingCoeff * sarg/arg/                        here->MOS6tBulkPot                    + czbdsw * model->MOS6bulkJctSideGradingCoeff * sargsw/arg /                        here->MOS6tBulkPot;            here->MOS6f4d = czbd*here->MOS6tBulkPot*(1-arg*sarg)/                        (1-model->MOS6bulkJctBotGradingCoeff)                    + czbdsw*here->MOS6tBulkPot*(1-arg*sargsw)/                        (1-model->MOS6bulkJctSideGradingCoeff)                    -here->MOS6f3d/2*                        (here->MOS6tDepCap*here->MOS6tDepCap)                    -here->MOS6tDepCap * here->MOS6f2d;            if(model->MOS6capBSGiven) {                czbs=here->MOS6tCbs;            } else {                if(model->MOS6bulkCapFactorGiven) {                    czbs=here->MOS6tCj*here->MOS6sourceArea;                } else {                    czbs=0;                }            }            if(model->MOS6sideWallCapFactorGiven) {                czbssw = here->MOS6tCjsw * here->MOS6sourcePerimiter;            } else {                czbssw=0;            }            arg = 1-model->MOS6fwdCapDepCoeff;            sarg = exp( (-model->MOS6bulkJctBotGradingCoeff) * log(arg) );            sargsw = exp( (-model->MOS6bulkJctSideGradingCoeff) * log(arg) );            here->MOS6Cbs = czbs;            here->MOS6Cbssw = czbssw;            here->MOS6f2s = czbs*(1-model->MOS6fwdCapDepCoeff*                        (1+model->MOS6bulkJctBotGradingCoeff))* sarg/arg                    +  czbssw*(1-model->MOS6fwdCapDepCoeff*                        (1+model->MOS6bulkJctSideGradingCoeff))*                        sargsw/arg;            here->MOS6f3s = czbs * model->MOS6bulkJctBotGradingCoeff * sarg/arg/                        here->MOS6tBulkPot                    + czbssw * model->MOS6bulkJctSideGradingCoeff * sargsw/arg /                        here->MOS6tBulkPot;            here->MOS6f4s = czbs*here->MOS6tBulkPot*(1-arg*sarg)/                        (1-model->MOS6bulkJctBotGradingCoeff)                    + czbssw*here->MOS6tBulkPot*(1-arg*sargsw)/                        (1-model->MOS6bulkJctSideGradingCoeff)                    -here->MOS6f3s/2*                        (here->MOS6tDepCap*here->MOS6tDepCap)                    -here->MOS6tDepCap * here->MOS6f2s;            if(model->MOS6drainResistanceGiven) {                if(model->MOS6drainResistance != 0) {                    here->MOS6drainConductance = 1/model->MOS6drainResistance;                } else {                    here->MOS6drainConductance = 0;                }            } else if (model->MOS6sheetResistanceGiven) {                if( (!here->MOS6drainSquaresGiven) ||                         ( here->MOS6drainSquares==0) ){                    here->MOS6drainSquares=1;                }                if(model->MOS6sheetResistance != 0) {                    here->MOS6drainConductance =                         1/(model->MOS6sheetResistance*here->MOS6drainSquares);                } else {                    here->MOS6drainConductance = 0;                }            } else {                here->MOS6drainConductance = 0;            }            if(model->MOS6sourceResistanceGiven) {                if(model->MOS6sourceResistance != 0) {                    here->MOS6sourceConductance = 1/model->MOS6sourceResistance;                } else {                    here->MOS6sourceConductance = 0;                }            } else if (model->MOS6sheetResistanceGiven) {                if( (!here->MOS6sourceSquaresGiven) ||                         ( here->MOS6sourceSquares==0) ) {                    here->MOS6sourceSquares=1;                }                if(model->MOS6sheetResistance != 0) {                    here->MOS6sourceConductance =                         1/(model->MOS6sheetResistance*here->MOS6sourceSquares);                } else {                    here->MOS6sourceConductance = 0;                }            } else {                here->MOS6sourceConductance = 0;            }        }    }    return(OK);}

⌨️ 快捷键说明

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