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: 1985 Thomas L. Quarles
5 1993 Stephen R. Whiteley
6 ****************************************************************************/
7
8 #include "spice.h"
9 #include <stdio.h>
10 #include "cktdefs.h"
11 #include "acdefs.h"
12 #include "jobdefs.h"
13 #include "iferrmsg.h"
14
15
16 /* ARGSUSED */
17 int
ACsetParm(cktp,anal,which,value)18 ACsetParm(cktp,anal,which,value)
19
20 GENERIC *cktp;
21 GENERIC *anal;
22 int which;
23 IFvalue *value;
24 {
25 ACAN *job = (ACAN *) anal;
26
27 if (ACsetp(&job->AC,which,value) == OK)
28 return (OK);
29 if (DCTsetp(&job->DC,which,value) == OK)
30 return (OK);
31 return (E_BADPARM);
32 }
33
34
35 int
ACsetp(ac,which,value)36 ACsetp(ac,which,value)
37
38 struct sACprms *ac;
39 int which;
40 IFvalue *value;
41 {
42 switch (which) {
43
44 case AC_START:
45 ac->fstart = value->rValue;
46 break;
47
48 case AC_STOP:
49 ac->fstop = value->rValue;
50 break;
51
52 case AC_STEPS:
53 ac->numSteps = value->iValue;
54 break;
55
56 case AC_DEC:
57 if (value->iValue) {
58 ac->stepType = DECADE;
59 }
60 else {
61 if (ac->stepType == DECADE) {
62 ac->stepType = 0;
63 }
64 }
65 break;
66
67 case AC_OCT:
68 if (value->iValue) {
69 ac->stepType = OCTAVE;
70 }
71 else {
72 if (ac->stepType == OCTAVE) {
73 ac->stepType = 0;
74 }
75 }
76 break;
77
78 case AC_LIN:
79 if (value->iValue) {
80 ac->stepType = LINEAR;
81 }
82 else {
83 if (ac->stepType == LINEAR) {
84 ac->stepType = 0;
85 }
86 }
87 break;
88
89 default:
90 return (E_BADPARM);
91 }
92 return (OK);
93 }
94
95
96
97 static IFparm ACparms[] = {
98 { "start", AC_START, IFP|IF_REAL, "starting frequency" },
99 { "stop", AC_STOP, IFP|IF_REAL, "ending frequency" },
100 { "numsteps", AC_STEPS, IFP|IF_INTEGER, "number of frequencies"},
101 { "dec", AC_DEC, IFP|IF_FLAG, "step by decades" },
102 { "oct", AC_OCT, IFP|IF_FLAG, "step by octaves" },
103 { "lin", AC_LIN, IFP|IF_FLAG, "step linearly" },
104 { "name1", DC_NAME1, IFP|IF_INSTANCE, "name of source to step" },
105 { "start1", DC_START1, IFP|IF_REAL, "starting voltage/current"},
106 { "stop1", DC_STOP1, IFP|IF_REAL, "ending voltage/current" },
107 { "step1", DC_STEP1, IFP|IF_REAL, "voltage/current step" },
108 { "name2", DC_NAME2, IFP|IF_INSTANCE, "name of source to step" },
109 { "start2", DC_START2, IFP|IF_REAL, "starting voltage/current"},
110 { "stop2", DC_STOP2, IFP|IF_REAL, "ending voltage/current" },
111 { "step2", DC_STEP2, IFP|IF_REAL, "voltage/current step" }
112 };
113
114 SPICEanalysis ACinfo = {
115 {
116 "AC",
117 "A.C. Small signal analysis",
118
119 sizeof(ACparms)/sizeof(IFparm),
120 ACparms
121 },
122 sizeof(ACAN),
123 FREQUENCYDOMAIN,
124 ACparse,
125 ACsetParm,
126 ACaskQuest,
127 ACan
128 };
129