Allow maxord=1 w/o crash
This commit is contained in:
parent
7b3960506f
commit
a5bfc9d6bd
|
|
@ -48,7 +48,7 @@ CKTsetup(CKTcircuit *ckt)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (ckt->CKTisSetup)
|
if (ckt->CKTisSetup)
|
||||||
return E_NOCHANGE;
|
return E_NOCHANGE;
|
||||||
|
|
||||||
CKTpartition(ckt);
|
CKTpartition(ckt);
|
||||||
|
|
||||||
|
|
@ -68,7 +68,7 @@ CKTsetup(CKTcircuit *ckt)
|
||||||
if(error) return(error);
|
if(error) return(error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for(i=0;i<=ckt->CKTmaxOrder+1;i++) {
|
for(i=0;i<=MAX(2,ckt->CKTmaxOrder)+1;i++) { /* dctran needs 3 states as minimum */
|
||||||
CKALLOC(ckt->CKTstates[i],ckt->CKTnumStates,double);
|
CKALLOC(ckt->CKTstates[i],ckt->CKTnumStates,double);
|
||||||
}
|
}
|
||||||
#ifdef WANT_SENSE2
|
#ifdef WANT_SENSE2
|
||||||
|
|
@ -127,7 +127,7 @@ CKTunsetup(CKTcircuit *ckt)
|
||||||
|
|
||||||
error = OK;
|
error = OK;
|
||||||
if (!ckt->CKTisSetup)
|
if (!ckt->CKTisSetup)
|
||||||
return OK;
|
return OK;
|
||||||
|
|
||||||
for(i=0;i<=ckt->CKTmaxOrder+1;i++) {
|
for(i=0;i<=ckt->CKTmaxOrder+1;i++) {
|
||||||
tfree(ckt->CKTstates[i]);
|
tfree(ckt->CKTstates[i]);
|
||||||
|
|
@ -143,8 +143,8 @@ CKTunsetup(CKTcircuit *ckt)
|
||||||
for (i=0;i<DEVmaxnum;i++) {
|
for (i=0;i<DEVmaxnum;i++) {
|
||||||
if ( DEVices[i] && ((*DEVices[i]).DEVunsetup != NULL) && (ckt->CKThead[i] != NULL) ){
|
if ( DEVices[i] && ((*DEVices[i]).DEVunsetup != NULL) && (ckt->CKThead[i] != NULL) ){
|
||||||
e2 = (*((*DEVices[i]).DEVunsetup))(ckt->CKThead[i],ckt);
|
e2 = (*((*DEVices[i]).DEVunsetup))(ckt->CKThead[i],ckt);
|
||||||
if (!error && e2)
|
if (!error && e2)
|
||||||
error = e2;
|
error = e2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ckt->CKTisSetup = 0;
|
ckt->CKTisSetup = 0;
|
||||||
|
|
|
||||||
|
|
@ -113,9 +113,9 @@ CKTsetOpt(CKTcircuit *ckt, JOB *anal, int opt, IFvalue *val)
|
||||||
case OPT_MAXORD:
|
case OPT_MAXORD:
|
||||||
task->TSKmaxOrder = val->iValue;
|
task->TSKmaxOrder = val->iValue;
|
||||||
/* Check options method and maxorder for consistency */
|
/* Check options method and maxorder for consistency */
|
||||||
if (task->TSKmaxOrder < 2) {
|
if (task->TSKmaxOrder < 1) {
|
||||||
task->TSKmaxOrder = 2;
|
task->TSKmaxOrder = 1;
|
||||||
fprintf(stderr,"\nWarning -- Option maxord < 2 not allowed in ngspice\nSet to 2\n\n");
|
fprintf(stderr,"\nWarning -- Option maxord < 1 not allowed in ngspice\nSet to 1\n\n");
|
||||||
}
|
}
|
||||||
else if (task->TSKmaxOrder > 6) {
|
else if (task->TSKmaxOrder > 6) {
|
||||||
task->TSKmaxOrder = 6;
|
task->TSKmaxOrder = 6;
|
||||||
|
|
@ -130,32 +130,32 @@ CKTsetOpt(CKTcircuit *ckt, JOB *anal, int opt, IFvalue *val)
|
||||||
break;
|
break;
|
||||||
case OPT_METHOD:
|
case OPT_METHOD:
|
||||||
if(strncmp(val->sValue,"trap", 4)==0)
|
if(strncmp(val->sValue,"trap", 4)==0)
|
||||||
task->TSKintegrateMethod=TRAPEZOIDAL;
|
task->TSKintegrateMethod=TRAPEZOIDAL;
|
||||||
else if (strcmp(val->sValue,"gear")==0)
|
else if (strcmp(val->sValue,"gear")==0)
|
||||||
task->TSKintegrateMethod=GEAR;
|
task->TSKintegrateMethod=GEAR;
|
||||||
else return(E_METHOD);
|
else return(E_METHOD);
|
||||||
break;
|
break;
|
||||||
case OPT_TRYTOCOMPACT:
|
case OPT_TRYTOCOMPACT:
|
||||||
task->TSKtryToCompact = val->iValue;
|
task->TSKtryToCompact = val->iValue;
|
||||||
break;
|
break;
|
||||||
case OPT_BADMOS3:
|
case OPT_BADMOS3:
|
||||||
task->TSKbadMos3 = val->iValue;
|
task->TSKbadMos3 = val->iValue;
|
||||||
break;
|
break;
|
||||||
case OPT_KEEPOPINFO:
|
case OPT_KEEPOPINFO:
|
||||||
task->TSKkeepOpInfo = val->iValue;
|
task->TSKkeepOpInfo = val->iValue;
|
||||||
break;
|
break;
|
||||||
case OPT_COPYNODESETS:
|
case OPT_COPYNODESETS:
|
||||||
task->TSKcopyNodesets = val->iValue;
|
task->TSKcopyNodesets = val->iValue;
|
||||||
break;
|
break;
|
||||||
case OPT_NODEDAMPING:
|
case OPT_NODEDAMPING:
|
||||||
task->TSKnodeDamping = val->iValue;
|
task->TSKnodeDamping = val->iValue;
|
||||||
break;
|
break;
|
||||||
case OPT_ABSDV:
|
case OPT_ABSDV:
|
||||||
task->TSKabsDv = val->rValue;
|
task->TSKabsDv = val->rValue;
|
||||||
break;
|
break;
|
||||||
case OPT_RELDV:
|
case OPT_RELDV:
|
||||||
task->TSKrelDv = val->rValue;
|
task->TSKrelDv = val->rValue;
|
||||||
break;
|
break;
|
||||||
/* gtri - begin - wbk - add new options */
|
/* gtri - begin - wbk - add new options */
|
||||||
#ifdef XSPICE
|
#ifdef XSPICE
|
||||||
case OPT_EVT_MAX_OP_ALTER:
|
case OPT_EVT_MAX_OP_ALTER:
|
||||||
|
|
@ -242,7 +242,7 @@ static IFparm OPTtbl[] = {
|
||||||
{ "itl6", OPT_SRCSTEPS, IF_SET|IF_INTEGER,"number of source steps"},
|
{ "itl6", OPT_SRCSTEPS, IF_SET|IF_INTEGER,"number of source steps"},
|
||||||
{ "srcsteps", OPT_SRCSTEPS, IF_SET|IF_INTEGER,"number of source steps"},
|
{ "srcsteps", OPT_SRCSTEPS, IF_SET|IF_INTEGER,"number of source steps"},
|
||||||
{ "gminsteps", OPT_GMINSTEPS, IF_SET|IF_INTEGER,"number of Gmin steps"},
|
{ "gminsteps", OPT_GMINSTEPS, IF_SET|IF_INTEGER,"number of Gmin steps"},
|
||||||
{ "gminfactor", OPT_GMINFACT, IF_SET|IF_REAL,"factor per Gmin step"},
|
{ "gminfactor", OPT_GMINFACT, IF_SET|IF_REAL,"factor per Gmin step"},
|
||||||
{ "acct", 0, IF_FLAG ,"Print accounting"},
|
{ "acct", 0, IF_FLAG ,"Print accounting"},
|
||||||
{ "list", 0, IF_FLAG, "Print a listing" },
|
{ "list", 0, IF_FLAG, "Print a listing" },
|
||||||
{ "nomod", 0, IF_FLAG, "Don't print a model summary" },
|
{ "nomod", 0, IF_FLAG, "Don't print a model summary" },
|
||||||
|
|
@ -297,19 +297,19 @@ static IFparm OPTtbl[] = {
|
||||||
{ "acfactortime", OPT_ACDECOMP,IF_ASK|IF_REAL,"AC factor time" },
|
{ "acfactortime", OPT_ACDECOMP,IF_ASK|IF_REAL,"AC factor time" },
|
||||||
{ "acsolvetime", OPT_ACSOLVE, IF_ASK|IF_REAL,"AC solve time" },
|
{ "acsolvetime", OPT_ACSOLVE, IF_ASK|IF_REAL,"AC solve time" },
|
||||||
{ "trytocompact", OPT_TRYTOCOMPACT, IF_SET|IF_FLAG,
|
{ "trytocompact", OPT_TRYTOCOMPACT, IF_SET|IF_FLAG,
|
||||||
"Try compaction for LTRA lines" },
|
"Try compaction for LTRA lines" },
|
||||||
{ "badmos3", OPT_BADMOS3, IF_SET|IF_FLAG,
|
{ "badmos3", OPT_BADMOS3, IF_SET|IF_FLAG,
|
||||||
"use old mos3 model (discontinuous with respect to kappa)" },
|
"use old mos3 model (discontinuous with respect to kappa)" },
|
||||||
{ "keepopinfo", OPT_KEEPOPINFO, IF_SET|IF_FLAG,
|
{ "keepopinfo", OPT_KEEPOPINFO, IF_SET|IF_FLAG,
|
||||||
"Record operating point for each small-signal analysis" },
|
"Record operating point for each small-signal analysis" },
|
||||||
{ "copynodesets", OPT_COPYNODESETS, IF_SET|IF_FLAG,
|
{ "copynodesets", OPT_COPYNODESETS, IF_SET|IF_FLAG,
|
||||||
"Copy nodesets from device terminals to internal nodes" },
|
"Copy nodesets from device terminals to internal nodes" },
|
||||||
{ "nodedamping", OPT_NODEDAMPING, IF_SET|IF_FLAG,
|
{ "nodedamping", OPT_NODEDAMPING, IF_SET|IF_FLAG,
|
||||||
"Limit iteration to iteration node voltage change" },
|
"Limit iteration to iteration node voltage change" },
|
||||||
{ "absdv", OPT_ABSDV, IF_SET|IF_REAL,
|
{ "absdv", OPT_ABSDV, IF_SET|IF_REAL,
|
||||||
"Maximum absolute iter-iter node voltage change" },
|
"Maximum absolute iter-iter node voltage change" },
|
||||||
{ "reldv", OPT_RELDV, IF_SET|IF_REAL,
|
{ "reldv", OPT_RELDV, IF_SET|IF_REAL,
|
||||||
"Maximum relative iter-iter node voltage change" }
|
"Maximum relative iter-iter node voltage change" }
|
||||||
};
|
};
|
||||||
|
|
||||||
int OPTcount = sizeof(OPTtbl)/sizeof(IFparm);
|
int OPTcount = sizeof(OPTtbl)/sizeof(IFparm);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue