parent
14815e8381
commit
3845db2c1f
|
|
@ -53,6 +53,8 @@ libfte_la_SOURCES = \
|
||||||
com_let.h \
|
com_let.h \
|
||||||
com_optimize.c \
|
com_optimize.c \
|
||||||
com_optimize.h \
|
com_optimize.h \
|
||||||
|
com_checkpoint.c \
|
||||||
|
com_checkpoint.h \
|
||||||
com_option.c \
|
com_option.c \
|
||||||
com_option.h \
|
com_option.h \
|
||||||
com_plot.c \
|
com_plot.c \
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,8 @@ void com_alter(wordlist *wl);
|
||||||
void com_altermod(wordlist *wl);
|
void com_altermod(wordlist *wl);
|
||||||
void com_alterparam(wordlist *wl);
|
void com_alterparam(wordlist *wl);
|
||||||
void com_optimize(wordlist *wl); /* Enhancement-130 */
|
void com_optimize(wordlist *wl); /* Enhancement-130 */
|
||||||
|
void com_savestate(wordlist *wl); /* Enhancement-131 */
|
||||||
|
void com_loadstate(wordlist *wl); /* Enhancement-131 */
|
||||||
void com_meas(wordlist *wl);
|
void com_meas(wordlist *wl);
|
||||||
void com_sysinfo(wordlist *wl);
|
void com_sysinfo(wordlist *wl);
|
||||||
void com_check_ifparm(wordlist *wl);
|
void com_check_ifparm(wordlist *wl);
|
||||||
|
|
|
||||||
|
|
@ -428,6 +428,14 @@ struct comm spcp_coms[] = {
|
||||||
{ 040, 040, 040, 040 }, E_DEFHMASK, 1, LOTS,
|
{ 040, 040, 040, 040 }, E_DEFHMASK, 1, LOTS,
|
||||||
NULL,
|
NULL,
|
||||||
"-param name init lo hi ... -analysis <cmd> -minimize <expr> [-maxiter N] [-tol T] [-verbose] : Nelder-Mead parameter optimizer." },
|
"-param name init lo hi ... -analysis <cmd> -minimize <expr> [-maxiter N] [-tol T] [-verbose] : Nelder-Mead parameter optimizer." },
|
||||||
|
{ "savestate", com_savestate, FALSE, TRUE, /* Enhancement-131 */
|
||||||
|
{ 1, 040000, 040000, 040000 }, E_DEFHMASK, 1, 1,
|
||||||
|
NULL,
|
||||||
|
"file : Save the current transient state to a checkpoint file." },
|
||||||
|
{ "loadstate", com_loadstate, FALSE, TRUE, /* Enhancement-131 */
|
||||||
|
{ 1, 040000, 040000, 040000 }, E_DEFHMASK, 1, 1,
|
||||||
|
NULL,
|
||||||
|
"file : Restore a transient checkpoint and continue the .tran run." },
|
||||||
{ "resume", com_resume, TRUE, FALSE,
|
{ "resume", com_resume, TRUE, FALSE,
|
||||||
{ 0, 0, 0, 0 }, E_DEFHMASK, 0, 0,
|
{ 0, 0, 0, 0 }, E_DEFHMASK, 0, 0,
|
||||||
NULL,
|
NULL,
|
||||||
|
|
|
||||||
|
|
@ -270,6 +270,8 @@ struct CKTcircuit {
|
||||||
unsigned int CKTkeepOpInfo:1; /* flag for small signal analyses */
|
unsigned int CKTkeepOpInfo:1; /* flag for small signal analyses */
|
||||||
unsigned int CKTcopyNodesets:1; /* NodesetFIX */
|
unsigned int CKTcopyNodesets:1; /* NodesetFIX */
|
||||||
unsigned int CKTnodeDamping:1; /* flag for node damping fix */
|
unsigned int CKTnodeDamping:1; /* flag for node damping fix */
|
||||||
|
unsigned int CKTcheckpoint:1; /* Enhancement-131: DCtran should continue from a restored
|
||||||
|
checkpoint (keep loaded state, build a fresh output plot) */
|
||||||
double CKTabsDv; /* abs limit for iter-iter voltage change */
|
double CKTabsDv; /* abs limit for iter-iter voltage change */
|
||||||
double CKTrelDv; /* rel limit for iter-iter voltage change */
|
double CKTrelDv; /* rel limit for iter-iter voltage change */
|
||||||
int CKTtroubleNode; /* Non-convergent node number */
|
int CKTtroubleNode; /* Non-convergent node number */
|
||||||
|
|
|
||||||
|
|
@ -113,6 +113,78 @@ DCtran(CKTcircuit *ckt,
|
||||||
#if defined SHARED_MODULE
|
#if defined SHARED_MODULE
|
||||||
int redostep;
|
int redostep;
|
||||||
#endif
|
#endif
|
||||||
|
if(ckt->CKTcheckpoint) {
|
||||||
|
/* Enhancement-131: continue a transient run from a checkpoint that was
|
||||||
|
restored from disk (see com_loadstate() in com_checkpoint.c). The
|
||||||
|
restored circuit already carries the saved CKTtime, CKTdelta,
|
||||||
|
CKTstates[], CKTrhsOld and integration order, so -- unlike a fresh
|
||||||
|
run -- we must NOT reset them or redo the DC operating point. Unlike
|
||||||
|
the in-memory `resume` path below we also cannot 666-relink an
|
||||||
|
existing output plot (there is none across a reload), so we open a
|
||||||
|
FRESH plot exactly as the restart branch does, then jump straight
|
||||||
|
into the time-stepping loop. */
|
||||||
|
ckt->CKTcheckpoint = 0; /* one-shot */
|
||||||
|
ckt->CKTmode = (ckt->CKTmode & MODEUIC) | MODETRAN | MODEINITPRED;
|
||||||
|
INIT_STATS();
|
||||||
|
firsttime = 0;
|
||||||
|
if(ckt->CKTminBreak == 0)
|
||||||
|
ckt->CKTminBreak = ckt->CKTmaxStep * 5e-5;
|
||||||
|
|
||||||
|
#ifdef XSPICE
|
||||||
|
/* The in-memory `resume` inherits these from the original run; a
|
||||||
|
cross-session restore starts a fresh process, so initialise the
|
||||||
|
XSPICE temporary-breakpoint markers (otherwise the stepping loop
|
||||||
|
forces CKTdelta to breakpoint.current - CKTtime = -CKTtime). */
|
||||||
|
g_mif_info.circuit.anal_type = MIF_DC;
|
||||||
|
g_mif_info.breakpoint.current = 1.0e30;
|
||||||
|
g_mif_info.breakpoint.last = 1.0e30;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Build a fresh output plot for the continuation. */
|
||||||
|
error = CKTnames(ckt, &numNames, &nameList);
|
||||||
|
if(error) return(error);
|
||||||
|
SPfrontEnd->IFnewUid (ckt, &timeUid, NULL, "time", UID_OTHER, NULL);
|
||||||
|
error = SPfrontEnd->OUTpBeginPlot (ckt, ckt->CKTcurJob,
|
||||||
|
ckt->CKTcurJob->JOBname,
|
||||||
|
timeUid, IF_REAL,
|
||||||
|
numNames, nameList, IF_REAL,
|
||||||
|
&(job->TRANplot));
|
||||||
|
tfree(nameList);
|
||||||
|
if(error) return(error);
|
||||||
|
|
||||||
|
if (ckt->CKTsoaCheck)
|
||||||
|
error = CKTsoaInit();
|
||||||
|
|
||||||
|
/* Fix up the breakpoint list for the continuation. Drop any restored
|
||||||
|
breakpoints at or before the resume time (they are in the past and
|
||||||
|
would yield a negative time step); keep the genuine future ones (e.g.
|
||||||
|
pending source edges). Then guarantee the (possibly extended) final
|
||||||
|
time is present and that at least two entries exist -- the stepping
|
||||||
|
loop reads CKTbreaks[1]. Sources re-schedule their own future edges
|
||||||
|
as the run proceeds. */
|
||||||
|
if(ckt->CKTbreaks != NULL && ckt->CKTbreakSize > 0) {
|
||||||
|
int nb, w = 0;
|
||||||
|
for(nb = 0; nb < ckt->CKTbreakSize; nb++)
|
||||||
|
if(ckt->CKTbreaks[nb] > ckt->CKTtime + ckt->CKTdelmin)
|
||||||
|
ckt->CKTbreaks[w++] = ckt->CKTbreaks[nb];
|
||||||
|
ckt->CKTbreakSize = w;
|
||||||
|
}
|
||||||
|
if(ckt->CKTbreaks == NULL || ckt->CKTbreakSize < 1) {
|
||||||
|
if(ckt->CKTbreaks) FREE(ckt->CKTbreaks);
|
||||||
|
ckt->CKTbreaks = TMALLOC(double, 2);
|
||||||
|
if(ckt->CKTbreaks == NULL) return(E_NOMEM);
|
||||||
|
ckt->CKTbreaks[0] = ckt->CKTfinalTime;
|
||||||
|
ckt->CKTbreaks[1] = ckt->CKTfinalTime + ckt->CKTmaxStep;
|
||||||
|
ckt->CKTbreakSize = 2;
|
||||||
|
} else {
|
||||||
|
if(ckt->CKTfinalTime > ckt->CKTtime)
|
||||||
|
CKTsetBreak(ckt, ckt->CKTfinalTime);
|
||||||
|
if(ckt->CKTbreakSize < 2)
|
||||||
|
CKTsetBreak(ckt, ckt->CKTfinalTime + ckt->CKTmaxStep);
|
||||||
|
}
|
||||||
|
|
||||||
|
goto resume;
|
||||||
|
}
|
||||||
if(restart || ckt->CKTtime == 0) {
|
if(restart || ckt->CKTtime == 0) {
|
||||||
/* dctran() is entered here upon starting transient simulation
|
/* dctran() is entered here upon starting transient simulation
|
||||||
with time 0 and restart 1.
|
with time 0 and restart 1.
|
||||||
|
|
|
||||||
|
|
@ -874,6 +874,7 @@
|
||||||
<ClInclude Include="..\src\frontend\com_asciiplot.h" />
|
<ClInclude Include="..\src\frontend\com_asciiplot.h" />
|
||||||
<ClInclude Include="..\src\frontend\com_cdump.h" />
|
<ClInclude Include="..\src\frontend\com_cdump.h" />
|
||||||
<ClInclude Include="..\src\frontend\com_chdir.h" />
|
<ClInclude Include="..\src\frontend\com_chdir.h" />
|
||||||
|
<ClInclude Include="..\src\frontend\com_checkpoint.h" />
|
||||||
<ClInclude Include="..\src\frontend\com_commands.h" />
|
<ClInclude Include="..\src\frontend\com_commands.h" />
|
||||||
<ClInclude Include="..\src\frontend\com_compose.h" />
|
<ClInclude Include="..\src\frontend\com_compose.h" />
|
||||||
<ClInclude Include="..\src\frontend\com_display.h" />
|
<ClInclude Include="..\src\frontend\com_display.h" />
|
||||||
|
|
@ -1490,6 +1491,7 @@
|
||||||
<ClCompile Include="..\src\frontend\com_asciiplot.c" />
|
<ClCompile Include="..\src\frontend\com_asciiplot.c" />
|
||||||
<ClCompile Include="..\src\frontend\com_cdump.c" />
|
<ClCompile Include="..\src\frontend\com_cdump.c" />
|
||||||
<ClCompile Include="..\src\frontend\com_chdir.c" />
|
<ClCompile Include="..\src\frontend\com_chdir.c" />
|
||||||
|
<ClCompile Include="..\src\frontend\com_checkpoint.c" />
|
||||||
<ClCompile Include="..\src\frontend\com_compose.c" />
|
<ClCompile Include="..\src\frontend\com_compose.c" />
|
||||||
<ClCompile Include="..\src\frontend\com_display.c" />
|
<ClCompile Include="..\src\frontend\com_display.c" />
|
||||||
<ClCompile Include="..\src\frontend\com_dl.c" />
|
<ClCompile Include="..\src\frontend\com_dl.c" />
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue