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/trcvdefs.h"
10 #include "ngspice/cktdefs.h"
11 
12 #include "analysis.h"
13 
14 /* ARGSUSED */
15 int
DCTsetParm(CKTcircuit * ckt,JOB * anal,int which,IFvalue * value)16 DCTsetParm(CKTcircuit *ckt, JOB *anal, int which, IFvalue *value)
17 {
18     TRCV *job = (TRCV *) anal;
19 
20     NG_IGNORE(ckt);
21 
22     switch(which) {
23 
24     case DCT_START1:
25         job->TRCVvStart[0] = value->rValue;
26         job->TRCVnestLevel = MAX(0, job->TRCVnestLevel);
27         job->TRCVset[0] = TRUE;
28         break;
29 
30     case DCT_STOP1:
31         job->TRCVvStop[0] = value->rValue;
32         job->TRCVnestLevel = MAX(0, job->TRCVnestLevel);
33         job->TRCVset[0] = TRUE;
34         break;
35 
36     case DCT_STEP1:
37         job->TRCVvStep[0] = value->rValue;
38         job->TRCVnestLevel = MAX(0, job->TRCVnestLevel);
39         job->TRCVset[0] = TRUE;
40         break;
41 
42     case DCT_START2:
43         job->TRCVvStart[1] = value->rValue;
44         job->TRCVnestLevel = MAX(1, job->TRCVnestLevel);
45         job->TRCVset[1] = TRUE;
46         break;
47 
48     case DCT_STOP2:
49         job->TRCVvStop[1] = value->rValue;
50         job->TRCVnestLevel = MAX(1, job->TRCVnestLevel);
51         job->TRCVset[1] = TRUE;
52         break;
53 
54     case DCT_STEP2:
55         job->TRCVvStep[1] = value->rValue;
56         job->TRCVnestLevel = MAX(1, job->TRCVnestLevel);
57         job->TRCVset[1] = TRUE;
58         break;
59 
60     case DCT_NAME1:
61         job->TRCVvName[0] = value->uValue;
62         job->TRCVnestLevel = MAX(0, job->TRCVnestLevel);
63         job->TRCVset[0] = TRUE;
64         break;
65 
66     case DCT_NAME2:
67         job->TRCVvName[1] = value->uValue;
68         job->TRCVnestLevel = MAX(1, job->TRCVnestLevel);
69         job->TRCVset[1] = TRUE;
70         break;
71 
72     case DCT_TYPE1:
73         job->TRCVvType[0] = value->iValue;
74         job->TRCVnestLevel = MAX(0, job->TRCVnestLevel);
75         job->TRCVset[0] = TRUE;
76         break;
77 
78     case DCT_TYPE2:
79         job->TRCVvType[1] = value->iValue;
80         job->TRCVnestLevel = MAX(1, job->TRCVnestLevel);
81         job->TRCVset[1] = TRUE;
82         break;
83 
84     default:
85         return(E_BADPARM);
86     }
87     return(OK);
88 }
89 
90 
91 static IFparm DCTparms[] = {
92     { "start1",     DCT_START1, IF_SET|IF_REAL,     "starting voltage/current"},
93     { "stop1",      DCT_STOP1,  IF_SET|IF_REAL,     "ending voltage/current" },
94     { "step1",      DCT_STEP1,  IF_SET|IF_REAL,     "voltage/current step" },
95     { "start2",     DCT_START2, IF_SET|IF_REAL,     "starting voltage/current"},
96     { "stop2",      DCT_STOP2,  IF_SET|IF_REAL,     "ending voltage/current" },
97     { "step2",      DCT_STEP2,  IF_SET|IF_REAL,     "voltage/current step" },
98     { "name1",      DCT_NAME1,  IF_SET|IF_INSTANCE, "name of source to step" },
99     { "name2",      DCT_NAME2,  IF_SET|IF_INSTANCE, "name of source to step" },
100     { "type1",      DCT_TYPE1,  IF_SET|IF_INTEGER,  "type of source to step" },
101     { "type2",      DCT_TYPE2,  IF_SET|IF_INTEGER,  "type of source to step" }
102 };
103 
104 SPICEanalysis DCTinfo  = {
105     {
106         "DC",
107         "D.C. Transfer curve analysis",
108 
109         NUMELEMS(DCTparms),
110         DCTparms
111     },
112     sizeof(TRCV),
113     SWEEPDOMAIN,
114     1,
115     DCTsetParm,
116     DCTaskQuest,
117     NULL,
118     DCtrCurv
119 };
120