origen_std_lib 0.10.1 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. checksums.yaml +5 -5
  2. data/config/application.rb +7 -19
  3. data/config/commands.rb +9 -0
  4. data/config/version.rb +2 -3
  5. data/lib/origen_std_lib/v93k.rb +17 -1
  6. data/{stdlib/v93k → src/advantest/smt7}/origen/.cproject +0 -0
  7. data/{stdlib/v93k → src/advantest/smt7}/origen/.project +0 -0
  8. data/src/advantest/smt7/origen/origen.cpp +18 -0
  9. data/{stdlib/v93k → src/advantest/smt7}/origen/origen.hpp +3 -3
  10. data/{stdlib/v93k → src/advantest/smt7}/origen/origen/helpers.hpp +25 -8
  11. data/src/advantest/smt7/origen/origen/helpers/console.cpp +94 -0
  12. data/src/advantest/smt7/origen/origen/helpers/misc.cpp +456 -0
  13. data/src/advantest/smt7/origen/origen/helpers/time.cpp +64 -0
  14. data/src/advantest/smt7/origen/origen/site.cpp +237 -0
  15. data/src/advantest/smt7/origen/origen/site.hpp +49 -0
  16. data/{stdlib/v93k → src/advantest/smt7}/origen/origen/test_method.hpp +1 -3
  17. data/src/advantest/smt7/origen/origen/test_method/base.cpp +231 -0
  18. data/src/advantest/smt7/origen/origen/test_method/base.hpp +155 -0
  19. data/src/advantest/smt7/origen/origen/test_method/dc_measurement.cpp +266 -0
  20. data/src/advantest/smt7/origen/origen/test_method/dc_measurement.hpp +58 -0
  21. data/src/advantest/smt7/origen/origen/test_method/empty.cpp +13 -0
  22. data/src/advantest/smt7/origen/origen/test_method/empty.hpp +24 -0
  23. data/src/advantest/smt7/origen/origen/test_method/frequency_measurement.cpp +133 -0
  24. data/src/advantest/smt7/origen/origen/test_method/frequency_measurement.hpp +46 -0
  25. data/src/advantest/smt7/origen/origen/test_method/functional_test.cpp +168 -0
  26. data/src/advantest/smt7/origen/origen/test_method/functional_test.hpp +53 -0
  27. data/{stdlib/v93k → src/advantest/smt7}/origen/origen/utils.hpp +1 -3
  28. data/src/advantest/smt7/origen/origen/utils/version.cpp +72 -0
  29. data/{stdlib/v93k → src/advantest/smt7}/origen/origen/utils/version.hpp +20 -21
  30. data/src/advantest/smt7/origen/test_methods/ApplyBin.cpp +37 -0
  31. data/src/advantest/smt7/origen/test_methods/DCMeasurement.cpp +90 -0
  32. data/src/advantest/smt7/origen/test_methods/FrequencyMeasurement.cpp +50 -0
  33. data/src/advantest/smt7/origen/test_methods/FunctionalTest.cpp +24 -0
  34. data/src/advantest/smt7/origen/test_methods/RecordBin.cpp +39 -0
  35. data/src/advantest/smt8/origen/common/Origen.java +334 -0
  36. data/src/advantest/smt8/origen/common/OrigenData.java +391 -0
  37. data/src/advantest/smt8/origen/common/OrigenHelpers.java +170 -0
  38. data/src/advantest/smt8/origen/test_methods/Base.java +265 -0
  39. data/src/advantest/smt8/origen/test_methods/DC_Measurement.java +302 -0
  40. data/src/advantest/smt8/origen/test_methods/Empty.java +12 -0
  41. data/src/advantest/smt8/origen/test_methods/Functional_test.java +462 -0
  42. data/templates/web/faq.md.erb +1 -52
  43. data/templates/web/guides/intro.md.erb +8 -0
  44. data/templates/web/guides/{v93k/intro.md.erb → v93ksmt7/capture.md.erb} +0 -2
  45. data/templates/web/guides/v93ksmt7/complete.md.erb +68 -0
  46. data/templates/web/guides/v93ksmt7/customizable.md.erb +139 -0
  47. data/templates/web/guides/v93ksmt7/helpers.md.erb +3 -0
  48. data/templates/web/guides/{v93k → v93ksmt7}/install.md.erb +1 -1
  49. data/templates/web/guides/v93ksmt7/integration.md.erb +3 -0
  50. data/templates/web/guides/v93ksmt7/intro.md.erb +8 -0
  51. data/templates/web/guides/v93ksmt7/patching.md.erb +3 -0
  52. data/templates/web/guides/v93ksmt8/intro.md.erb +9 -0
  53. data/templates/web/index.md.erb +23 -6
  54. data/templates/web/layouts/_guides.html.erb +15 -3
  55. data/templates/web/partials/_common_args.md.erb +13 -0
  56. data/templates/web/partials/_navbar.html.erb +2 -2
  57. metadata +52 -32
  58. data/stdlib/v93k/origen/origen.cpp +0 -22
  59. data/stdlib/v93k/origen/origen/helpers/console.cpp +0 -105
  60. data/stdlib/v93k/origen/origen/helpers/misc.cpp +0 -311
  61. data/stdlib/v93k/origen/origen/site.cpp +0 -220
  62. data/stdlib/v93k/origen/origen/site.hpp +0 -51
  63. data/stdlib/v93k/origen/origen/test_method/base.hpp +0 -156
  64. data/stdlib/v93k/origen/origen/test_method/dc_measurement.cpp +0 -182
  65. data/stdlib/v93k/origen/origen/test_method/dc_measurement.hpp +0 -59
  66. data/stdlib/v93k/origen/origen/test_method/frequency_measurement.cpp +0 -107
  67. data/stdlib/v93k/origen/origen/test_method/frequency_measurement.hpp +0 -48
  68. data/stdlib/v93k/origen/origen/test_method/functional_test.cpp +0 -125
  69. data/stdlib/v93k/origen/origen/test_method/functional_test.hpp +0 -52
  70. data/stdlib/v93k/origen/origen/utils/version.cpp +0 -79
  71. data/stdlib/v93k/origen/test_methods/ApplyBin.cpp +0 -41
  72. data/stdlib/v93k/origen/test_methods/DCMeasurement.cpp +0 -129
  73. data/stdlib/v93k/origen/test_methods/FrequencyMeasurement.cpp +0 -93
  74. data/stdlib/v93k/origen/test_methods/FunctionalTest.cpp +0 -94
  75. data/stdlib/v93k/origen/test_methods/RecordBin.cpp +0 -48
@@ -0,0 +1,12 @@
1
+ package origen.test_methods;
2
+
3
+ /** An empty test template */
4
+ public class Empty extends Base {
5
+
6
+ /** Main run function for empty */
7
+ @Override
8
+ public void run() {
9
+ logTrace("Empty", "run");
10
+ super.run();
11
+ }
12
+ }
@@ -0,0 +1,462 @@
1
+ package origen.test_methods;
2
+
3
+ import java.util.ArrayList;
4
+ import java.util.List;
5
+ import origen.common.Origen;
6
+ import origen.common.OrigenHelpers;
7
+ import xoc.dsa.DeviceSetupFactory;
8
+ import xoc.dsa.IDeviceSetup;
9
+ import xoc.dta.datatypes.MultiSiteBoolean;
10
+ import xoc.dta.datatypes.MultiSiteLong;
11
+ import xoc.dta.datatypes.MultiSiteString;
12
+ import xoc.dta.measurement.IMeasurement;
13
+ import xoc.dta.resultaccess.IDigInOutCaptureResults;
14
+ import xoc.dta.resultaccess.IMeasurementResult;
15
+ import xoc.dta.resultaccess.datatypes.BitSequence.BitOrder;
16
+ import xoc.dta.resultaccess.datatypes.MultiSiteBitSequence;
17
+ import xoc.dta.setupaccess.IParallelGroup;
18
+ import xoc.dta.testdescriptor.IFunctionalTestDescriptor;
19
+
20
+ /** The Function test template for all functional tests */
21
+ public class Functional_test extends Base {
22
+
23
+ public IFunctionalTestDescriptor FUNC;
24
+
25
+ // Class variables
26
+
27
+ /** Pin to capture from */
28
+ private String _pin;
29
+
30
+ /** Number of vectors to capture */
31
+ private int _capture;
32
+
33
+ /** Number of bits per captured word */
34
+ private int _bitPerWord;
35
+
36
+ /** Pattern name */
37
+ private String _pattern;
38
+
39
+ /** Testname to override */
40
+ private String _testNameOverride;
41
+
42
+ /** The result of executing the primary pattern */
43
+ private IMeasurementResult funcResult;
44
+
45
+ private MultiSiteBitSequence _capturedData;
46
+
47
+ // Link to self
48
+ public Functional_test origen;
49
+
50
+ // Patching information
51
+ /** Do we need to activate the patched patterns? */
52
+ boolean activatePatchedMeas;
53
+
54
+ /** The measurement that is only used for patching */
55
+ public IMeasurement patchedMeas;
56
+
57
+ /** The measurement that is only used dynamic pattern switching */
58
+ public IMeasurement dynamicPatMeas;
59
+
60
+ ArrayList<IMeasurementResult> dynamicMeasurementResults;
61
+
62
+ boolean _hasDynamicMeas = false;
63
+
64
+ /** The list of patterns to patch */
65
+ List<String> patchList;
66
+
67
+ /** Used to select only one pattern from a list of patterns for site specific execution */
68
+ List<String> dynamicPatternList;
69
+
70
+ @Override
71
+ public void _setup() {
72
+ message(Origen.LOG_METHODTRACE, "Functional_test --> Setup");
73
+ origen = this;
74
+ patchList = new ArrayList<String>();
75
+ dynamicPatternList = new ArrayList<String>();
76
+ patchedMeas.setSpecificationName(measurement.getSpecificationName());
77
+ dynamicPatMeas.setSpecificationName(measurement.getSpecificationName());
78
+ pin("");
79
+ capture(0);
80
+ bitPerWord(1);
81
+ pattern("");
82
+ testName("");
83
+
84
+ measure_setup();
85
+ }
86
+
87
+ /**
88
+ * Creates/adds to a list of patched patterns Needs to be called for every pattern that has to be
89
+ * patched
90
+ *
91
+ * @param pat
92
+ * @return
93
+ */
94
+ public Functional_test addToPatchList(String pat) {
95
+
96
+ patchList.add("C402TNVMTester.patterns." + pat);
97
+ return this;
98
+ }
99
+
100
+ public Functional_test addToDynamicPatternList(String pat) {
101
+ dynamicPatternList.add(pat);
102
+ return this;
103
+ }
104
+
105
+ public Functional_test overlaySubroutinePerSite(
106
+ String subroutinePattern, MultiSiteLong decData, int size) {
107
+ Origen.overlaySubroutinePerSite(
108
+ "C402TNVMTester.patterns." + subroutinePattern, "NVM_DIN_PIN", decData, size);
109
+ return this;
110
+ }
111
+
112
+ public Functional_test overlaySubroutineAllSites(
113
+ String subroutinePattern, long decData, int size) {
114
+ Origen.overlaySubroutineAllSites(
115
+ "C402TNVMTester.patterns." + subroutinePattern, "NVM_DIN_PIN", decData, size);
116
+ return this;
117
+ }
118
+
119
+ /**
120
+ * Setup the patch measurement instance Call after all patterns are added to the list The setup
121
+ * creates a new devicesetup with fake pattern calls to all patched patterns This make sure that
122
+ * they are referenced in this testmethod. Is is not possible to patch patterns that are not used
123
+ * in the testflow After this setupPatch() is called, the patchedMeas still needs to be activated,
124
+ * this happens in run()
125
+ *
126
+ * @return
127
+ */
128
+ public Functional_test setupPatch() {
129
+ IDeviceSetup ds = DeviceSetupFactory.createInstance();
130
+ ds.importSpec(measurement.getSpecificationName());
131
+ ds.sequentialBegin("measPatch");
132
+ {
133
+ for (String pat : patchList) {
134
+ ds.patternCall(pat);
135
+ }
136
+ }
137
+ ds.sequentialEnd();
138
+ patchedMeas.setSetups(ds);
139
+
140
+ // Warn run() that we need to activate the patched measurement still
141
+ activatePatchedMeas = true;
142
+
143
+ return this;
144
+ }
145
+
146
+ public Functional_test setupDynamicPatternList() {
147
+ IDeviceSetup ds = DeviceSetupFactory.createInstance();
148
+ ds.importSpec(dynamicPatMeas.getSpecificationName());
149
+ for (String pat : dynamicPatternList) {
150
+ ds.parallelBegin(pat);
151
+ {
152
+ ds.setBypassable();
153
+ ds.patternCall("C402TNVMTester.patterns." + pat);
154
+ }
155
+ ds.parallelEnd();
156
+ }
157
+ dynamicPatMeas.setSetups(ds);
158
+ _hasDynamicMeas = true;
159
+ return this;
160
+ }
161
+
162
+ // Executed the given (previously setup) pattern on all sites
163
+ public void executeDynamicPat(String pat) {
164
+ selectDynamicPat(pat);
165
+ dynamicPatMeas.execute();
166
+ dynamicMeasurementResults.add(dynamicPatMeas.preserveResult());
167
+ }
168
+
169
+ // Execute the given (previously setup) pattern on all sites except those where bypass is set to
170
+ // true
171
+ public void executeDynamicPat(String pat, MultiSiteBoolean bypass) {
172
+ selectDynamicPat(pat, bypass);
173
+ dynamicPatMeas.execute();
174
+ dynamicMeasurementResults.add(dynamicPatMeas.preserveResult());
175
+ }
176
+
177
+ // Executed the given (previously setup) patterns on all sites, where each site can have a
178
+ // different pattern
179
+ public void executeDynamicPat(MultiSiteString pats) {
180
+ selectDynamicPats(pats);
181
+ dynamicPatMeas.execute();
182
+ dynamicMeasurementResults.add(dynamicPatMeas.preserveResult());
183
+ }
184
+
185
+ public Functional_test selectDynamicPat(String pat, MultiSiteBoolean bypass) {
186
+ message(Origen.LOG_METHODTRACE, "Executing dynamic pattern: " + pat);
187
+ boolean patFound = false;
188
+ MultiSiteBoolean allSites = new MultiSiteBoolean(true);
189
+ List<IParallelGroup> paraGroups = dynamicPatMeas.operatingSequence().getParallelGroups();
190
+ for (IParallelGroup iParallelGroup : paraGroups) {
191
+ if (iParallelGroup.getName().equals(pat)) {
192
+ patFound = true;
193
+ iParallelGroup.setBypass(bypass);
194
+ } else {
195
+ iParallelGroup.setBypass(allSites);
196
+ }
197
+ }
198
+ if (!patFound) {
199
+ throw new Error(
200
+ "Dynamic pattern: " + pat + " not found!! Make sure you have it added in setup()");
201
+ }
202
+ return this;
203
+ }
204
+
205
+ public Functional_test selectDynamicPat(String pat) {
206
+ MultiSiteBoolean noSites = new MultiSiteBoolean(false);
207
+ selectDynamicPat(pat, noSites);
208
+ return this;
209
+ }
210
+
211
+ public Functional_test selectDynamicPats(MultiSiteString pats) {
212
+ // boolean patFound = false;
213
+
214
+ List<IParallelGroup> paraGroups = dynamicPatMeas.operatingSequence().getParallelGroups();
215
+ for (IParallelGroup iParallelGroup : paraGroups) {
216
+ MultiSiteBoolean bypass = new MultiSiteBoolean(true);
217
+ for (int site : context.getActiveSites()) {
218
+ if (iParallelGroup.getName().equals(pats.get(site))) {
219
+ bypass.set(site, false);
220
+ }
221
+ }
222
+ iParallelGroup.setBypass(bypass);
223
+ }
224
+ // if(!patFound) {
225
+ // throw new Error("Dynamic pattern: " + pat + " not found!! Make sure you have it
226
+ // added in setup()");
227
+ // }
228
+ return this;
229
+ }
230
+
231
+ /**
232
+ * The functional test method can optionally capture data by supplying the number of vectors to
233
+ * capture
234
+ *
235
+ * @param v Number of vectors to capture
236
+ * @return
237
+ */
238
+ public Functional_test capture(int numVecs) {
239
+ _capture = numVecs;
240
+ return this;
241
+ }
242
+
243
+ /**
244
+ * If data capture is requested, supply the pin to capture data from
245
+ *
246
+ * @param pin Pin to capture from
247
+ * @return
248
+ */
249
+ public Functional_test pin(String pin) {
250
+ _pin = pin;
251
+ return this;
252
+ }
253
+
254
+ /**
255
+ * Serial capture data will be grouped into words, specify how many bits per word in the serial
256
+ * stream (default 1)
257
+ *
258
+ * @param bitsPerWord
259
+ * @return
260
+ */
261
+ public Functional_test bitPerWord(int bitsPerWord) {
262
+ _bitPerWord = bitsPerWord;
263
+ return this;
264
+ }
265
+
266
+ /**
267
+ * Override the pattern argument from the test suite
268
+ *
269
+ * @param patName
270
+ * @return
271
+ */
272
+ public Functional_test pattern(String patName) {
273
+ _pattern = patName;
274
+ return this;
275
+ }
276
+
277
+ /**
278
+ * Override the test name argument from the test suite, this can be useful if the main test item
279
+ * to be logged is a captured value and the pattern execution is to be logged separately. The
280
+ * override is only valid for one call to execute()
281
+ *
282
+ * @param testName
283
+ * @return
284
+ */
285
+ public Functional_test testName(String newTestName) {
286
+ _testNameOverride = newTestName;
287
+ return this;
288
+ }
289
+
290
+ /**
291
+ * Gets all captured data
292
+ *
293
+ * @return
294
+ */
295
+ public MultiSiteBitSequence capturedData() {
296
+ return _capturedData;
297
+ }
298
+
299
+ /**
300
+ * Gets a specific word from the captured data Bitorder is fixed to RIGHT_TO_LEFT
301
+ *
302
+ * @param wordNr
303
+ * @return
304
+ */
305
+ public MultiSiteLong capturedData(int wordNr) {
306
+ message(Origen.LOG_METHODTRACE, "Get captured data" + wordNr);
307
+ return capturedData(wordNr, BitOrder.RIGHT_TO_LEFT);
308
+ }
309
+
310
+ /**
311
+ * Gets a specific word from the captured data Bitorder has to be specified
312
+ *
313
+ * @param wordNr
314
+ * @param order BitOrder (eg. RIGHT_TO_LEFT)
315
+ * @return
316
+ */
317
+ public MultiSiteLong capturedData(int wordNr, BitOrder order) {
318
+ // Init the MultiSite array
319
+ MultiSiteLong MSL = new MultiSiteLong();
320
+
321
+ // Loop through the sites to get the data
322
+ for (int site : context.getActiveSites()) {
323
+ message(
324
+ Origen.LOG_METHODTRACE,
325
+ "Num cap words: " + _capturedData.get(site).toLongArray(_bitPerWord, order).length);
326
+ MSL.set(site, _capturedData.get(site).toLongArray(_bitPerWord, order)[wordNr]);
327
+ }
328
+ return MSL;
329
+ }
330
+
331
+ /**
332
+ * Gives the string representation of the binary sequence of the result data for a specific wordnr
333
+ * Bitorder is fixed to RIGHT_TO_LEFT
334
+ *
335
+ * @param wordNr
336
+ * @return
337
+ */
338
+ public MultiSiteString getBinaryWord(int wordNr) {
339
+ MultiSiteString MSS = new MultiSiteString();
340
+ for (int site : context.getActiveSites()) {
341
+ MSS.set(
342
+ site,
343
+ OrigenHelpers.longToPaddedBinaryString(
344
+ _capturedData.get(site).toLongArray(_bitPerWord, BitOrder.RIGHT_TO_LEFT)[wordNr],
345
+ _bitPerWord,
346
+ BitOrder.RIGHT_TO_LEFT,
347
+ false));
348
+ }
349
+ return MSS;
350
+ }
351
+
352
+ /**
353
+ * Gives the string representation of the HEX sequence of the result data for a specific wordnr
354
+ * Bitorder is fixed to RIGHT_TO_LEFT
355
+ *
356
+ * @param wordNr
357
+ * @return
358
+ */
359
+ public MultiSiteString getHexWord(int wordNr, int nrHexChars) {
360
+ MultiSiteString MSS = new MultiSiteString();
361
+ for (int site : context.getActiveSites()) {
362
+ MSS.set(
363
+ site,
364
+ OrigenHelpers.longToPaddedHexString(
365
+ _capturedData.get(site).toLongArray(_bitPerWord, BitOrder.RIGHT_TO_LEFT)[wordNr],
366
+ nrHexChars,
367
+ BitOrder.RIGHT_TO_LEFT));
368
+ }
369
+ return MSS;
370
+ }
371
+
372
+ /** Helper function for default bitPerWord use */
373
+ public MultiSiteString getHexWord(int wordNr) {
374
+ return getHexWord(wordNr, _bitPerWord / 4);
375
+ }
376
+
377
+ @Override
378
+ public void _preBody() {
379
+ dynamicMeasurementResults = new ArrayList<IMeasurementResult>();
380
+ }
381
+
382
+ /** Main run function for functional */
383
+ @SuppressWarnings("null")
384
+ @Override
385
+ public void run() {
386
+ IDigInOutCaptureResults digCapture = null;
387
+
388
+ logTrace("Functional_test", "run");
389
+ super.run();
390
+
391
+ // Check if we need to override the pattern name
392
+ if (_pattern != "") {
393
+ measurement.setPatternName(_pattern);
394
+ }
395
+
396
+ // Check if we need to capture anything
397
+ // When capture is enabled, we have to disable the cyclePassFail
398
+ if (_capture > 0) {
399
+ logTrace("Functional_test", "Enabling capture on " + _pin);
400
+ measurement.digInOut(_pin).result().cyclePassFail().setEnabled(false);
401
+ measurement.digInOut(_pin).result().capture().setEnabled(true);
402
+ } else {
403
+ logTrace("Functional_test", "Disabling capture on " + _pin);
404
+ measurement.digInOut(_pin).result().cyclePassFail().setEnabled(true);
405
+ measurement.digInOut(_pin).result().capture().setEnabled(false);
406
+ }
407
+
408
+ // Run the measurement
409
+ measurement.execute();
410
+
411
+ funcResult = measurement.preserveResult();
412
+
413
+ // When captured was enabled, we need to load the captured data for later processing
414
+ // After this is done, the tester can be released
415
+ if (_capture > 0) {
416
+ // protect results to be not overwritten
417
+ digCapture = measurement.digInOut(_pin).preserveCaptureResults();
418
+ }
419
+
420
+ // Activate the patched measurements
421
+ // Without this, you cannot patch any patterns that are not used in THIS testmethod
422
+ if (activatePatchedMeas) {
423
+ patchedMeas.activate();
424
+ }
425
+
426
+ // Assume for now that if force pass is set then branching decision could be dependent on the
427
+ // result of this test, in future add another attribute to control async processing on/off
428
+ if (!sync && !forcePass) {
429
+ releaseTester();
430
+ }
431
+
432
+ if (_capture > 0) {
433
+ _capturedData =
434
+ digCapture.getSerialBitsAsBitSequence(measurement.getSignal(_pin).getDutSignalName());
435
+ }
436
+ }
437
+
438
+ @Override
439
+ public void processResults() {
440
+ logTrace("Functional_test", "processResults");
441
+
442
+ if (_hasDynamicMeas && dynamicMeasurementResults.size() > 0) {
443
+ MultiSiteBoolean dynamicPassed = null;
444
+ for (IMeasurementResult result : dynamicMeasurementResults) {
445
+ if (dynamicPassed == null) {
446
+ dynamicPassed = result.hasPassed();
447
+ } else {
448
+ dynamicPassed = dynamicPassed.and(result.hasPassed());
449
+ }
450
+ }
451
+ if (funcResult != null) {
452
+ judgeAndDatalog(FUNC, dynamicPassed.and(funcResult.hasPassed()));
453
+ } else {
454
+ judgeAndDatalog(FUNC, dynamicPassed);
455
+ }
456
+ } else {
457
+ if (funcResult != null) {
458
+ judgeAndDatalog(FUNC, funcResult);
459
+ }
460
+ }
461
+ }
462
+ }