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 1992 Stephen R. Whiteley
6 ****************************************************************************/
7
8 /*
9 * OPTsetParm(ckt,opt,value)
10 * set the specified 'opt' to have value 'value' in the
11 * given circuit 'ckt'.
12 */
13
14 #include "spice.h"
15 #include <stdio.h>
16 #include "cktdefs.h"
17 #include "optdefs.h"
18 #include "tskdefs.h"
19 #include "jobdefs.h"
20 #include "const.h"
21 #include "sperror.h"
22 #include "iferrmsg.h"
23
24
25 /* ARGSUSED */
26 int
OPTsetParm(cktp,anal,which,value)27 OPTsetParm(cktp,anal,which,value)
28
29 GENERIC *cktp;
30 GENERIC *anal;
31 int which;
32 IFvalue *value;
33 {
34 TSKtask *task = (TSKtask *)anal;
35
36 switch (which) {
37
38 case OPT_NOOPITER:
39 task->TSKnoOpIter = value->iValue;
40 break;
41 case OPT_GMIN:
42 task->TSKgmin = value->rValue;
43 break;
44 case OPT_RELTOL:
45 task->TSKreltol = value->rValue;
46 break;
47 case OPT_ABSTOL:
48 task->TSKabstol = value->rValue;
49 break;
50 case OPT_VNTOL:
51 task->TSKvoltTol = value->rValue;
52 break;
53 case OPT_TRTOL:
54 task->TSKtrtol = value->rValue;
55 break;
56 case OPT_CHGTOL:
57 task->TSKchgtol = value->rValue;
58 break;
59 case OPT_PIVTOL:
60 task->TSKpivotAbsTol = value->rValue;
61 break;
62 case OPT_PIVREL:
63 task->TSKpivotRelTol = value->rValue;
64 break;
65 case OPT_TNOM:
66 task->TSKnomTemp = value->rValue + CONSTCtoK;
67 /* Centegrade to Kelvin */
68 break;
69 case OPT_TEMP:
70 task->TSKtemp = value->rValue + CONSTCtoK;
71 /* Centegrade to Kelvin */
72 break;
73 case OPT_ITL1:
74 task->TSKdcMaxIter = value->iValue;
75 break;
76 case OPT_ITL2:
77 task->TSKdcTrcvMaxIter = value->iValue;
78 break;
79 case OPT_ITL3:
80 break;
81 case OPT_ITL4:
82 task->TSKtranMaxIter = value->iValue;
83 break;
84 case OPT_ITL5:
85 break;
86 case OPT_SRCSTEPS:
87 task->TSKnumSrcSteps = value->iValue;
88 break;
89 case OPT_GMINSTEPS:
90 task->TSKnumGminSteps = value->iValue;
91 break;
92 case OPT_DEFL:
93 task->TSKdefaultMosL = value->rValue;
94 break;
95 case OPT_DEFW:
96 task->TSKdefaultMosW = value->rValue;
97 break;
98 case OPT_DEFAD:
99 task->TSKdefaultMosAD = value->rValue;
100 break;
101 case OPT_DEFAS:
102 task->TSKdefaultMosAD = value->rValue;
103 break;
104 case OPT_BYPASS:
105 task->TSKbypass = value->iValue;
106 break;
107 case OPT_MAXORD:
108 task->TSKmaxOrder = value->iValue;
109 break;
110 case OPT_OLDLIMIT:
111 task->TSKfixLimit = value->iValue;
112 break;
113 case OPT_MINBREAK:
114 task->TSKminBreak = value->rValue;
115 break;
116 case OPT_METHOD:
117 if (strncmp(value->sValue,"trap", 4) == 0)
118 task->TSKintegrateMethod = TRAPEZOIDAL;
119 else if (strcmp(value->sValue,"gear") == 0)
120 task->TSKintegrateMethod = GEAR;
121 else return (E_METHOD);
122 break;
123 case OPT_TRYTOCOMPACT:
124 task->TSKtryToCompact = 1;
125 break;
126 default:
127 return (E_BADPARM);
128 }
129 return (OK);
130 }
131 static IFparm OPTtbl[] = {
132 { "noopiter", OPT_NOOPITER,IF_SET|IF_FLAG,"Go directly to gmin stepping" },
133 { "gmin", OPT_GMIN,IF_SET|IF_REAL,"Minimum conductance" },
134 { "reltol", OPT_RELTOL,IF_SET|IF_REAL ,"Relative error tolerence"},
135 { "abstol", OPT_ABSTOL,IF_SET|IF_REAL,"Absolute error tolerence" },
136 { "vntol", OPT_VNTOL,IF_SET|IF_REAL,"Voltage error tolerence" },
137 { "trtol", OPT_TRTOL,IF_SET|IF_REAL,"Truncation error overestimation factor" },
138 { "chgtol", OPT_CHGTOL,IF_SET|IF_REAL, "Charge error tolerence" },
139 { "pivtol", OPT_PIVTOL,IF_SET|IF_REAL, "Minimum acceptable pivot" },
140 { "pivrel", OPT_PIVREL,IF_SET|IF_REAL, "Minimum acceptable ratio of pivot" },
141 { "tnom", OPT_TNOM,IF_SET|IF_ASK|IF_REAL, "Nominal temperature" },
142 { "temp", OPT_TEMP,IF_SET|IF_ASK|IF_REAL, "Operating temperature" },
143 { "itl1", OPT_ITL1,IF_SET|IF_INTEGER,"DC iteration limit" },
144 { "itl2", OPT_ITL2,IF_SET|IF_INTEGER,"DC transfer curve iteration limit" },
145 { "itl3", OPT_ITL3, IF_INTEGER,"Lower transient iteration limit"},
146 { "itl4", OPT_ITL4,IF_SET|IF_INTEGER,"Upper transient iteration limit" },
147 { "itl5", OPT_ITL5, IF_INTEGER,"Total transient iteration limit"},
148 { "itl6", OPT_SRCSTEPS, IF_SET|IF_INTEGER,"Number of source steps"},
149 { "srcsteps", OPT_SRCSTEPS, IF_SET|IF_INTEGER,"Number of source steps"},
150 { "gminsteps", OPT_GMINSTEPS, IF_SET|IF_INTEGER,"Number of Gmin steps"},
151 { "acct", 0, IF_FLAG ,"Print accounting"},
152 { "list", 0, IF_FLAG, "Print a listing" },
153 { "nomod", 0, IF_FLAG, "Don't print a model summary" },
154 { "nopage", 0, IF_FLAG, "Don't insert page breaks" },
155 { "node", 0, IF_FLAG,"Print a node connection summary" },
156 { "opts", 0, IF_FLAG, "Print a list of the options" },
157 { "oldlimit", OPT_OLDLIMIT, IF_SET|IF_FLAG, "Use SPICE2 MOSfet limiting" },
158 { "numdgt", 0, IF_INTEGER, "Set number of digits printed"},
159 { "cptime", 0, IF_REAL, "Total cpu time in seconds" },
160 { "limtim", 0, IF_INTEGER, "Time to reserve for output" },
161 { "limpts", 0,IF_INTEGER,"Maximum points per analysis"},
162 { "lvlcod", 0, IF_INTEGER,"Generate machine code" },
163 { "lvltim", 0, IF_INTEGER,"Type of timestep control" },
164 { "method", OPT_METHOD, IF_SET|IF_STRING,"Integration method" },
165 { "maxord", OPT_MAXORD, IF_SET|IF_INTEGER,"Maximum integration order" },
166 { "defl", OPT_DEFL,IF_SET|IF_REAL,"Default MOSfet length" },
167 { "defw", OPT_DEFW,IF_SET|IF_REAL,"Default MOSfet width" },
168 { "minbreak", OPT_MINBREAK,IF_SET|IF_REAL,"Minimum time between breakpoints" },
169 { "defad", OPT_DEFAD,IF_SET|IF_REAL,"Default MOSfet area of drain" },
170 { "defas", OPT_DEFAS,IF_SET|IF_REAL,"Default MOSfet area of source" },
171 { "bypass",OPT_BYPASS,IF_SET|IF_INTEGER,"Allow bypass of unchanging elements"},
172 { "totiter", OPT_ITERS, IF_ASK|IF_INTEGER,"Total iterations" },
173 { "traniter", OPT_TRANIT, IF_ASK|IF_INTEGER ,"Transient iterations"},
174 { "equations", OPT_EQNS, IF_ASK|IF_INTEGER,"Circuit Equations" },
175 { "tranpoints", OPT_TRANPTS, IF_ASK|IF_INTEGER,"Transient timepoints" },
176 { "accept", OPT_TRANACCPT, IF_ASK|IF_INTEGER,"Accepted timepoints" },
177 { "rejected", OPT_TRANRJCT, IF_ASK|IF_INTEGER,"Rejected timepoints" },
178 { "time", OPT_TOTANALTIME, IF_ASK|IF_REAL,"Total Analysis Time" },
179 { "trantime", OPT_TRANTIME, IF_ASK|IF_REAL,"Transient time" },
180 { "reordertime", OPT_REORDTIME, IF_ASK|IF_REAL,"Matrix reordering time" },
181 { "lutime", OPT_DECOMP, IF_ASK|IF_REAL,"L-U decomposition time" },
182 { "solvetime", OPT_SOLVE, IF_ASK|IF_REAL,"Matrix solve time" },
183 { "tranlutime", OPT_TRANDECOMP,IF_ASK|IF_REAL,"Transient L-U decomp time"},
184 { "transolvetime", OPT_TRANSOLVE, IF_ASK|IF_REAL,"Transient solve time" },
185 { "trancuriters", OPT_TRANCURITER, IF_ASK|IF_INTEGER,
186 "Transient iters at last time point" },
187 { "loadtime", OPT_LOADTIME, IF_ASK|IF_REAL,"Load time" },
188 { "trytocompact", OPT_TRYTOCOMPACT, IF_SET|IF_FLAG,
189 "Try compaction for LTRA lines" },
190 { "matsize",OPT_MATSIZ, IF_ASK|IF_INTEGER,"Matrix size"},
191 { "nonzero",OPT_NONZ, IF_ASK|IF_INTEGER,"Number of nonzero matrix entries"},
192 { "fillin",OPT_FILLIN,IF_ASK|IF_INTEGER,"Fill-in terms from decomposition"}
193 };
194
195 int OPTcount = sizeof(OPTtbl)/sizeof(IFparm);
196
197 SPICEanalysis OPTinfo = {
198 {
199 "options",
200 "Task option selection",
201 sizeof(OPTtbl)/sizeof(IFparm),
202 OPTtbl
203 },
204 0, /* no size associated with options */
205 NODOMAIN,
206 OPTparse,
207 OPTsetParm,
208 OPTaskQuest,
209 NULL
210 };
211