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

📄 mos9sld.c

📁 ngspice又一个电子CAD仿真软件代码.功能更全
💻 C
📖 第 1 页 / 共 2 页
字号:
                DcdprmDp = ( - DcdprDp + DcdDp);                DcsprmDp = ( - DcbsDp - DcdDp - DcbdDp  - DcsprDp);                if(flag == 0){                    EffectiveLength = here->MOS9l                         - 2*model->MOS9latDiff + model->MOS9lengthAdjust;                    if(EffectiveLength == 0){                         DqgsDp = 0;                        DqgdDp = 0;                        DqgbDp = 0;                    }                    else{                        DqgsDp = model->MOS9type * qgs0 / EffectiveLength;                        DqgdDp = model->MOS9type * qgd0 / EffectiveLength;                        DqgbDp = model->MOS9type * qgb0 / EffectiveLength;                    }                }                else{                    EffectiveWidth = here->MOS9w                         - 2*model->MOS9widthNarrow + model->MOS9widthAdjust;                    DqgsDp = model->MOS9type * qgs0 / EffectiveWidth;                    DqgdDp = model->MOS9type * qgd0 / EffectiveWidth;                    DqgbDp = model->MOS9type * qgb0 / EffectiveWidth;                }                qbd = *(ckt->CKTstate0 + here->MOS9qbd);                qbs = *(ckt->CKTstate0 + here->MOS9qbs);                DqbsDp = model->MOS9type * (qbs - qbs0)*DELAinv;                DqbdDp = model->MOS9type * (qbd - qbd0)*DELAinv;                if(flag == 0){                    *(here->MOS9dphigs_dl) = DqgsDp;                    *(here->MOS9dphigd_dl) = DqgdDp;                    *(here->MOS9dphibs_dl) = DqbsDp;                    *(here->MOS9dphibd_dl) = DqbdDp;                    *(here->MOS9dphigb_dl) = DqgbDp;                }                else{                    *(here->MOS9dphigs_dw) = DqgsDp;                    *(here->MOS9dphigd_dw) = DqgdDp;                    *(here->MOS9dphibs_dw) = DqbsDp;                    *(here->MOS9dphibd_dw) = DqbdDp;                    *(here->MOS9dphigb_dw) = DqgbDp;                }#ifdef SENSDEBUG                printf("CKTag[0]=%.7e,CKTag[1]=%.7e,flag= %d\n",                        ckt->CKTag[0],ckt->CKTag[1],flag);                printf("cd0 = %.7e ,cd = %.7e,\n",cd0,cd);                 printf("cbs0 = %.7e ,cbs = %.7e,\n",cbs0,cbs);                 printf("cbd0 = %.7e ,cbd = %.7e,\n",cbd0,cbd);                 printf("DcdprmDp = %.7e,\n",DcdprmDp);                 printf("DcsprmDp = %.7e,\n",DcsprmDp);                 printf("DcdprDp = %.7e,\n",DcdprDp);                 printf("DcsprDp = %.7e,\n",DcsprDp);                 printf("qgs0 = %.7e \n",qgs0);                 printf("qgd0 = %.7e \n",qgd0);                 printf("qgb0 = %.7e \n",qgb0);                 printf("qbs0 = %.7e ,qbs = %.7e,\n",qbs0,qbs);                 printf("qbd0 = %.7e ,qbd = %.7e,\n",qbd0,qbd);                 printf("DqgsDp = %.7e \n",DqgsDp);                 printf("DqgdDp = %.7e \n",DqgdDp);                 printf("DqgbDp = %.7e \n",DqgbDp);                 printf("DqbsDp = %.7e \n",DqbsDp);                 printf("DqbdDp = %.7e \n",DqbdDp);                 printf("EffectiveLength = %.7e \n",EffectiveLength);                 printf("tdepCap = %.7e \n",here->MOS9tDepCap);                 printf("\n");#endif /* SENSDEBUG*/                if((info->SENmode == TRANSEN) &&                    (ckt->CKTmode & MODEINITTRAN))                    goto next2;                /*                                 *   load RHS matrix                                 */                if(flag == 0){                    *(info->SEN_RHS[here->MOS9bNode] + here->MOS9senParmNo)                             -= model->MOS9type * DcbDp;                    *(info->SEN_RHS[here->MOS9dNode] + here->MOS9senParmNo)                             -= model->MOS9type * DcdprDp;                    *(info->SEN_RHS[here->MOS9dNodePrime] + here->MOS9senParmNo)                            -= model->MOS9type * DcdprmDp;                    *(info->SEN_RHS[here->MOS9sNode] + here->MOS9senParmNo)                             -= model->MOS9type * DcsprDp;                    *(info->SEN_RHS[here->MOS9sNodePrime] + here->MOS9senParmNo)                            -= model->MOS9type * DcsprmDp;                }                else{                      offset = here->MOS9sens_l;                    *(info->SEN_RHS[here->MOS9bNode] + here->MOS9senParmNo +                             offset) -= model->MOS9type * DcbDp;                    *(info->SEN_RHS[here->MOS9dNode] + here->MOS9senParmNo +                             offset) -= model->MOS9type * DcdprDp;                    *(info->SEN_RHS[here->MOS9dNodePrime] + here->MOS9senParmNo                            + offset) -= model->MOS9type * DcdprmDp;                    *(info->SEN_RHS[here->MOS9sNode] + here->MOS9senParmNo +                            offset) -= model->MOS9type * DcsprDp;                    *(info->SEN_RHS[here->MOS9sNodePrime] + here->MOS9senParmNo                            + offset) -= model->MOS9type * DcsprmDp;                }#ifdef SENSDEBUG                printf("after loading\n");                if(flag == 0){                    printf("DcbDp=%.7e\n",                            *(info->SEN_RHS[here->MOS9bNode] +                            here->MOS9senParmNo));                    printf("DcdprDp=%.7e\n",                            *(info->SEN_RHS[here->MOS9dNode] +                            here->MOS9senParmNo));                    printf("DcsprDp=%.7e\n",                            *(info->SEN_RHS[here->MOS9sNode] +                            here->MOS9senParmNo));                    printf("DcdprmDp=%.7e\n",                            *(info->SEN_RHS[here->MOS9dNodePrime] +                            here->MOS9senParmNo));                    printf("DcsprmDp=%.7e\n",                            *(info->SEN_RHS[here->MOS9sNodePrime] +                            here->MOS9senParmNo));                    printf("\n");                }                else{                    printf("DcbDp=%.7e\n",                            *(info->SEN_RHS[here->MOS9bNode] +                            here->MOS9senParmNo + here->MOS9sens_l));                    printf("DcdprDp=%.7e\n",                            *(info->SEN_RHS[here->MOS9dNode] +                            here->MOS9senParmNo + here->MOS9sens_l));                    printf("DcsprDp=%.7e\n",                            *(info->SEN_RHS[here->MOS9sNode] +                            here->MOS9senParmNo + here->MOS9sens_l));                    printf("DcdprmDp=%.7e\n",                            *(info->SEN_RHS[here->MOS9dNodePrime] +                            here->MOS9senParmNo + here->MOS9sens_l));                    printf("DcsprmDp=%.7e\n",                            *(info->SEN_RHS[here->MOS9sNodePrime] +                            here->MOS9senParmNo + here->MOS9sens_l));                }#endif /* SENSDEBUG*/next2:                                   ;            }next1:            if((info->SENmode == DCSEN) ||                (ckt->CKTmode&MODETRANOP) ) goto restore;            if((info->SENmode == TRANSEN) &&                (ckt->CKTmode & MODEINITTRAN)) goto restore;            for(iparmno = 1;iparmno<=info->SENparms;iparmno++){#ifdef SENSDEBUG                printf("after conductive currents\n");                printf("iparmno = %d\n",iparmno);                printf("DcbDp=%.7e\n",                        *(info->SEN_RHS[here->MOS9bNode] + iparmno));                printf("DcdprDp=%.7e\n",                        *(info->SEN_RHS[here->MOS9dNode] + iparmno));                printf("DcdprmDp=%.7e\n",                        *(info->SEN_RHS[here->MOS9dNodePrime] + iparmno));                printf("DcsprDp=%.7e\n",                        *(info->SEN_RHS[here->MOS9sNode] + iparmno));                printf("DcsprmDp=%.7e\n",                        *(info->SEN_RHS[here->MOS9sNodePrime] + iparmno));                printf("\n");#endif /* SENSDEBUG */                Osxpgs = tag0 * *(ckt->CKTstate1 + here->MOS9sensxpgs +                        10*(iparmno - 1))                        + tag1 * *(ckt->CKTstate1 + here->MOS9sensxpgs +                        10*(iparmno - 1) + 1);                Osxpgd = tag0 * *(ckt->CKTstate1 + here->MOS9sensxpgd +                        10*(iparmno - 1))                        + tag1 * *(ckt->CKTstate1 + here->MOS9sensxpgd +                        10*(iparmno - 1) + 1);                Osxpbs = tag0 * *(ckt->CKTstate1 + here->MOS9sensxpbs +                        10*(iparmno - 1))                        + tag1 * *(ckt->CKTstate1 + here->MOS9sensxpbs +                        10*(iparmno - 1) + 1);                Osxpbd =tag0 * *(ckt->CKTstate1 + here->MOS9sensxpbd +                        10*(iparmno - 1))                        + tag1 * *(ckt->CKTstate1 + here->MOS9sensxpbd +                        10*(iparmno - 1) + 1);                Osxpgb = tag0 * *(ckt->CKTstate1 + here->MOS9sensxpgb +                        10*(iparmno - 1))                        + tag1 * *(ckt->CKTstate1 + here->MOS9sensxpgb +                        10*(iparmno - 1) + 1);#ifdef SENSDEBUG                printf("iparmno=%d\n",iparmno);                printf("sxpgs=%.7e,sdgs=%.7e\n",                        *(ckt->CKTstate1 + here->MOS9sensxpgs +                         10*(iparmno - 1)), *(ckt->CKTstate1 +                         here->MOS9sensxpgs + 10*(iparmno - 1) + 1));                printf("sxpgd=%.7e,sdgd=%.7e\n",                        *(ckt->CKTstate1 + here->MOS9sensxpgd +                         10*(iparmno - 1)), *(ckt->CKTstate1 +                         here->MOS9sensxpgd + 10*(iparmno - 1) + 1));                printf("sxpbs=%.7e,sdbs=%.7e\n",                        *(ckt->CKTstate1 + here->MOS9sensxpbs +                         10*(iparmno - 1)), *(ckt->CKTstate1 +                         here->MOS9sensxpbs + 10*(iparmno - 1) + 1));                printf("sxpbd=%.7e,sdbd=%.7e\n",                        *(ckt->CKTstate1 + here->MOS9sensxpbd +                         10*(iparmno - 1)), *(ckt->CKTstate1 +                         here->MOS9sensxpbd + 10*(iparmno - 1) + 1));                printf("sxpgb=%.7e,sdgb=%.7e\n",                        *(ckt->CKTstate1 + here->MOS9sensxpgb +                         10*(iparmno - 1)), *(ckt->CKTstate1 +                         here->MOS9sensxpgb + 10*(iparmno - 1) + 1));                printf("before loading DqDp\n");                printf("Osxpgs=%.7e,Osxpgd=%.7e\n",Osxpgs,Osxpgd);                printf("Osxpbs=%.7e,Osxpbd=%.7e,Osxpgb=%.7e\n",                        Osxpbs,Osxpbd,Osxpgb);                printf("\n");#endif /* SENSDEBUG */                if(here->MOS9sens_l && (iparmno == here->MOS9senParmNo)){                    Osxpgs -= tag0 * *(here->MOS9dphigs_dl);                    Osxpgd -= tag0 * *(here->MOS9dphigd_dl);                    Osxpbs -= tag0 * *(here->MOS9dphibs_dl);                    Osxpbd -= tag0 * *(here->MOS9dphibd_dl);                    Osxpgb -= tag0 * *(here->MOS9dphigb_dl);                }                if(here->MOS9sens_w &&                         (iparmno == (here->MOS9senParmNo + here->MOS9sens_l))){                    Osxpgs -= tag0 * *(here->MOS9dphigs_dw);                    Osxpgd -= tag0 * *(here->MOS9dphigd_dw);                    Osxpbs -= tag0 * *(here->MOS9dphibs_dw);                    Osxpbd -= tag0 * *(here->MOS9dphibd_dw);                    Osxpgb -= tag0 * *(here->MOS9dphigb_dw);                }#ifdef SENSDEBUG                printf("after loading DqDp\n");                printf("DqgsDp=%.7e",DqgsDp);                printf("Osxpgs=%.7e,Osxpgd=%.7e\n",Osxpgs,Osxpgd);                printf("Osxpbs=%.7e,Osxpbd=%.7e,Osxpgb=%.7e\n",                        Osxpbs,Osxpbd,Osxpgb);#endif /* SENSDEBUG */                *(info->SEN_RHS[here->MOS9bNode] + iparmno) +=                         Osxpbs + Osxpbd -Osxpgb;                *(info->SEN_RHS[here->MOS9gNode] + iparmno) +=                        Osxpgs + Osxpgd + Osxpgb;                *(info->SEN_RHS[here->MOS9dNodePrime] + iparmno) -=                        Osxpgd + Osxpbd ;                *(info->SEN_RHS[here->MOS9sNodePrime] + iparmno) -=                        Osxpgs + Osxpbs;#ifdef SENSDEBUG                printf("after capacitive currents\n");                printf("DcbDp=%.7e\n",                        *(info->SEN_RHS[here->MOS9bNode] + iparmno));                printf("DcdprDp=%.7e\n",                        *(info->SEN_RHS[here->MOS9dNode] + iparmno));                printf("DcdprmDp=%.7e\n",                        *(info->SEN_RHS[here->MOS9dNodePrime] + iparmno));                printf("DcsprDp=%.7e\n",                        *(info->SEN_RHS[here->MOS9sNode] + iparmno));                printf("DcsprmDp=%.7e\n",                        *(info->SEN_RHS[here->MOS9sNodePrime] + iparmno));#endif /* SENSDEBUG */            }restore:    /* put the unperturbed values back into the state vector */            for(i=0; i <= 16; i++)                *(ckt->CKTstate0 + here->MOS9states + i) = *(SaveState + i);            here->MOS9sourceConductance = *(SaveState + 17) ;               here->MOS9drainConductance = *(SaveState + 18) ;             here->MOS9cd =  *(SaveState + 19) ;              here->MOS9cbs =  *(SaveState + 20) ;              here->MOS9cbd =  *(SaveState + 21) ;              here->MOS9gmbs =  *(SaveState + 22) ;              here->MOS9gm =  *(SaveState + 23) ;              here->MOS9gds =  *(SaveState + 24) ;              here->MOS9gbd =  *(SaveState + 25) ;              here->MOS9gbs =  *(SaveState + 26) ;              here->MOS9capbd =  *(SaveState + 27) ;              here->MOS9capbs =  *(SaveState + 28) ;              here->MOS9Cbd =  *(SaveState + 29) ;              here->MOS9Cbdsw =  *(SaveState + 30) ;              here->MOS9Cbs =  *(SaveState + 31) ;              here->MOS9Cbssw =  *(SaveState + 32) ;              here->MOS9f2d =  *(SaveState + 33) ;              here->MOS9f3d =  *(SaveState + 34) ;              here->MOS9f4d =  *(SaveState + 35) ;              here->MOS9f2s =  *(SaveState + 36) ;              here->MOS9f3s =  *(SaveState + 37) ;              here->MOS9f4s =  *(SaveState + 38) ;              here->MOS9cgs = *(SaveState + 39) ;              here->MOS9cgd = *(SaveState + 40) ;              here->MOS9cgb = *(SaveState + 41) ;              here->MOS9vdsat = *(SaveState + 42) ;              here->MOS9von = *(SaveState + 43) ;               here->MOS9mode = save_mode ;              here->MOS9senPertFlag = OFF;        }    }    info->SENstatus = NORMAL;#ifdef SENSDEBUG    printf("MOS9senload end\n");#endif /* SENSDEBUG */    return(OK);}

⌨️ 快捷键说明

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