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

📄 dctran.sav07nov91

📁 支持数字元件仿真的SPICE插件
💻 SAV07NOV91
📖 第 1 页 / 共 2 页
字号:
         *  and previous timestep         */        ckt->CKTorder = 1;#ifdef STEPDEBUG        if( (ckt->CKTdelta >.1* ckt->CKTsaveDelta) ||                (ckt->CKTdelta > .1*(*(ckt->CKTbreaks+1)-*(ckt->CKTbreaks))) ) {            if(ckt->CKTsaveDelta < (*(ckt->CKTbreaks+1)-*(ckt->CKTbreaks)))  {                (void)printf("limited by pre-breakpoint delta\n");            } else {                (void)printf("limited by next breakpoint\n");            }        }#endif#ifdef SHORTMACRO            mt= MIN(ckt->CKTsaveDelta, *(ckt->CKTbreaks+1)-*(ckt->CKTbreaks));            ckt->CKTdelta = MIN(ckt->CKTdelta, .1 * mt);#else            ckt->CKTdelta = MIN(ckt->CKTdelta, .1 * MIN(ckt->CKTsaveDelta,                    *(ckt->CKTbreaks+1)-*(ckt->CKTbreaks)));#endif        if(firsttime) {            ckt->CKTdelta /= 10;#ifdef STEPDEBUG            (void)printf("delta cut for initial timepoint\n");#endif        }     }/* gtri - begin - wbk - Add Breakpoint stuff */    if(ckt->CKTtime + ckt->CKTdelta >= g_mif_info.breakpoint.current) {        /* If next time > temporary breakpoint, force it to the breakpoint */        /* And mark that timestep was set by temporary breakpoint */        ckt->CKTsaveDelta = ckt->CKTdelta;        ckt->CKTdelta = g_mif_info.breakpoint.current - ckt->CKTtime;        g_mif_info.breakpoint.last = ckt->CKTtime + ckt->CKTdelta;    }    else {        /* Else, mark that timestep was not set by temporary breakpoint */        g_mif_info.breakpoint.last = 1.0e30;    }/* gtri - end - wbk - Add Breakpoint stuff *//* gtri - begin - wbk - Modify Breakpoint stuff *//* Old Code:    if(ckt->CKTtime + ckt->CKTdelta >= *(ckt->CKTbreaks+1)) {        ckt->CKTsaveDelta = ckt->CKTdelta;        ckt->CKTdelta = *(ckt->CKTbreaks+1) - ckt->CKTtime;#ifdef STEPDEBUG        (void)printf("delta cut to hit breakpoint\n");#endif        ckt->CKTbreak = 1;        error = CKTclrBreak(ckt);        if(error) {            ckt->CKTcurrentAnalysis = DOING_TRAN;            ckt->CKTstat->STATtranTime +=                     (*(SPfrontEnd->IFseconds))()-startTime;            ckt->CKTstat->STATtranIter +=                     ckt->CKTstat->STATnumIter - startIters;            ckt->CKTstat->STATtranDecompTime += ckt->CKTstat->STATdecompTime -                    startdTime;            ckt->CKTstat->STATtranSolveTime += ckt->CKTstat->STATsolveTime -                    startsTime;            return(error);        }    } else if((ckt->CKTtime + ckt->CKTdelta > *(ckt->CKTbreaks)) &&            (ckt->CKTtime < *(ckt->CKTbreaks))) {        ckt->CKTbreak = 1;        ckt->CKTsaveDelta = ckt->CKTdelta;#ifdef STEPDEBUG        (void)printf("delta cut to hit breakpoint again\n");#endif        ckt->CKTdelta = *(ckt->CKTbreaks) - ckt->CKTtime;    }    New Code:*/    /* Throw out any permanent breakpoint times <= current time */    while(1) {        if(*(ckt->CKTbreaks) <= (ckt->CKTtime + ckt->CKTminBreak))            CKTclrBreak(ckt);        else            break;    }    /* Force the breakpoint if appropriate */    if((ckt->CKTtime + ckt->CKTdelta) > *(ckt->CKTbreaks)) {        ckt->CKTbreak = 1;        ckt->CKTsaveDelta = ckt->CKTdelta;        ckt->CKTdelta = *(ckt->CKTbreaks) - ckt->CKTtime;    }/* gtri - end - wbk - Modify Breakpoint stuff *//* gtri - begin - wbk - Do event solution */    if(ckt->evt->counts.num_insts > 0) {        /* if time = 0 and op_alternate was specified as false during */        /* dcop analysis, call any changed instances to let them */        /* post their outputs with their associated delays */        if((ckt->CKTtime == 0.0) && (! ckt->evt->options.op_alternate))            EVTiter(ckt);        /* while there are events on the queue with event time <= next */        /* projected analog time, process them */        while((g_mif_info.circuit.evt_step = EVTnext_time(ckt))               <= (ckt->CKTtime + ckt->CKTdelta)) {            /* Initialize temp analog bkpt to infinity */            g_mif_info.breakpoint.current = 1e30;            /* Pull items off queue and process them */            EVTdequeue(ckt, g_mif_info.circuit.evt_step);            EVTiter(ckt);            /* If any instances have forced an earlier */            /* next analog time, cut the delta */            if(*(ckt->CKTbreaks) < g_mif_info.breakpoint.current)                if(*(ckt->CKTbreaks) > (ckt->CKTtime + ckt->CKTminBreak))                    g_mif_info.breakpoint.current = *(ckt->CKTbreaks);            if(g_mif_info.breakpoint.current < (ckt->CKTtime + ckt->CKTdelta)) {                /* Breakpoint must be > last accepted timepoint */                /* and >= current event time */                if(g_mif_info.breakpoint.current > (ckt->CKTtime + ckt->CKTminBreak)                   && (g_mif_info.breakpoint.current >= g_mif_info.circuit.evt_step)) {                    ckt->CKTsaveDelta = ckt->CKTdelta;                    ckt->CKTdelta = g_mif_info.breakpoint.current - ckt->CKTtime;                    g_mif_info.breakpoint.last = ckt->CKTtime + ckt->CKTdelta;                }            }        } /* end while next event time <= next analog time */    } /* end if there are event instances *//* gtri - end - wbk - Do event solution */    for(i=5;i>=0;i--) {        ckt->CKTdeltaOld[i+1]=ckt->CKTdeltaOld[i];    }    ckt->CKTdeltaOld[0]=ckt->CKTdelta;    temp = ckt->CKTstates[ckt->CKTmaxOrder+1];    for(i=ckt->CKTmaxOrder;i>=0;i--) {        ckt->CKTstates[i+1] = ckt->CKTstates[i];    }    ckt->CKTstates[0] = temp;/* 600 */    while (1) {/* gtri - add - wbk - 4/17/91 - Fix Berkeley bug *//* This is needed here to allow CAPask to output currents *//* during Transient analysis.  A grep for CKTcurrentAnalysis *//* indicates that it should not hurt anything else ... */        ckt->CKTcurrentAnalysis = DOING_TRAN;/* gtri - end - wbk - 4/17/91 - Fix Berkeley bug */        olddelta=ckt->CKTdelta;        /* time abort? */        ckt->CKTtime += ckt->CKTdelta;        ckt->CKTdeltaOld[0]=ckt->CKTdelta;        NIcomCof(ckt);#ifdef PREDICTOR        error = NIpred(ckt);#endif /* PREDICTOR */        save_mode = ckt->CKTmode;        save_order = ckt->CKTorder;/* gtri - begin - wbk - Add Breakpoint stuff */        /* Initialize temporary breakpoint to infinity */        g_mif_info.breakpoint.current = 1.0e30;/* gtri - end - wbk - Add Breakpoint stuff *//* gtri - begin - wbk - add convergence problem reporting flags */        /* delta is forced to equal delmin on last attempt near line 650 */        if(ckt->CKTdelta <= ckt->CKTdelmin)            ckt->enh->conv_debug.last_NIiter_call = MIF_TRUE;        else            ckt->enh->conv_debug.last_NIiter_call = MIF_FALSE;/* gtri - begin - wbk - add convergence problem reporting flags *//* gtri - begin - wbk - Call all hybrids *//* gtri - begin - wbk - Set evt_step */        if(ckt->evt->counts.num_insts > 0) {            g_mif_info.circuit.evt_step = ckt->CKTtime;        }/* gtri - end - wbk - Set evt_step */        converged = NIiter(ckt,ckt->CKTtranMaxIter);        if(ckt->evt->counts.num_insts > 0) {            g_mif_info.circuit.evt_step = ckt->CKTtime;            EVTcall_hybrids(ckt);        }/* gtri - end - wbk - Call all hybrids */        ckt->CKTstat->STATtimePts ++;        ckt->CKTmode = (ckt->CKTmode&MODEUIC)|MODETRAN | MODEINITPRED;        if(firsttime) {            for(i=0;i<ckt->CKTnumStates;i++) {                *(ckt->CKTstate2+i) = *(ckt->CKTstate1+i);                *(ckt->CKTstate3+i) = *(ckt->CKTstate1+i);            }        }        if(converged != 0) {            ckt->CKTtime = ckt->CKTtime -ckt->CKTdelta;            ckt->CKTstat->STATrejected ++;            ckt->CKTdelta = ckt->CKTdelta/8;#ifdef STEPDEBUG            (void)printf("delta cut for non-convergence\n");#endif            if(firsttime) {                ckt->CKTmode = (ckt->CKTmode&MODEUIC)|MODETRAN | MODEINITTRAN;            }            ckt->CKTorder = 1;/* gtri - begin - wbk - Add Breakpoint stuff */        /* Force backup if temporary breakpoint is < current time */        } else if(g_mif_info.breakpoint.current < ckt->CKTtime) {            ckt->CKTsaveDelta = ckt->CKTdelta;            ckt->CKTtime -= ckt->CKTdelta;            ckt->CKTdelta = g_mif_info.breakpoint.current - ckt->CKTtime;            g_mif_info.breakpoint.last = ckt->CKTtime + ckt->CKTdelta;            if(firsttime) {                ckt->CKTmode = (ckt->CKTmode&MODEUIC)|MODETRAN | MODEINITTRAN;            }            ckt->CKTorder = 1;/* gtri - end - wbk - Add Breakpoint stuff */        } else {            if (firsttime) {                if(ckt->CKTsenInfo && (ckt->CKTsenInfo->SENmode & TRANSEN)){                    save1 = ckt->CKTmode;                    save2 = ckt->CKTorder;                    ckt->CKTmode = save_mode;                    ckt->CKTorder = save_order;                    if(error = CKTsenDCtran(ckt)) return(error);                    ckt->CKTmode = save1;                    ckt->CKTorder = save2;                }                firsttime =0;                goto nextTime;  /* no check on                                 * first time point                                 */            }            new = ckt->CKTdelta;            error = CKTtrunc(ckt,&new);            if(error) {                ckt->CKTcurrentAnalysis = DOING_TRAN;                ckt->CKTstat->STATtranTime +=                         (*(SPfrontEnd->IFseconds))()-startTime;                ckt->CKTstat->STATtranIter +=                         ckt->CKTstat->STATnumIter - startIters;                ckt->CKTstat->STATtranDecompTime += ckt->CKTstat->STATdecompTime                        - startdTime;                ckt->CKTstat->STATtranSolveTime += ckt->CKTstat->STATsolveTime                        - startsTime;                return(error);            }            if(new>.9 * ckt->CKTdelta) {                if(ckt->CKTorder == 1) {                    new = ckt->CKTdelta;                    ckt->CKTorder = 2;                    error = CKTtrunc(ckt,&new);                    if(error) {                        ckt->CKTcurrentAnalysis = DOING_TRAN;                        ckt->CKTstat->STATtranTime +=                                 (*(SPfrontEnd->IFseconds))()-startTime;                        ckt->CKTstat->STATtranIter +=                                 ckt->CKTstat->STATnumIter - startIters;                        ckt->CKTstat->STATtranDecompTime +=                                 ckt->CKTstat->STATdecompTime - startdTime;                        ckt->CKTstat->STATtranSolveTime +=                                 ckt->CKTstat->STATsolveTime - startsTime;                        return(error);                    }                    if(new <= 1.05 * ckt->CKTdelta) {                        ckt->CKTorder = 1;                    }                }                /* time point OK  - 630*/                ckt->CKTdelta = new;#ifdef STEPDEBUG                (void)printf(                    "delta set to truncation error result:point accepted\n");#endif                if(ckt->CKTsenInfo && (ckt->CKTsenInfo->SENmode & TRANSEN)){                    save1 = ckt->CKTmode;                    save2 = ckt->CKTorder;                    ckt->CKTmode = save_mode;                    ckt->CKTorder = save_order;                    if(error = CKTsenDCtran(ckt)) return(error);                    ckt->CKTmode = save1;                    ckt->CKTorder = save2;                }                /* go to 650 - trapezoidal */                goto nextTime;            } else {                ckt->CKTtime = ckt->CKTtime -ckt->CKTdelta;                ckt->CKTstat->STATrejected ++;                ckt->CKTdelta = new;#ifdef STEPDEBUG                (void)printf(                    "delta set to truncation error result:point rejected\n");#endif            }        }        if (ckt->CKTdelta <= ckt->CKTdelmin) {            if (olddelta > ckt->CKTdelmin) {                ckt->CKTdelta = ckt->CKTdelmin;#ifdef STEPDEBUG                (void)printf("delta at delmin\n");#endif            } else {                ckt->CKTcurrentAnalysis = DOING_TRAN;                ckt->CKTstat->STATtranTime +=                         (*(SPfrontEnd->IFseconds))()-startTime;                ckt->CKTstat->STATtranIter +=                         ckt->CKTstat->STATnumIter - startIters;                ckt->CKTstat->STATtranDecompTime +=                         ckt->CKTstat->STATdecompTime - startdTime;                ckt->CKTstat->STATtranSolveTime +=                         ckt->CKTstat->STATsolveTime - startsTime;                errMsg = MALLOC(strlen(msg)+1);                strcpy(errMsg,msg);                return(E_TIMESTEP);            }        }/* gtri - begin - wbk - Do event backup */        if(ckt->evt->counts.num_insts > 0)            EVTbackup(ckt, ckt->CKTtime + ckt->CKTdelta);/* gtri - end - wbk - Do event backup */    }    /* NOTREACHED */}

⌨️ 快捷键说明

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