|
|
|
@ -4,7 +4,7 @@ Author: 1985 Thomas L. Quarles |
|
|
|
Modified: 2000 AlansFixes |
|
|
|
**********/ |
|
|
|
|
|
|
|
/* subroutine to do DC TRANSIENT analysis |
|
|
|
/* subroutine to do DC TRANSIENT analysis |
|
|
|
--- ONLY, unlike spice2 routine with the same name! */ |
|
|
|
|
|
|
|
#include "ngspice.h" |
|
|
|
@ -18,7 +18,7 @@ Modified: 2000 AlansFixes |
|
|
|
|
|
|
|
#ifdef XSPICE |
|
|
|
/* gtri - add - wbk - Add headers */ |
|
|
|
#include "miftypes.h" |
|
|
|
#include "miftypes.h" |
|
|
|
|
|
|
|
#include "evt.h" |
|
|
|
#include "mif.h" |
|
|
|
@ -32,12 +32,12 @@ Modified: 2000 AlansFixes |
|
|
|
#endif |
|
|
|
|
|
|
|
#ifdef HAS_WINDOWS /* hvogt 10.03.99, nach W. Mues */ |
|
|
|
void SetAnalyse( char * Analyse, int Percent); |
|
|
|
void SetAnalyse(char * Analyse, int Percent); |
|
|
|
#endif |
|
|
|
|
|
|
|
int |
|
|
|
DCtran(CKTcircuit *ckt, |
|
|
|
int restart) /* forced restart flag */ |
|
|
|
int restart) /* forced restart flag */ |
|
|
|
{ |
|
|
|
int i; |
|
|
|
double olddelta; |
|
|
|
@ -85,26 +85,25 @@ DCtran(CKTcircuit *ckt, |
|
|
|
#endif |
|
|
|
if(restart || ckt->CKTtime == 0) { |
|
|
|
delta=MIN(ckt->CKTfinalTime/200,ckt->CKTstep)/10; |
|
|
|
|
|
|
|
#ifdef STEPDEBUG |
|
|
|
printf("delta = %g finalTime/200: %g CKTstep: %g\n",delta,ckt->CKTfinalTime/200,ckt->CKTstep); |
|
|
|
printf("delta = %g finalTime/200: %g CKTstep: %g\n",delta,ckt->CKTfinalTime/200,ckt->CKTstep); |
|
|
|
#endif |
|
|
|
/* begin LTRA code addition */ |
|
|
|
if (ckt->CKTtimePoints != NULL) |
|
|
|
FREE(ckt->CKTtimePoints); |
|
|
|
/* begin LTRA code addition */ |
|
|
|
if (ckt->CKTtimePoints != NULL) |
|
|
|
FREE(ckt->CKTtimePoints); |
|
|
|
|
|
|
|
if (ckt->CKTstep >= ckt->CKTmaxStep) |
|
|
|
maxstepsize = ckt->CKTstep; |
|
|
|
else |
|
|
|
maxstepsize = ckt->CKTmaxStep; |
|
|
|
if (ckt->CKTstep >= ckt->CKTmaxStep) |
|
|
|
maxstepsize = ckt->CKTstep; |
|
|
|
else |
|
|
|
maxstepsize = ckt->CKTmaxStep; |
|
|
|
|
|
|
|
ckt->CKTsizeIncr = 10; |
|
|
|
ckt->CKTtimeIndex = -1; /* before the DC soln has been stored */ |
|
|
|
ckt->CKTtimeListSize = ckt->CKTfinalTime / maxstepsize + 0.5; |
|
|
|
ltra_num = CKTtypelook("LTRA"); |
|
|
|
if (ltra_num >= 0 && ckt->CKThead[ltra_num] != NULL) |
|
|
|
ckt->CKTtimePoints = NEWN(double, ckt->CKTtimeListSize); |
|
|
|
/* end LTRA code addition */ |
|
|
|
ckt->CKTsizeIncr = 10; |
|
|
|
ckt->CKTtimeIndex = -1; /* before the DC soln has been stored */ |
|
|
|
ckt->CKTtimeListSize = ckt->CKTfinalTime / maxstepsize + 0.5; |
|
|
|
ltra_num = CKTtypelook("LTRA"); |
|
|
|
if (ltra_num >= 0 && ckt->CKThead[ltra_num] != NULL) |
|
|
|
ckt->CKTtimePoints = NEWN(double, ckt->CKTtimeListSize); |
|
|
|
/* end LTRA code addition */ |
|
|
|
|
|
|
|
if(ckt->CKTbreaks) FREE(ckt->CKTbreaks); |
|
|
|
ckt->CKTbreaks = TMALLOC(double, 2); |
|
|
|
@ -125,7 +124,6 @@ DCtran(CKTcircuit *ckt, |
|
|
|
|
|
|
|
#ifdef XSPICE |
|
|
|
/* gtri - add - wbk - 12/19/90 - Add IPC stuff and set anal_init and anal_type */ |
|
|
|
|
|
|
|
/* Tell the beginPlot routine what mode we're in */ |
|
|
|
g_ipc.anal_type = IPC_ANAL_TRAN; |
|
|
|
|
|
|
|
@ -133,7 +131,6 @@ DCtran(CKTcircuit *ckt, |
|
|
|
g_mif_info.circuit.anal_type = MIF_DC; |
|
|
|
|
|
|
|
g_mif_info.circuit.anal_init = MIF_TRUE; |
|
|
|
|
|
|
|
/* gtri - end - wbk */ |
|
|
|
#endif |
|
|
|
error = CKTnames(ckt,&numNames,&nameList); |
|
|
|
@ -141,17 +138,17 @@ DCtran(CKTcircuit *ckt, |
|
|
|
(*(SPfrontEnd->IFnewUid))(ckt,&timeUid,(IFuid)NULL, |
|
|
|
"time", UID_OTHER, NULL); |
|
|
|
error = (*(SPfrontEnd->OUTpBeginPlot))(ckt, |
|
|
|
ckt->CKTcurJob, |
|
|
|
ckt->CKTcurJob->JOBname,timeUid,IF_REAL,numNames,nameList, |
|
|
|
IF_REAL,&(((TRANan*)ckt->CKTcurJob)->TRANplot)); |
|
|
|
tfree(nameList); |
|
|
|
ckt->CKTcurJob, |
|
|
|
ckt->CKTcurJob->JOBname,timeUid,IF_REAL,numNames,nameList, |
|
|
|
IF_REAL,&(((TRANan*)ckt->CKTcurJob)->TRANplot)); |
|
|
|
tfree(nameList); |
|
|
|
if(error) return(error); |
|
|
|
|
|
|
|
ckt->CKTtime = 0; |
|
|
|
ckt->CKTdelta = 0; |
|
|
|
ckt->CKTbreak=1; |
|
|
|
firsttime = 1; |
|
|
|
save_mode = (ckt->CKTmode&MODEUIC)|MODETRANOP | MODEINITJCT; |
|
|
|
save_mode = (ckt->CKTmode&MODEUIC) | MODETRANOP | MODEINITJCT; |
|
|
|
save_order = ckt->CKTorder; |
|
|
|
#ifdef XSPICE |
|
|
|
/* gtri - begin - wbk - set a breakpoint at end of supply ramping time */ |
|
|
|
@ -161,72 +158,72 @@ DCtran(CKTcircuit *ckt, |
|
|
|
/* gtri - end - wbk - set a breakpoint at end of supply ramping time */ |
|
|
|
|
|
|
|
/* gtri - begin - wbk - Call EVTop if event-driven instances exist */ |
|
|
|
if(ckt->evt->counts.num_insts != 0){ |
|
|
|
/* use new DCOP algorithm */ |
|
|
|
converged = EVTop(ckt, |
|
|
|
(ckt->CKTmode & MODEUIC) | MODETRANOP | MODEINITJCT, |
|
|
|
(ckt->CKTmode & MODEUIC)|MODETRANOP| MODEINITFLOAT, |
|
|
|
ckt->CKTdcMaxIter, |
|
|
|
MIF_TRUE); |
|
|
|
EVTdump(ckt, IPC_ANAL_DCOP, 0.0); |
|
|
|
|
|
|
|
EVTop_save(ckt, MIF_FALSE, 0.0); |
|
|
|
|
|
|
|
/* gtri - end - wbk - Call EVTop if event-driven instances exist */ |
|
|
|
} else |
|
|
|
#endif |
|
|
|
if(ckt->evt->counts.num_insts != 0) { |
|
|
|
/* use new DCOP algorithm */ |
|
|
|
converged = EVTop(ckt, |
|
|
|
(ckt->CKTmode & MODEUIC) | MODETRANOP | MODEINITJCT, |
|
|
|
(ckt->CKTmode & MODEUIC) | MODETRANOP | MODEINITFLOAT, |
|
|
|
ckt->CKTdcMaxIter, |
|
|
|
MIF_TRUE); |
|
|
|
EVTdump(ckt, IPC_ANAL_DCOP, 0.0); |
|
|
|
|
|
|
|
EVTop_save(ckt, MIF_FALSE, 0.0); |
|
|
|
|
|
|
|
/* gtri - end - wbk - Call EVTop if event-driven instances exist */ |
|
|
|
} else |
|
|
|
#endif |
|
|
|
converged = CKTop(ckt, |
|
|
|
(ckt->CKTmode & MODEUIC)|MODETRANOP| MODEINITJCT, |
|
|
|
(ckt->CKTmode & MODEUIC)|MODETRANOP| MODEINITFLOAT, |
|
|
|
ckt->CKTdcMaxIter); |
|
|
|
|
|
|
|
if(converged != 0) { |
|
|
|
(ckt->CKTmode & MODEUIC)|MODETRANOP| MODEINITJCT, |
|
|
|
(ckt->CKTmode & MODEUIC)|MODETRANOP| MODEINITFLOAT, |
|
|
|
ckt->CKTdcMaxIter); |
|
|
|
|
|
|
|
if(converged != 0) { |
|
|
|
fprintf(stdout,"\nTransient solution failed -\n"); |
|
|
|
CKTncDump(ckt); |
|
|
|
/* CKTnode *node; |
|
|
|
double new, old, tol; |
|
|
|
int i=1; |
|
|
|
|
|
|
|
fprintf(stdout,"\nTransient solution failed -\n\n"); |
|
|
|
fprintf(stdout,"Last Node Voltages\n"); |
|
|
|
fprintf(stdout,"------------------\n\n"); |
|
|
|
fprintf(stdout,"%-30s %20s %20s\n", "Node", "Last Voltage", |
|
|
|
"Previous Iter"); |
|
|
|
fprintf(stdout,"%-30s %20s %20s\n", "----", "------------", |
|
|
|
"-------------"); |
|
|
|
for(node=ckt->CKTnodes->next;node;node=node->next) { |
|
|
|
if (strstr(node->name, "#branch") || !strstr(node->name, "#")) { |
|
|
|
new = *((ckt->CKTrhsOld) + i ) ; |
|
|
|
old = *((ckt->CKTrhs) + i ) ; |
|
|
|
fprintf(stdout,"%-30s %20g %20g", node->name, new, old); |
|
|
|
if(node->type == 3) { |
|
|
|
tol = ckt->CKTreltol * (MAX(fabs(old),fabs(new))) + |
|
|
|
ckt->CKTvoltTol; |
|
|
|
} else { |
|
|
|
tol = ckt->CKTreltol * (MAX(fabs(old),fabs(new))) + |
|
|
|
ckt->CKTabstol; |
|
|
|
} |
|
|
|
if (fabs(new-old) >tol ) { |
|
|
|
fprintf(stdout," *"); |
|
|
|
} |
|
|
|
fprintf(stdout,"\n"); |
|
|
|
}; |
|
|
|
i++; |
|
|
|
} */ |
|
|
|
fprintf(stdout,"\n"); |
|
|
|
fflush(stdout); |
|
|
|
/* CKTnode *node; |
|
|
|
double new, old, tol; |
|
|
|
int i=1; |
|
|
|
|
|
|
|
fprintf(stdout,"\nTransient solution failed -\n\n"); |
|
|
|
fprintf(stdout,"Last Node Voltages\n"); |
|
|
|
fprintf(stdout,"------------------\n\n"); |
|
|
|
fprintf(stdout,"%-30s %20s %20s\n", "Node", "Last Voltage", |
|
|
|
"Previous Iter"); |
|
|
|
fprintf(stdout,"%-30s %20s %20s\n", "----", "------------", |
|
|
|
"-------------"); |
|
|
|
for(node=ckt->CKTnodes->next;node;node=node->next) { |
|
|
|
if (strstr(node->name, "#branch") || !strstr(node->name, "#")) { |
|
|
|
new = *((ckt->CKTrhsOld) + i ) ; |
|
|
|
old = *((ckt->CKTrhs) + i ) ; |
|
|
|
fprintf(stdout,"%-30s %20g %20g", node->name, new, old); |
|
|
|
if(node->type == 3) { |
|
|
|
tol = ckt->CKTreltol * (MAX(fabs(old),fabs(new))) + |
|
|
|
ckt->CKTvoltTol; |
|
|
|
} else { |
|
|
|
tol = ckt->CKTreltol * (MAX(fabs(old),fabs(new))) + |
|
|
|
ckt->CKTabstol; |
|
|
|
} |
|
|
|
if (fabs(new-old) >tol ) { |
|
|
|
fprintf(stdout," *"); |
|
|
|
} |
|
|
|
fprintf(stdout,"\n"); |
|
|
|
}; |
|
|
|
i++; |
|
|
|
} */ |
|
|
|
fprintf(stdout,"\n"); |
|
|
|
fflush(stdout); |
|
|
|
} else if (!ft_noacctprint && !ft_noinitprint) { |
|
|
|
fprintf(stdout,"\nInitial Transient Solution\n"); |
|
|
|
fprintf(stdout,"--------------------------\n\n"); |
|
|
|
fprintf(stdout,"%-30s %15s\n", "Node", "Voltage"); |
|
|
|
fprintf(stdout,"%-30s %15s\n", "----", "-------"); |
|
|
|
for(node=ckt->CKTnodes->next;node;node=node->next) { |
|
|
|
if (strstr(node->name, "#branch") || !strstr(node->name, "#")) |
|
|
|
fprintf(stdout,"%-30s %15g\n", node->name, |
|
|
|
*(ckt->CKTrhsOld+node->number)); |
|
|
|
}; |
|
|
|
fprintf(stdout,"\n"); |
|
|
|
fflush(stdout); |
|
|
|
fprintf(stdout,"\nInitial Transient Solution\n"); |
|
|
|
fprintf(stdout,"--------------------------\n\n"); |
|
|
|
fprintf(stdout,"%-30s %15s\n", "Node", "Voltage"); |
|
|
|
fprintf(stdout,"%-30s %15s\n", "----", "-------"); |
|
|
|
for(node=ckt->CKTnodes->next;node;node=node->next) { |
|
|
|
if (strstr(node->name, "#branch") || !strstr(node->name, "#")) |
|
|
|
fprintf(stdout,"%-30s %15g\n", node->name, |
|
|
|
*(ckt->CKTrhsOld+node->number)); |
|
|
|
}; |
|
|
|
fprintf(stdout,"\n"); |
|
|
|
fflush(stdout); |
|
|
|
}; |
|
|
|
|
|
|
|
if(converged != 0) return(converged); |
|
|
|
@ -242,7 +239,6 @@ DCtran(CKTcircuit *ckt, |
|
|
|
|
|
|
|
/* gtri - end - wbk */ |
|
|
|
|
|
|
|
|
|
|
|
/* gtri - add - wbk - 12/19/90 - set anal_init and anal_type */ |
|
|
|
|
|
|
|
g_mif_info.circuit.anal_init = MIF_TRUE; |
|
|
|
@ -259,7 +255,7 @@ DCtran(CKTcircuit *ckt, |
|
|
|
g_mif_info.breakpoint.last = 1.0e30; |
|
|
|
|
|
|
|
/* gtri - end - wbk - Add Breakpoint stuff */ |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
ckt->CKTstat->STATtimePts ++; |
|
|
|
ckt->CKTorder=1; |
|
|
|
for(i=0;i<7;i++) { |
|
|
|
@ -290,10 +286,10 @@ DCtran(CKTcircuit *ckt, |
|
|
|
#endif |
|
|
|
|
|
|
|
ckt->CKTmode = (ckt->CKTmode&MODEUIC)|MODETRAN | MODEINITTRAN; |
|
|
|
/* modeinittran set here */ |
|
|
|
/* modeinittran set here */ |
|
|
|
ckt->CKTag[0]=ckt->CKTag[1]=0; |
|
|
|
bcopy(ckt->CKTstate0, ckt->CKTstate1, |
|
|
|
ckt->CKTnumStates*sizeof(double)); |
|
|
|
ckt->CKTnumStates*sizeof(double)); |
|
|
|
|
|
|
|
#ifdef WANT_SENSE2 |
|
|
|
if(ckt->CKTsenInfo && (ckt->CKTsenInfo->SENmode & TRANSEN)){ |
|
|
|
@ -311,12 +307,12 @@ DCtran(CKTcircuit *ckt, |
|
|
|
startcTime = ckt->CKTstat->STATcombineTime; |
|
|
|
startkTime = ckt->CKTstat->STATsyncTime; |
|
|
|
#ifdef CLUSTER |
|
|
|
CLUsetup(ckt); |
|
|
|
#endif |
|
|
|
CLUsetup(ckt); |
|
|
|
#endif |
|
|
|
} else { |
|
|
|
/*saj As traninit resets CKTmode */ |
|
|
|
ckt->CKTmode = (ckt->CKTmode&MODEUIC)|MODETRAN | MODEINITPRED; |
|
|
|
/* saj */ |
|
|
|
/* saj As traninit resets CKTmode */ |
|
|
|
ckt->CKTmode = (ckt->CKTmode&MODEUIC) | MODETRAN | MODEINITPRED; |
|
|
|
/* saj */ |
|
|
|
startTime=(*(SPfrontEnd->IFseconds))(); |
|
|
|
startIters = ckt->CKTstat->STATnumIter; |
|
|
|
startdTime = ckt->CKTstat->STATdecompTime; |
|
|
|
@ -326,42 +322,42 @@ DCtran(CKTcircuit *ckt, |
|
|
|
startkTime = ckt->CKTstat->STATsyncTime; |
|
|
|
if(ckt->CKTminBreak==0) ckt->CKTminBreak=ckt->CKTmaxStep*5e-5; |
|
|
|
firsttime=0; |
|
|
|
/* To get rawfile working saj*/ |
|
|
|
/* To get rawfile working saj*/ |
|
|
|
/* get namelist again */ |
|
|
|
error = CKTnames(ckt,&numNames,&nameList); |
|
|
|
error = CKTnames(ckt,&numNames,&nameList); |
|
|
|
if(error) return(error); |
|
|
|
/* get timeUiD again */ |
|
|
|
/* get timeUiD again */ |
|
|
|
(*(SPfrontEnd->IFnewUid))(ckt,&timeUid,(IFuid)NULL, |
|
|
|
"time", UID_OTHER, NULL); |
|
|
|
error = (*(SPfrontEnd->OUTpBeginPlot))(ckt, ckt->CKTcurJob, |
|
|
|
ckt->CKTcurJob->JOBname,timeUid,IF_REAL,666,nameList, |
|
|
|
666,&(((TRANan*)ckt->CKTcurJob)->TRANplot));/*magic 666 nums as flags */ |
|
|
|
tfree(nameList); |
|
|
|
if(error) { |
|
|
|
fprintf(stderr, "Couldn't relink rawfile\n"); |
|
|
|
return error; |
|
|
|
} |
|
|
|
/*end saj*/ |
|
|
|
error = (*(SPfrontEnd->OUTpBeginPlot))(ckt, ckt->CKTcurJob, |
|
|
|
ckt->CKTcurJob->JOBname,timeUid,IF_REAL,666,nameList, |
|
|
|
666,&(((TRANan*)ckt->CKTcurJob)->TRANplot));/* magic 666 nums as flags */ |
|
|
|
tfree(nameList); |
|
|
|
if(error) { |
|
|
|
fprintf(stderr, "Couldn't relink rawfile\n"); |
|
|
|
return error; |
|
|
|
} |
|
|
|
/* end saj*/ |
|
|
|
goto resume; |
|
|
|
} |
|
|
|
|
|
|
|
/* 650 */ |
|
|
|
nextTime: |
|
|
|
nextTime: |
|
|
|
|
|
|
|
/* begin LTRA code addition */ |
|
|
|
if (ckt->CKTtimePoints) { |
|
|
|
ckt->CKTtimeIndex++; |
|
|
|
if (ckt->CKTtimeIndex >= ckt->CKTtimeListSize) { |
|
|
|
/* need more space */ |
|
|
|
int need; |
|
|
|
need = 0.5 + (ckt->CKTfinalTime - ckt->CKTtime) / maxstepsize; |
|
|
|
if (need < ckt->CKTsizeIncr) |
|
|
|
need = ckt->CKTsizeIncr; |
|
|
|
ckt->CKTtimeListSize += need; |
|
|
|
ckt->CKTtimeIndex++; |
|
|
|
if (ckt->CKTtimeIndex >= ckt->CKTtimeListSize) { |
|
|
|
/* need more space */ |
|
|
|
int need; |
|
|
|
need = 0.5 + (ckt->CKTfinalTime - ckt->CKTtime) / maxstepsize; |
|
|
|
if (need < ckt->CKTsizeIncr) |
|
|
|
need = ckt->CKTsizeIncr; |
|
|
|
ckt->CKTtimeListSize += need; |
|
|
|
ckt->CKTtimePoints = TREALLOC(double, ckt->CKTtimePoints, ckt->CKTtimeListSize); |
|
|
|
ckt->CKTsizeIncr *= 1.4; |
|
|
|
} |
|
|
|
*(ckt->CKTtimePoints + ckt->CKTtimeIndex) = ckt->CKTtime; |
|
|
|
ckt->CKTsizeIncr *= 1.4; |
|
|
|
} |
|
|
|
*(ckt->CKTtimePoints + ckt->CKTtimeIndex) = ckt->CKTtime; |
|
|
|
} |
|
|
|
/* end LTRA code addition */ |
|
|
|
|
|
|
|
@ -382,8 +378,8 @@ nextTime: |
|
|
|
*/ |
|
|
|
|
|
|
|
#ifdef STEPDEBUG |
|
|
|
printf("Delta %g accepted at time %g (finaltime: %g)\n",ckt->CKTdelta,ckt->CKTtime,ckt->CKTfinalTime); |
|
|
|
fflush(stdout); |
|
|
|
printf("Delta %g accepted at time %g (finaltime: %g)\n",ckt->CKTdelta,ckt->CKTtime,ckt->CKTfinalTime); |
|
|
|
fflush(stdout); |
|
|
|
#endif /* STEPDEBUG */ |
|
|
|
ckt->CKTstat->STATaccepted ++; |
|
|
|
ckt->CKTbreak=0; |
|
|
|
@ -448,13 +444,13 @@ nextTime: |
|
|
|
g_ipc.last_time = ckt->CKTtime; |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
else |
|
|
|
/* gtri - modify - wbk - 12/19/90 - Send IPC stuff */ |
|
|
|
#endif |
|
|
|
#ifdef CLUSTER |
|
|
|
CLUoutput(ckt); |
|
|
|
#endif |
|
|
|
if(ckt->CKTtime >= ckt->CKTinitTime) CKTdump(ckt,ckt->CKTtime, |
|
|
|
CLUoutput(ckt); |
|
|
|
#endif |
|
|
|
if(ckt->CKTtime >= ckt->CKTinitTime) CKTdump(ckt,ckt->CKTtime, |
|
|
|
(((TRANan*)ckt->CKTcurJob)->TRANplot)); |
|
|
|
#ifdef XSPICE |
|
|
|
/* gtri - begin - wbk - Update event queues/data for accepted timepoint */ |
|
|
|
@ -464,11 +460,11 @@ nextTime: |
|
|
|
if(ckt->evt->counts.num_insts > 0) |
|
|
|
EVTaccept(ckt, ckt->CKTtime); |
|
|
|
/* gtri - end - wbk - Update event queues/data for accepted timepoint */ |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
ckt->CKTstat->STAToldIter = ckt->CKTstat->STATnumIter; |
|
|
|
if(check_autostop("tran") || |
|
|
|
fabs(ckt->CKTtime - ckt->CKTfinalTime) < ckt->CKTminBreak || |
|
|
|
AlmostEqualUlps( ckt->CKTtime, ckt->CKTfinalTime, 100 ) ) { |
|
|
|
fabs(ckt->CKTtime - ckt->CKTfinalTime) < ckt->CKTminBreak || |
|
|
|
AlmostEqualUlps( ckt->CKTtime, ckt->CKTfinalTime, 100 ) ) { |
|
|
|
#ifdef STEPDEBUG |
|
|
|
printf(" done: time is %g, final time is %g, and tol is %g\n", |
|
|
|
ckt->CKTtime,ckt->CKTfinalTime,ckt->CKTminBreak); |
|
|
|
@ -516,9 +512,9 @@ nextTime: |
|
|
|
} |
|
|
|
resume: |
|
|
|
#ifdef STEPDEBUG |
|
|
|
if( (ckt->CKTdelta <= ckt->CKTfinalTime/50) && |
|
|
|
(ckt->CKTdelta <= ckt->CKTmaxStep)) { |
|
|
|
; |
|
|
|
if( (ckt->CKTdelta <= ckt->CKTfinalTime/50) && |
|
|
|
(ckt->CKTdelta <= ckt->CKTmaxStep)) { |
|
|
|
; |
|
|
|
} else { |
|
|
|
if(ckt->CKTfinalTime/50<ckt->CKTmaxStep) { |
|
|
|
(void)printf("limited by Tstop/50\n"); |
|
|
|
@ -528,56 +524,55 @@ resume: |
|
|
|
} |
|
|
|
#endif |
|
|
|
#ifdef HAS_WINDOWS |
|
|
|
if (ckt->CKTtime == 0.) |
|
|
|
if (ckt->CKTtime == 0.) |
|
|
|
SetAnalyse( "tran init", 0); |
|
|
|
else |
|
|
|
SetAnalyse( "tran", (int)((ckt->CKTtime * 1000.) / ckt->CKTfinalTime)); |
|
|
|
#endif |
|
|
|
ckt->CKTdelta = |
|
|
|
ckt->CKTdelta = |
|
|
|
MIN(ckt->CKTdelta,ckt->CKTmaxStep); |
|
|
|
#ifdef XSPICE |
|
|
|
/* gtri - begin - wbk - Cut integration order if first timepoint after breakpoint */ |
|
|
|
//if(ckt->CKTtime == g_mif_info.breakpoint.last) |
|
|
|
/* if(ckt->CKTtime == g_mif_info.breakpoint.last) */ |
|
|
|
if ( AlmostEqualUlps( ckt->CKTtime, g_mif_info.breakpoint.last, 100 ) ) |
|
|
|
ckt->CKTorder = 1; |
|
|
|
/* gtri - end - wbk - Cut integration order if first timepoint after breakpoint */ |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
/* are we at a breakpoint, or indistinguishably close? */ |
|
|
|
//if ((ckt->CKTtime == *(ckt->CKTbreaks)) || (*(ckt->CKTbreaks) - |
|
|
|
/* are we at a breakpoint, or indistinguishably close? */ |
|
|
|
/* if ((ckt->CKTtime == *(ckt->CKTbreaks)) || (*(ckt->CKTbreaks) - */ |
|
|
|
if ( AlmostEqualUlps( ckt->CKTtime, *(ckt->CKTbreaks), 100 ) || (*(ckt->CKTbreaks) - |
|
|
|
(ckt->CKTtime) <= ckt->CKTdelmin)) { |
|
|
|
(ckt->CKTtime) <= ckt->CKTdelmin)) { |
|
|
|
/* first timepoint after a breakpoint - cut integration order */ |
|
|
|
/* and limit timestep to .1 times minimum of time to next breakpoint, |
|
|
|
* and previous timestep |
|
|
|
* and previous timestep |
|
|
|
*/ |
|
|
|
ckt->CKTorder = 1; |
|
|
|
#ifdef STEPDEBUG |
|
|
|
if( (ckt->CKTdelta >.1* ckt->CKTsaveDelta) || |
|
|
|
(ckt->CKTdelta > .1*(*(ckt->CKTbreaks+1)-*(ckt->CKTbreaks))) ) { |
|
|
|
(ckt->CKTdelta > .1*(*(ckt->CKTbreaks+1)-*(ckt->CKTbreaks))) ) { |
|
|
|
if(ckt->CKTsaveDelta < (*(ckt->CKTbreaks+1)-*(ckt->CKTbreaks))) { |
|
|
|
(void)printf("limited by pre-breakpoint delta (saveDelta: %g, nxt_breakpt: %g, curr_breakpt: %g\n", |
|
|
|
ckt->CKTsaveDelta, *(ckt->CKTbreaks+1), *(ckt->CKTbreaks)); |
|
|
|
ckt->CKTsaveDelta, *(ckt->CKTbreaks+1), *(ckt->CKTbreaks)); |
|
|
|
} else { |
|
|
|
(void)printf("limited by next breakpoint\n"); |
|
|
|
} |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
ckt->CKTdelta = MIN(ckt->CKTdelta, .1 * MIN(ckt->CKTsaveDelta, |
|
|
|
*(ckt->CKTbreaks+1)-*(ckt->CKTbreaks))); |
|
|
|
ckt->CKTdelta = MIN(ckt->CKTdelta, .1 * MIN(ckt->CKTsaveDelta, |
|
|
|
*(ckt->CKTbreaks+1)-*(ckt->CKTbreaks))); |
|
|
|
|
|
|
|
if(firsttime) { |
|
|
|
ckt->CKTdelta /= 10; |
|
|
|
#ifdef STEPDEBUG |
|
|
|
(void)printf("delta cut for initial timepoint\n"); |
|
|
|
#endif |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#ifdef XSPICE |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/* gtri - begin - wbk - Add Breakpoint stuff */ |
|
|
|
|
|
|
|
@ -588,7 +583,7 @@ resume: |
|
|
|
ckt->CKTdelta = g_mif_info.breakpoint.current - ckt->CKTtime; |
|
|
|
g_mif_info.breakpoint.last = ckt->CKTtime + ckt->CKTdelta; |
|
|
|
} |
|
|
|
else { |
|
|
|
else { |
|
|
|
/* Else, mark that timestep was not set by temporary breakpoint */ |
|
|
|
g_mif_info.breakpoint.last = 1.0e30; |
|
|
|
} |
|
|
|
@ -599,12 +594,12 @@ resume: |
|
|
|
/* Throw out any permanent breakpoint times <= current time */ |
|
|
|
for (;;) { |
|
|
|
#ifdef STEPDEBUG |
|
|
|
printf(" brk_pt: %g ckt_time: %g ckt_min_break: %g\n",*(ckt->CKTbreaks), ckt->CKTtime, ckt->CKTminBreak); |
|
|
|
printf(" brk_pt: %g ckt_time: %g ckt_min_break: %g\n",*(ckt->CKTbreaks), ckt->CKTtime, ckt->CKTminBreak); |
|
|
|
#endif |
|
|
|
if(AlmostEqualUlps(*(ckt->CKTbreaks),ckt->CKTtime, 100) || *(ckt->CKTbreaks) <= (ckt->CKTtime + ckt->CKTminBreak)) { |
|
|
|
if(AlmostEqualUlps(*(ckt->CKTbreaks),ckt->CKTtime, 100) || *(ckt->CKTbreaks) <= (ckt->CKTtime + ckt->CKTminBreak)) { |
|
|
|
#ifdef STEPDEBUG |
|
|
|
printf("throwing out permanent breakpoint times <= current time (brk pt: %g)\n",*(ckt->CKTbreaks)); |
|
|
|
printf(" ckt_time: %g ckt_min_break: %g\n",ckt->CKTtime, ckt->CKTminBreak); |
|
|
|
printf("throwing out permanent breakpoint times <= current time (brk pt: %g)\n",*(ckt->CKTbreaks)); |
|
|
|
printf(" ckt_time: %g ckt_min_break: %g\n",ckt->CKTtime, ckt->CKTminBreak); |
|
|
|
#endif |
|
|
|
CKTclrBreak(ckt); |
|
|
|
} |
|
|
|
@ -621,8 +616,8 @@ resume: |
|
|
|
/* gtri - end - wbk - Modify Breakpoint stuff */ |
|
|
|
#else /* !XSPICE */ |
|
|
|
|
|
|
|
/* don't want to get below delmin for no reason */ |
|
|
|
ckt->CKTdelta = MAX(ckt->CKTdelta, ckt->CKTdelmin*2.0); |
|
|
|
/* don't want to get below delmin for no reason */ |
|
|
|
ckt->CKTdelta = MAX(ckt->CKTdelta, ckt->CKTdelmin*2.0); |
|
|
|
} |
|
|
|
else if(ckt->CKTtime + ckt->CKTdelta >= *(ckt->CKTbreaks)) { |
|
|
|
ckt->CKTsaveDelta = ckt->CKTdelta; |
|
|
|
@ -703,7 +698,7 @@ resume: |
|
|
|
/* 600 */ |
|
|
|
for (;;) { |
|
|
|
#ifdef CLUSTER |
|
|
|
redostep = 1; |
|
|
|
redostep = 1; |
|
|
|
#endif |
|
|
|
#ifdef XSPICE |
|
|
|
/* gtri - add - wbk - 4/17/91 - Fix Berkeley bug */ |
|
|
|
@ -719,8 +714,8 @@ resume: |
|
|
|
/* time abort? */ |
|
|
|
ckt->CKTtime += ckt->CKTdelta; |
|
|
|
#ifdef CLUSTER |
|
|
|
CLUinput(ckt); |
|
|
|
#endif |
|
|
|
CLUinput(ckt); |
|
|
|
#endif |
|
|
|
ckt->CKTdeltaOld[0]=ckt->CKTdelta; |
|
|
|
NIcomCof(ckt); |
|
|
|
#ifdef PREDICTOR |
|
|
|
@ -740,11 +735,10 @@ resume: |
|
|
|
/* 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; |
|
|
|
ckt->enh->conv_debug.last_NIiter_call = MIF_TRUE; |
|
|
|
else |
|
|
|
ckt->enh->conv_debug.last_NIiter_call = MIF_FALSE; |
|
|
|
ckt->enh->conv_debug.last_NIiter_call = MIF_FALSE; |
|
|
|
/* gtri - begin - wbk - add convergence problem reporting flags */ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* gtri - begin - wbk - Call all hybrids */ |
|
|
|
@ -752,22 +746,22 @@ resume: |
|
|
|
/* gtri - begin - wbk - Set evt_step */ |
|
|
|
|
|
|
|
if(ckt->evt->counts.num_insts > 0) { |
|
|
|
g_mif_info.circuit.evt_step = ckt->CKTtime; |
|
|
|
g_mif_info.circuit.evt_step = ckt->CKTtime; |
|
|
|
} |
|
|
|
/* gtri - end - wbk - Set evt_step */ |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
converged = NIiter(ckt,ckt->CKTtranMaxIter); |
|
|
|
|
|
|
|
|
|
|
|
#ifdef XSPICE |
|
|
|
if(ckt->evt->counts.num_insts > 0) |
|
|
|
{ |
|
|
|
if(ckt->evt->counts.num_insts > 0) |
|
|
|
{ |
|
|
|
g_mif_info.circuit.evt_step = ckt->CKTtime; |
|
|
|
EVTcall_hybrids(ckt); |
|
|
|
} |
|
|
|
} |
|
|
|
/* gtri - end - wbk - Call all hybrids */ |
|
|
|
|
|
|
|
#endif |
|
|
|
#endif |
|
|
|
ckt->CKTstat->STATtimePts ++; |
|
|
|
ckt->CKTmode = (ckt->CKTmode&MODEUIC)|MODETRAN | MODEINITPRED; |
|
|
|
if(firsttime) { |
|
|
|
@ -776,23 +770,23 @@ resume: |
|
|
|
*(ckt->CKTstate3+i) = *(ckt->CKTstate1+i); |
|
|
|
} |
|
|
|
} |
|
|
|
/* txl, cpl addition */ |
|
|
|
if (converged == 1111) { |
|
|
|
return(converged); |
|
|
|
} |
|
|
|
/* txl, cpl addition */ |
|
|
|
if (converged == 1111) { |
|
|
|
return(converged); |
|
|
|
} |
|
|
|
|
|
|
|
if(converged != 0) { |
|
|
|
#ifndef CLUSTER |
|
|
|
#ifndef CLUSTER |
|
|
|
ckt->CKTtime = ckt->CKTtime -ckt->CKTdelta; |
|
|
|
ckt->CKTstat->STATrejected ++; |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
ckt->CKTdelta = ckt->CKTdelta/8; |
|
|
|
#ifdef STEPDEBUG |
|
|
|
(void)printf("delta cut to %g for non-convergance\n",ckt->CKTdelta); |
|
|
|
(void)printf("delta cut to %g for non-convergance\n",ckt->CKTdelta); |
|
|
|
fflush(stdout); |
|
|
|
#endif |
|
|
|
if(firsttime) { |
|
|
|
ckt->CKTmode = (ckt->CKTmode&MODEUIC)|MODETRAN | MODEINITTRAN; |
|
|
|
ckt->CKTmode = (ckt->CKTmode&MODEUIC) | MODETRAN | MODEINITTRAN; |
|
|
|
} |
|
|
|
ckt->CKTorder = 1; |
|
|
|
|
|
|
|
@ -828,33 +822,33 @@ resume: |
|
|
|
} |
|
|
|
#endif |
|
|
|
firsttime =0; |
|
|
|
#ifndef CLUSTER |
|
|
|
#ifndef CLUSTER |
|
|
|
goto nextTime; /* no check on |
|
|
|
* first time point |
|
|
|
*/ |
|
|
|
#else |
|
|
|
redostep = 0; |
|
|
|
goto chkStep; |
|
|
|
#endif |
|
|
|
redostep = 0; |
|
|
|
goto chkStep; |
|
|
|
#endif |
|
|
|
} |
|
|
|
new = ckt->CKTdelta; |
|
|
|
error = CKTtrunc(ckt,&new); |
|
|
|
if(error) { |
|
|
|
ckt->CKTcurrentAnalysis = DOING_TRAN; |
|
|
|
ckt->CKTstat->STATtranTime += |
|
|
|
(*(SPfrontEnd->IFseconds))()-startTime; |
|
|
|
ckt->CKTstat->STATtranIter += |
|
|
|
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; |
|
|
|
ckt->CKTstat->STATtranLoadTime += ckt->CKTstat->STATloadTime |
|
|
|
- startlTime; |
|
|
|
ckt->CKTstat->STATtranCombTime += ckt->CKTstat->STATcombineTime |
|
|
|
- startcTime; |
|
|
|
ckt->CKTstat->STATtranSyncTime += ckt->CKTstat->STATsyncTime |
|
|
|
- startkTime; |
|
|
|
ckt->CKTstat->STATtranLoadTime += ckt->CKTstat->STATloadTime |
|
|
|
- startlTime; |
|
|
|
ckt->CKTstat->STATtranCombTime += ckt->CKTstat->STATcombineTime |
|
|
|
- startcTime; |
|
|
|
ckt->CKTstat->STATtranSyncTime += ckt->CKTstat->STATsyncTime |
|
|
|
- startkTime; |
|
|
|
return(error); |
|
|
|
} |
|
|
|
if(new>.9 * ckt->CKTdelta) { |
|
|
|
@ -864,41 +858,41 @@ resume: |
|
|
|
error = CKTtrunc(ckt,&new); |
|
|
|
if(error) { |
|
|
|
ckt->CKTcurrentAnalysis = DOING_TRAN; |
|
|
|
ckt->CKTstat->STATtranTime += |
|
|
|
(*(SPfrontEnd->IFseconds))()-startTime; |
|
|
|
ckt->CKTstat->STATtranIter += |
|
|
|
ckt->CKTstat->STATtranTime += |
|
|
|
(*(SPfrontEnd->IFseconds))() - startTime; |
|
|
|
ckt->CKTstat->STATtranIter += |
|
|
|
ckt->CKTstat->STATnumIter - startIters; |
|
|
|
ckt->CKTstat->STATtranDecompTime += |
|
|
|
ckt->CKTstat->STATtranDecompTime += |
|
|
|
ckt->CKTstat->STATdecompTime - startdTime; |
|
|
|
ckt->CKTstat->STATtranSolveTime += |
|
|
|
ckt->CKTstat->STATtranSolveTime += |
|
|
|
ckt->CKTstat->STATsolveTime - startsTime; |
|
|
|
ckt->CKTstat->STATtranLoadTime += |
|
|
|
ckt->CKTstat->STATloadTime - startlTime; |
|
|
|
ckt->CKTstat->STATtranCombTime += |
|
|
|
ckt->CKTstat->STATcombineTime - startcTime; |
|
|
|
ckt->CKTstat->STATtranSyncTime += |
|
|
|
ckt->CKTstat->STATsyncTime - startkTime; |
|
|
|
ckt->CKTstat->STATtranLoadTime += |
|
|
|
ckt->CKTstat->STATloadTime - startlTime; |
|
|
|
ckt->CKTstat->STATtranCombTime += |
|
|
|
ckt->CKTstat->STATcombineTime - startcTime; |
|
|
|
ckt->CKTstat->STATtranSyncTime += |
|
|
|
ckt->CKTstat->STATsyncTime - startkTime; |
|
|
|
return(error); |
|
|
|
} |
|
|
|
if(new <= 1.05 * ckt->CKTdelta) { |
|
|
|
ckt->CKTorder = 1; |
|
|
|
} |
|
|
|
} |
|
|
|
/* time point OK - 630*/ |
|
|
|
/* time point OK - 630 */ |
|
|
|
ckt->CKTdelta = new; |
|
|
|
#ifdef NDEV |
|
|
|
/* show a time process indicator, by Gong Ding, gdiso@ustc.edu */ |
|
|
|
if(ckt->CKTtime/ckt->CKTfinalTime*100<10.0) |
|
|
|
printf("%%%3.2lf\b\b\b\b\b",ckt->CKTtime/ckt->CKTfinalTime*100); |
|
|
|
else if(ckt->CKTtime/ckt->CKTfinalTime*100<100.0) |
|
|
|
printf("%%%4.2lf\b\b\b\b\b\b",ckt->CKTtime/ckt->CKTfinalTime*100); |
|
|
|
else |
|
|
|
printf("%%%5.2lf\b\b\b\b\b\b\b",ckt->CKTtime/ckt->CKTfinalTime*100); |
|
|
|
fflush(stdout); |
|
|
|
#endif |
|
|
|
|
|
|
|
#ifdef NDEV |
|
|
|
/* show a time process indicator, by Gong Ding, gdiso@ustc.edu */ |
|
|
|
if(ckt->CKTtime/ckt->CKTfinalTime*100<10.0) |
|
|
|
printf("%%%3.2lf\b\b\b\b\b",ckt->CKTtime/ckt->CKTfinalTime*100); |
|
|
|
else if(ckt->CKTtime/ckt->CKTfinalTime*100<100.0) |
|
|
|
printf("%%%4.2lf\b\b\b\b\b\b",ckt->CKTtime/ckt->CKTfinalTime*100); |
|
|
|
else |
|
|
|
printf("%%%5.2lf\b\b\b\b\b\b\b",ckt->CKTtime/ckt->CKTfinalTime*100); |
|
|
|
fflush(stdout); |
|
|
|
#endif |
|
|
|
|
|
|
|
#ifdef STEPDEBUG |
|
|
|
(void)printf( |
|
|
|
(void)printf( |
|
|
|
"delta set to truncation error result: %g. Point accepted at CKTtime: %g\n", |
|
|
|
ckt->CKTdelta,ckt->CKTtime); |
|
|
|
fflush(stdout); |
|
|
|
@ -915,17 +909,17 @@ resume: |
|
|
|
} |
|
|
|
#endif |
|
|
|
#ifndef CLUSTER |
|
|
|
/* go to 650 - trapezoidal */ |
|
|
|
/* go to 650 - trapezoidal */ |
|
|
|
goto nextTime; |
|
|
|
#else |
|
|
|
redostep = 0; |
|
|
|
goto chkStep; |
|
|
|
#endif |
|
|
|
redostep = 0; |
|
|
|
goto chkStep; |
|
|
|
#endif |
|
|
|
} else { |
|
|
|
#ifndef CLUSTER |
|
|
|
#ifndef CLUSTER |
|
|
|
ckt->CKTtime = ckt->CKTtime -ckt->CKTdelta; |
|
|
|
ckt->CKTstat->STATrejected ++; |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
ckt->CKTdelta = new; |
|
|
|
#ifdef STEPDEBUG |
|
|
|
(void)printf( |
|
|
|
@ -934,7 +928,7 @@ resume: |
|
|
|
} |
|
|
|
} |
|
|
|
#ifdef PARALLEL_ARCH |
|
|
|
DGOP_( &type, &(ckt->CKTdelta), &length, "min" ); |
|
|
|
DGOP_( &type, &(ckt->CKTdelta), &length, "min" ); |
|
|
|
#endif /* PARALLEL_ARCH */ |
|
|
|
|
|
|
|
if (ckt->CKTdelta <= ckt->CKTdelmin) { |
|
|
|
@ -945,21 +939,21 @@ resume: |
|
|
|
#endif |
|
|
|
} else { |
|
|
|
ckt->CKTcurrentAnalysis = DOING_TRAN; |
|
|
|
ckt->CKTstat->STATtranTime += |
|
|
|
ckt->CKTstat->STATtranTime += |
|
|
|
(*(SPfrontEnd->IFseconds))()-startTime; |
|
|
|
ckt->CKTstat->STATtranIter += |
|
|
|
ckt->CKTstat->STATtranIter += |
|
|
|
ckt->CKTstat->STATnumIter - startIters; |
|
|
|
ckt->CKTstat->STATtranDecompTime += |
|
|
|
ckt->CKTstat->STATtranDecompTime += |
|
|
|
ckt->CKTstat->STATdecompTime - startdTime; |
|
|
|
ckt->CKTstat->STATtranSolveTime += |
|
|
|
ckt->CKTstat->STATtranSolveTime += |
|
|
|
ckt->CKTstat->STATsolveTime - startsTime; |
|
|
|
ckt->CKTstat->STATtranLoadTime += |
|
|
|
ckt->CKTstat->STATloadTime - startlTime; |
|
|
|
ckt->CKTstat->STATtranCombTime += |
|
|
|
ckt->CKTstat->STATcombineTime - startcTime; |
|
|
|
ckt->CKTstat->STATtranSyncTime += |
|
|
|
ckt->CKTstat->STATsyncTime - startkTime; |
|
|
|
errMsg = CKTtrouble(ckt, "Timestep too small"); |
|
|
|
ckt->CKTstat->STATtranLoadTime += |
|
|
|
ckt->CKTstat->STATloadTime - startlTime; |
|
|
|
ckt->CKTstat->STATtranCombTime += |
|
|
|
ckt->CKTstat->STATcombineTime - startcTime; |
|
|
|
ckt->CKTstat->STATtranSyncTime += |
|
|
|
ckt->CKTstat->STATsyncTime - startkTime; |
|
|
|
errMsg = CKTtrouble(ckt, "Timestep too small"); |
|
|
|
return(E_TIMESTEP); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -970,16 +964,16 @@ resume: |
|
|
|
EVTbackup(ckt, ckt->CKTtime + ckt->CKTdelta); |
|
|
|
|
|
|
|
/* gtri - end - wbk - Do event backup */ |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
#ifdef CLUSTER |
|
|
|
chkStep: |
|
|
|
if(CLUsync(ckt->CKTtime,&ckt->CKTdelta,redostep)){ |
|
|
|
goto nextTime; |
|
|
|
} else { |
|
|
|
ckt->CKTtime -= olddelta; |
|
|
|
ckt->CKTstat->STATrejected ++; |
|
|
|
} |
|
|
|
#endif |
|
|
|
chkStep: |
|
|
|
if(CLUsync(ckt->CKTtime,&ckt->CKTdelta,redostep)){ |
|
|
|
goto nextTime; |
|
|
|
} else { |
|
|
|
ckt->CKTtime -= olddelta; |
|
|
|
ckt->CKTstat->STATrejected ++; |
|
|
|
} |
|
|
|
#endif |
|
|
|
} |
|
|
|
/* NOTREACHED */ |
|
|
|
} |