origen_std_lib 0.9.0 → 0.13.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/config/application.rb +7 -19
- data/config/commands.rb +9 -0
- data/config/version.rb +1 -2
- data/lib/origen_std_lib/v93k.rb +17 -1
- data/{stdlib/v93k → src/advantest/smt7}/origen/.cproject +0 -0
- data/{stdlib/v93k → src/advantest/smt7}/origen/.project +0 -0
- data/src/advantest/smt7/origen/origen.cpp +18 -0
- data/{stdlib/v93k → src/advantest/smt7}/origen/origen.hpp +3 -3
- data/{stdlib/v93k → src/advantest/smt7}/origen/origen/helpers.hpp +25 -8
- data/src/advantest/smt7/origen/origen/helpers/console.cpp +94 -0
- data/src/advantest/smt7/origen/origen/helpers/misc.cpp +456 -0
- data/src/advantest/smt7/origen/origen/helpers/time.cpp +64 -0
- data/src/advantest/smt7/origen/origen/site.cpp +237 -0
- data/src/advantest/smt7/origen/origen/site.hpp +49 -0
- data/{stdlib/v93k → src/advantest/smt7}/origen/origen/test_method.hpp +1 -3
- data/src/advantest/smt7/origen/origen/test_method/base.cpp +231 -0
- data/src/advantest/smt7/origen/origen/test_method/base.hpp +155 -0
- data/src/advantest/smt7/origen/origen/test_method/dc_measurement.cpp +266 -0
- data/src/advantest/smt7/origen/origen/test_method/dc_measurement.hpp +58 -0
- data/src/advantest/smt7/origen/origen/test_method/empty.cpp +13 -0
- data/src/advantest/smt7/origen/origen/test_method/empty.hpp +24 -0
- data/src/advantest/smt7/origen/origen/test_method/frequency_measurement.cpp +133 -0
- data/src/advantest/smt7/origen/origen/test_method/frequency_measurement.hpp +46 -0
- data/src/advantest/smt7/origen/origen/test_method/functional_test.cpp +168 -0
- data/src/advantest/smt7/origen/origen/test_method/functional_test.hpp +53 -0
- data/{stdlib/v93k → src/advantest/smt7}/origen/origen/utils.hpp +1 -3
- data/src/advantest/smt7/origen/origen/utils/version.cpp +72 -0
- data/{stdlib/v93k → src/advantest/smt7}/origen/origen/utils/version.hpp +20 -21
- data/src/advantest/smt7/origen/test_methods/ApplyBin.cpp +37 -0
- data/src/advantest/smt7/origen/test_methods/DCMeasurement.cpp +90 -0
- data/src/advantest/smt7/origen/test_methods/FrequencyMeasurement.cpp +50 -0
- data/src/advantest/smt7/origen/test_methods/FunctionalTest.cpp +24 -0
- data/src/advantest/smt7/origen/test_methods/RecordBin.cpp +39 -0
- data/src/advantest/smt8/origen/common/Origen.java +334 -0
- data/src/advantest/smt8/origen/common/OrigenData.java +391 -0
- data/src/advantest/smt8/origen/common/OrigenHelpers.java +170 -0
- data/src/advantest/smt8/origen/test_methods/Base.java +265 -0
- data/src/advantest/smt8/origen/test_methods/DC_Measurement.java +302 -0
- data/src/advantest/smt8/origen/test_methods/Empty.java +12 -0
- data/src/advantest/smt8/origen/test_methods/Functional_test.java +474 -0
- data/templates/web/faq.md.erb +1 -52
- data/templates/web/guides/intro.md.erb +8 -0
- data/templates/web/guides/{v93k/intro.md.erb → v93ksmt7/capture.md.erb} +0 -2
- data/templates/web/guides/v93ksmt7/complete.md.erb +68 -0
- data/templates/web/guides/v93ksmt7/customizable.md.erb +139 -0
- data/templates/web/guides/v93ksmt7/helpers.md.erb +3 -0
- data/templates/web/guides/{v93k → v93ksmt7}/install.md.erb +1 -1
- data/templates/web/guides/v93ksmt7/integration.md.erb +3 -0
- data/templates/web/guides/v93ksmt7/intro.md.erb +8 -0
- data/templates/web/guides/v93ksmt7/patching.md.erb +3 -0
- data/templates/web/guides/v93ksmt8/intro.md.erb +9 -0
- data/templates/web/index.md.erb +23 -6
- data/templates/web/layouts/_guides.html.erb +15 -3
- data/templates/web/partials/_common_args.md.erb +13 -0
- data/templates/web/partials/_navbar.html.erb +2 -2
- metadata +52 -33
- data/stdlib/v93k/origen/origen.cpp +0 -22
- data/stdlib/v93k/origen/origen/helpers/console.cpp +0 -105
- data/stdlib/v93k/origen/origen/helpers/misc.cpp +0 -311
- data/stdlib/v93k/origen/origen/site.cpp +0 -220
- data/stdlib/v93k/origen/origen/site.hpp +0 -51
- data/stdlib/v93k/origen/origen/test_method/base.hpp +0 -156
- data/stdlib/v93k/origen/origen/test_method/dc_measurement.cpp +0 -182
- data/stdlib/v93k/origen/origen/test_method/dc_measurement.hpp +0 -59
- data/stdlib/v93k/origen/origen/test_method/frequency_measurement.cpp +0 -107
- data/stdlib/v93k/origen/origen/test_method/frequency_measurement.hpp +0 -48
- data/stdlib/v93k/origen/origen/test_method/functional_test.cpp +0 -118
- data/stdlib/v93k/origen/origen/test_method/functional_test.hpp +0 -51
- data/stdlib/v93k/origen/origen/utils/version.cpp +0 -79
- data/stdlib/v93k/origen/test_methods/ApplyBin.cpp +0 -41
- data/stdlib/v93k/origen/test_methods/DCMeasurement.cpp +0 -129
- data/stdlib/v93k/origen/test_methods/FrequencyMeasurement.cpp +0 -93
- data/stdlib/v93k/origen/test_methods/FunctionalTest.cpp +0 -94
- data/stdlib/v93k/origen/test_methods/RecordBin.cpp +0 -48
@@ -0,0 +1,265 @@
|
|
1
|
+
package origen.test_methods;
|
2
|
+
|
3
|
+
import origen.common.Origen;
|
4
|
+
import xoc.dta.TestMethod;
|
5
|
+
import xoc.dta.datatypes.MultiSiteBoolean;
|
6
|
+
import xoc.dta.datatypes.MultiSiteDouble;
|
7
|
+
import xoc.dta.datatypes.MultiSiteLong;
|
8
|
+
import xoc.dta.measurement.IMeasurement;
|
9
|
+
import xoc.dta.resultaccess.IMeasurementResult;
|
10
|
+
import xoc.dta.testdescriptor.IFunctionalTestDescriptor;
|
11
|
+
import xoc.dta.testdescriptor.IParametricTestDescriptor;
|
12
|
+
|
13
|
+
/** Origen testmethods base class. All testmethods inherit from this class */
|
14
|
+
public class Base extends TestMethod {
|
15
|
+
/** General testmethod parameters, used by all testmethods */
|
16
|
+
public IMeasurement measurement;
|
17
|
+
|
18
|
+
public String testName;
|
19
|
+
// TODO Verify forcePass implementation (also check if implemented in DC_Measurements)
|
20
|
+
public Boolean forcePass = false;
|
21
|
+
// Sites that passed will contain a '1' if forcePass has been set, otherwise undefined
|
22
|
+
public MultiSiteLong setOnPassFlags;
|
23
|
+
// Sites that failed will contain a '1' if forcePass has been set, otherwise undefined
|
24
|
+
public MultiSiteLong setOnFailFlags;
|
25
|
+
// When set to true the tester will never be released by Origen code, though your application
|
26
|
+
// test method code is still free to do so if you want
|
27
|
+
public Boolean syncPar = false;
|
28
|
+
/**
|
29
|
+
* The log level that will be used during the execution of the TP. Change the value here to get
|
30
|
+
* more, or less logging info
|
31
|
+
*/
|
32
|
+
int origenLoglevel = Origen.LOG_WARNING;
|
33
|
+
|
34
|
+
/**
|
35
|
+
* Execute the checkparms() function? This is used to check if all testmethod parameters are
|
36
|
+
* parsed
|
37
|
+
*/
|
38
|
+
boolean checkParams = true;
|
39
|
+
|
40
|
+
public void logTrace(String className, String method) {
|
41
|
+
message(Origen.LOG_METHODTRACE, "\t" + className + "\t" + method + "()");
|
42
|
+
}
|
43
|
+
|
44
|
+
// ********* FLOW LOGIC BELOW **********
|
45
|
+
|
46
|
+
/**
|
47
|
+
* Overridden setup function from the testmethod
|
48
|
+
*
|
49
|
+
* <p>The order is that first the setup() function is called by SMT, then the update() function
|
50
|
+
* and then the execute() function
|
51
|
+
*
|
52
|
+
* <p>This setup() function calls the _setup function from the underlying class (Can be
|
53
|
+
* DC_Measurement or Function_test), depending on the type of TM These subclasses are responsible
|
54
|
+
* for proper handling of the TM setup.
|
55
|
+
*/
|
56
|
+
@Override
|
57
|
+
public void setup() {
|
58
|
+
Origen.context = context;
|
59
|
+
Origen.meas = measurement;
|
60
|
+
messageLogLevel = origenLoglevel;
|
61
|
+
logTrace("Base", "setup");
|
62
|
+
if (!dependenciesUnchanged()) {
|
63
|
+
_setup();
|
64
|
+
}
|
65
|
+
}
|
66
|
+
|
67
|
+
/**
|
68
|
+
* Overridden update function from the testmethod
|
69
|
+
*
|
70
|
+
* <p>The order is that first the setup() function is called by SMT, then the update() function
|
71
|
+
* and then the execute() function
|
72
|
+
*
|
73
|
+
* <p>The update() function does nothing at the moment. It acts as a placeholder because all TM's
|
74
|
+
* should have an update function. If a TM wants the use the update() functionality from SMT it
|
75
|
+
* can implement this function itself
|
76
|
+
*/
|
77
|
+
@Override
|
78
|
+
public void update() {
|
79
|
+
logTrace("Base", "update");
|
80
|
+
}
|
81
|
+
|
82
|
+
/**
|
83
|
+
* Overridden execute function from the testmethod
|
84
|
+
*
|
85
|
+
* <p>The order is that first the setup() function is called by SMT, then the update() function
|
86
|
+
* and then the execute() function
|
87
|
+
*
|
88
|
+
* <p>The execute() function first checks if the parameters are parsed. It then calls the body()
|
89
|
+
* function from the testmethod. This is the main function of the TM. Finally it necessary, it
|
90
|
+
* calls the process() function from the TM.
|
91
|
+
*/
|
92
|
+
@Override
|
93
|
+
public void execute() {
|
94
|
+
logTrace("Base", "execute");
|
95
|
+
|
96
|
+
if (checkParams) {
|
97
|
+
checkParams();
|
98
|
+
}
|
99
|
+
|
100
|
+
if (forcePass) {
|
101
|
+
setOnPassFlags = new MultiSiteLong(1);
|
102
|
+
setOnFailFlags = new MultiSiteLong(0);
|
103
|
+
}
|
104
|
+
|
105
|
+
// Call the internal pre body function
|
106
|
+
_preBody();
|
107
|
+
|
108
|
+
// Call the application test method body
|
109
|
+
body();
|
110
|
+
|
111
|
+
// Call the application test method process method
|
112
|
+
process();
|
113
|
+
|
114
|
+
// Call the internal process results method
|
115
|
+
processResults();
|
116
|
+
}
|
117
|
+
|
118
|
+
/**
|
119
|
+
* Placeholder for the checkParams function. The goal of this function is to check if all the
|
120
|
+
* testmethod parameters that are passed to a testmethod are actually used This will make sure
|
121
|
+
* that parameters are not ignored. Should be overridden by testmethods when needed
|
122
|
+
*/
|
123
|
+
public void checkParams() {
|
124
|
+
logTrace("Base", "checkParams");
|
125
|
+
}
|
126
|
+
|
127
|
+
public void measure_setup() {
|
128
|
+
logTrace("Base", "measure_setup");
|
129
|
+
}
|
130
|
+
|
131
|
+
public void process() {
|
132
|
+
logTrace("Base", "process");
|
133
|
+
}
|
134
|
+
|
135
|
+
public void _setup() {
|
136
|
+
logTrace("Base", "_setup");
|
137
|
+
}
|
138
|
+
|
139
|
+
public void run() {
|
140
|
+
logTrace("Base", "run");
|
141
|
+
}
|
142
|
+
|
143
|
+
public void _preBody() {
|
144
|
+
logTrace("Base", "_preBody");
|
145
|
+
}
|
146
|
+
|
147
|
+
public void body() {
|
148
|
+
logTrace("Base", "body");
|
149
|
+
run();
|
150
|
+
}
|
151
|
+
|
152
|
+
public void processResults() {
|
153
|
+
logTrace("Base", "processResults");
|
154
|
+
}
|
155
|
+
|
156
|
+
public void judgeAndDatalog(IFunctionalTestDescriptor t, MultiSiteBoolean passed) {
|
157
|
+
MultiSiteBoolean allPassed = new MultiSiteBoolean(true);
|
158
|
+
|
159
|
+
if (forcePass) {
|
160
|
+
for (int site : context.getActiveSites()) {
|
161
|
+
setOnPassFlags.set(site, setOnPassFlags.get(site) & (passed.get(site) ? 1 : 0));
|
162
|
+
setOnFailFlags.set(site, setOnFailFlags.get(site) | (passed.get(site) ? 0 : 1));
|
163
|
+
}
|
164
|
+
// Record that this test happened to STDF, but don't know how to log the true result
|
165
|
+
// without also causing it to fail/bin
|
166
|
+
t.evaluate(allPassed);
|
167
|
+
} else {
|
168
|
+
t.evaluate(passed);
|
169
|
+
}
|
170
|
+
for (int site : context.getActiveSites()) {
|
171
|
+
message(
|
172
|
+
Origen.LOG_PARAM,
|
173
|
+
"["
|
174
|
+
+ site
|
175
|
+
+ "]("
|
176
|
+
+ t.getTestName()
|
177
|
+
+ ") "
|
178
|
+
+ " : "
|
179
|
+
+ (passed.get(site) ? "PASSED" : "FAILED"));
|
180
|
+
}
|
181
|
+
}
|
182
|
+
|
183
|
+
public void judgeAndDatalog(IFunctionalTestDescriptor t, IMeasurementResult measurementResult) {
|
184
|
+
MultiSiteBoolean passed = measurementResult.hasPassed();
|
185
|
+
judgeAndDatalog(t, passed);
|
186
|
+
}
|
187
|
+
|
188
|
+
/**
|
189
|
+
* Log a multisite double
|
190
|
+
*
|
191
|
+
* @param t Name of the testdescriptor
|
192
|
+
* @param MSD
|
193
|
+
*/
|
194
|
+
public void judgeAndDatalog(IParametricTestDescriptor t, MultiSiteDouble MSD) {
|
195
|
+
|
196
|
+
if (forcePass) {
|
197
|
+
boolean loLimitPresent, hiLimitPresent;
|
198
|
+
double lo = 0;
|
199
|
+
double hi = 0;
|
200
|
+
|
201
|
+
if (t.getLowLimit() == null) {
|
202
|
+
loLimitPresent = false;
|
203
|
+
} else {
|
204
|
+
loLimitPresent = true;
|
205
|
+
lo = t.getLowLimit().doubleValue();
|
206
|
+
}
|
207
|
+
if (t.getHighLimit() == null) {
|
208
|
+
hiLimitPresent = false;
|
209
|
+
} else {
|
210
|
+
hiLimitPresent = true;
|
211
|
+
hi = t.getHighLimit().doubleValue();
|
212
|
+
}
|
213
|
+
|
214
|
+
for (int site : context.getActiveSites()) {
|
215
|
+
boolean passed = true;
|
216
|
+
double val = MSD.get(site);
|
217
|
+
|
218
|
+
// TODO: How to handle difference between LT and LTE?
|
219
|
+
if (loLimitPresent) {
|
220
|
+
if (val < lo) {
|
221
|
+
passed = false;
|
222
|
+
}
|
223
|
+
}
|
224
|
+
|
225
|
+
if (hiLimitPresent) {
|
226
|
+
if (val > hi) {
|
227
|
+
passed = false;
|
228
|
+
}
|
229
|
+
}
|
230
|
+
|
231
|
+
setOnPassFlags.set(site, setOnPassFlags.get(site) & (passed ? 1 : 0));
|
232
|
+
setOnFailFlags.set(site, setOnFailFlags.get(site) | (passed ? 0 : 1));
|
233
|
+
}
|
234
|
+
|
235
|
+
t.setLowLimit(Double.NaN);
|
236
|
+
t.setHighLimit(Double.NaN);
|
237
|
+
}
|
238
|
+
|
239
|
+
t.evaluate(MSD);
|
240
|
+
|
241
|
+
MultiSiteBoolean pf = t.getPassFail();
|
242
|
+
for (int site : context.getActiveSites()) {
|
243
|
+
message(
|
244
|
+
Origen.LOG_PARAM,
|
245
|
+
"["
|
246
|
+
+ site
|
247
|
+
+ "]("
|
248
|
+
+ t.getTestName()
|
249
|
+
+ ") "
|
250
|
+
+ MSD.get(site)
|
251
|
+
+ " : "
|
252
|
+
+ (pf.get(site) ? "PASSED" : "FAILED"));
|
253
|
+
}
|
254
|
+
}
|
255
|
+
|
256
|
+
/**
|
257
|
+
* Log a multisite long
|
258
|
+
*
|
259
|
+
* @param t Name of the testdescriptor
|
260
|
+
* @param MSL
|
261
|
+
*/
|
262
|
+
public void judgeAndDatalog(IParametricTestDescriptor t, MultiSiteLong MSL) {
|
263
|
+
judgeAndDatalog(t, MSL.toMultiSiteDouble());
|
264
|
+
}
|
265
|
+
}
|
@@ -0,0 +1,302 @@
|
|
1
|
+
package origen.test_methods;
|
2
|
+
|
3
|
+
import java.io.File;
|
4
|
+
import origen.common.Origen;
|
5
|
+
import origen.common.OrigenHelpers;
|
6
|
+
import xoc.dsa.DeviceSetupFactory;
|
7
|
+
import xoc.dsa.IDeviceSetup;
|
8
|
+
import xoc.dta.datatypes.MultiSiteDouble;
|
9
|
+
import xoc.dta.datatypes.MultiSiteDoubleArray;
|
10
|
+
import xoc.dta.resultaccess.IDigInOutActionResults;
|
11
|
+
import xoc.dta.resultaccess.IDigInOutActionResults.IIforceVmeasResults;
|
12
|
+
import xoc.dta.resultaccess.IDigInOutActionResults.IVforceImeasResults;
|
13
|
+
import xoc.dta.resultaccess.IMeasurementResult;
|
14
|
+
import xoc.dta.testdescriptor.IFunctionalTestDescriptor;
|
15
|
+
import xoc.dta.testdescriptor.IParametricTestDescriptor;
|
16
|
+
|
17
|
+
/** An example test method using test descriptor */
|
18
|
+
public class DC_Measurement extends Base {
|
19
|
+
|
20
|
+
public IFunctionalTestDescriptor FUNC;
|
21
|
+
public IParametricTestDescriptor PAR;
|
22
|
+
|
23
|
+
public enum MEAS {
|
24
|
+
CURR,
|
25
|
+
VOLT
|
26
|
+
}
|
27
|
+
|
28
|
+
MultiSiteDouble _result;
|
29
|
+
|
30
|
+
boolean _applyShutdown;
|
31
|
+
String _shutdownPattern;
|
32
|
+
int _checkShutdown;
|
33
|
+
MEAS _measure;
|
34
|
+
double _settlingTime;
|
35
|
+
String _pin;
|
36
|
+
double _forceValue;
|
37
|
+
double _iRange;
|
38
|
+
double _VclampLow;
|
39
|
+
double _VclampHigh;
|
40
|
+
boolean _highAccuracy;
|
41
|
+
double _limitsLow;
|
42
|
+
double _limitsHigh;
|
43
|
+
int _averages;
|
44
|
+
|
45
|
+
int _badc;
|
46
|
+
String _actionName;
|
47
|
+
public DC_Measurement origen;
|
48
|
+
|
49
|
+
static OrigenHelpers origenHelpers;
|
50
|
+
|
51
|
+
/** The result of executing the primary pattern */
|
52
|
+
private IMeasurementResult funcResult;
|
53
|
+
|
54
|
+
@Override
|
55
|
+
public void measure_setup() {
|
56
|
+
logTrace("DC_Measurement", "measure_setup");
|
57
|
+
}
|
58
|
+
|
59
|
+
public DC_Measurement applyShutdown(boolean v) {
|
60
|
+
_applyShutdown = v;
|
61
|
+
return this;
|
62
|
+
}
|
63
|
+
|
64
|
+
public DC_Measurement shutdownPattern(String v) {
|
65
|
+
_shutdownPattern = v;
|
66
|
+
return this;
|
67
|
+
}
|
68
|
+
|
69
|
+
public DC_Measurement checkShutdown(int v) {
|
70
|
+
_checkShutdown = v;
|
71
|
+
return this;
|
72
|
+
}
|
73
|
+
|
74
|
+
public DC_Measurement measure(MEAS volt) {
|
75
|
+
_measure = volt;
|
76
|
+
return this;
|
77
|
+
}
|
78
|
+
|
79
|
+
public DC_Measurement settlingTime(double v) {
|
80
|
+
_settlingTime = v;
|
81
|
+
return this;
|
82
|
+
}
|
83
|
+
|
84
|
+
public DC_Measurement averages(int v) {
|
85
|
+
_averages = v;
|
86
|
+
return this;
|
87
|
+
}
|
88
|
+
|
89
|
+
public DC_Measurement VclampLow(double v) {
|
90
|
+
_VclampLow = v;
|
91
|
+
return this;
|
92
|
+
}
|
93
|
+
|
94
|
+
public DC_Measurement VclampHigh(double v) {
|
95
|
+
_VclampHigh = v;
|
96
|
+
return this;
|
97
|
+
}
|
98
|
+
|
99
|
+
public DC_Measurement highAccuracy(boolean v) {
|
100
|
+
_highAccuracy = v;
|
101
|
+
return this;
|
102
|
+
}
|
103
|
+
|
104
|
+
public DC_Measurement limitsLow(double v) {
|
105
|
+
_limitsLow = v;
|
106
|
+
return this;
|
107
|
+
}
|
108
|
+
|
109
|
+
public DC_Measurement limitsHigh(double v) {
|
110
|
+
_VclampHigh = v;
|
111
|
+
return this;
|
112
|
+
}
|
113
|
+
|
114
|
+
public DC_Measurement pin(String v) {
|
115
|
+
_pin = v;
|
116
|
+
return this;
|
117
|
+
}
|
118
|
+
|
119
|
+
public DC_Measurement forceValue(double v) {
|
120
|
+
_forceValue = v;
|
121
|
+
return this;
|
122
|
+
}
|
123
|
+
|
124
|
+
public DC_Measurement iRange(double v) {
|
125
|
+
_iRange = v;
|
126
|
+
return this;
|
127
|
+
}
|
128
|
+
|
129
|
+
public DC_Measurement badc(int v) {
|
130
|
+
_badc = v;
|
131
|
+
return this;
|
132
|
+
}
|
133
|
+
|
134
|
+
public MultiSiteDouble result() {
|
135
|
+
return _result;
|
136
|
+
}
|
137
|
+
|
138
|
+
@Override
|
139
|
+
public void _setup() {
|
140
|
+
message(10, "DC_Measurement --> _Setup");
|
141
|
+
origen = this;
|
142
|
+
pin("NVM_ANALOGIO");
|
143
|
+
applyShutdown(true);
|
144
|
+
checkShutdown(1);
|
145
|
+
settlingTime(1000 * 1e-6);
|
146
|
+
forceValue(0);
|
147
|
+
iRange(0);
|
148
|
+
VclampLow(0);
|
149
|
+
VclampHigh(3);
|
150
|
+
highAccuracy(true);
|
151
|
+
limitsHigh(3);
|
152
|
+
limitsLow(0);
|
153
|
+
averages(1);
|
154
|
+
badc(0);
|
155
|
+
shutdownPattern("");
|
156
|
+
|
157
|
+
// Call setup from the testmethod
|
158
|
+
measure_setup();
|
159
|
+
|
160
|
+
message(Origen.LOG_METHODTRACE, "Setting up " + _measure + " measurement");
|
161
|
+
|
162
|
+
if (_measure == MEAS.VOLT) {
|
163
|
+
_actionName = "iforceVmeas";
|
164
|
+
} else {
|
165
|
+
_actionName = "vforceImeas";
|
166
|
+
}
|
167
|
+
|
168
|
+
if (_applyShutdown) {
|
169
|
+
if (_shutdownPattern.isEmpty()) {
|
170
|
+
// TODO Fix the relative paths for the shutdownpattern
|
171
|
+
shutdownPattern(measurement.getPatternName() + "_part1");
|
172
|
+
String workingDirectory = System.getProperty("user.dir");
|
173
|
+
String[] parts = _shutdownPattern.split("\\.");
|
174
|
+
String file = workingDirectory + "/src/patterns/" + parts[2] + ".pat";
|
175
|
+
File f = new File(measurement.getPatternName());
|
176
|
+
if (f.exists()) {
|
177
|
+
message(Origen.LOG_METHODTRACE, "Shutdown pattern " + file + " found, using it.");
|
178
|
+
} else {
|
179
|
+
message(
|
180
|
+
Origen.LOG_FAIL,
|
181
|
+
"Shutdown pattern " + file + " not found, NOT using a shutdown pattern!");
|
182
|
+
applyShutdown(false);
|
183
|
+
shutdownPattern("");
|
184
|
+
}
|
185
|
+
}
|
186
|
+
}
|
187
|
+
|
188
|
+
// Create an action sequence for the measurement
|
189
|
+
IDeviceSetup ds = DeviceSetupFactory.createInstance();
|
190
|
+
ds.importSpec(measurement.getSpecificationName());
|
191
|
+
|
192
|
+
// ISetupDigInOut dcVISetup = ds.addDigInOut("NVM_ANA_PIN");
|
193
|
+
// forceValue = I_force; // The forced current
|
194
|
+
// waitTime = 1000us; // A delay between forcing the current and measuring the voltage
|
195
|
+
// vclampHigh = 3V; // The upper-limit of the voltage clamp
|
196
|
+
// vclampLow = 0.0V; // The lower-limit of the voltage clamp
|
197
|
+
// highAccuracy = true; // The highAccuracy mode of the digInOut instrument is turned off
|
198
|
+
// in this example
|
199
|
+
// limits.low = 0V; // The lower-limit for the measurment to pass
|
200
|
+
// limits.high = 3V; // The upper-limit for the measurement to pass
|
201
|
+
//
|
202
|
+
//
|
203
|
+
// IIforceVmeas iforceVmeas = dcVISetup.iforceVmeas("iforceVmeas");
|
204
|
+
// iforceVmeas.setForceValue(0);
|
205
|
+
// iforceVmeas.setVclampHigh(1);
|
206
|
+
// iforceVmeas.setVclampLow(-1);
|
207
|
+
// iforceVmeas.setAverages(_averages);
|
208
|
+
// iforceVmeas.setWaitTime(_settlingTime)
|
209
|
+
//
|
210
|
+
// action iforceVmeas iforceVmeas {
|
211
|
+
// forceValue = I_force; // The forced current
|
212
|
+
// waitTime = 1000us; // A delay between forcing the current and measuring the
|
213
|
+
// voltage
|
214
|
+
// vclampHigh = 3V; // The upper-limit of the voltage clamp
|
215
|
+
// vclampLow = 0.0V; // The lower-limit of the voltage clamp
|
216
|
+
// highAccuracy = true; // The highAccuracy mode of the digInOut instrument is turned
|
217
|
+
// off in this example
|
218
|
+
// limits.low = 0V; // The lower-limit for the measurment to pass
|
219
|
+
// limits.high = 3V; // The upper-limit for the measurement to pass
|
220
|
+
//
|
221
|
+
// }
|
222
|
+
// action vforceImeas vforceImeas {
|
223
|
+
// forceValue = V_force; // The forced voltage
|
224
|
+
// waitTime = 1.5ms; // A delay between forcing the voltage and measuring the current
|
225
|
+
// irange = 0.1uA; // The expected range of the measured current
|
226
|
+
// highAccuracy = false; // The highAccuracy mode of the digInOut instrument is
|
227
|
+
// turned off in this example
|
228
|
+
// limits.low = -20.0nA; // The lower-limit for the measurment to pass
|
229
|
+
// limits.high = -5.0nA; // The upper-limit for the measurement to pass
|
230
|
+
//
|
231
|
+
// }
|
232
|
+
|
233
|
+
// ds.parallelBegin("MeasurementSequence");
|
234
|
+
// {
|
235
|
+
ds.sequentialBegin("PatAndShutdownSeq");
|
236
|
+
{
|
237
|
+
ds.patternCall(measurement.getPatternName());
|
238
|
+
ds.actionCall(_actionName);
|
239
|
+
if (_applyShutdown) {
|
240
|
+
ds.patternCall(_shutdownPattern);
|
241
|
+
}
|
242
|
+
}
|
243
|
+
ds.sequentialEnd();
|
244
|
+
// }
|
245
|
+
// ds.parallelEnd();
|
246
|
+
|
247
|
+
measurement.setSetups(ds);
|
248
|
+
}
|
249
|
+
|
250
|
+
@Override
|
251
|
+
public void run() {
|
252
|
+
MultiSiteDoubleArray intermediateResult;
|
253
|
+
|
254
|
+
logTrace("DC_Measurement", "run");
|
255
|
+
super.run();
|
256
|
+
measurement.execute();
|
257
|
+
|
258
|
+
// postBody should be added and called here
|
259
|
+
|
260
|
+
// protect results to be not overwritten
|
261
|
+
IDigInOutActionResults actionResults = measurement.digInOut(_pin).preserveActionResults();
|
262
|
+
funcResult = measurement.preserveResult();
|
263
|
+
|
264
|
+
// Assume for now that if force pass is set then branching decision could be dependent on the
|
265
|
+
// result of this test, in future add another attribute to control async processing on/off
|
266
|
+
if (!syncPar && !forcePass) {
|
267
|
+
releaseTester();
|
268
|
+
}
|
269
|
+
|
270
|
+
// Make the DC measurement result available
|
271
|
+
if (_measure == MEAS.VOLT) {
|
272
|
+
IIforceVmeasResults ifvmResults = actionResults.iforceVmeas(_actionName);
|
273
|
+
intermediateResult = ifvmResults.getVoltage(_pin);
|
274
|
+
|
275
|
+
} else { // MEAS.CURR
|
276
|
+
IVforceImeasResults ifvmResults = actionResults.vforceImeas(_actionName);
|
277
|
+
intermediateResult = ifvmResults.getCurrent(_pin);
|
278
|
+
}
|
279
|
+
|
280
|
+
// Loop through the sites to get the data
|
281
|
+
_result = new MultiSiteDouble();
|
282
|
+
for (int site : context.getActiveSites()) {
|
283
|
+
if (intermediateResult.get(site).length > 1) {
|
284
|
+
message(
|
285
|
+
1,
|
286
|
+
"Warning: not all measurements are logged, only the first one, change in DC_Measurement.java to include more");
|
287
|
+
}
|
288
|
+
_result.set(site, intermediateResult.get(site)[0]);
|
289
|
+
}
|
290
|
+
}
|
291
|
+
|
292
|
+
@Override
|
293
|
+
public void processResults() {
|
294
|
+
judgeAndDatalog(FUNC, funcResult);
|
295
|
+
|
296
|
+
judgeAndDatalog(PAR, filterResult(_result));
|
297
|
+
}
|
298
|
+
|
299
|
+
public MultiSiteDouble filterResult(MultiSiteDouble MSD) {
|
300
|
+
return MSD;
|
301
|
+
}
|
302
|
+
}
|