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

📄 mos2sld.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/**********Copyright 1990 Regents of the University of California.  All rights reserved.Author: 1985 Thomas L. Quarles**********//* actually load the current sensitivity  * information into the  array previously provided  */#include "spice.h"#include <stdio.h>#include "smpdefs.h"#include "cktdefs.h"#include "mos2defs.h"#include "util.h"#include "sperror.h"#include "suffix.h"intMOS2sLoad(inModel,ckt)GENmodel *inModel;CKTcircuit *ckt;{    register MOS2model *model = (MOS2model *)inModel;    register MOS2instance *here;    double   SaveState[44];    int    save_mode;    int    i;    int    iparmno;    int    error;    int    flag;    double A0;    double DELA;    double Apert;    double DELAinv;    double gspr0;    double gspr;    double gdpr0;    double gdpr;    double cdpr0;    double cspr0;    double cd0;    double cbd0;    double cbs0;    double cd;    double cbd;    double cbs;    double DcdprDp;    double DcsprDp;    double DcbDp;    double DcdDp;    double DcbsDp;    double DcbdDp;    double DcdprmDp;    double DcsprmDp;    double qgs0;    double qgd0;    double qgb0;    double qbd0;    double qbd;    double qbs0;    double qbs;    double DqgsDp;    double DqgdDp;    double DqgbDp;    double DqbdDp;    double DqbsDp;    double Osxpgs;    double Osxpgd;    double Osxpgb;    double Osxpbd;    double Osxpbs;    double tag0;    double tag1;    double arg;    double sarg;    double sargsw;    int offset;    double EffectiveLength;    SENstruct *info;#ifdef SENSDEBUG    printf("MOS2senload \n");    printf("CKTtime = %.5e\n",ckt->CKTtime);    printf("CKTorder = %d\n",ckt->CKTorder);#endif /* SENSDEBUG */    info = ckt->CKTsenInfo;    info->SENstatus = PERTURBATION;    tag0 = ckt->CKTag[0];     tag1 = ckt->CKTag[1];    if(ckt->CKTorder == 1){        tag1 = 0;    }    /*  loop through all the models */    for( ; model != NULL; model = model->MOS2nextModel ) {        /* loop through all the instances of the model */        for (here = model->MOS2instances; here != NULL ;                here=here->MOS2nextInstance) {	    if (here->MOS2owner != ARCHme) continue;#ifdef SENSDEBUG            printf("senload instance name %s\n",here->MOS2name);            printf("gate = %d ,drain = %d, drainprm = %d\n",                     here->MOS2gNode,here->MOS2dNode,here->MOS2dNodePrime);            printf("source = %d , sourceprm = %d ,body = %d, senparmno = %d\n",                    here->MOS2sNode ,here->MOS2sNodePrime,                    here->MOS2bNode,here->MOS2senParmNo);#endif /* SENSDEBUG */            /* save the unperturbed values in the state vector */            for(i=0; i <= 16; i++){                *(SaveState + i) = *(ckt->CKTstate0 + here->MOS2states + i);            }            *(SaveState + 17) = here->MOS2sourceConductance;              *(SaveState + 18) = here->MOS2drainConductance;              *(SaveState + 19) = here->MOS2cd;              *(SaveState + 20) = here->MOS2cbs;              *(SaveState + 21) = here->MOS2cbd;              *(SaveState + 22) = here->MOS2gmbs;              *(SaveState + 23) = here->MOS2gm;              *(SaveState + 24) = here->MOS2gds;              *(SaveState + 25) = here->MOS2gbd;              *(SaveState + 26) = here->MOS2gbs;              *(SaveState + 27) = here->MOS2capbd;              *(SaveState + 28) = here->MOS2capbs;              *(SaveState + 29) = here->MOS2Cbd;              *(SaveState + 30) = here->MOS2Cbdsw;              *(SaveState + 31) = here->MOS2Cbs;              *(SaveState + 32) = here->MOS2Cbssw;              *(SaveState + 33) = here->MOS2f2d;              *(SaveState + 34) = here->MOS2f3d;              *(SaveState + 35) = here->MOS2f4d;              *(SaveState + 36) = here->MOS2f2s;              *(SaveState + 37) = here->MOS2f3s;              *(SaveState + 38) = here->MOS2f4s;              *(SaveState + 39) = here->MOS2cgs;              *(SaveState + 40) = here->MOS2cgd;              *(SaveState + 41) = here->MOS2cgb;              *(SaveState + 42) = here->MOS2vdsat;              *(SaveState + 43) = here->MOS2von;              save_mode  = here->MOS2mode;              if(here->MOS2senParmNo == 0) goto next1;#ifdef SENSDEBUG            printf("without perturbation \n");            printf("gbd =%.5e\n",here->MOS2gbd);            printf("satCur =%.5e\n",here->MOS2tSatCur);            printf("satCurDens =%.5e\n",here->MOS2tSatCurDens);            printf("vbd =%.5e\n",*(ckt->CKTstate0 + here->MOS2vbd));#endif /* SENSDEBUG */            cdpr0= here->MOS2cd;            cspr0= -(here->MOS2cd + here->MOS2cbd + here->MOS2cbs);            if((info->SENmode == TRANSEN) &&                (ckt->CKTmode & MODEINITTRAN)){                qgs0 = *(ckt->CKTstate1 + here->MOS2qgs);                qgd0 = *(ckt->CKTstate1 + here->MOS2qgd);                qgb0 = *(ckt->CKTstate1 + here->MOS2qgb);            }            else{                qgs0 = *(ckt->CKTstate0 + here->MOS2qgs);                qgd0 = *(ckt->CKTstate0 + here->MOS2qgd);                qgb0 = *(ckt->CKTstate0 + here->MOS2qgb);            }            here->MOS2senPertFlag = ON;            error =  MOS2load((GENmodel*)model,ckt);            if(error) return(error);            cd0 =  here->MOS2cd ;            cbd0 = here->MOS2cbd ;            cbs0 = here->MOS2cbs ;            gspr0= here->MOS2sourceConductance ;            gdpr0= here->MOS2drainConductance ;            qbs0 = *(ckt->CKTstate0 + here->MOS2qbs);            qbd0 = *(ckt->CKTstate0 + here->MOS2qbd);            for( flag = 0 ; flag <= 1 ; flag++){                if(here->MOS2sens_l == 0)                    if(flag == 0) goto next2;                if(here->MOS2sens_w == 0)                    if(flag == 1) goto next2;                if(flag == 0){                    A0 = here->MOS2l;                    DELA = info->SENpertfac * A0;                    DELAinv = 1.0/DELA;                    Apert = A0 + DELA;                    here->MOS2l = Apert;                }                else{                    A0 = here->MOS2w;                    DELA = info->SENpertfac * A0;                    DELAinv = 1.0/DELA;                    Apert = A0 + DELA;                    here->MOS2w = Apert;                    here->MOS2drainArea *= (1 + info->SENpertfac);                    here->MOS2sourceArea *= (1 + info->SENpertfac);                    here->MOS2Cbd *= (1 + info->SENpertfac);                    here->MOS2Cbs *= (1 + info->SENpertfac);                    if(here->MOS2drainPerimiter){                        here->MOS2Cbdsw += here->MOS2Cbdsw *                            DELA/here->MOS2drainPerimiter;                    }                    if(here->MOS2sourcePerimiter){                        here->MOS2Cbssw += here->MOS2Cbssw *                            DELA/here->MOS2sourcePerimiter;                    }                    if(*(ckt->CKTstate0 + here->MOS2vbd) >=                        here->MOS2tDepCap){                        arg = 1-model->MOS2fwdCapDepCoeff;                        sarg = exp( (-model->MOS2bulkJctBotGradingCoeff) *                                 log(arg) );                        sargsw = exp( (-model->MOS2bulkJctSideGradingCoeff) *                                 log(arg) );                        here->MOS2f2d = here->MOS2Cbd*                                (1-model->MOS2fwdCapDepCoeff*                                (1+model->MOS2bulkJctBotGradingCoeff))* sarg/arg                                +  here->MOS2Cbdsw*(1-model->MOS2fwdCapDepCoeff*                                (1+model->MOS2bulkJctSideGradingCoeff))*                                sargsw/arg;                        here->MOS2f3d = here->MOS2Cbd *                                 model->MOS2bulkJctBotGradingCoeff * sarg/arg/                                here->MOS2tBulkPot + here->MOS2Cbdsw *                                 model->MOS2bulkJctSideGradingCoeff *                                 sargsw/arg / here->MOS2tBulkPot;                        here->MOS2f4d = here->MOS2Cbd*                                here->MOS2tBulkPot*(1-arg*sarg)/                                (1-model->MOS2bulkJctBotGradingCoeff)                                + here->MOS2Cbdsw*here->MOS2tBulkPot*                                (1-arg*sargsw)/                                (1-model->MOS2bulkJctSideGradingCoeff)                                -here->MOS2f3d/2*                                (here->MOS2tDepCap*here->MOS2tDepCap)                                -here->MOS2tDepCap * here->MOS2f2d;                    }                    if(*(ckt->CKTstate0 + here->MOS2vbs) >=                        here->MOS2tDepCap){                        arg = 1-model->MOS2fwdCapDepCoeff;                        sarg = exp( (-model->MOS2bulkJctBotGradingCoeff) *                                 log(arg) );                        sargsw = exp( (-model->MOS2bulkJctSideGradingCoeff) *                                 log(arg) );                        here->MOS2f2s = here->MOS2Cbs*                                (1-model->MOS2fwdCapDepCoeff*                                (1+model->MOS2bulkJctBotGradingCoeff))* sarg/arg                                +  here->MOS2Cbssw*(1-model->MOS2fwdCapDepCoeff*                                (1+model->MOS2bulkJctSideGradingCoeff))*                                sargsw/arg;                        here->MOS2f3s = here->MOS2Cbs *                                 model->MOS2bulkJctBotGradingCoeff * sarg/arg/                                here->MOS2tBulkPot + here->MOS2Cbssw *                                 model->MOS2bulkJctSideGradingCoeff *sargsw/arg /                                here->MOS2tBulkPot;                        here->MOS2f4s = here->MOS2Cbs*here->MOS2tBulkPot*                                (1-arg*sarg)/                                (1-model->MOS2bulkJctBotGradingCoeff)                                + here->MOS2Cbssw*here->MOS2tBulkPot*                                (1-arg*sargsw)/                                (1-model->MOS2bulkJctSideGradingCoeff)                                -here->MOS2f3s/2*                                (here->MOS2tDepCap*here->MOS2tDepCap)                                -here->MOS2tDepCap * here->MOS2f2s;                    }                    here->MOS2drainConductance *= Apert/A0;                    here->MOS2sourceConductance *= Apert/A0;                }#ifdef SENSDEBUG                if(flag == 0)                    printf("perturbation of l\n");                if(flag == 1)                    printf("perturbation of w\n");#endif /* SENSDEBUG */                error =  MOS2load((GENmodel*)model,ckt);                if(error) return(error);                if(flag == 0){                    here->MOS2l = A0;                }                else{                    here->MOS2w = A0;                    here->MOS2drainArea /= (1 + info->SENpertfac);                    here->MOS2sourceArea /= (1 + info->SENpertfac);                    here->MOS2drainConductance *= A0/Apert;                    here->MOS2sourceConductance *= A0/Apert;                }                cd =  here->MOS2cd ;                cbd = here->MOS2cbd ;                cbs = here->MOS2cbs ;                gspr= here->MOS2sourceConductance ;                gdpr= here->MOS2drainConductance ;                DcdDp = (cd - cd0) * DELAinv;                DcbsDp = (cbs - cbs0) * DELAinv;                DcbdDp = (cbd - cbd0) * DELAinv;                DcbDp = ( DcbsDp + DcbdDp );                DcdprDp = 0;                DcsprDp = 0;                if(here->MOS2dNode != here->MOS2dNodePrime)                    if(gdpr0) DcdprDp = cdpr0 * (gdpr - gdpr0)/gdpr0 * DELAinv;

⌨️ 快捷键说明

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