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