Allow maxord=1 w/o crash

This commit is contained in:
dwarning 2010-10-31 17:42:46 +00:00
parent 7b3960506f
commit a5bfc9d6bd
2 changed files with 44 additions and 44 deletions

View File

@ -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;

View File

@ -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);