Browse Source

bipolar handling fixed

pre-master-46
h_vogt 17 years ago
parent
commit
1de4a31321
  1. 7
      ChangeLog
  2. 2
      src/frontend/inp.c
  3. 22
      src/frontend/inpcom.c
  4. 8
      src/spicelib/parser/inp2q.c

7
ChangeLog

@ -1,3 +1,10 @@
2009-05-16 Holger Vogt
* inpcom.c lines 2940ff fix case 'q'
* inp.c:788 error message with original line number from
input deck
* inp2q.c:155 error message if no model is found and default
BJT is selected instead
2009-05-12 Holger Vogt 2009-05-12 Holger Vogt
* inpcom.c fcn inp_fix_gnd_name() remove excessive white * inpcom.c fcn inp_fix_gnd_name() remove excessive white
spaces after replacing gnd by 0 spaces after replacing gnd by 0

2
src/frontend/inp.c

@ -785,7 +785,7 @@ inp_dodeck(struct line *deck, char *tt, wordlist *end, bool reuse,
if (p == dd->li_error) if (p == dd->li_error)
out_printf("Error on line %d : %s\n\t%s\n", out_printf("Error on line %d : %s\n\t%s\n",
dd->li_linenum, dd->li_line, dd->li_error);
dd->li_linenum_orig, dd->li_line, dd->li_error);
else else
out_printf("\t%s\n", p); out_printf("\t%s\n", p);

22
src/frontend/inpcom.c

@ -2899,7 +2899,7 @@ static int
get_number_terminals( char *c ) get_number_terminals( char *c )
{ {
int i, j, k; int i, j, k;
char *name[10];
char *name[12];
char nam_buf[33]; char nam_buf[33];
bool area_found = FALSE; bool area_found = FALSE;
@ -2938,16 +2938,32 @@ get_number_terminals( char *c )
return i-j-2; return i-j-2;
break; break;
case 'q': /* recognition of 3/4 terminal bjt's needed */ case 'q': /* recognition of 3/4 terminal bjt's needed */
/* QXXXXXXX NC NB NE <NS> MNAME <AREA> <OFF> <IC=VBE, VCE> <TEMP=T> */
/* 12 tokens maximum */
i = j = 0; i = j = 0;
while ( (i < 10) && (*c != '\0') ) {
while ( (i < 12) && (*c != '\0') ) {
char* comma;
name[i] = gettok_instance(&c); name[i] = gettok_instance(&c);
if (strstr(name[i], "off") || strstr(name[i], "=")) j++; if (strstr(name[i], "off") || strstr(name[i], "=")) j++;
/* If we have IC=VBE, VCE instead of IC=VBE,VCE we need to inc j */
if ((comma = strstr(name[i], ",")) && ( *(++comma) == NULL)) j++;
/* If we have IC=VBE , VCE we need to inc j */
if (eq(name[i], ",")) j++;
i++; i++;
} }
i--; i--;
area_found = FALSE; area_found = FALSE;
for (k = i; k > i-j-1; k--) { for (k = i; k > i-j-1; k--) {
if (isdigit(*name[k])) area_found = TRUE;
bool only_digits = TRUE;
char* nametmp = name[k];
/* MNAME has to contain at least one alpha character. AREA may be assumed
if we have a token with only digits, and where the previous token does not
end with a ',' */
while (*nametmp) {
if (isalpha(*nametmp) || (*nametmp == ',')) only_digits = FALSE;
nametmp++;
}
if (only_digits && (strstr(name[k-1],",") == NULL)) area_found = TRUE;
} }
if (area_found) { if (area_found) {
return i-j-2; return i-j-2;

8
src/spicelib/parser/inp2q.c

@ -141,15 +141,21 @@ void INP2Q(void *ckt, INPtables * tab, card * current, void *gnode)
type = (thismodel->INPmodType); type = (thismodel->INPmodType);
mdfast = (thismodel->INPmodfast); mdfast = (thismodel->INPmodfast);
} else { } else {
type = INPtypelook("BJT");
/* no model found */
type = INPtypelook("BJT");
if (type < 0) { if (type < 0) {
LITERR("Device type BJT not supported by this binary\n"); LITERR("Device type BJT not supported by this binary\n");
return; return;
} }
if (!tab->defQmod) { if (!tab->defQmod) {
/* create default Q model */ /* create default Q model */
char *err;
IFnewUid(ckt, &uid, (IFuid) NULL, "Q", UID_MODEL, (void **) NULL); IFnewUid(ckt, &uid, (IFuid) NULL, "Q", UID_MODEL, (void **) NULL);
IFC(newModel, (ckt, type, &(tab->defQmod), uid)); IFC(newModel, (ckt, type, &(tab->defQmod), uid));
err = (char *) MALLOC((70 + strlen(model)) * sizeof(char));
(void) sprintf(err, "Unable to find definition of model %s - default BJT assumed \n", model);
LITERR(err);
tfree(err);
} }
mdfast = tab->defQmod; mdfast = tab->defQmod;
} }

Loading…
Cancel
Save