|
|
@ -16,7 +16,7 @@ Modified: 2000 AlansFixes |
|
|
|
|
|
|
|
|
static int |
|
|
static int |
|
|
dot_noise(char *line, CKTcircuit *ckt, INPtables *tab, card *current, |
|
|
dot_noise(char *line, CKTcircuit *ckt, INPtables *tab, card *current, |
|
|
TSKtask *task, CKTnode *gnode, JOB *foo) |
|
|
|
|
|
|
|
|
TSKtask *task, CKTnode *gnode, JOB *foo) |
|
|
{ |
|
|
{ |
|
|
int which; /* which analysis we are performing */ |
|
|
int which; /* which analysis we are performing */ |
|
|
int i; /* generic loop variable */ |
|
|
int i; /* generic loop variable */ |
|
|
@ -36,14 +36,14 @@ dot_noise(char *line, CKTcircuit *ckt, INPtables *tab, card *current, |
|
|
/* .noise V(OUTPUT,REF) SRC {DEC OCT LIN} NP FSTART FSTOP <PTSPRSUM> */ |
|
|
/* .noise V(OUTPUT,REF) SRC {DEC OCT LIN} NP FSTART FSTOP <PTSPRSUM> */ |
|
|
which = -1; |
|
|
which = -1; |
|
|
for (i = 0; i < ft_sim->numAnalyses; i++) { |
|
|
for (i = 0; i < ft_sim->numAnalyses; i++) { |
|
|
if (strcmp(ft_sim->analyses[i]->name, "NOISE") == 0) { |
|
|
|
|
|
which = i; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if (strcmp(ft_sim->analyses[i]->name, "NOISE") == 0) { |
|
|
|
|
|
which = i; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
if (which == -1) { |
|
|
if (which == -1) { |
|
|
LITERR("Noise analysis unsupported.\n"); |
|
|
|
|
|
return (0); |
|
|
|
|
|
|
|
|
LITERR("Noise analysis unsupported.\n"); |
|
|
|
|
|
return (0); |
|
|
} |
|
|
} |
|
|
IFC(newAnalysis, (ckt, which, "Noise Analysis", &foo, task)); |
|
|
IFC(newAnalysis, (ckt, which, "Noise Analysis", &foo, task)); |
|
|
INPgetTok(&line, &name, 1); |
|
|
INPgetTok(&line, &name, 1); |
|
|
@ -53,68 +53,68 @@ dot_noise(char *line, CKTcircuit *ckt, INPtables *tab, card *current, |
|
|
|
|
|
|
|
|
if (name != NULL) { |
|
|
if (name != NULL) { |
|
|
|
|
|
|
|
|
if ((*name == 'V' || *name == 'v') && !name[1]) { |
|
|
|
|
|
|
|
|
|
|
|
INPgetNetTok(&line, &nname1, 0); |
|
|
|
|
|
INPtermInsert(ckt, &nname1, tab, &node1); |
|
|
|
|
|
ptemp.nValue = node1; |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "output", &ptemp)) |
|
|
|
|
|
|
|
|
|
|
|
if (*line != ')') { |
|
|
|
|
|
INPgetNetTok(&line, &nname2, 1); |
|
|
|
|
|
INPtermInsert(ckt, &nname2, tab, &node2); |
|
|
|
|
|
ptemp.nValue = node2; |
|
|
|
|
|
} else { |
|
|
|
|
|
ptemp.nValue = gnode; |
|
|
|
|
|
} |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "outputref", &ptemp)) |
|
|
|
|
|
|
|
|
|
|
|
INPgetTok(&line, &name, 1); |
|
|
|
|
|
INPinsert(&name, tab); |
|
|
|
|
|
ptemp.uValue = name; |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "input", &ptemp)) |
|
|
|
|
|
|
|
|
|
|
|
INPgetTok(&line, &steptype, 1); |
|
|
|
|
|
ptemp.iValue = 1; |
|
|
|
|
|
error = INPapName(ckt, which, foo, steptype, &ptemp); |
|
|
|
|
|
if (error) |
|
|
|
|
|
current->error = INPerrCat(current->error, INPerror(error)); |
|
|
|
|
|
parm = INPgetValue(ckt, &line, IF_INTEGER, tab); |
|
|
|
|
|
error = INPapName(ckt, which, foo, "numsteps", parm); |
|
|
|
|
|
if (error) |
|
|
|
|
|
current->error = INPerrCat(current->error, INPerror(error)); |
|
|
|
|
|
parm = INPgetValue(ckt, &line, IF_REAL, tab); |
|
|
|
|
|
error = INPapName(ckt, which, foo, "start", parm); |
|
|
|
|
|
if (error) |
|
|
|
|
|
current->error = INPerrCat(current->error, INPerror(error)); |
|
|
|
|
|
parm = INPgetValue(ckt, &line, IF_REAL, tab); |
|
|
|
|
|
error = INPapName(ckt, which, foo, "stop", parm); |
|
|
|
|
|
if (error) |
|
|
|
|
|
current->error = INPerrCat(current->error, INPerror(error)); |
|
|
|
|
|
|
|
|
|
|
|
/* now see if "ptspersum" has been specified by the user */ |
|
|
|
|
|
|
|
|
|
|
|
for (found = 0, point = line; (!found) && (*point != '\0'); found = ((*point != ' ') && (*(point++) != '\t'))) |
|
|
|
|
|
; |
|
|
|
|
|
if (found) { |
|
|
|
|
|
parm = INPgetValue(ckt, &line, IF_INTEGER, tab); |
|
|
|
|
|
error = INPapName(ckt, which, foo, "ptspersum", parm); |
|
|
|
|
|
if (error) |
|
|
|
|
|
current->error = INPerrCat(current->error, INPerror(error)); |
|
|
|
|
|
} else { |
|
|
|
|
|
ptemp.iValue = 0; |
|
|
|
|
|
error = INPapName(ckt, which, foo, "ptspersum", &ptemp); |
|
|
|
|
|
if (error) |
|
|
|
|
|
current->error = INPerrCat(current->error, INPerror(error)); |
|
|
|
|
|
} |
|
|
|
|
|
} else |
|
|
|
|
|
LITERR("bad syntax " |
|
|
|
|
|
"[.noise v(OUT) SRC {DEC OCT LIN} " |
|
|
|
|
|
"NP FSTART FSTOP <PTSPRSUM>]\n"); |
|
|
|
|
|
|
|
|
if ((*name == 'V' || *name == 'v') && !name[1]) { |
|
|
|
|
|
|
|
|
|
|
|
INPgetNetTok(&line, &nname1, 0); |
|
|
|
|
|
INPtermInsert(ckt, &nname1, tab, &node1); |
|
|
|
|
|
ptemp.nValue = node1; |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "output", &ptemp)) |
|
|
|
|
|
|
|
|
|
|
|
if (*line != ')') { |
|
|
|
|
|
INPgetNetTok(&line, &nname2, 1); |
|
|
|
|
|
INPtermInsert(ckt, &nname2, tab, &node2); |
|
|
|
|
|
ptemp.nValue = node2; |
|
|
|
|
|
} else { |
|
|
|
|
|
ptemp.nValue = gnode; |
|
|
|
|
|
} |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "outputref", &ptemp)) |
|
|
|
|
|
|
|
|
|
|
|
INPgetTok(&line, &name, 1); |
|
|
|
|
|
INPinsert(&name, tab); |
|
|
|
|
|
ptemp.uValue = name; |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "input", &ptemp)) |
|
|
|
|
|
|
|
|
|
|
|
INPgetTok(&line, &steptype, 1); |
|
|
|
|
|
ptemp.iValue = 1; |
|
|
|
|
|
error = INPapName(ckt, which, foo, steptype, &ptemp); |
|
|
|
|
|
if (error) |
|
|
|
|
|
current->error = INPerrCat(current->error, INPerror(error)); |
|
|
|
|
|
parm = INPgetValue(ckt, &line, IF_INTEGER, tab); |
|
|
|
|
|
error = INPapName(ckt, which, foo, "numsteps", parm); |
|
|
|
|
|
if (error) |
|
|
|
|
|
current->error = INPerrCat(current->error, INPerror(error)); |
|
|
|
|
|
parm = INPgetValue(ckt, &line, IF_REAL, tab); |
|
|
|
|
|
error = INPapName(ckt, which, foo, "start", parm); |
|
|
|
|
|
if (error) |
|
|
|
|
|
current->error = INPerrCat(current->error, INPerror(error)); |
|
|
|
|
|
parm = INPgetValue(ckt, &line, IF_REAL, tab); |
|
|
|
|
|
error = INPapName(ckt, which, foo, "stop", parm); |
|
|
|
|
|
if (error) |
|
|
|
|
|
current->error = INPerrCat(current->error, INPerror(error)); |
|
|
|
|
|
|
|
|
|
|
|
/* now see if "ptspersum" has been specified by the user */ |
|
|
|
|
|
|
|
|
|
|
|
for (found = 0, point = line; (!found) && (*point != '\0'); found = ((*point != ' ') && (*(point++) != '\t'))) |
|
|
|
|
|
; |
|
|
|
|
|
if (found) { |
|
|
|
|
|
parm = INPgetValue(ckt, &line, IF_INTEGER, tab); |
|
|
|
|
|
error = INPapName(ckt, which, foo, "ptspersum", parm); |
|
|
|
|
|
if (error) |
|
|
|
|
|
current->error = INPerrCat(current->error, INPerror(error)); |
|
|
|
|
|
} else { |
|
|
|
|
|
ptemp.iValue = 0; |
|
|
|
|
|
error = INPapName(ckt, which, foo, "ptspersum", &ptemp); |
|
|
|
|
|
if (error) |
|
|
|
|
|
current->error = INPerrCat(current->error, INPerror(error)); |
|
|
|
|
|
} |
|
|
|
|
|
} else |
|
|
|
|
|
LITERR("bad syntax " |
|
|
|
|
|
"[.noise v(OUT) SRC {DEC OCT LIN} " |
|
|
|
|
|
"NP FSTART FSTOP <PTSPRSUM>]\n"); |
|
|
} else { |
|
|
} else { |
|
|
LITERR("bad syntax " |
|
|
|
|
|
"[.noise v(OUT) SRC {DEC OCT LIN} " |
|
|
|
|
|
"NP FSTART FSTOP <PTSPRSUM>]\n"); |
|
|
|
|
|
|
|
|
LITERR("bad syntax " |
|
|
|
|
|
"[.noise v(OUT) SRC {DEC OCT LIN} " |
|
|
|
|
|
"NP FSTART FSTOP <PTSPRSUM>]\n"); |
|
|
} |
|
|
} |
|
|
return 0; |
|
|
return 0; |
|
|
} |
|
|
} |
|
|
@ -135,14 +135,14 @@ dot_op(char *line, CKTcircuit *ckt, INPtables *tab, card *current, |
|
|
/* .op */ |
|
|
/* .op */ |
|
|
which = -1; |
|
|
which = -1; |
|
|
for (i = 0; i < ft_sim->numAnalyses; i++) { |
|
|
for (i = 0; i < ft_sim->numAnalyses; i++) { |
|
|
if (strcmp(ft_sim->analyses[i]->name, "OP") == 0) { |
|
|
|
|
|
which = i; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if (strcmp(ft_sim->analyses[i]->name, "OP") == 0) { |
|
|
|
|
|
which = i; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
if (which == -1) { |
|
|
if (which == -1) { |
|
|
LITERR("DC operating point analysis unsupported\n"); |
|
|
|
|
|
return (0); |
|
|
|
|
|
|
|
|
LITERR("DC operating point analysis unsupported\n"); |
|
|
|
|
|
return (0); |
|
|
} |
|
|
} |
|
|
IFC(newAnalysis, (ckt, which, "Operating Point", &foo, task)); |
|
|
IFC(newAnalysis, (ckt, which, "Operating Point", &foo, task)); |
|
|
return (0); |
|
|
return (0); |
|
|
@ -151,7 +151,7 @@ dot_op(char *line, CKTcircuit *ckt, INPtables *tab, card *current, |
|
|
|
|
|
|
|
|
static int |
|
|
static int |
|
|
dot_disto(char *line, CKTcircuit *ckt, INPtables *tab, card *current, |
|
|
dot_disto(char *line, CKTcircuit *ckt, INPtables *tab, card *current, |
|
|
TSKtask *task, CKTnode *gnode, JOB *foo) |
|
|
|
|
|
|
|
|
TSKtask *task, CKTnode *gnode, JOB *foo) |
|
|
{ |
|
|
{ |
|
|
int which; /* which analysis we are performing */ |
|
|
int which; /* which analysis we are performing */ |
|
|
int i; /* generic loop variable */ |
|
|
int i; /* generic loop variable */ |
|
|
@ -165,14 +165,14 @@ dot_disto(char *line, CKTcircuit *ckt, INPtables *tab, card *current, |
|
|
/* .disto {DEC OCT LIN} NP FSTART FSTOP <F2OVERF1> */ |
|
|
/* .disto {DEC OCT LIN} NP FSTART FSTOP <F2OVERF1> */ |
|
|
which = -1; |
|
|
which = -1; |
|
|
for (i = 0; i < ft_sim->numAnalyses; i++) { |
|
|
for (i = 0; i < ft_sim->numAnalyses; i++) { |
|
|
if (strcmp(ft_sim->analyses[i]->name, "DISTO") == 0) { |
|
|
|
|
|
which = i; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if (strcmp(ft_sim->analyses[i]->name, "DISTO") == 0) { |
|
|
|
|
|
which = i; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
if (which == -1) { |
|
|
if (which == -1) { |
|
|
LITERR("Small signal distortion analysis unsupported.\n"); |
|
|
|
|
|
return (0); |
|
|
|
|
|
|
|
|
LITERR("Small signal distortion analysis unsupported.\n"); |
|
|
|
|
|
return (0); |
|
|
} |
|
|
} |
|
|
IFC(newAnalysis, (ckt, which, "Distortion Analysis", &foo, task)); |
|
|
IFC(newAnalysis, (ckt, which, "Distortion Analysis", &foo, task)); |
|
|
INPgetTok(&line, &steptype, 1); /* get DEC, OCT, or LIN */ |
|
|
INPgetTok(&line, &steptype, 1); /* get DEC, OCT, or LIN */ |
|
|
@ -185,8 +185,8 @@ dot_disto(char *line, CKTcircuit *ckt, INPtables *tab, card *current, |
|
|
parm = INPgetValue(ckt, &line, IF_REAL, tab); /* fstop */ |
|
|
parm = INPgetValue(ckt, &line, IF_REAL, tab); /* fstop */ |
|
|
GCA(INPapName, (ckt, which, foo, "stop", parm)); |
|
|
GCA(INPapName, (ckt, which, foo, "stop", parm)); |
|
|
if (*line) { |
|
|
if (*line) { |
|
|
parm = INPgetValue(ckt, &line, IF_REAL, tab); /* f1phase */ |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "f2overf1", parm)); |
|
|
|
|
|
|
|
|
parm = INPgetValue(ckt, &line, IF_REAL, tab); /* f1phase */ |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "f2overf1", parm)); |
|
|
} |
|
|
} |
|
|
return (0); |
|
|
return (0); |
|
|
} |
|
|
} |
|
|
@ -208,14 +208,14 @@ dot_ac(char *line, CKTcircuit *ckt, INPtables *tab, card *current, |
|
|
/* .ac {DEC OCT LIN} NP FSTART FSTOP */ |
|
|
/* .ac {DEC OCT LIN} NP FSTART FSTOP */ |
|
|
which = -1; |
|
|
which = -1; |
|
|
for (i = 0; i < ft_sim->numAnalyses; i++) { |
|
|
for (i = 0; i < ft_sim->numAnalyses; i++) { |
|
|
if (strcmp(ft_sim->analyses[i]->name, "AC") == 0) { |
|
|
|
|
|
which = i; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if (strcmp(ft_sim->analyses[i]->name, "AC") == 0) { |
|
|
|
|
|
which = i; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
if (which == -1) { |
|
|
if (which == -1) { |
|
|
LITERR("AC small signal analysis unsupported.\n"); |
|
|
|
|
|
return (0); |
|
|
|
|
|
|
|
|
LITERR("AC small signal analysis unsupported.\n"); |
|
|
|
|
|
return (0); |
|
|
} |
|
|
} |
|
|
IFC(newAnalysis, (ckt, which, "AC Analysis", &foo, task)); |
|
|
IFC(newAnalysis, (ckt, which, "AC Analysis", &foo, task)); |
|
|
INPgetTok(&line, &steptype, 1); /* get DEC, OCT, or LIN */ |
|
|
INPgetTok(&line, &steptype, 1); /* get DEC, OCT, or LIN */ |
|
|
@ -247,14 +247,14 @@ dot_pz(char *line, CKTcircuit *ckt, INPtables *tab, card *current, |
|
|
/* .pz nodeI nodeG nodeJ nodeK {V I} {POL ZER PZ} */ |
|
|
/* .pz nodeI nodeG nodeJ nodeK {V I} {POL ZER PZ} */ |
|
|
which = -1; |
|
|
which = -1; |
|
|
for (i = 0; i < ft_sim->numAnalyses; i++) { |
|
|
for (i = 0; i < ft_sim->numAnalyses; i++) { |
|
|
if (strcmp(ft_sim->analyses[i]->name, "PZ") == 0) { |
|
|
|
|
|
which = i; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if (strcmp(ft_sim->analyses[i]->name, "PZ") == 0) { |
|
|
|
|
|
which = i; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
if (which == -1) { |
|
|
if (which == -1) { |
|
|
LITERR("Pole-zero analysis unsupported.\n"); |
|
|
|
|
|
return (0); |
|
|
|
|
|
|
|
|
LITERR("Pole-zero analysis unsupported.\n"); |
|
|
|
|
|
return (0); |
|
|
} |
|
|
} |
|
|
IFC(newAnalysis, (ckt, which, "Pole-Zero Analysis", &foo, task)); |
|
|
IFC(newAnalysis, (ckt, which, "Pole-Zero Analysis", &foo, task)); |
|
|
parm = INPgetValue(ckt, &line, IF_NODE, tab); |
|
|
parm = INPgetValue(ckt, &line, IF_NODE, tab); |
|
|
@ -292,14 +292,14 @@ dot_dc(char *line, CKTcircuit *ckt, INPtables *tab, card *current, |
|
|
/* Vstop2 Vinc2 */ |
|
|
/* Vstop2 Vinc2 */ |
|
|
which = -1; |
|
|
which = -1; |
|
|
for (i = 0; i < ft_sim->numAnalyses; i++) { |
|
|
for (i = 0; i < ft_sim->numAnalyses; i++) { |
|
|
if (strcmp(ft_sim->analyses[i]->name, "DC") == 0) { |
|
|
|
|
|
which = i; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if (strcmp(ft_sim->analyses[i]->name, "DC") == 0) { |
|
|
|
|
|
which = i; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
if (which == -1) { |
|
|
if (which == -1) { |
|
|
LITERR("DC transfer curve analysis unsupported\n"); |
|
|
|
|
|
return (0); |
|
|
|
|
|
|
|
|
LITERR("DC transfer curve analysis unsupported\n"); |
|
|
|
|
|
return (0); |
|
|
} |
|
|
} |
|
|
IFC(newAnalysis, (ckt, which, "DC transfer characteristic", &foo, task)); |
|
|
IFC(newAnalysis, (ckt, which, "DC transfer characteristic", &foo, task)); |
|
|
INPgetTok(&line, &name, 1); |
|
|
INPgetTok(&line, &name, 1); |
|
|
@ -313,16 +313,16 @@ dot_dc(char *line, CKTcircuit *ckt, INPtables *tab, card *current, |
|
|
parm = INPgetValue(ckt, &line, IF_REAL, tab); /* vinc1 */ |
|
|
parm = INPgetValue(ckt, &line, IF_REAL, tab); /* vinc1 */ |
|
|
GCA(INPapName, (ckt, which, foo, "step1", parm)); |
|
|
GCA(INPapName, (ckt, which, foo, "step1", parm)); |
|
|
if (*line) { |
|
|
if (*line) { |
|
|
INPgetTok(&line, &name, 1); |
|
|
|
|
|
INPinsert(&name, tab); |
|
|
|
|
|
ptemp.uValue = name; |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "name2", &ptemp)); |
|
|
|
|
|
parm = INPgetValue(ckt, &line, IF_REAL, tab); /* vstart2 */ |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "start2", parm)); |
|
|
|
|
|
parm = INPgetValue(ckt, &line, IF_REAL, tab); /* vstop2 */ |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "stop2", parm)); |
|
|
|
|
|
parm = INPgetValue(ckt, &line, IF_REAL, tab); /* vinc2 */ |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "step2", parm)); |
|
|
|
|
|
|
|
|
INPgetTok(&line, &name, 1); |
|
|
|
|
|
INPinsert(&name, tab); |
|
|
|
|
|
ptemp.uValue = name; |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "name2", &ptemp)); |
|
|
|
|
|
parm = INPgetValue(ckt, &line, IF_REAL, tab); /* vstart2 */ |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "start2", parm)); |
|
|
|
|
|
parm = INPgetValue(ckt, &line, IF_REAL, tab); /* vstop2 */ |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "stop2", parm)); |
|
|
|
|
|
parm = INPgetValue(ckt, &line, IF_REAL, tab); /* vinc2 */ |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "step2", parm)); |
|
|
} |
|
|
} |
|
|
return 0; |
|
|
return 0; |
|
|
} |
|
|
} |
|
|
@ -346,51 +346,51 @@ dot_tf(char *line, CKTcircuit *ckt, INPtables *tab, card *current, |
|
|
/* .tf vsrc2 src */ |
|
|
/* .tf vsrc2 src */ |
|
|
which = -1; |
|
|
which = -1; |
|
|
for (i = 0; i < ft_sim->numAnalyses; i++) { |
|
|
for (i = 0; i < ft_sim->numAnalyses; i++) { |
|
|
if (strcmp(ft_sim->analyses[i]->name, "TF") == 0) { |
|
|
|
|
|
which = i; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if (strcmp(ft_sim->analyses[i]->name, "TF") == 0) { |
|
|
|
|
|
which = i; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
if (which == -1) { |
|
|
if (which == -1) { |
|
|
LITERR("Transfer Function analysis unsupported.\n"); |
|
|
|
|
|
return (0); |
|
|
|
|
|
|
|
|
LITERR("Transfer Function analysis unsupported.\n"); |
|
|
|
|
|
return (0); |
|
|
} |
|
|
} |
|
|
IFC(newAnalysis, (ckt, which, "Transfer Function", &foo, task)); |
|
|
IFC(newAnalysis, (ckt, which, "Transfer Function", &foo, task)); |
|
|
INPgetTok(&line, &name, 0); |
|
|
INPgetTok(&line, &name, 0); |
|
|
/* name is now either V or I or a serious error */ |
|
|
/* name is now either V or I or a serious error */ |
|
|
if (*name == 'v' && strlen(name) == 1) { |
|
|
if (*name == 'v' && strlen(name) == 1) { |
|
|
if (*line != '(' ) { |
|
|
|
|
|
/* error, bad input format */ |
|
|
|
|
|
} |
|
|
|
|
|
INPgetNetTok(&line, &nname1, 0); |
|
|
|
|
|
INPtermInsert(ckt, &nname1, tab, &node1); |
|
|
|
|
|
ptemp.nValue = node1; |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "outpos", &ptemp)); |
|
|
|
|
|
if (*line != ')') { |
|
|
|
|
|
INPgetNetTok(&line, &nname2, 1); |
|
|
|
|
|
INPtermInsert(ckt, &nname2, tab, &node2); |
|
|
|
|
|
ptemp.nValue = node2; |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "outneg", &ptemp)); |
|
|
|
|
|
ptemp.sValue = |
|
|
|
|
|
TMALLOC(char, 5 + strlen(nname1) + strlen(nname2)); |
|
|
|
|
|
(void) sprintf(ptemp.sValue, "V(%s,%s)", nname1, nname2); |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "outname", &ptemp)); |
|
|
|
|
|
} else { |
|
|
|
|
|
ptemp.nValue = gnode; |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "outneg", &ptemp)); |
|
|
|
|
|
ptemp.sValue = |
|
|
|
|
|
TMALLOC(char, 4 + strlen(nname1)); |
|
|
|
|
|
(void) sprintf(ptemp.sValue, "V(%s)", nname1); |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "outname", &ptemp)); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if (*line != '(' ) { |
|
|
|
|
|
/* error, bad input format */ |
|
|
|
|
|
} |
|
|
|
|
|
INPgetNetTok(&line, &nname1, 0); |
|
|
|
|
|
INPtermInsert(ckt, &nname1, tab, &node1); |
|
|
|
|
|
ptemp.nValue = node1; |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "outpos", &ptemp)); |
|
|
|
|
|
if (*line != ')') { |
|
|
|
|
|
INPgetNetTok(&line, &nname2, 1); |
|
|
|
|
|
INPtermInsert(ckt, &nname2, tab, &node2); |
|
|
|
|
|
ptemp.nValue = node2; |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "outneg", &ptemp)); |
|
|
|
|
|
ptemp.sValue = |
|
|
|
|
|
TMALLOC(char, 5 + strlen(nname1) + strlen(nname2)); |
|
|
|
|
|
(void) sprintf(ptemp.sValue, "V(%s,%s)", nname1, nname2); |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "outname", &ptemp)); |
|
|
|
|
|
} else { |
|
|
|
|
|
ptemp.nValue = gnode; |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "outneg", &ptemp)); |
|
|
|
|
|
ptemp.sValue = |
|
|
|
|
|
TMALLOC(char, 4 + strlen(nname1)); |
|
|
|
|
|
(void) sprintf(ptemp.sValue, "V(%s)", nname1); |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "outname", &ptemp)); |
|
|
|
|
|
} |
|
|
} else if (*name == 'i' && strlen(name) == 1) { |
|
|
} else if (*name == 'i' && strlen(name) == 1) { |
|
|
INPgetTok(&line, &name, 1); |
|
|
|
|
|
INPinsert(&name, tab); |
|
|
|
|
|
ptemp.uValue = name; |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "outsrc", &ptemp)); |
|
|
|
|
|
|
|
|
INPgetTok(&line, &name, 1); |
|
|
|
|
|
INPinsert(&name, tab); |
|
|
|
|
|
ptemp.uValue = name; |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "outsrc", &ptemp)); |
|
|
} else { |
|
|
} else { |
|
|
LITERR("Syntax error: voltage or current expected.\n"); |
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
LITERR("Syntax error: voltage or current expected.\n"); |
|
|
|
|
|
return 0; |
|
|
} |
|
|
} |
|
|
INPgetTok(&line, &name, 1); |
|
|
INPgetTok(&line, &name, 1); |
|
|
INPinsert(&name, tab); |
|
|
INPinsert(&name, tab); |
|
|
@ -402,7 +402,7 @@ dot_tf(char *line, CKTcircuit *ckt, INPtables *tab, card *current, |
|
|
|
|
|
|
|
|
static int |
|
|
static int |
|
|
dot_tran(char *line, CKTcircuit *ckt, INPtables *tab, card *current, |
|
|
dot_tran(char *line, CKTcircuit *ckt, INPtables *tab, card *current, |
|
|
TSKtask *task, CKTnode *gnode, JOB *foo) |
|
|
|
|
|
|
|
|
TSKtask *task, CKTnode *gnode, JOB *foo) |
|
|
{ |
|
|
{ |
|
|
int error; /* error code temporary */ |
|
|
int error; /* error code temporary */ |
|
|
IFvalue ptemp; /* a value structure to package resistance into */ |
|
|
IFvalue ptemp; /* a value structure to package resistance into */ |
|
|
@ -417,14 +417,14 @@ dot_tran(char *line, CKTcircuit *ckt, INPtables *tab, card *current, |
|
|
/* .tran Tstep Tstop <Tstart <Tmax> > <UIC> */ |
|
|
/* .tran Tstep Tstop <Tstart <Tmax> > <UIC> */ |
|
|
which = -1; |
|
|
which = -1; |
|
|
for (i = 0; i < ft_sim->numAnalyses; i++) { |
|
|
for (i = 0; i < ft_sim->numAnalyses; i++) { |
|
|
if (strcmp(ft_sim->analyses[i]->name, "TRAN") == 0) { |
|
|
|
|
|
which = i; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if (strcmp(ft_sim->analyses[i]->name, "TRAN") == 0) { |
|
|
|
|
|
which = i; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
if (which == -1) { |
|
|
if (which == -1) { |
|
|
LITERR("Transient analysis unsupported.\n"); |
|
|
|
|
|
return (0); |
|
|
|
|
|
|
|
|
LITERR("Transient analysis unsupported.\n"); |
|
|
|
|
|
return (0); |
|
|
} |
|
|
} |
|
|
IFC(newAnalysis, (ckt, which, "Transient Analysis", &foo, task)); |
|
|
IFC(newAnalysis, (ckt, which, "Transient Analysis", &foo, task)); |
|
|
parm = INPgetValue(ckt, &line, IF_REAL, tab); /* Tstep */ |
|
|
parm = INPgetValue(ckt, &line, IF_REAL, tab); /* Tstep */ |
|
|
@ -432,25 +432,25 @@ dot_tran(char *line, CKTcircuit *ckt, INPtables *tab, card *current, |
|
|
parm = INPgetValue(ckt, &line, IF_REAL, tab); /* Tstop */ |
|
|
parm = INPgetValue(ckt, &line, IF_REAL, tab); /* Tstop */ |
|
|
GCA(INPapName, (ckt, which, foo, "tstop", parm)); |
|
|
GCA(INPapName, (ckt, which, foo, "tstop", parm)); |
|
|
if (*line) { |
|
|
if (*line) { |
|
|
dtemp = INPevaluate(&line, &error, 1); /* tstart? */ |
|
|
|
|
|
if (error == 0) { |
|
|
|
|
|
ptemp.rValue = dtemp; |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "tstart", &ptemp)); |
|
|
|
|
|
dtemp = INPevaluate(&line, &error, 1); /* tmax? */ |
|
|
|
|
|
if (error == 0) { |
|
|
|
|
|
ptemp.rValue = dtemp; |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "tmax", &ptemp)); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
dtemp = INPevaluate(&line, &error, 1); /* tstart? */ |
|
|
|
|
|
if (error == 0) { |
|
|
|
|
|
ptemp.rValue = dtemp; |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "tstart", &ptemp)); |
|
|
|
|
|
dtemp = INPevaluate(&line, &error, 1); /* tmax? */ |
|
|
|
|
|
if (error == 0) { |
|
|
|
|
|
ptemp.rValue = dtemp; |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "tmax", &ptemp)); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
if (*line) { |
|
|
if (*line) { |
|
|
INPgetTok(&line, &word, 1); /* uic? */ |
|
|
|
|
|
if (strcmp(word, "uic") == 0) { |
|
|
|
|
|
ptemp.iValue = 1; |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "uic", &ptemp)); |
|
|
|
|
|
} else { |
|
|
|
|
|
LITERR(" Error: unknown parameter on .tran - ignored\n"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
INPgetTok(&line, &word, 1); /* uic? */ |
|
|
|
|
|
if (strcmp(word, "uic") == 0) { |
|
|
|
|
|
ptemp.iValue = 1; |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "uic", &ptemp)); |
|
|
|
|
|
} else { |
|
|
|
|
|
LITERR(" Error: unknown parameter on .tran - ignored\n"); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
return (0); |
|
|
return (0); |
|
|
} |
|
|
} |
|
|
@ -458,7 +458,7 @@ dot_tran(char *line, CKTcircuit *ckt, INPtables *tab, card *current, |
|
|
|
|
|
|
|
|
static int |
|
|
static int |
|
|
dot_sens(char *line, CKTcircuit *ckt, INPtables *tab, card *current, |
|
|
dot_sens(char *line, CKTcircuit *ckt, INPtables *tab, card *current, |
|
|
TSKtask *task, CKTnode *gnode, JOB *foo) |
|
|
|
|
|
|
|
|
TSKtask *task, CKTnode *gnode, JOB *foo) |
|
|
{ |
|
|
{ |
|
|
char *name; /* the resistor's name */ |
|
|
char *name; /* the resistor's name */ |
|
|
int error; /* error code temporary */ |
|
|
int error; /* error code temporary */ |
|
|
@ -474,14 +474,14 @@ dot_sens(char *line, CKTcircuit *ckt, INPtables *tab, card *current, |
|
|
|
|
|
|
|
|
which = -1; /* Bug fix from Glao Dezai */ |
|
|
which = -1; /* Bug fix from Glao Dezai */ |
|
|
for (i = 0; i < ft_sim->numAnalyses; i++) { |
|
|
for (i = 0; i < ft_sim->numAnalyses; i++) { |
|
|
if (strcmp(ft_sim->analyses[i]->name, "SENS") == 0) { |
|
|
|
|
|
which = i; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if (strcmp(ft_sim->analyses[i]->name, "SENS") == 0) { |
|
|
|
|
|
which = i; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
if (which == -1) { |
|
|
if (which == -1) { |
|
|
LITERR("Sensitivity unsupported.\n"); |
|
|
|
|
|
return (0); |
|
|
|
|
|
|
|
|
LITERR("Sensitivity unsupported.\n"); |
|
|
|
|
|
return (0); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
IFC(newAnalysis, (ckt, which, "Sensitivity Analysis", &foo, task)); |
|
|
IFC(newAnalysis, (ckt, which, "Sensitivity Analysis", &foo, task)); |
|
|
@ -494,62 +494,62 @@ dot_sens(char *line, CKTcircuit *ckt, INPtables *tab, card *current, |
|
|
INPgetTok(&line, &name, 0); |
|
|
INPgetTok(&line, &name, 0); |
|
|
/* name is now either V or I or a serious error */ |
|
|
/* name is now either V or I or a serious error */ |
|
|
if (*name == 'v' && strlen(name) == 1) { |
|
|
if (*name == 'v' && strlen(name) == 1) { |
|
|
if (*line != '(') { |
|
|
|
|
|
LITERR("Syntax error: '(' expected after 'v'\n"); |
|
|
|
|
|
return 0; |
|
|
|
|
|
} |
|
|
|
|
|
INPgetNetTok(&line, &nname1, 0); |
|
|
|
|
|
INPtermInsert(ckt, &nname1, tab, &node1); |
|
|
|
|
|
ptemp.nValue = node1; |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "outpos", &ptemp)) |
|
|
|
|
|
|
|
|
|
|
|
if (*line != ')') { |
|
|
|
|
|
INPgetNetTok(&line, &nname2, 1); |
|
|
|
|
|
INPtermInsert(ckt, &nname2, tab, &node2); |
|
|
|
|
|
ptemp.nValue = node2; |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "outneg", &ptemp)); |
|
|
|
|
|
ptemp.sValue = TMALLOC(char, 5 + strlen(nname1) + strlen(nname2)); |
|
|
|
|
|
(void) sprintf(ptemp.sValue, "V(%s,%s)", nname1, nname2); |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "outname", &ptemp)); |
|
|
|
|
|
} else { |
|
|
|
|
|
ptemp.nValue = gnode; |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "outneg", &ptemp)); |
|
|
|
|
|
ptemp.sValue = |
|
|
|
|
|
TMALLOC(char, 4 + strlen(nname1)); |
|
|
|
|
|
(void) sprintf(ptemp.sValue, "V(%s)", nname1); |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "outname", &ptemp)); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if (*line != '(') { |
|
|
|
|
|
LITERR("Syntax error: '(' expected after 'v'\n"); |
|
|
|
|
|
return 0; |
|
|
|
|
|
} |
|
|
|
|
|
INPgetNetTok(&line, &nname1, 0); |
|
|
|
|
|
INPtermInsert(ckt, &nname1, tab, &node1); |
|
|
|
|
|
ptemp.nValue = node1; |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "outpos", &ptemp)) |
|
|
|
|
|
|
|
|
|
|
|
if (*line != ')') { |
|
|
|
|
|
INPgetNetTok(&line, &nname2, 1); |
|
|
|
|
|
INPtermInsert(ckt, &nname2, tab, &node2); |
|
|
|
|
|
ptemp.nValue = node2; |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "outneg", &ptemp)); |
|
|
|
|
|
ptemp.sValue = TMALLOC(char, 5 + strlen(nname1) + strlen(nname2)); |
|
|
|
|
|
(void) sprintf(ptemp.sValue, "V(%s,%s)", nname1, nname2); |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "outname", &ptemp)); |
|
|
|
|
|
} else { |
|
|
|
|
|
ptemp.nValue = gnode; |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "outneg", &ptemp)); |
|
|
|
|
|
ptemp.sValue = |
|
|
|
|
|
TMALLOC(char, 4 + strlen(nname1)); |
|
|
|
|
|
(void) sprintf(ptemp.sValue, "V(%s)", nname1); |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "outname", &ptemp)); |
|
|
|
|
|
} |
|
|
} else if (*name == 'i' && strlen(name) == 1) { |
|
|
} else if (*name == 'i' && strlen(name) == 1) { |
|
|
INPgetTok(&line, &name, 1); |
|
|
|
|
|
INPinsert(&name, tab); |
|
|
|
|
|
ptemp.uValue = name; |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "outsrc", &ptemp)); |
|
|
|
|
|
|
|
|
INPgetTok(&line, &name, 1); |
|
|
|
|
|
INPinsert(&name, tab); |
|
|
|
|
|
ptemp.uValue = name; |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "outsrc", &ptemp)); |
|
|
} else { |
|
|
} else { |
|
|
LITERR("Syntax error: voltage or current expected.\n"); |
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
LITERR("Syntax error: voltage or current expected.\n"); |
|
|
|
|
|
return 0; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
INPgetTok(&line, &name, 1); |
|
|
INPgetTok(&line, &name, 1); |
|
|
if (name && !strcmp(name, "pct")) { |
|
|
if (name && !strcmp(name, "pct")) { |
|
|
ptemp.iValue = 1; |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "pct", &ptemp)) |
|
|
|
|
|
INPgetTok(&line, &name, 1); |
|
|
|
|
|
|
|
|
ptemp.iValue = 1; |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "pct", &ptemp)) |
|
|
|
|
|
INPgetTok(&line, &name, 1); |
|
|
} |
|
|
} |
|
|
if (name && !strcmp(name, "ac")) { |
|
|
if (name && !strcmp(name, "ac")) { |
|
|
INPgetTok(&line, &steptype, 1); /* get DEC, OCT, or LIN */ |
|
|
|
|
|
ptemp.iValue = 1; |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, steptype, &ptemp)); |
|
|
|
|
|
parm = INPgetValue(ckt, &line, IF_INTEGER, tab); /* number of points */ |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "numsteps", parm)); |
|
|
|
|
|
parm = INPgetValue(ckt, &line, IF_REAL, tab); /* fstart */ |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "start", parm)); |
|
|
|
|
|
parm = INPgetValue(ckt, &line, IF_REAL, tab); /* fstop */ |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "stop", parm)); |
|
|
|
|
|
return (0); |
|
|
|
|
|
|
|
|
INPgetTok(&line, &steptype, 1); /* get DEC, OCT, or LIN */ |
|
|
|
|
|
ptemp.iValue = 1; |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, steptype, &ptemp)); |
|
|
|
|
|
parm = INPgetValue(ckt, &line, IF_INTEGER, tab); /* number of points */ |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "numsteps", parm)); |
|
|
|
|
|
parm = INPgetValue(ckt, &line, IF_REAL, tab); /* fstart */ |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "start", parm)); |
|
|
|
|
|
parm = INPgetValue(ckt, &line, IF_REAL, tab); /* fstop */ |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "stop", parm)); |
|
|
|
|
|
return (0); |
|
|
} else if (name && *name && strcmp(name, "dc")) { |
|
|
} else if (name && *name && strcmp(name, "dc")) { |
|
|
/* Bad flag */ |
|
|
|
|
|
LITERR("Syntax error: 'ac' or 'dc' expected.\n"); |
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
|
/* Bad flag */ |
|
|
|
|
|
LITERR("Syntax error: 'ac' or 'dc' expected.\n"); |
|
|
|
|
|
return 0; |
|
|
} |
|
|
} |
|
|
return (0); |
|
|
return (0); |
|
|
} |
|
|
} |
|
|
@ -558,7 +558,7 @@ dot_sens(char *line, CKTcircuit *ckt, INPtables *tab, card *current, |
|
|
#ifdef WANT_SENSE2 |
|
|
#ifdef WANT_SENSE2 |
|
|
static int |
|
|
static int |
|
|
dot_sens2(char *line, CKTcircuit *ckt, INPtables *tab, card *current, |
|
|
dot_sens2(char *line, CKTcircuit *ckt, INPtables *tab, card *current, |
|
|
TSKtask *task, CKTnode *gnode, JOB *foo) |
|
|
|
|
|
|
|
|
TSKtask *task, CKTnode *gnode, JOB *foo) |
|
|
{ |
|
|
{ |
|
|
int error; /* error code temporary */ |
|
|
int error; /* error code temporary */ |
|
|
IFvalue ptemp; /* a value structure to package resistance into */ |
|
|
IFvalue ptemp; /* a value structure to package resistance into */ |
|
|
@ -570,58 +570,58 @@ dot_sens2(char *line, CKTcircuit *ckt, INPtables *tab, card *current, |
|
|
/* .sens {AC} {DC} {TRAN} [dev=nnn parm=nnn]* */ |
|
|
/* .sens {AC} {DC} {TRAN} [dev=nnn parm=nnn]* */ |
|
|
which = -1; |
|
|
which = -1; |
|
|
for (i = 0; i < ft_sim->numAnalyses; i++) { |
|
|
for (i = 0; i < ft_sim->numAnalyses; i++) { |
|
|
if (strcmp(ft_sim->analyses[i]->name, "SENS2") == 0) { |
|
|
|
|
|
which = i; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if (strcmp(ft_sim->analyses[i]->name, "SENS2") == 0) { |
|
|
|
|
|
which = i; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
if (which == -1) { |
|
|
if (which == -1) { |
|
|
LITERR("Sensitivity-2 analysis unsupported\n"); |
|
|
|
|
|
return (0); |
|
|
|
|
|
|
|
|
LITERR("Sensitivity-2 analysis unsupported\n"); |
|
|
|
|
|
return (0); |
|
|
} |
|
|
} |
|
|
IFC(newAnalysis, (ckt, which, "Sensitivity-2 Analysis", &foo, task)); |
|
|
IFC(newAnalysis, (ckt, which, "Sensitivity-2 Analysis", &foo, task)); |
|
|
while (*line) { |
|
|
while (*line) { |
|
|
/* read the entire line */ |
|
|
|
|
|
INPgetTok(&line, &token, 1); |
|
|
|
|
|
for (i = 0; i < ft_sim->analyses[which]->numParms; i++) { |
|
|
|
|
|
/* find the parameter */ |
|
|
|
|
|
if (0 == strcmp(token, |
|
|
|
|
|
ft_sim->analyses[which]->analysisParms[i].keyword)) { |
|
|
|
|
|
/* found it, analysis which, parameter i */ |
|
|
|
|
|
if (ft_sim->analyses[which]->analysisParms[i].dataType & IF_FLAG) { |
|
|
|
|
|
/* one of the keywords! */ |
|
|
|
|
|
ptemp.iValue = 1; |
|
|
|
|
|
error = |
|
|
|
|
|
ft_sim->setAnalysisParm (ckt, foo, |
|
|
|
|
|
ft_sim->analyses[which]->analysisParms[i].id, |
|
|
|
|
|
&ptemp, |
|
|
|
|
|
NULL); |
|
|
|
|
|
if (error) |
|
|
|
|
|
current->error = |
|
|
|
|
|
INPerrCat(current->error, INPerror(error)); |
|
|
|
|
|
} else { |
|
|
|
|
|
parm = |
|
|
|
|
|
INPgetValue(ckt, &line, |
|
|
|
|
|
ft_sim->analyses[which]->analysisParms[i].dataType, tab); |
|
|
|
|
|
error = |
|
|
|
|
|
ft_sim->setAnalysisParm (ckt, foo, |
|
|
|
|
|
ft_sim-> |
|
|
|
|
|
analyses |
|
|
|
|
|
[which]->analysisParms |
|
|
|
|
|
[i].id, parm, |
|
|
|
|
|
NULL); |
|
|
|
|
|
if (error) |
|
|
|
|
|
current->error = |
|
|
|
|
|
INPerrCat(current->error, INPerror(error)); |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
if (i == ft_sim->analyses[which]->numParms) { |
|
|
|
|
|
/* didn't find it! */ |
|
|
|
|
|
LITERR(" Error: unknown parameter on .sens-ignored \n"); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
/* read the entire line */ |
|
|
|
|
|
INPgetTok(&line, &token, 1); |
|
|
|
|
|
for (i = 0; i < ft_sim->analyses[which]->numParms; i++) { |
|
|
|
|
|
/* find the parameter */ |
|
|
|
|
|
if (0 == strcmp(token, |
|
|
|
|
|
ft_sim->analyses[which]->analysisParms[i].keyword)) { |
|
|
|
|
|
/* found it, analysis which, parameter i */ |
|
|
|
|
|
if (ft_sim->analyses[which]->analysisParms[i].dataType & IF_FLAG) { |
|
|
|
|
|
/* one of the keywords! */ |
|
|
|
|
|
ptemp.iValue = 1; |
|
|
|
|
|
error = |
|
|
|
|
|
ft_sim->setAnalysisParm (ckt, foo, |
|
|
|
|
|
ft_sim->analyses[which]->analysisParms[i].id, |
|
|
|
|
|
&ptemp, |
|
|
|
|
|
NULL); |
|
|
|
|
|
if (error) |
|
|
|
|
|
current->error = |
|
|
|
|
|
INPerrCat(current->error, INPerror(error)); |
|
|
|
|
|
} else { |
|
|
|
|
|
parm = |
|
|
|
|
|
INPgetValue(ckt, &line, |
|
|
|
|
|
ft_sim->analyses[which]->analysisParms[i].dataType, tab); |
|
|
|
|
|
error = |
|
|
|
|
|
ft_sim->setAnalysisParm (ckt, foo, |
|
|
|
|
|
ft_sim-> |
|
|
|
|
|
analyses |
|
|
|
|
|
[which]->analysisParms |
|
|
|
|
|
[i].id, parm, |
|
|
|
|
|
NULL); |
|
|
|
|
|
if (error) |
|
|
|
|
|
current->error = |
|
|
|
|
|
INPerrCat(current->error, INPerror(error)); |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
if (i == ft_sim->analyses[which]->numParms) { |
|
|
|
|
|
/* didn't find it! */ |
|
|
|
|
|
LITERR(" Error: unknown parameter on .sens-ignored \n"); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
return (0); |
|
|
return (0); |
|
|
} |
|
|
} |
|
|
@ -630,7 +630,7 @@ dot_sens2(char *line, CKTcircuit *ckt, INPtables *tab, card *current, |
|
|
/*SP: Steady State Analyis */ |
|
|
/*SP: Steady State Analyis */ |
|
|
static int |
|
|
static int |
|
|
dot_pss(char *line, void *ckt, INPtables *tab, card *current, |
|
|
dot_pss(char *line, void *ckt, INPtables *tab, card *current, |
|
|
void *task, void *gnode, JOB *foo) |
|
|
|
|
|
|
|
|
void *task, void *gnode, JOB *foo) |
|
|
{ |
|
|
{ |
|
|
int error; /* error code temporary */ |
|
|
int error; /* error code temporary */ |
|
|
IFvalue ptemp; /* a value structure to package resistance into */ |
|
|
IFvalue ptemp; /* a value structure to package resistance into */ |
|
|
@ -646,68 +646,68 @@ dot_pss(char *line, void *ckt, INPtables *tab, card *current, |
|
|
/* .pss Fguess StabTime OscNode <UIC>*/ |
|
|
/* .pss Fguess StabTime OscNode <UIC>*/ |
|
|
which = -1; |
|
|
which = -1; |
|
|
for (i = 0; i < ft_sim->numAnalyses; i++) { |
|
|
for (i = 0; i < ft_sim->numAnalyses; i++) { |
|
|
if (strcmp(ft_sim->analyses[i]->name, "PSS") == 0) { |
|
|
|
|
|
which = i; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if (strcmp(ft_sim->analyses[i]->name, "PSS") == 0) { |
|
|
|
|
|
which = i; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
if (which == -1) { |
|
|
if (which == -1) { |
|
|
LITERR("Periodic steady state analysis unsupported.\n"); |
|
|
|
|
|
return (0); |
|
|
|
|
|
|
|
|
LITERR("Periodic steady state analysis unsupported.\n"); |
|
|
|
|
|
return (0); |
|
|
} |
|
|
} |
|
|
IFC(newAnalysis, (ckt, which, "Periodic steady state Analysis", &foo, task)); |
|
|
IFC(newAnalysis, (ckt, which, "Periodic steady state Analysis", &foo, task)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
parm = INPgetValue(ckt, &line, IF_REAL, tab); /* Fguess */ |
|
|
parm = INPgetValue(ckt, &line, IF_REAL, tab); /* Fguess */ |
|
|
GCA(INPapName, (ckt, which, foo, "fguess", parm)); |
|
|
GCA(INPapName, (ckt, which, foo, "fguess", parm)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
parm = INPgetValue(ckt, &line, IF_REAL, tab); /* StabTime */ |
|
|
parm = INPgetValue(ckt, &line, IF_REAL, tab); /* StabTime */ |
|
|
GCA(INPapName, (ckt, which, foo, "stabtime", parm)); |
|
|
GCA(INPapName, (ckt, which, foo, "stabtime", parm)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
INPgetNetTok(&line, &nname, 0); |
|
|
INPgetNetTok(&line, &nname, 0); |
|
|
INPtermInsert(ckt, &nname, tab, &nnode); |
|
|
INPtermInsert(ckt, &nname, tab, &nnode); |
|
|
ptemp.nValue = nnode; |
|
|
ptemp.nValue = nnode; |
|
|
GCA(INPapName, (ckt, which, foo, "oscnode", &ptemp)) /* OscNode given as string */ |
|
|
GCA(INPapName, (ckt, which, foo, "oscnode", &ptemp)) /* OscNode given as string */ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
parm = INPgetValue(ckt, &line, IF_INTEGER, tab); /* PSS points */ |
|
|
parm = INPgetValue(ckt, &line, IF_INTEGER, tab); /* PSS points */ |
|
|
GCA(INPapName, (ckt, which, foo, "points", parm)); |
|
|
GCA(INPapName, (ckt, which, foo, "points", parm)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
parm = INPgetValue(ckt, &line, IF_INTEGER, tab); /* PSS harmonics */ |
|
|
parm = INPgetValue(ckt, &line, IF_INTEGER, tab); /* PSS harmonics */ |
|
|
GCA(INPapName, (ckt, which, foo, "harmonics", parm)); |
|
|
GCA(INPapName, (ckt, which, foo, "harmonics", parm)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (*line) { |
|
|
if (*line) { |
|
|
INPgetTok(&line, &word, 1); /* uic? */ |
|
|
|
|
|
if (strcmp(word, "uic") == 0) { |
|
|
|
|
|
ptemp.iValue = 1; |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "uic", &ptemp)); |
|
|
|
|
|
} else { |
|
|
|
|
|
LITERR(" Error: unknown parameter on .pss - ignored\n"); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
INPgetTok(&line, &word, 1); /* uic? */ |
|
|
|
|
|
if (strcmp(word, "uic") == 0) { |
|
|
|
|
|
ptemp.iValue = 1; |
|
|
|
|
|
GCA(INPapName, (ckt, which, foo, "uic", &ptemp)); |
|
|
|
|
|
} else { |
|
|
|
|
|
LITERR(" Error: unknown parameter on .pss - ignored\n"); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
parm = INPgetValue(ckt, &line, IF_INTEGER, tab); /* SC iterations */ |
|
|
parm = INPgetValue(ckt, &line, IF_INTEGER, tab); /* SC iterations */ |
|
|
GCA(INPapName, (ckt, which, foo, "sc_iter", parm)); |
|
|
GCA(INPapName, (ckt, which, foo, "sc_iter", parm)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
parm = INPgetValue(ckt, &line, IF_REAL, tab); /* Steady coefficient */ |
|
|
parm = INPgetValue(ckt, &line, IF_REAL, tab); /* Steady coefficient */ |
|
|
GCA(INPapName, (ckt, which, foo, "steady_coeff", parm)); |
|
|
GCA(INPapName, (ckt, which, foo, "steady_coeff", parm)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return (0); |
|
|
return (0); |
|
|
} |
|
|
} |
|
|
/* SP */ |
|
|
/* SP */ |
|
|
|
|
|
|
|
|
static int |
|
|
static int |
|
|
dot_options(char *line, CKTcircuit *ckt, INPtables *tab, card *current, |
|
|
dot_options(char *line, CKTcircuit *ckt, INPtables *tab, card *current, |
|
|
TSKtask *task, CKTnode *gnode, JOB *foo) |
|
|
|
|
|
|
|
|
TSKtask *task, CKTnode *gnode, JOB *foo) |
|
|
{ |
|
|
{ |
|
|
NG_IGNORE(line); |
|
|
|
|
|
NG_IGNORE(gnode); |
|
|
|
|
|
NG_IGNORE(foo); |
|
|
|
|
|
|
|
|
|
|
|
/* .option - specify program options - rather complicated */ |
|
|
|
|
|
/* use a subroutine to handle all of them to keep this */ |
|
|
|
|
|
/* subroutine managable. */ |
|
|
|
|
|
|
|
|
|
|
|
INPdoOpts(ckt, &(task->taskOptions), current, tab); |
|
|
|
|
|
return (0); |
|
|
|
|
|
|
|
|
NG_IGNORE(line); |
|
|
|
|
|
NG_IGNORE(gnode); |
|
|
|
|
|
NG_IGNORE(foo); |
|
|
|
|
|
|
|
|
|
|
|
/* .option - specify program options - rather complicated */ |
|
|
|
|
|
/* use a subroutine to handle all of them to keep this */ |
|
|
|
|
|
/* subroutine managable. */ |
|
|
|
|
|
|
|
|
|
|
|
INPdoOpts(ckt, &(task->taskOptions), current, tab); |
|
|
|
|
|
return (0); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -724,103 +724,102 @@ INP2dot(CKTcircuit *ckt, INPtables *tab, card *current, TSKtask *task, CKTnode * |
|
|
|
|
|
|
|
|
INPgetTok(&line, &token, 1); |
|
|
INPgetTok(&line, &token, 1); |
|
|
if (strcmp(token, ".model") == 0) { |
|
|
if (strcmp(token, ".model") == 0) { |
|
|
/* don't have to do anything, since models were all done in |
|
|
|
|
|
* pass 1 */ |
|
|
|
|
|
goto quit; |
|
|
|
|
|
|
|
|
/* don't have to do anything, since models were all done in |
|
|
|
|
|
* pass 1 */ |
|
|
|
|
|
goto quit; |
|
|
} else if ((strcmp(token, ".width") == 0) || |
|
|
} else if ((strcmp(token, ".width") == 0) || |
|
|
strcmp(token, ".print") == 0 || strcmp(token, ".plot") == 0) { |
|
|
|
|
|
/* obsolete - ignore */ |
|
|
|
|
|
LITERR(" Warning: obsolete control card - ignored \n"); |
|
|
|
|
|
goto quit; |
|
|
|
|
|
|
|
|
strcmp(token, ".print") == 0 || strcmp(token, ".plot") == 0) { |
|
|
|
|
|
/* obsolete - ignore */ |
|
|
|
|
|
LITERR(" Warning: obsolete control card - ignored \n"); |
|
|
|
|
|
goto quit; |
|
|
} else if ((strcmp(token, ".temp") == 0)) { |
|
|
} else if ((strcmp(token, ".temp") == 0)) { |
|
|
/* .temp temp1 temp2 temp3 temp4 ..... */ |
|
|
|
|
|
/* not yet implemented - warn & ignore */ |
|
|
|
|
|
|
|
|
/* .temp temp1 temp2 temp3 temp4 ..... */ |
|
|
|
|
|
/* not yet implemented - warn & ignore */ |
|
|
/* |
|
|
/* |
|
|
LITERR(" Warning: .TEMP card obsolete - use .options TEMP and TNOM\n"); |
|
|
|
|
|
*/ |
|
|
|
|
|
goto quit; |
|
|
|
|
|
|
|
|
LITERR(" Warning: .TEMP card obsolete - use .options TEMP and TNOM\n"); |
|
|
|
|
|
*/ |
|
|
|
|
|
goto quit; |
|
|
} else if ((strcmp(token, ".op") == 0)) { |
|
|
} else if ((strcmp(token, ".op") == 0)) { |
|
|
rtn = dot_op(line, ckt, tab, current, task, gnode, foo); |
|
|
|
|
|
goto quit; |
|
|
|
|
|
|
|
|
rtn = dot_op(line, ckt, tab, current, task, gnode, foo); |
|
|
|
|
|
goto quit; |
|
|
} else if ((strcmp(token, ".nodeset") == 0)) { |
|
|
} else if ((strcmp(token, ".nodeset") == 0)) { |
|
|
goto quit; |
|
|
|
|
|
|
|
|
goto quit; |
|
|
} else if ((strcmp(token, ".disto") == 0)) { |
|
|
} else if ((strcmp(token, ".disto") == 0)) { |
|
|
rtn = dot_disto(line, ckt, tab, current, task, gnode, foo); |
|
|
|
|
|
goto quit; |
|
|
|
|
|
|
|
|
rtn = dot_disto(line, ckt, tab, current, task, gnode, foo); |
|
|
|
|
|
goto quit; |
|
|
} else if ((strcmp(token, ".noise") == 0)) { |
|
|
} else if ((strcmp(token, ".noise") == 0)) { |
|
|
rtn = dot_noise(line, ckt, tab, current, task, gnode, foo); |
|
|
|
|
|
goto quit; |
|
|
|
|
|
|
|
|
rtn = dot_noise(line, ckt, tab, current, task, gnode, foo); |
|
|
|
|
|
goto quit; |
|
|
} else if ((strcmp(token, ".four") == 0) |
|
|
} else if ((strcmp(token, ".four") == 0) |
|
|
|| (strcmp(token, ".fourier") == 0)) { |
|
|
|
|
|
/* .four */ |
|
|
|
|
|
/* not implemented - warn & ignore */ |
|
|
|
|
|
LITERR("Use fourier command to obtain fourier analysis\n"); |
|
|
|
|
|
goto quit; |
|
|
|
|
|
|
|
|
|| (strcmp(token, ".fourier") == 0)) { |
|
|
|
|
|
/* .four */ |
|
|
|
|
|
/* not implemented - warn & ignore */ |
|
|
|
|
|
LITERR("Use fourier command to obtain fourier analysis\n"); |
|
|
|
|
|
goto quit; |
|
|
} else if ((strcmp(token, ".ic") == 0)) { |
|
|
} else if ((strcmp(token, ".ic") == 0)) { |
|
|
goto quit; |
|
|
|
|
|
|
|
|
goto quit; |
|
|
} else if ((strcmp(token, ".ac") == 0)) { |
|
|
} else if ((strcmp(token, ".ac") == 0)) { |
|
|
rtn = dot_ac(line, ckt, tab, current, task, gnode, foo); |
|
|
|
|
|
goto quit; |
|
|
|
|
|
|
|
|
rtn = dot_ac(line, ckt, tab, current, task, gnode, foo); |
|
|
|
|
|
goto quit; |
|
|
} else if ((strcmp(token, ".pz") == 0)) { |
|
|
} else if ((strcmp(token, ".pz") == 0)) { |
|
|
rtn = dot_pz(line, ckt, tab, current, task, gnode, foo); |
|
|
|
|
|
goto quit; |
|
|
|
|
|
|
|
|
rtn = dot_pz(line, ckt, tab, current, task, gnode, foo); |
|
|
|
|
|
goto quit; |
|
|
} else if ((strcmp(token, ".dc") == 0)) { |
|
|
} else if ((strcmp(token, ".dc") == 0)) { |
|
|
rtn = dot_dc(line, ckt, tab, current, task, gnode, foo); |
|
|
|
|
|
goto quit; |
|
|
|
|
|
|
|
|
rtn = dot_dc(line, ckt, tab, current, task, gnode, foo); |
|
|
|
|
|
goto quit; |
|
|
} else if ((strcmp(token, ".tf") == 0)) { |
|
|
} else if ((strcmp(token, ".tf") == 0)) { |
|
|
rtn = dot_tf(line, ckt, tab, current, task, gnode, foo); |
|
|
|
|
|
goto quit; |
|
|
|
|
|
|
|
|
rtn = dot_tf(line, ckt, tab, current, task, gnode, foo); |
|
|
|
|
|
goto quit; |
|
|
} else if ((strcmp(token, ".tran") == 0)) { |
|
|
} else if ((strcmp(token, ".tran") == 0)) { |
|
|
rtn = dot_tran(line, ckt, tab, current, task, gnode, foo); |
|
|
|
|
|
goto quit; |
|
|
|
|
|
/* SP: Steady State Analysis */ |
|
|
|
|
|
|
|
|
rtn = dot_tran(line, ckt, tab, current, task, gnode, foo); |
|
|
|
|
|
goto quit; |
|
|
|
|
|
/* SP: Steady State Analysis */ |
|
|
} else if ((strcmp(token, ".pss") == 0)) { |
|
|
} else if ((strcmp(token, ".pss") == 0)) { |
|
|
rtn = dot_pss(line, ckt, tab, current, task, gnode, foo); |
|
|
|
|
|
goto quit; |
|
|
|
|
|
/* SP */ |
|
|
|
|
|
|
|
|
rtn = dot_pss(line, ckt, tab, current, task, gnode, foo); |
|
|
|
|
|
goto quit; |
|
|
|
|
|
/* SP */ |
|
|
} else if ((strcmp(token, ".subckt") == 0) || |
|
|
} else if ((strcmp(token, ".subckt") == 0) || |
|
|
(strcmp(token, ".ends") == 0)) { |
|
|
|
|
|
/* not yet implemented - warn & ignore */ |
|
|
|
|
|
LITERR(" Warning: Subcircuits not yet implemented - ignored \n"); |
|
|
|
|
|
goto quit; |
|
|
|
|
|
|
|
|
(strcmp(token, ".ends") == 0)) { |
|
|
|
|
|
/* not yet implemented - warn & ignore */ |
|
|
|
|
|
LITERR(" Warning: Subcircuits not yet implemented - ignored \n"); |
|
|
|
|
|
goto quit; |
|
|
} else if ((strcmp(token, ".end") == 0)) { |
|
|
} else if ((strcmp(token, ".end") == 0)) { |
|
|
/* .end - end of input */ |
|
|
|
|
|
/* not allowed to pay attention to additional input - return */ |
|
|
|
|
|
rtn = 1; |
|
|
|
|
|
goto quit; |
|
|
|
|
|
|
|
|
/* .end - end of input */ |
|
|
|
|
|
/* not allowed to pay attention to additional input - return */ |
|
|
|
|
|
rtn = 1; |
|
|
|
|
|
goto quit; |
|
|
} else if (strcmp(token, ".sens") == 0) { |
|
|
} else if (strcmp(token, ".sens") == 0) { |
|
|
rtn = dot_sens(line, ckt, tab, current, task, gnode, foo); |
|
|
|
|
|
goto quit; |
|
|
|
|
|
|
|
|
rtn = dot_sens(line, ckt, tab, current, task, gnode, foo); |
|
|
|
|
|
goto quit; |
|
|
} |
|
|
} |
|
|
#ifdef WANT_SENSE2 |
|
|
#ifdef WANT_SENSE2 |
|
|
else if ((strcmp(token, ".sens2") == 0)) { |
|
|
else if ((strcmp(token, ".sens2") == 0)) { |
|
|
rtn = dot_sens2(line, ckt, tab, current, task, gnode, foo); |
|
|
|
|
|
goto quit; |
|
|
|
|
|
|
|
|
rtn = dot_sens2(line, ckt, tab, current, task, gnode, foo); |
|
|
|
|
|
goto quit; |
|
|
} |
|
|
} |
|
|
#endif |
|
|
#endif |
|
|
else if ((strcmp(token, ".probe") == 0)) { |
|
|
else if ((strcmp(token, ".probe") == 0)) { |
|
|
/* Maybe generate a "probe" format file in the future. */ |
|
|
|
|
|
goto quit; |
|
|
|
|
|
} |
|
|
|
|
|
else if ((strcmp(token, ".options") == 0)|| |
|
|
|
|
|
(strcmp(token,".option")==0) || |
|
|
|
|
|
(strcmp(token,".opt")==0)) { |
|
|
|
|
|
rtn = dot_options(line, ckt, tab, current, task, gnode, foo); |
|
|
|
|
|
goto quit; |
|
|
|
|
|
|
|
|
/* Maybe generate a "probe" format file in the future. */ |
|
|
|
|
|
goto quit; |
|
|
|
|
|
} else if ((strcmp(token, ".options") == 0)|| |
|
|
|
|
|
(strcmp(token,".option")==0) || |
|
|
|
|
|
(strcmp(token,".opt")==0)) { |
|
|
|
|
|
rtn = dot_options(line, ckt, tab, current, task, gnode, foo); |
|
|
|
|
|
goto quit; |
|
|
} |
|
|
} |
|
|
/* Added by H.Tanaka to find .global option */ |
|
|
/* Added by H.Tanaka to find .global option */ |
|
|
else if (strcmp(token, ".global") == 0) { |
|
|
else if (strcmp(token, ".global") == 0) { |
|
|
rtn = 0; |
|
|
|
|
|
LITERR(" Warning: .global not yet implemented - ignored \n"); |
|
|
|
|
|
goto quit; |
|
|
|
|
|
|
|
|
rtn = 0; |
|
|
|
|
|
LITERR(" Warning: .global not yet implemented - ignored \n"); |
|
|
|
|
|
goto quit; |
|
|
} |
|
|
} |
|
|
/* ignore .meas statements -- these will be handled after analysis */ |
|
|
/* ignore .meas statements -- these will be handled after analysis */ |
|
|
/* also ignore .param statements */ |
|
|
/* also ignore .param statements */ |
|
|
/* ignore .prot, .unprot */ |
|
|
/* ignore .prot, .unprot */ |
|
|
else if (strcmp(token, ".meas") == 0 || strcmp(token, ".param") == 0 || strcmp(token, ".measure") == 0 || |
|
|
else if (strcmp(token, ".meas") == 0 || strcmp(token, ".param") == 0 || strcmp(token, ".measure") == 0 || |
|
|
strcmp(token, ".prot") == 0 || strcmp(token, ".unprot") == 0) { |
|
|
|
|
|
rtn = 0; |
|
|
|
|
|
goto quit; |
|
|
|
|
|
|
|
|
strcmp(token, ".prot") == 0 || strcmp(token, ".unprot") == 0) { |
|
|
|
|
|
rtn = 0; |
|
|
|
|
|
goto quit; |
|
|
} |
|
|
} |
|
|
LITERR(" unimplemented control card - error \n"); |
|
|
LITERR(" unimplemented control card - error \n"); |
|
|
quit: |
|
|
quit: |
|
|
|