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