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