1 /**********
2 Copyright 1991 Regents of the University of California. All rights reserved.
3 **********/
4
5 #include "ngspice/ngspice.h"
6 #include "ngspice/ifsim.h"
7 #include "ngspice/iferrmsg.h"
8 #include "ngspice/cktdefs.h"
9 #include "ngspice/sensdefs.h"
10
11 #include "analysis.h"
12
13 /* ARGSUSED */
14 int
SENSsetParam(CKTcircuit * ckt,JOB * anal,int which,IFvalue * value)15 SENSsetParam(CKTcircuit *ckt, JOB *anal, int which, IFvalue *value)
16 {
17 SENS_AN *job = (SENS_AN *) anal;
18
19 NG_IGNORE(ckt);
20
21 switch(which) {
22
23 case SENS_POS:
24 job->output_pos = value->nValue;
25 job->output_neg = NULL;
26 job->output_volt = 1;
27 job->step_type = SENS_DC;
28 break;
29
30 case SENS_NEG:
31 job->output_neg = value->nValue;
32 break;
33
34 case SENS_SRC:
35 job->output_src = value->uValue;
36 job->output_volt = 0;
37 job->step_type = SENS_DC;
38 break;
39
40 case SENS_NAME:
41 job->output_name = value->sValue;
42 break;
43
44 case SENS_START:
45 job->start_freq = value->rValue;
46 break;
47
48 case SENS_STOP:
49 job->stop_freq = value->rValue;
50 break;
51
52 case SENS_STEPS:
53 job->n_freq_steps = value->iValue;
54 break;
55
56 case SENS_DECADE:
57 job->step_type = SENS_DECADE;
58 break;
59
60 case SENS_OCTAVE:
61 job->step_type = SENS_OCTAVE;
62 break;
63
64 case SENS_LINEAR:
65 job->step_type = SENS_LINEAR;
66 break;
67
68 case SENS_DC:
69 job->step_type = SENS_DC;
70 break;
71
72 case SENS_DEFTOL:
73 job->deftol = value->rValue;
74 break;
75
76 case SENS_DEFPERTURB:
77 job->defperturb = value->rValue;
78 break;
79
80 default:
81 return(E_BADPARM);
82 }
83 return(OK);
84 }
85
86
87 static IFparm SENSparms[] = {
88 /* TF like parameters */
89 { "outpos", SENS_POS, IF_SET|IF_ASK|IF_NODE, "output positive node" },
90 { "outneg", SENS_NEG, IF_SET|IF_ASK|IF_NODE, "output negative node" },
91 { "outsrc", SENS_SRC, IF_SET|IF_ASK|IF_INSTANCE, "output current" },
92 { "outname", SENS_NAME, IF_SET|IF_ASK|IF_STRING,
93 "Name of output variable" },
94
95 /* AC parameters */
96 { "start", SENS_START, IF_SET|IF_ASK|IF_REAL, "starting frequency" },
97 { "stop", SENS_STOP, IF_SET|IF_ASK|IF_REAL, "ending frequency" },
98 { "numsteps", SENS_STEPS,IF_SET|IF_ASK|IF_INTEGER,
99 "number of frequencies"},
100 { "dec", SENS_DECADE, IF_SET|IF_FLAG, "step by decades" },
101 { "oct", SENS_OCTAVE, IF_SET|IF_FLAG, "step by octaves" },
102 { "lin", SENS_LINEAR, IF_SET|IF_FLAG, "step linearly" },
103 { "dc", SENS_DC, IF_SET|IF_FLAG, "analysis at DC" },
104 };
105
106 SPICEanalysis SENSinfo = {
107 {
108 "SENS",
109 "Sensitivity analysis",
110 NUMELEMS(SENSparms),
111 SENSparms
112 },
113 sizeof(SENS_AN),
114 FREQUENCYDOMAIN,
115 1,
116 SENSsetParam,
117 SENSask,
118 NULL,
119 sens_sens
120 };
121