1 /**********
2 Copyright 1990 Regents of the University of California.  All rights reserved.
3 Author: 1985 Thomas L. Quarles
4 **********/
5 
6 #include "ngspice/ngspice.h"
7 #include "ngspice/ifsim.h"
8 #include "ngspice/iferrmsg.h"
9 #include "ngspice/acdefs.h"
10 #include "ngspice/cktdefs.h"
11 
12 #include "analysis.h"
13 
14 /* ARGSUSED */
15 int
ACsetParm(CKTcircuit * ckt,JOB * anal,int which,IFvalue * value)16 ACsetParm(CKTcircuit *ckt, JOB *anal, int which, IFvalue *value)
17 {
18     ACAN *job = (ACAN *) anal;
19 
20     NG_IGNORE(ckt);
21 
22     switch(which) {
23 
24     case AC_START:
25 	if (value->rValue < 0.0) {
26 	    errMsg = copy("Frequency of < 0 is invalid for AC start");
27             job->ACstartFreq = 1.0;
28 	    return(E_PARMVAL);
29 	}
30 
31         job->ACstartFreq = value->rValue;
32         break;
33 
34     case AC_STOP:
35 	if (value->rValue < 0.0) {
36 	    errMsg = copy("Frequency of < 0 is invalid for AC stop");
37             job->ACstartFreq = 1.0;
38 	    return(E_PARMVAL);
39 	}
40 
41         job->ACstopFreq = value->rValue;
42         break;
43 
44     case AC_STEPS:
45         job->ACnumberSteps = value->iValue;
46         break;
47 
48     case AC_DEC:
49         if(value->iValue) {
50             job->ACstepType = DECADE;
51         } else {
52             if (job->ACstepType == DECADE) {
53                 job->ACstepType = 0;
54             }
55         }
56         break;
57 
58     case AC_OCT:
59         if(value->iValue) {
60                 job->ACstepType = OCTAVE;
61         } else {
62             if (job->ACstepType == OCTAVE) {
63                 job->ACstepType = 0;
64             }
65         }
66         break;
67 
68     case AC_LIN:
69         if(value->iValue) {
70             job->ACstepType = LINEAR;
71         } else {
72             if (job->ACstepType == LINEAR) {
73                 job->ACstepType = 0;
74             }
75         }
76         break;
77 
78     default:
79         return(E_BADPARM);
80     }
81     return(OK);
82 }
83 
84 
85 static IFparm ACparms[] = {
86     { "start",      AC_START,   IF_SET|IF_ASK|IF_REAL, "starting frequency" },
87     { "stop",       AC_STOP,    IF_SET|IF_ASK|IF_REAL, "ending frequency" },
88     { "numsteps",   AC_STEPS,IF_SET|IF_ASK|IF_INTEGER, "number of frequencies"},
89     { "dec",        AC_DEC,     IF_SET|IF_FLAG, "step by decades" },
90     { "oct",        AC_OCT,     IF_SET|IF_FLAG, "step by octaves" },
91     { "lin",        AC_LIN,     IF_SET|IF_FLAG, "step linearly" }
92 };
93 
94 SPICEanalysis ACinfo  = {
95     {
96         "AC",
97         "A.C. Small signal analysis",
98 
99         NUMELEMS(ACparms),
100         ACparms
101     },
102     sizeof(ACAN),
103     FREQUENCYDOMAIN,
104     1,
105     ACsetParm,
106     ACaskQuest,
107     NULL,
108     ACan
109 };
110