1 /***************************************************************************
2 JSPICE3 adaptation of Spice3e2 - Copyright (c) Stephen R. Whiteley 1992
3 Copyright 1990 Regents of the University of California.  All rights reserved.
4 Authors: 1987 Thomas L. Quarles
5          1993 Stephen R. Whiteley
6 ****************************************************************************/
7 
8 #include "spice.h"
9 #include <stdio.h>
10 #include "inpdefs.h"
11 #include "inpmacs.h"
12 
13 void
JFETparse(type,ckt,tabp,currentp)14 JFETparse(type,ckt,tabp,currentp)
15 
16 int  type;
17 GENERIC *ckt;
18 GENERIC *tabp;
19 GENERIC *currentp;
20 {
21     /* JFET parser */
22 
23     /* Jname <node> <node> <node> <model> [<val>] [OFF] [IC=<val>,<val>] */
24 
25     INPtables *tab = (INPtables*)tabp;
26     card *current = (card*)currentp;
27 
28     char *line;     /* the part of the current line left to parse */
29     char *name;     /* the device's name */
30     char *nname1;   /* the first node's name */
31     char *nname2;   /* the second node's name */
32     char *nname3;   /* the third node's name */
33     GENERIC *node1; /* the first node's node pointer */
34     GENERIC *node2; /* the second node's node pointer */
35     GENERIC *node3; /* the third node's node pointer */
36     int error;      /* error code temporary */
37     GENERIC *fast;  /* pointer to the actual instance */
38     IFvalue ptemp;  /* a value structure to package resistance into */
39     int waslead;    /* flag to indicate that unlabeled number was found */
40     double leadval; /* actual value of unlabeled number */
41     char *model;    /* the name of the model */
42     INPmodel *thismodel; /* pointer to model description for user's model */
43     GENERIC *mdfast;     /* pointer to the actual model */
44     IFuid uid;      /* uid of default model */
45 
46     line = current->line;
47     INPgetTok(&line,&name,1);
48     INPinsert(&name,tab);
49 
50     INPgetTok(&line,&nname1,1);
51     INPtermInsert(ckt,&nname1,tab,&node1);
52 
53     INPgetTok(&line,&nname2,1);
54     INPtermInsert(ckt,&nname2,tab,&node2);
55 
56     INPgetTok(&line,&nname3,1);
57     INPtermInsert(ckt,&nname3,tab,&node3);
58 
59     INPgetTok(&line,&model,1);
60     INPinsert(&model,tab);
61 
62     current->error = INPgetMod(ckt,model,&thismodel,tab);
63     if (thismodel != NULL) {
64         if (type != thismodel->INPmodType) {
65             LITERR(INPdevErr(NULL))
66             return;
67         }
68         mdfast = (thismodel->INPmodfast);
69     }
70     else {
71         if (!tab->defJmod) {
72             /* create default J model */
73             IFnewUid(ckt,&uid,(IFuid)NULL,"J",UID_MODEL,(GENERIC**)NULL);
74             IFC(newModel,(ckt,type,&(tab->defJmod),uid))
75         }
76         mdfast = tab->defJmod;
77     }
78     IFC(newInstance,(ckt,mdfast,&fast,name))
79     IFC(bindNode,(ckt,fast,1,node1))
80     IFC(bindNode,(ckt,fast,2,node2))
81     IFC(bindNode,(ckt,fast,3,node3))
82     PARSECALL((&line,ckt,type,fast,&leadval,&waslead,tab))
83     if (waslead) {
84         ptemp.rValue = leadval;
85         GCA(INPpName,("area",&ptemp,ckt,type,fast))
86     }
87 }
88