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