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

📄 mos1sacl.c

📁 spice中支持多层次元件模型仿真的可单独运行的插件源码
💻 C
📖 第 1 页 / 共 3 页
字号:
/**********Copyright 1990 Regents of the University of California.  All rights reserved.Author: 1985 Thomas L. Quarles**********/#include "spice.h"#include <stdio.h>#include "smpdefs.h"#include "cktdefs.h"#include "const.h"#include "mos1defs.h"#include "util.h"#include "sperror.h"#include "suffix.h"/* actually load the current ac sensitivity  * information into the  array previously provided  */intMOS1sAcLoad(inModel,ckt)GENmodel *inModel;register CKTcircuit *ckt;{    register MOS1model *model = (MOS1model*)inModel;    register MOS1instance *here;    int xnrm;    int xrev;    double A0;    double Apert;    double DELA;    double DELAinv;    double gdpr0;    double gspr0;    double gds0;    double gbs0;    double gbd0;    double gm0;    double gmbs0;    double gdpr;    double gspr;    double gds;    double gbs;    double gbd;    double gm;    double gmbs;    double xcgs0;    double xcgd0;    double xcgb0;    double xbd0;    double xbs0;    double xcgs;    double xcgd;    double xcgb;    double xbd;    double xbs;    double vbsOp;    double vbdOp;    double vspr;    double vdpr;    double vgs;    double vgd;    double vgb;    double vbs;    double vbd;    double vds;    double ivspr;    double ivdpr;    double ivgs;    double ivgd;    double ivgb;    double ivbs;    double ivbd;    double ivds;    double cspr;    double cdpr;    double cgs;    double cgd;    double cgb;    double cbs;    double cbd;    double cds;    double cs0;    double csprm0;    double cd0;    double cdprm0;    double cg0;    double cb0;    double cs;    double csprm;    double cd;    double cdprm;    double cg;    double cb;    double icspr;    double icdpr;    double icgs;    double icgd;    double icgb;    double icbs;    double icbd;    double icds;    double ics0;    double icsprm0;    double icd0;    double icdprm0;    double icg0;    double icb0;    double ics;    double icsprm;    double icd;    double icdprm;    double icg;    double icb;    double DvDp;    int i;    int flag;    int error;    int iparmno;    double arg;    double sarg;    double sargsw;    double SaveState[44];    int    save_mode;    SENstruct *info;#ifdef SENSDEBUG    printf("MOS1senacload\n");    printf("CKTomega = %.5e\n",ckt->CKTomega);#endif /* SENSDEBUG */    info = ckt->CKTsenInfo;    info->SENstatus = PERTURBATION;    for( ; model != NULL; model = model->MOS1nextModel) {        for(here = model->MOS1instances; here!= NULL;                here = here->MOS1nextInstance) {	    if (here->MOS1owner != ARCHme) continue;            /* save the unperturbed values in the state vector */            for(i=0; i <= 16; i++)                *(SaveState + i) = *(ckt->CKTstate0 + here->MOS1states + i);            *(SaveState + 17) = here->MOS1sourceConductance;              *(SaveState + 18) = here->MOS1drainConductance;              *(SaveState + 19) = here->MOS1cd;              *(SaveState + 20) = here->MOS1cbs;              *(SaveState + 21) = here->MOS1cbd;              *(SaveState + 22) = here->MOS1gmbs;              *(SaveState + 23) = here->MOS1gm;              *(SaveState + 24) = here->MOS1gds;              *(SaveState + 25) = here->MOS1gbd;              *(SaveState + 26) = here->MOS1gbs;              *(SaveState + 27) = here->MOS1capbd;              *(SaveState + 28) = here->MOS1capbs;              *(SaveState + 29) = here->MOS1Cbd;              *(SaveState + 30) = here->MOS1Cbdsw;              *(SaveState + 31) = here->MOS1Cbs;              *(SaveState + 32) = here->MOS1Cbssw;              *(SaveState + 33) = here->MOS1f2d;              *(SaveState + 34) = here->MOS1f3d;              *(SaveState + 35) = here->MOS1f4d;              *(SaveState + 36) = here->MOS1f2s;              *(SaveState + 37) = here->MOS1f3s;              *(SaveState + 38) = here->MOS1f4s;              *(SaveState + 39) = here->MOS1cgs;              *(SaveState + 40) = here->MOS1cgd;              *(SaveState + 41) = here->MOS1cgb;              *(SaveState + 42) = here->MOS1vdsat;              *(SaveState + 43) = here->MOS1von;              save_mode  = here->MOS1mode;              xnrm=1;            xrev=0;            if (here->MOS1mode < 0) {                xnrm=0;                xrev=1;            }            vbsOp = model->MOS1type * (             *(ckt->CKTrhsOp+here->MOS1bNode) -                *(ckt->CKTrhsOp+here->MOS1sNodePrime));            vbdOp = model->MOS1type * (             *(ckt->CKTrhsOp+here->MOS1bNode) -                *(ckt->CKTrhsOp+here->MOS1dNodePrime));            vspr = *(ckt->CKTrhsOld + here->MOS1sNode)                 - *(ckt->CKTrhsOld +                    here->MOS1sNodePrime) ;            ivspr = *(ckt->CKTirhsOld + here->MOS1sNode)                 - *(ckt->CKTirhsOld +                    here->MOS1sNodePrime) ;            vdpr = *(ckt->CKTrhsOld + here->MOS1dNode)                 - *(ckt->CKTrhsOld +                    here->MOS1dNodePrime) ;            ivdpr = *(ckt->CKTirhsOld + here->MOS1dNode)                 - *(ckt->CKTirhsOld +                    here->MOS1dNodePrime) ;            vgb = *(ckt->CKTrhsOld + here->MOS1gNode)                 - *(ckt->CKTrhsOld +                    here->MOS1bNode) ;            ivgb = *(ckt->CKTirhsOld + here->MOS1gNode)                 - *(ckt->CKTirhsOld +                    here->MOS1bNode) ;            vbs = *(ckt->CKTrhsOld + here->MOS1bNode)                 - *(ckt->CKTrhsOld +                    here->MOS1sNodePrime) ;            ivbs = *(ckt->CKTirhsOld + here->MOS1bNode)                 - *(ckt->CKTirhsOld +                    here->MOS1sNodePrime) ;            vbd = *(ckt->CKTrhsOld + here->MOS1bNode)                 - *(ckt->CKTrhsOld +                    here->MOS1dNodePrime) ;            ivbd = *(ckt->CKTirhsOld + here->MOS1bNode)                 - *(ckt->CKTirhsOld +                    here->MOS1dNodePrime) ;            vds = vbs - vbd ;            ivds = ivbs - ivbd ;            vgs = vgb + vbs ;            ivgs = ivgb + ivbs ;            vgd = vgb + vbd ;            ivgd = ivgb + ivbd ;#ifdef SENSDEBUG            printf("senacload instance name %s\n",here->MOS1name);            printf("gate = %d ,drain = %d, drainprm = %d\n",                     here->MOS1gNode,here->MOS1dNode,here->MOS1dNodePrime);            printf("source = %d , sourceprm = %d ,body = %d, senparmno = %d\n",                    here->MOS1sNode ,here->MOS1sNodePrime,here->MOS1bNode,                    here->MOS1senParmNo);            printf("\n without  perturbation \n");#endif /* SENSDEBUG */            /*  without  perturbation  */            *(ckt->CKTstate0 + here->MOS1vbs) = vbsOp;            *(ckt->CKTstate0 + here->MOS1vbd) = vbdOp;            here->MOS1senPertFlag = ON ;            if(info->SENacpertflag == 1){                /* store the  unperturbed values of small signal parameters */                if(error = MOS1load((GENmodel*)model,ckt)) return(error);                *(here->MOS1senCgs) = here->MOS1cgs;                *(here->MOS1senCgd) = here->MOS1cgd;                *(here->MOS1senCgb) = here->MOS1cgb;                *(here->MOS1senCbd) = here->MOS1capbd;                *(here->MOS1senCbs) = here->MOS1capbs;                *(here->MOS1senGds) = here->MOS1gds;                *(here->MOS1senGbs) = here->MOS1gbs;                *(here->MOS1senGbd) = here->MOS1gbd;                *(here->MOS1senGm) = here->MOS1gm;                *(here->MOS1senGmbs) = here->MOS1gmbs;            }            xcgs0= *(here->MOS1senCgs) * ckt->CKTomega;            xcgd0= *(here->MOS1senCgd) * ckt->CKTomega;            xcgb0= *(here->MOS1senCgb) * ckt->CKTomega;            xbd0= *(here->MOS1senCbd) * ckt->CKTomega;            xbs0= *(here->MOS1senCbs) * ckt->CKTomega;            gds0= *(here->MOS1senGds);            gbs0= *(here->MOS1senGbs);            gbd0= *(here->MOS1senGbd);            gm0= *(here->MOS1senGm);            gmbs0= *(here->MOS1senGmbs);            gdpr0 = here->MOS1drainConductance;            gspr0 = here->MOS1sourceConductance;

⌨️ 快捷键说明

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