origen_std_lib 0.10.1 → 0.13.1

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/helpers/console.cpp +94 -0
  9. data/src/advantest/smt7/origen/origen/helpers/misc.cpp +456 -0
  10. data/src/advantest/smt7/origen/origen/helpers/time.cpp +64 -0
  11. data/{stdlib/v93k → src/advantest/smt7}/origen/origen/helpers.hpp +25 -8
  12. data/src/advantest/smt7/origen/origen/site.cpp +237 -0
  13. data/src/advantest/smt7/origen/origen/site.hpp +50 -0
  14. data/src/advantest/smt7/origen/origen/test_method/base.cpp +231 -0
  15. data/src/advantest/smt7/origen/origen/test_method/base.hpp +155 -0
  16. data/src/advantest/smt7/origen/origen/test_method/dc_measurement.cpp +266 -0
  17. data/src/advantest/smt7/origen/origen/test_method/dc_measurement.hpp +58 -0
  18. data/src/advantest/smt7/origen/origen/test_method/empty.cpp +13 -0
  19. data/src/advantest/smt7/origen/origen/test_method/empty.hpp +24 -0
  20. data/src/advantest/smt7/origen/origen/test_method/frequency_measurement.cpp +133 -0
  21. data/src/advantest/smt7/origen/origen/test_method/frequency_measurement.hpp +46 -0
  22. data/src/advantest/smt7/origen/origen/test_method/functional_test.cpp +168 -0
  23. data/src/advantest/smt7/origen/origen/test_method/functional_test.hpp +53 -0
  24. data/{stdlib/v93k → src/advantest/smt7}/origen/origen/test_method.hpp +1 -3
  25. data/src/advantest/smt7/origen/origen/utils/version.cpp +72 -0
  26. data/{stdlib/v93k → src/advantest/smt7}/origen/origen/utils/version.hpp +20 -21
  27. data/{stdlib/v93k → src/advantest/smt7}/origen/origen/utils.hpp +1 -3
  28. data/src/advantest/smt7/origen/origen.cpp +18 -0
  29. data/{stdlib/v93k → src/advantest/smt7}/origen/origen.hpp +3 -3
  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/helpers/console.cpp +0 -105
  59. data/stdlib/v93k/origen/origen/helpers/misc.cpp +0 -311
  60. data/stdlib/v93k/origen/origen/site.cpp +0 -220
  61. data/stdlib/v93k/origen/origen/site.hpp +0 -51
  62. data/stdlib/v93k/origen/origen/test_method/base.hpp +0 -156
  63. data/stdlib/v93k/origen/origen/test_method/dc_measurement.cpp +0 -182
  64. data/stdlib/v93k/origen/origen/test_method/dc_measurement.hpp +0 -59
  65. data/stdlib/v93k/origen/origen/test_method/frequency_measurement.cpp +0 -107
  66. data/stdlib/v93k/origen/origen/test_method/frequency_measurement.hpp +0 -48
  67. data/stdlib/v93k/origen/origen/test_method/functional_test.cpp +0 -125
  68. data/stdlib/v93k/origen/origen/test_method/functional_test.hpp +0 -52
  69. data/stdlib/v93k/origen/origen/utils/version.cpp +0 -79
  70. data/stdlib/v93k/origen/origen.cpp +0 -22
  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,334 @@
1
+ package origen.common;
2
+
3
+ import java.util.List;
4
+ import xoc.dta.ITestContext;
5
+ import xoc.dta.datatypes.MultiSiteLong;
6
+ import xoc.dta.datatypes.MultiSiteString;
7
+ import xoc.dta.measurement.IMeasurement;
8
+ import xoc.dta.setupaccess.IPattern;
9
+ import xoc.dta.signals.ISignal;
10
+
11
+ public class Origen {
12
+
13
+ /**
14
+ * Define the different loglevels <br>
15
+ * Internally the SMT8 logging system will be used (message()) the constants here just work as
16
+ * shorthand for default use cases
17
+ */
18
+ public static final int LOG_METHODTRACE = 9;
19
+
20
+ public static final int LOG_DATA = 10;
21
+ public static final int LOG_PARAM = 3;
22
+ public static final int LOG_FUNC = 4;
23
+ public static final int LOG_FAIL = 2;
24
+ public static final int LOG_WARNING = 1;
25
+ public static final int LOG_ERROR = 0;
26
+
27
+ // All general multisite variables
28
+ // The booleans keep track of their state, these are not multisite since we only use multisite
29
+ // assignments for the _vars
30
+ private static MultiSiteString _lotid;
31
+ private static boolean _lotidSet;
32
+
33
+ private static MultiSiteLong _wafer;
34
+ private static boolean _waferSet;
35
+
36
+ private static MultiSiteLong _x;
37
+ private static boolean _xSet;
38
+
39
+ private static MultiSiteLong _y;
40
+ private static boolean _ySet;
41
+
42
+ public static ITestContext context;
43
+ public static IMeasurement meas;
44
+
45
+ /**
46
+ * Implementing the SMT8 message system also for this non-TM class. Perhaps not the prettiest
47
+ * thing to do but it fixes the logging. The context needs to be set from a TM (like Base)
48
+ *
49
+ * @param level
50
+ * @param msg
51
+ */
52
+ public static void message(int level, String msg) {
53
+ // No longer works on SMT 8.2, should this function be removed completely?
54
+ // context.message(level,msg);
55
+ }
56
+
57
+ public Origen() {
58
+ _lotidSet = false;
59
+ _waferSet = false;
60
+ _xSet = false;
61
+ _ySet = false;
62
+ }
63
+
64
+ /**
65
+ * Returns the IPattern from the name of the pattern
66
+ *
67
+ * @param patname
68
+ * @return
69
+ */
70
+ public static IPattern getPat(String patname) {
71
+ return context.pattern(patname);
72
+ }
73
+
74
+ /**
75
+ * Patch data per site
76
+ *
77
+ * @param subroutinePattern Name of the pattern to patch
78
+ * @param pin Name of the pin to use
79
+ * @param decData The data to patch with
80
+ * @param size The amount of vectors to patch
81
+ */
82
+ public static void overlaySubroutinePerSite(
83
+ String subroutinePattern, String pin, MultiSiteLong decData, int size) {
84
+ message(Origen.LOG_METHODTRACE, "Performing patching on " + subroutinePattern);
85
+ OrigenHelpers.overlaySubroutine(
86
+ getPat(subroutinePattern),
87
+ Origen.pinFromGroup(pin),
88
+ decData,
89
+ size,
90
+ context.getActiveSites());
91
+ }
92
+
93
+ /**
94
+ * Patch the same data to all sites
95
+ *
96
+ * @param subroutinePattern Name of the pattern to patch
97
+ * @param pin Name of the pin to use
98
+ * @param decData The data to patch with
99
+ * @param size The amount of vectors to patch
100
+ */
101
+ public static void overlaySubroutineAllSites(
102
+ String subroutinePattern, String pin, long decData, int size) {
103
+ message(Origen.LOG_METHODTRACE, "Performing patching on " + subroutinePattern);
104
+ OrigenHelpers.overlaySubroutine(
105
+ getPat(subroutinePattern), Origen.pinFromGroup(pin), decData, size);
106
+ }
107
+
108
+ /**
109
+ * Get 1 pin name from a pingroup. Throws an exception if the group contains more than 1 pin
110
+ *
111
+ * @param group
112
+ * @return
113
+ */
114
+ public static String pinFromGroup(String group) {
115
+ List<ISignal> dutGroup = meas.getSignalGroup(group).getDutSignals();
116
+ if (dutGroup.size() > 1) {
117
+ throw new NumberFormatException("Can only patch one signal at a time");
118
+ }
119
+ return dutGroup.get(0).toString();
120
+ }
121
+
122
+ // /**
123
+ // * Debug function to display the STDF variables to check if they are properly setup
124
+ // */
125
+ // public static void showDieInfoFromSTDF() {
126
+ // MultiSiteLong x_coord =context.testProgram().variables().getLong("STDF.X_COORD");
127
+ // MultiSiteLong y_coord =context.testProgram().variables().getLong("STDF.Y_COORD");
128
+ // MultiSiteString wafer_id =context.testProgram().variables().getString("STDF.WAFER_ID");
129
+ // MultiSiteString lot_id =context.testProgram().variables().getString("STDF.LOT_ID");
130
+ // String sublot_id =context.testProgram().variables().getString("STDF.SBLOT_ID").get();
131
+ // message(Origen.LOG_DATA,"Wafer_id:" + wafer_id);
132
+ // message(Origen.LOG_DATA,"Lot_id:" + lot_id);
133
+ // message(Origen.LOG_DATA,"Sublot_id:" + sublot_id);
134
+ // message(Origen.LOG_DATA,"(x,y):(" + x_coord + "," + y_coord + ")");
135
+ // }
136
+
137
+ /** Set the lot ID to the given value, e.g. "ABC1234" */
138
+ public static void lotid(MultiSiteString v) {
139
+ _lotid = v;
140
+ _lotidSet = true;
141
+ }
142
+
143
+ /** Convert long value to 8 character ASCII string */
144
+ private static String toASCII(long value) {
145
+ int length = 8;
146
+ StringBuilder builder = new StringBuilder(length);
147
+ for (int i = length - 1; i >= 0; i--) {
148
+ builder.append((char) ((value >> (8 * i)) & 0xFF));
149
+ }
150
+ return builder.toString();
151
+ }
152
+
153
+ /** Set the lot ID based on the integer representation returned from lotidInt */
154
+ public static void lotid(MultiSiteLong v) {
155
+ MultiSiteString lotStr = new MultiSiteString("");
156
+ for (int site : v.getActiveSites()) {
157
+ long val = v.get(site);
158
+ lotStr.set(site, toASCII(val));
159
+ }
160
+ lotid(lotStr);
161
+ }
162
+
163
+ /* Get the lot ID. If it has not previously been set to a value it will be automatically queried
164
+ * from the test system.
165
+ */
166
+ public static MultiSiteString lotid() {
167
+ if (!_lotidSet) {
168
+
169
+ MultiSiteString lot_id = new MultiSiteString("TR7T7290W25D0");
170
+
171
+ if(!context.testProgram().variables().getString("mi8_recipe_version").get().isEmpty()) {
172
+ lot_id = context.testProgram().variables().getString("STDF.WAFER_ID"); //for use with prober
173
+ }
174
+
175
+ MultiSiteString batch_id = new MultiSiteString();
176
+ for (int site : context.getActiveSites()) {
177
+ String perSiteWID = lot_id.get(site); // per site string contains batch id & wafer number
178
+ String sBatch =
179
+ perSiteWID.substring(
180
+ 0, Math.min(perSiteWID.length(), 8)); // this will give you batch id
181
+ batch_id.set(site, sBatch);
182
+ System.out.println("Wafer batch " + sBatch);
183
+ }
184
+
185
+ _lotid = batch_id; // store the batch number
186
+ // _lotidSet = true;
187
+ }
188
+
189
+ return _lotid;
190
+ }
191
+
192
+ /**
193
+ * Returns the lot ID as a 64-bit integer that is suitable for programming to the device. Each
194
+ * character in the lotID is converted to its ASCII code. An error will be raised if the length of
195
+ * the current lotID overflows 64-bits.STDF.WAFER_ID
196
+ */
197
+ public static MultiSiteLong lotidInt() {
198
+ MultiSiteLong tempLong = new MultiSiteLong();
199
+ MultiSiteString lotid = lotid();
200
+ for (int site : lotid.getActiveSites()) {
201
+ String id = lotid.get(site);
202
+
203
+ // Convert each character to ascii using 2 hex (8 bytes)
204
+ StringBuilder sb = new StringBuilder();
205
+ char[] letters = id.toCharArray();
206
+ for (char ch : letters) {
207
+ sb.append(Long.toHexString(ch));
208
+ }
209
+ // Convert the hex string to long again
210
+ tempLong.set(site, Long.parseLong(sb.toString(), 16));
211
+ }
212
+ return tempLong;
213
+ }
214
+
215
+ /** Set the wafer number to the given value */
216
+ public static void wafer(MultiSiteLong valMSL) {
217
+ _wafer = valMSL;
218
+ _waferSet = true;
219
+ }
220
+
221
+ /**
222
+ * Get the wafer number. If it has not previously been set to a value it will be automatically
223
+ * queried from the test system.
224
+ */
225
+ public static MultiSiteLong wafer() {
226
+ if (!_waferSet) {
227
+
228
+ MultiSiteString wafer_id = new MultiSiteString("TR7T7290W55D0");
229
+
230
+ if(!context.testProgram().variables().getString("mi8_recipe_version").get().isEmpty()) {
231
+ wafer_id = context.testProgram().variables().getString("STDF.WAFER_ID"); //for use with prober
232
+ // Expect to return something like "TR7T7290W25D0)", where 25 is the wafer number
233
+ }
234
+
235
+ MultiSiteLong mslWnum = new MultiSiteLong(0);
236
+ for (int site : context.getActiveSites()) {
237
+ String perSiteWID = wafer_id.get(site); // per site string contains batch id & wafer number
238
+ String sWnum =
239
+ perSiteWID.substring(
240
+ perSiteWID.length() - 4,
241
+ perSiteWID.length() - 2); // extracted wafer number as string
242
+ Long lWnum = new Long(sWnum); // wafer number in Long
243
+ mslWnum.set(site, lWnum);
244
+ System.out.println("Wafer number " + lWnum);
245
+ }
246
+
247
+ // TBD :check for valid value
248
+ // if (lWnum < 1 || lWnum > 25) {
249
+ // throw new Error("ERROR: Wafer is out of the range : " + mslWnum);
250
+ // }
251
+
252
+ _wafer = mslWnum; // store the wafer number
253
+ // _waferSet = true;
254
+ }
255
+ return _wafer;
256
+ }
257
+
258
+ /** Query the X and Y coordinates from the test system and set them for all sites. */
259
+ public static void setXY() {
260
+
261
+ MultiSiteLong x_coord = new MultiSiteLong(90); // for debug purpose
262
+ MultiSiteLong y_coord = new MultiSiteLong(100); // for debug purpose
263
+
264
+ if(!context.testProgram().variables().getString("mi8_recipe_version").get().isEmpty()) {
265
+ x_coord =context.testProgram().variables().getLong("STDF.X_COORD"); //for use with probe
266
+ y_coord =context.testProgram().variables().getLong("STDF.Y_COORD"); //for use with probe
267
+ }
268
+
269
+ // MultiSiteLong x_coord = new MultiSiteLong(90); // for debug purpose
270
+ // MultiSiteLong y_coord = new MultiSiteLong(100); // for debug purpose
271
+
272
+ // TBD
273
+ // if (x_coord.lessThan(-32768) || x_coord.greaterThan(32767) ) {
274
+
275
+ // throw new NumberFormatException("Can only patch one signal at a time");
276
+ // cout << "ERROR: X is out of the range of an Int16: " << lx << endl;
277
+ // ERROR_EXIT(TM::EXIT_FLOW);
278
+
279
+ // }
280
+
281
+ // GetDiePosXYOfSite(_number, &lx, &ly);
282
+ // if (lx < -32768 || lx > 32767) {
283
+ // cout << "ERROR: X is out of the range of an Int16: " << lx << endl;
284
+ // ERROR_EXIT(TM::EXIT_FLOW);
285
+ // }
286
+ // if (ly < -32768 || ly > 32767) {
287
+ // cout << "ERROR: Y is out of the range of an Int16: " << ly << endl;
288
+ // ERROR_EXIT(TM::EXIT_FLOW);
289
+ // }
290
+ // _x = (int) lx;
291
+ // _y = (int) ly;
292
+
293
+ _x = x_coord;
294
+ _y = y_coord;
295
+ // _xSet = true;
296
+ // _ySet = true;
297
+ }
298
+
299
+ /**
300
+ * Get the X co-ord. If it has not previously been set to a value it will be automatically queried
301
+ * from the test system.
302
+ */
303
+ public static MultiSiteLong x() {
304
+ if (!_xSet) {
305
+ setXY();
306
+ }
307
+ return _x;
308
+ }
309
+
310
+ /**
311
+ * Get the Y co-ord. If it has not previously been set to a value it will be automatically queried
312
+ * from the test system.
313
+ *
314
+ * @return
315
+ */
316
+ public static MultiSiteLong y() {
317
+ if (!_ySet) {
318
+ setXY();
319
+ }
320
+ return _y;
321
+ }
322
+
323
+ /** Set the X co-ordinate to the given value */
324
+ public static void x(MultiSiteLong v) {
325
+ _x = v;
326
+ _xSet = true;
327
+ }
328
+
329
+ /** Set the Y co-ordinate to the given value */
330
+ public static void y(MultiSiteLong v) {
331
+ _y = v;
332
+ _ySet = true;
333
+ }
334
+ }