mos9ask.c

来自「ngspice又一个电子CAD仿真软件代码.功能更全」· C语言 代码 · 共 440 行 · 第 1/2 页

C
440 行
字号
        case MOS9_CQGB:            value->rValue = *(ckt->CKTstate0 + here->MOS9cqgb);            return(OK);        case MOS9_QBD:            value->rValue = *(ckt->CKTstate0 + here->MOS9qbd);            return(OK);        case MOS9_CQBD:            value->rValue = *(ckt->CKTstate0 + here->MOS9cqbd);            return(OK);        case MOS9_QBS:            value->rValue = *(ckt->CKTstate0 + here->MOS9qbs);            return(OK);        case MOS9_CQBS:            value->rValue = *(ckt->CKTstate0 + here->MOS9cqbs);            return(OK);        case MOS9_L_SENS_DC:            if(ckt->CKTsenInfo){                value->rValue = *(ckt->CKTsenInfo->SEN_Sap[select->iValue + 1]+                        here->MOS9senParmNo);            }            return(OK);        case MOS9_L_SENS_REAL:            if(ckt->CKTsenInfo){            value->rValue = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+                        here->MOS9senParmNo);            }            return(OK);        case MOS9_L_SENS_IMAG:            if(ckt->CKTsenInfo){                value->rValue = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+                        here->MOS9senParmNo);            }            return(OK);        case MOS9_L_SENS_MAG:            if(ckt->CKTsenInfo){                vr = *(ckt->CKTrhsOld + select->iValue + 1);                 vi = *(ckt->CKTirhsOld + select->iValue + 1);                 vm = sqrt(vr*vr + vi*vi);                if(vm == 0){                    value->rValue = 0;                    return(OK);                }                sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+                        here->MOS9senParmNo);                si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+                        here->MOS9senParmNo);                value->rValue = (vr * sr + vi * si)/vm;            }            return(OK);        case MOS9_L_SENS_PH:            if(ckt->CKTsenInfo){                vr = *(ckt->CKTrhsOld + select->iValue + 1);                 vi = *(ckt->CKTirhsOld + select->iValue + 1);                 vm = vr*vr + vi*vi;                if(vm == 0){                    value->rValue = 0;                    return(OK);                }                sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+                        here->MOS9senParmNo);                si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+                        here->MOS9senParmNo);                value->rValue =  (vr * si - vi * sr)/vm;            }            return(OK);        case MOS9_L_SENS_CPLX:            if(ckt->CKTsenInfo){                value->cValue.real=                         *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+                        here->MOS9senParmNo);                value->cValue.imag=                         *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+                        here->MOS9senParmNo);            }            return(OK);        case MOS9_W_SENS_DC:            if(ckt->CKTsenInfo){                value->rValue = *(ckt->CKTsenInfo->SEN_Sap[select->iValue + 1]+                        here->MOS9senParmNo + here->MOS9sens_l);            }            return(OK);        case MOS9_W_SENS_REAL:            if(ckt->CKTsenInfo){                value->rValue = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+                        here->MOS9senParmNo + here->MOS9sens_l);            }            return(OK);        case MOS9_W_SENS_IMAG:            if(ckt->CKTsenInfo){                value->rValue = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+                        here->MOS9senParmNo + here->MOS9sens_l);            }            return(OK);        case MOS9_W_SENS_MAG:            if(ckt->CKTsenInfo){                vr = *(ckt->CKTrhsOld + select->iValue + 1);                 vi = *(ckt->CKTirhsOld + select->iValue + 1);                 vm = sqrt(vr*vr + vi*vi);                if(vm == 0){                    value->rValue = 0;                    return(OK);                }                sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+                        here->MOS9senParmNo + here->MOS9sens_l);                si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+                        here->MOS9senParmNo + here->MOS9sens_l);                value->rValue = (vr * sr + vi * si)/vm;            }            return(OK);        case MOS9_W_SENS_PH:            if(ckt->CKTsenInfo){                vr = *(ckt->CKTrhsOld + select->iValue + 1);                 vi = *(ckt->CKTirhsOld + select->iValue + 1);                 vm = vr*vr + vi*vi;                if(vm == 0){                    value->rValue = 0;                    return(OK);                }                sr = *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+                        here->MOS9senParmNo + here->MOS9sens_l);                si = *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+                        here->MOS9senParmNo + here->MOS9sens_l);                value->rValue =  (vr * si - vi * sr)/vm;            }            return(OK);        case MOS9_W_SENS_CPLX:            if(ckt->CKTsenInfo){                value->cValue.real=                         *(ckt->CKTsenInfo->SEN_RHS[select->iValue + 1]+                        here->MOS9senParmNo + here->MOS9sens_l);                value->cValue.imag=                         *(ckt->CKTsenInfo->SEN_iRHS[select->iValue + 1]+                        here->MOS9senParmNo + here->MOS9sens_l);            }            return(OK);        case MOS9_CB :            if (ckt->CKTcurrentAnalysis & DOING_AC) {                errMsg = MALLOC(strlen(msg)+1);                errRtn = "MOS9ask.c";                strcpy(errMsg,msg);                return(E_ASKCURRENT);            } else {                value->rValue = here->MOS9cbd + here->MOS9cbs - *(ckt->CKTstate0                        + here->MOS9cqgb);            }            return(OK);        case MOS9_CG :            if (ckt->CKTcurrentAnalysis & DOING_AC) {                errMsg = MALLOC(strlen(msg)+1);                errRtn = "MOS9ask.c";                strcpy(errMsg,msg);                return(E_ASKCURRENT);            } else if (ckt->CKTcurrentAnalysis & (DOING_DCOP | DOING_TRCV)) {                value->rValue = 0;            } else if ((ckt->CKTcurrentAnalysis & DOING_TRAN) &&                         (ckt->CKTmode & MODETRANOP)) {                value->rValue = 0;            } else {                value->rValue = *(ckt->CKTstate0 + here->MOS9cqgb) +                    *(ckt->CKTstate0 + here->MOS9cqgd) + *(ckt->CKTstate0 +                     here->MOS9cqgs);            }            return(OK);        case MOS9_CS :            if (ckt->CKTcurrentAnalysis & DOING_AC) {                errMsg = MALLOC(strlen(msg)+1);                errRtn = "MOS9ask.c";                strcpy(errMsg,msg);                return(E_ASKCURRENT);            } else {                value->rValue = -here->MOS9cd;                value->rValue -= here->MOS9cbd + here->MOS9cbs -                        *(ckt->CKTstate0 + here->MOS9cqgb);                if ((ckt->CKTcurrentAnalysis & DOING_TRAN) &&                         !(ckt->CKTmode & MODETRANOP)) {                    value->rValue -= *(ckt->CKTstate0 + here->MOS9cqgb) +                             *(ckt->CKTstate0 + here->MOS9cqgd) +                            *(ckt->CKTstate0 + here->MOS9cqgs);                }            }            return(OK);        case MOS9_POWER :            if (ckt->CKTcurrentAnalysis & DOING_AC) {                errMsg = MALLOC(strlen(msg)+1);                errRtn = "MOS9ask.c";                strcpy(errMsg,msg);                return(E_ASKPOWER);            } else {                double temp;                value->rValue = here->MOS9cd *                         *(ckt->CKTrhsOld + here->MOS9dNode);                value->rValue += (here->MOS9cbd + here->MOS9cbs -                        *(ckt->CKTstate0 + here->MOS9cqgb)) *                        *(ckt->CKTrhsOld + here->MOS9bNode);                if ((ckt->CKTcurrentAnalysis & DOING_TRAN) &&                         !(ckt->CKTmode & MODETRANOP)) {                    value->rValue += (*(ckt->CKTstate0 + here->MOS9cqgb) +                             *(ckt->CKTstate0 + here->MOS9cqgd) +                             *(ckt->CKTstate0 + here->MOS9cqgs)) *                            *(ckt->CKTrhsOld + here->MOS9gNode);                }                temp = -here->MOS9cd;                temp -= here->MOS9cbd + here->MOS9cbs ;                if ((ckt->CKTcurrentAnalysis & DOING_TRAN) &&                         !(ckt->CKTmode & MODETRANOP)) {                    temp -= *(ckt->CKTstate0 + here->MOS9cqgb) +                             *(ckt->CKTstate0 + here->MOS9cqgd) +                             *(ckt->CKTstate0 + here->MOS9cqgs);                }                value->rValue += temp * *(ckt->CKTrhsOld + here->MOS9sNode);            }            return(OK);        default:            return(E_BADPARM);    }    /* NOTREACHED */}

⌨️ 快捷键说明

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