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