1 /***************************************************************************
2 JSPICE3 adaptation of Spice3f2 - 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 "ftedefs.h"
10 #include "inpdefs.h"
11 #include "inpmacs.h"
12 #include "misc.h"
13 
14 
15 /* ARGSUSED */
16 int
NOISEparse(ckt,tab,which,currentp,line,task,gnode)17 NOISEparse(ckt,tab,which,currentp,line,task,gnode)
18 
19 /*
20     .noise V(OUTPUT) SRC {DEC OCT LIN} NP FSTART FSTOP [PTSPRSUM]
21         [ dc SRC1NAME Vstart1 [Vstop1 [Vinc1]]
22         [SRC2NAME Vstart2 [Vstop2 [Vinc2]]] ]
23 */
24 GENERIC *ckt;
25 INPtables *tab;
26 int which;
27 GENERIC *currentp;
28 char **line;
29 GENERIC *task;
30 GENERIC *gnode;
31 {
32     char *token;    /* a token from the line */
33     GENERIC *foo;   /* pointer to analysis */
34     IFvalue ptemp;  /* a value structure to package stuff into */
35     IFvalue *parm;  /* a pointer to a value struct for function returns */
36     int error;      /* error code temporary */
37     card *current = (card *)currentp;
38 
39     IFC(newAnalysis, (ckt,which,"noise",&foo,task))
40     INPgetTok(line,&token,1);
41 
42     /* Make sure the ".noise" command is followed by V(xxxx).
43      * If it is, extract 'xxxx'.  If not, report an error.
44      */
45 
46     if ((*token == 'v' || *token == 'V') && strlen(token) == 1) {
47         txfree(token);
48         if (**line != '(' /* match) */) {
49             LITERR("Syntax error: '(' expected after 'v'");
50             return (0);
51         }
52         INPgetTok(line,&token,0); /* don't gobble */
53         ptemp.sValue = token;
54         GCA(INPapName,(ckt,which,foo,"output",&ptemp))
55 
56         /* See if an output reference node is specified, ie the */
57         /* command of the form V(xxxx), or of the form V(xxxx,yyyy) */
58 
59         if (**line != /* match ( */ ')') {
60             parm = INPgetValue(ckt,line,IF_STRING,tab);
61             GCA(INPapName,(ckt,which,foo,"outputref",parm))
62         }
63         else {
64             ptemp.sValue = (char*)NULL;
65             GCA(INPapName,(ckt,which,foo,"outputref",&ptemp))
66         }
67 
68         INPgetTok(line,&token,1);
69         strtolower(token);
70         INPinsert(&token,tab);
71         ptemp.uValue = token;
72         GCA(INPapName,(ckt,which,foo,"input",&ptemp))
73 
74         GCA(ParseAC,(ckt,line,current,which,foo,tab))
75 
76         if (**line) {
77             ptemp.iValue = INPevaluate(line,&error,1);    /* ptspersum? */
78             if (error == 0) {
79                 GCA(INPapName,(ckt,which,foo,"ptspersum",&ptemp))
80             }
81             if (**line) {
82                 INPgetTok(line, &token, 1);
83                 strtolower(token);
84                 if (!strcmp(token,"dc")) {
85                     txfree(token);
86                     GCA(ParseDC,(ckt,line,current,which,foo,tab,1))
87                     if (**line)
88                         GCA(ParseDC,(ckt,line,current,which,foo,tab,2))
89                 }
90             }
91         }
92     }
93     else {
94         txfree(token);
95         LITERR("Unknown parameter on .noise - ignored.")
96     }
97     return (0);
98 }
99