origen_std_lib 0.7.0 → 0.8.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.
- checksums.yaml +4 -4
- data/config/application.rb +13 -0
- data/config/version.rb +1 -1
- data/stdlib/v93k/origen/Debug/liborigen.so +0 -0
- data/stdlib/v93k/origen/Debug/makefile +63 -0
- data/stdlib/v93k/origen/Debug/objects.mk +8 -0
- data/stdlib/v93k/origen/Debug/origen.d +1477 -0
- data/stdlib/v93k/origen/Debug/origen.o +0 -0
- data/stdlib/v93k/origen/Debug/origen/helpers/console.d +1483 -0
- data/stdlib/v93k/origen/Debug/origen/helpers/console.o +0 -0
- data/stdlib/v93k/origen/Debug/origen/helpers/misc.d +1483 -0
- data/stdlib/v93k/origen/Debug/origen/helpers/misc.o +0 -0
- data/stdlib/v93k/origen/Debug/origen/helpers/subdir.mk +27 -0
- data/stdlib/v93k/origen/Debug/origen/site.d +1469 -0
- data/stdlib/v93k/origen/Debug/origen/site.o +0 -0
- data/stdlib/v93k/origen/Debug/origen/subdir.mk +24 -0
- data/stdlib/v93k/origen/Debug/origen/test_method/dc_measurement.d +1501 -0
- data/stdlib/v93k/origen/Debug/origen/test_method/dc_measurement.o +0 -0
- data/stdlib/v93k/origen/Debug/origen/test_method/frequency_measurement.d +1502 -0
- data/stdlib/v93k/origen/Debug/origen/test_method/frequency_measurement.o +0 -0
- data/stdlib/v93k/origen/Debug/origen/test_method/functional_test.d +1501 -0
- data/stdlib/v93k/origen/Debug/origen/test_method/functional_test.o +0 -0
- data/stdlib/v93k/origen/Debug/origen/test_method/subdir.mk +30 -0
- data/stdlib/v93k/origen/Debug/origen/utils/subdir.mk +24 -0
- data/stdlib/v93k/origen/Debug/origen/utils/version.d +4 -0
- data/stdlib/v93k/origen/Debug/origen/utils/version.o +0 -0
- data/stdlib/v93k/origen/Debug/sources.mk +32 -0
- data/stdlib/v93k/origen/Debug/subdir.mk +24 -0
- data/stdlib/v93k/origen/Debug/test_methods/ApplyBin.d +1487 -0
- data/stdlib/v93k/origen/Debug/test_methods/ApplyBin.o +0 -0
- data/stdlib/v93k/origen/Debug/test_methods/DCMeasurement.d +1508 -0
- data/stdlib/v93k/origen/Debug/test_methods/DCMeasurement.o +0 -0
- data/stdlib/v93k/origen/Debug/test_methods/FrequencyMeasurement.d +1508 -0
- data/stdlib/v93k/origen/Debug/test_methods/FrequencyMeasurement.o +0 -0
- data/stdlib/v93k/origen/Debug/test_methods/FunctionalTest.d +1511 -0
- data/stdlib/v93k/origen/Debug/test_methods/FunctionalTest.o +0 -0
- data/stdlib/v93k/origen/Debug/test_methods/RecordBin.d +1487 -0
- data/stdlib/v93k/origen/Debug/test_methods/RecordBin.o +0 -0
- data/stdlib/v93k/origen/Debug/test_methods/subdir.mk +36 -0
- data/stdlib/v93k/origen/origen.cpp +22 -0
- data/stdlib/v93k/origen/origen.hpp +22 -0
- data/stdlib/v93k/origen/origen/helpers.hpp +44 -0
- data/stdlib/v93k/origen/origen/helpers/console.cpp +105 -0
- data/stdlib/v93k/origen/origen/helpers/misc.cpp +305 -0
- data/stdlib/v93k/origen/origen/site.cpp +220 -0
- data/stdlib/v93k/origen/origen/site.hpp +51 -0
- data/stdlib/v93k/origen/origen/test_method.hpp +17 -0
- data/stdlib/v93k/origen/origen/test_method/base.hpp +151 -0
- data/stdlib/v93k/origen/origen/test_method/dc_measurement.cpp +182 -0
- data/stdlib/v93k/origen/origen/test_method/dc_measurement.hpp +59 -0
- data/stdlib/v93k/origen/origen/test_method/frequency_measurement.cpp +109 -0
- data/stdlib/v93k/origen/origen/test_method/frequency_measurement.hpp +48 -0
- data/stdlib/v93k/origen/origen/test_method/functional_test.cpp +119 -0
- data/stdlib/v93k/origen/origen/test_method/functional_test.hpp +51 -0
- data/stdlib/v93k/origen/origen/utils.hpp +12 -0
- data/stdlib/v93k/origen/origen/utils/version.cpp +79 -0
- data/stdlib/v93k/origen/origen/utils/version.hpp +64 -0
- data/stdlib/v93k/origen/test_methods/ApplyBin.cpp +41 -0
- data/stdlib/v93k/origen/test_methods/DCMeasurement.cpp +127 -0
- data/stdlib/v93k/origen/test_methods/FrequencyMeasurement.cpp +91 -0
- data/stdlib/v93k/origen/test_methods/FunctionalTest.cpp +92 -0
- data/stdlib/v93k/origen/test_methods/RecordBin.cpp +48 -0
- metadata +60 -1
@@ -0,0 +1,220 @@
|
|
1
|
+
#include "site.hpp"
|
2
|
+
#include <libcicpi.h>
|
3
|
+
#include <iostream>
|
4
|
+
#include "helpers.hpp"
|
5
|
+
using namespace std;
|
6
|
+
|
7
|
+
namespace Origen {
|
8
|
+
|
9
|
+
Site::Site(int number) {
|
10
|
+
_number = number;
|
11
|
+
lotidSet = false;
|
12
|
+
waferSet = false;
|
13
|
+
xSet = false;
|
14
|
+
ySet = false;
|
15
|
+
binSet = false;
|
16
|
+
softbinSet = false;
|
17
|
+
}
|
18
|
+
Site::~Site() {}
|
19
|
+
|
20
|
+
/// Set the lot ID to the given value, e.g. "ABC1234"
|
21
|
+
void Site::lotid(string val) {
|
22
|
+
lotidSet = true;
|
23
|
+
_lotid = val;
|
24
|
+
}
|
25
|
+
|
26
|
+
|
27
|
+
/// Set the lot ID based on the integer representation returned from lotidInt
|
28
|
+
void Site::lotid(uint64_t val) {
|
29
|
+
string id = "";
|
30
|
+
|
31
|
+
for(int i = 0; i < 8; i++) {
|
32
|
+
int ch = val >> (8 * (7 - i));
|
33
|
+
if (ch != 0) {
|
34
|
+
id = id + (char)ch;
|
35
|
+
}
|
36
|
+
}
|
37
|
+
|
38
|
+
lotid(id);
|
39
|
+
}
|
40
|
+
|
41
|
+
|
42
|
+
/// Get the lot ID. If it has not previously been set to a value it will be automatically queried from the test system.
|
43
|
+
string Site::lotid() {
|
44
|
+
if (!lotidSet) {
|
45
|
+
char value[CI_CPI_MAX_MODL_STRING_LEN * 2];
|
46
|
+
if (!GetModelfileString(const_cast<char*>("LOT_ID"), value)) {
|
47
|
+
_lotid = (string) value;
|
48
|
+
} else {
|
49
|
+
_lotid = "Undefined";
|
50
|
+
}
|
51
|
+
lotidSet = true;
|
52
|
+
}
|
53
|
+
return _lotid;
|
54
|
+
}
|
55
|
+
|
56
|
+
/// Returns the lot ID as a 64-bit integer that is suitable for programming to the device.
|
57
|
+
/// Each character in the lotID is converted to its ASCII code.
|
58
|
+
/// An error will be raised if the length of the current lotID overflows 64-bits.
|
59
|
+
uint64_t Site::lotidInt() {
|
60
|
+
string id = lotid();
|
61
|
+
stringstream val;
|
62
|
+
|
63
|
+
// If the ID is > 8 chars then lose the upper chars, making the assuming that the lower ones are
|
64
|
+
// the more significant ones for the purposes of identifying a particular lot
|
65
|
+
if (id.length() > 8) {
|
66
|
+
id = id.substr(id.length() - 8, 8);
|
67
|
+
}
|
68
|
+
if (id.length() > 0) val << toHex((int)id.at(0));
|
69
|
+
if (id.length() > 1) val << toHex((int)id.at(1));
|
70
|
+
if (id.length() > 2) val << toHex((int)id.at(2));
|
71
|
+
if (id.length() > 3) val << toHex((int)id.at(3));
|
72
|
+
if (id.length() > 4) val << toHex((int)id.at(4));
|
73
|
+
if (id.length() > 5) val << toHex((int)id.at(5));
|
74
|
+
if (id.length() > 6) val << toHex((int)id.at(6));
|
75
|
+
if (id.length() > 7) val << toHex((int)id.at(7));
|
76
|
+
|
77
|
+
return toUInt(val.str(), 16);
|
78
|
+
}
|
79
|
+
|
80
|
+
|
81
|
+
/// Set the wafer number to the given value
|
82
|
+
void Site::wafer(int val) {
|
83
|
+
waferSet = true;
|
84
|
+
if (val < 0 || val > 255) {
|
85
|
+
cout << "ERROR: Wafer is out of the range of a UInt8: " << val << endl;
|
86
|
+
ERROR_EXIT(TM::EXIT_FLOW);
|
87
|
+
}
|
88
|
+
_wafer = (uint8_t)val;
|
89
|
+
}
|
90
|
+
|
91
|
+
/// Get the wafer number. If it has not previously been set to a value it will be automatically queried from the test system.
|
92
|
+
int Site::wafer() {
|
93
|
+
if (!waferSet) {
|
94
|
+
char value[CI_CPI_MAX_MODL_STRING_LEN * 2];
|
95
|
+
|
96
|
+
// if (!GetModelfileString(const_cast<char*>("WAFER_ID"), value)) {
|
97
|
+
// Expect to return something like "AB1234-15AA", where 15 is the wafer number
|
98
|
+
//wafer(toInt(split((string) value, '-')[1].substr(0, 2)));
|
99
|
+
if (!GetModelfileString(const_cast<char*>("WAFER_NUMBER"), value)) {
|
100
|
+
wafer(toInt((string) value));
|
101
|
+
} else {
|
102
|
+
wafer(0xFF);
|
103
|
+
}
|
104
|
+
waferSet = true;
|
105
|
+
}
|
106
|
+
return _wafer;
|
107
|
+
}
|
108
|
+
|
109
|
+
|
110
|
+
/// Set the X co-ordinate to the given value
|
111
|
+
void Site::x(int val) {
|
112
|
+
xSet = true;
|
113
|
+
_x = val;
|
114
|
+
}
|
115
|
+
|
116
|
+
/// Get the X co-ord. If it has not previously been set to a value it will be automatically queried from the test system.
|
117
|
+
int Site::x() {
|
118
|
+
if (!xSet) {
|
119
|
+
long lx, ly;
|
120
|
+
GetDiePosXYOfSite(_number, &lx, &ly);
|
121
|
+
if (lx < -32768 || lx > 32767) {
|
122
|
+
cout << "ERROR: X is out of the range of an Int16: " << lx << endl;
|
123
|
+
ERROR_EXIT(TM::EXIT_FLOW);
|
124
|
+
}
|
125
|
+
if (ly < -32768 || ly > 32767) {
|
126
|
+
cout << "ERROR: Y is out of the range of an Int16: " << ly << endl;
|
127
|
+
ERROR_EXIT(TM::EXIT_FLOW);
|
128
|
+
}
|
129
|
+
_x = (int) lx;
|
130
|
+
_y = (int) ly;
|
131
|
+
xSet = true;
|
132
|
+
ySet = true;
|
133
|
+
}
|
134
|
+
return _x;
|
135
|
+
}
|
136
|
+
|
137
|
+
|
138
|
+
/// Set the Y co-ordinate to the given value
|
139
|
+
void Site::y(int val) {
|
140
|
+
ySet = true;
|
141
|
+
_y = val;
|
142
|
+
}
|
143
|
+
|
144
|
+
/// Get the Y co-ord. If it has not previously been set to a value it will be automatically queried from the test system.
|
145
|
+
int Site::y() {
|
146
|
+
if (!ySet) {
|
147
|
+
long lx, ly;
|
148
|
+
GetDiePosXYOfSite(_number, &lx, &ly);
|
149
|
+
if (lx < -32768 || lx > 32767) {
|
150
|
+
cout << "ERROR: X is out of the range of an Int16: " << lx << endl;
|
151
|
+
ERROR_EXIT(TM::EXIT_FLOW);
|
152
|
+
}
|
153
|
+
if (ly < -32768 || ly > 32767) {
|
154
|
+
cout << "ERROR: Y is out of the range of an Int16: " << ly << endl;
|
155
|
+
ERROR_EXIT(TM::EXIT_FLOW);
|
156
|
+
}
|
157
|
+
_x = (int) lx;
|
158
|
+
_y = (int) ly;
|
159
|
+
xSet = true;
|
160
|
+
ySet = true;
|
161
|
+
}
|
162
|
+
return _y;
|
163
|
+
}
|
164
|
+
|
165
|
+
/// Set the site's bin to the given value, but only if a bin has not already been set.
|
166
|
+
/// Note that this does not actually bin out the site but just records the bin assignment
|
167
|
+
/// in a variable that can be retrieved by calling bin().
|
168
|
+
void Site::bin(int val) {
|
169
|
+
if (!binSet) {
|
170
|
+
binSet = true;
|
171
|
+
_bin = val;
|
172
|
+
}
|
173
|
+
}
|
174
|
+
|
175
|
+
/// Set the site's bin to the given value, but only if a bin has not already been set or
|
176
|
+
/// if the force argument is set to true, in which case it will overwrite any previous
|
177
|
+
/// assignment.
|
178
|
+
/// Note that this does not actually bin out the site but just records the bin assignment
|
179
|
+
/// in a variable that can be retrieved by calling bin().
|
180
|
+
void Site::bin(int val, bool force) {
|
181
|
+
if (!binSet || force) {
|
182
|
+
binSet = true;
|
183
|
+
_bin = val;
|
184
|
+
}
|
185
|
+
}
|
186
|
+
|
187
|
+
/// Returns the bin that has been assigned to the site by previously calling bin(int), if no
|
188
|
+
/// bin has been assigned then it will return 0.
|
189
|
+
int Site::bin() {
|
190
|
+
return (binSet) ? _bin : 0;
|
191
|
+
}
|
192
|
+
|
193
|
+
/// Set the site's softbin to the given value, but only if a softbin has not already been set.
|
194
|
+
/// Note that this does not actually bin out the site but just records the softbin assignment
|
195
|
+
/// in a variable that can be retrieved by calling softbin().
|
196
|
+
void Site::softbin(int val) {
|
197
|
+
if (!softbinSet) {
|
198
|
+
softbinSet = true;
|
199
|
+
_softbin = val;
|
200
|
+
}
|
201
|
+
}
|
202
|
+
|
203
|
+
/// Set the site's softbin to the given value, but only if a softbin a has not already been set or
|
204
|
+
/// if the force argument is set to true, in which case it will overwrite any previous
|
205
|
+
/// assignment.
|
206
|
+
/// Note that this does not actually bin out the site but just records the softbin assignment
|
207
|
+
/// in a variable that can be retrieved by calling softbin().
|
208
|
+
void Site::softbin(int val, bool force) {
|
209
|
+
if (!softbinSet || force) {
|
210
|
+
softbinSet = true;
|
211
|
+
_softbin = val;
|
212
|
+
}
|
213
|
+
}
|
214
|
+
|
215
|
+
/// Returns the bin that has been assigned to the site by previously calling bin(int), if no
|
216
|
+
/// bin has been assigned then it will return 0.
|
217
|
+
int Site::softbin() {
|
218
|
+
return (softbinSet) ? _softbin : 0;
|
219
|
+
}
|
220
|
+
} /* namespace Origen */
|
@@ -0,0 +1,51 @@
|
|
1
|
+
#ifndef ORIGEN_SITE_HPP_
|
2
|
+
#define ORIGEN_SITE_HPP_
|
3
|
+
|
4
|
+
#include <string>
|
5
|
+
using namespace std;
|
6
|
+
|
7
|
+
namespace Origen {
|
8
|
+
|
9
|
+
class Site {
|
10
|
+
string _lotid;
|
11
|
+
bool lotidSet;
|
12
|
+
int _wafer;
|
13
|
+
bool waferSet;
|
14
|
+
int _x;
|
15
|
+
bool xSet;
|
16
|
+
int _y;
|
17
|
+
bool ySet;
|
18
|
+
int _number;
|
19
|
+
int _bin;
|
20
|
+
int _softbin;
|
21
|
+
bool binSet;
|
22
|
+
bool softbinSet;
|
23
|
+
|
24
|
+
|
25
|
+
public:
|
26
|
+
Site(int);
|
27
|
+
virtual ~Site();
|
28
|
+
string lotid();
|
29
|
+
uint64_t lotidInt();
|
30
|
+
void lotid(string);
|
31
|
+
void lotid(uint64_t);
|
32
|
+
int wafer();
|
33
|
+
void wafer(int);
|
34
|
+
int x();
|
35
|
+
void x(int);
|
36
|
+
int y();
|
37
|
+
void y(int);
|
38
|
+
int bin();
|
39
|
+
void bin(int);
|
40
|
+
void bin(int, bool);
|
41
|
+
int softbin();
|
42
|
+
void softbin(int);
|
43
|
+
void softbin(int, bool);
|
44
|
+
|
45
|
+
/// Returns the site number associated with the given site object
|
46
|
+
int number() { return _number; }
|
47
|
+
};
|
48
|
+
|
49
|
+
|
50
|
+
} /* namespace Origen */
|
51
|
+
#endif
|
@@ -0,0 +1,17 @@
|
|
1
|
+
#ifndef ORIGEN_TEST_METHOD_INCLUDED
|
2
|
+
#define ORIGEN_TEST_METHOD_INCLUDED
|
3
|
+
|
4
|
+
#include "mapi.hpp"
|
5
|
+
#include "rdi.hpp"
|
6
|
+
|
7
|
+
#define origen getThis()
|
8
|
+
|
9
|
+
using namespace std;
|
10
|
+
|
11
|
+
namespace Origen {
|
12
|
+
namespace TestMethod {
|
13
|
+
|
14
|
+
}
|
15
|
+
}
|
16
|
+
|
17
|
+
#endif
|
@@ -0,0 +1,151 @@
|
|
1
|
+
#ifndef ORIGEN_TEST_METHOD_BASE_INCLUDED
|
2
|
+
#define ORIGEN_TEST_METHOD_BASE_INCLUDED
|
3
|
+
|
4
|
+
#include "../test_method.hpp"
|
5
|
+
#include "../../origen.hpp"
|
6
|
+
|
7
|
+
namespace Origen {
|
8
|
+
namespace TestMethod {
|
9
|
+
|
10
|
+
class Base {
|
11
|
+
bool _async;
|
12
|
+
bool _syncup;
|
13
|
+
|
14
|
+
public:
|
15
|
+
virtual ~Base() {
|
16
|
+
}
|
17
|
+
Base() {
|
18
|
+
async(false);
|
19
|
+
syncup(false);
|
20
|
+
}
|
21
|
+
|
22
|
+
Base & async(bool v) { _async = v; return *this; }
|
23
|
+
Base & syncup(bool v) { _syncup = v; return *this; }
|
24
|
+
|
25
|
+
protected:
|
26
|
+
/// Returns 1 when running in offline mode
|
27
|
+
int offline() {
|
28
|
+
int flag;
|
29
|
+
GET_SYSTEM_FLAG("offline", &flag);
|
30
|
+
return flag;
|
31
|
+
}
|
32
|
+
|
33
|
+
// Returns an object containing the test limits, this can be passed to SMT APIs that take a LIMITS
|
34
|
+
// object argument. To actually get the limit values use loLimit() and hiLimit().
|
35
|
+
LIMIT limits() {
|
36
|
+
return GET_LIMIT_OBJECT("Functional");
|
37
|
+
}
|
38
|
+
|
39
|
+
/// Returns the high limit value in whole units, i.e. A or V
|
40
|
+
double hiLimit() {
|
41
|
+
double lim = 0.0;
|
42
|
+
double * plim = &lim;
|
43
|
+
|
44
|
+
limits().getHigh(plim);
|
45
|
+
return lim;
|
46
|
+
}
|
47
|
+
|
48
|
+
/// Returns the low limit value in whole units, i.e. A or V
|
49
|
+
double loLimit() {
|
50
|
+
double lim = 0.0;
|
51
|
+
double * plim = &lim;
|
52
|
+
|
53
|
+
limits().getLow(plim);
|
54
|
+
return lim;
|
55
|
+
}
|
56
|
+
|
57
|
+
// Called immediately before the first RDI operation is executed
|
58
|
+
virtual void preTestFunc() {
|
59
|
+
}
|
60
|
+
virtual void preTestFunc(int site) {
|
61
|
+
}
|
62
|
+
|
63
|
+
// Called before the main RDI operation is executed, giving the chance to add
|
64
|
+
// additional settings to it
|
65
|
+
virtual void filterRDI(SMART_RDI::dcBase & prdi) {
|
66
|
+
}
|
67
|
+
virtual void filterRDI(SMART_RDI::DIG_CAP & prdi) {
|
68
|
+
}
|
69
|
+
virtual void filterRDI(SMART_RDI::FUNC & prdi) {
|
70
|
+
}
|
71
|
+
|
72
|
+
// If the test has a hold state, this will be called immediately after the hold
|
73
|
+
// state pattern has run
|
74
|
+
virtual void holdStateFunc() {
|
75
|
+
}
|
76
|
+
virtual void holdStateFunc(int site) {
|
77
|
+
}
|
78
|
+
|
79
|
+
// Called after the last RDI operation has executed and all results have been
|
80
|
+
// fetched
|
81
|
+
virtual void postTestFunc() {
|
82
|
+
}
|
83
|
+
virtual void postTestFunc(int site) {
|
84
|
+
}
|
85
|
+
|
86
|
+
// Called immediately before the final result processing. If the test is configured for async
|
87
|
+
// processing then this will be called later in the background. Contrast this with the
|
88
|
+
// postTestFunc which will be called before the main test body completes.
|
89
|
+
virtual void processFunc(int site) {
|
90
|
+
}
|
91
|
+
|
92
|
+
// Called before the main test result is judged, giving a chance to transform it
|
93
|
+
virtual double filterResult(double result) {
|
94
|
+
return result;
|
95
|
+
}
|
96
|
+
|
97
|
+
virtual bool async() {
|
98
|
+
return _async;
|
99
|
+
}
|
100
|
+
virtual bool syncup() {
|
101
|
+
return _syncup;
|
102
|
+
}
|
103
|
+
|
104
|
+
virtual void serialProcessing(int site) {};
|
105
|
+
|
106
|
+
void enableHiddenUpload() {
|
107
|
+
if (async()) {
|
108
|
+
rdi.hiddenUpload(TA::ALL);
|
109
|
+
} else {
|
110
|
+
rdi.hiddenUpload(TA::NO);
|
111
|
+
}
|
112
|
+
}
|
113
|
+
|
114
|
+
void callPreTestFunc() {
|
115
|
+
if (syncup()) {
|
116
|
+
synchronize();
|
117
|
+
}
|
118
|
+
preTestFunc();
|
119
|
+
FOR_EACH_SITE_BEGIN();
|
120
|
+
preTestFunc(CURRENT_SITE_NUMBER());
|
121
|
+
FOR_EACH_SITE_END();
|
122
|
+
}
|
123
|
+
|
124
|
+
void callHoldStateFunc() {
|
125
|
+
holdStateFunc();
|
126
|
+
FOR_EACH_SITE_BEGIN();
|
127
|
+
holdStateFunc(CURRENT_SITE_NUMBER());
|
128
|
+
FOR_EACH_SITE_END();
|
129
|
+
}
|
130
|
+
|
131
|
+
template <class T>
|
132
|
+
void callPostTestFunc(T* obj) {
|
133
|
+
ON_FIRST_INVOCATION_BEGIN();
|
134
|
+
postTestFunc();
|
135
|
+
FOR_EACH_SITE_BEGIN();
|
136
|
+
postTestFunc(CURRENT_SITE_NUMBER());
|
137
|
+
FOR_EACH_SITE_END();
|
138
|
+
ON_FIRST_INVOCATION_END();
|
139
|
+
|
140
|
+
if (async()) {
|
141
|
+
SMC_ARM_internal(obj);
|
142
|
+
} else {
|
143
|
+
processFunc(CURRENT_SITE_NUMBER());
|
144
|
+
this->serialProcessing(CURRENT_SITE_NUMBER());
|
145
|
+
}
|
146
|
+
}
|
147
|
+
};
|
148
|
+
}
|
149
|
+
}
|
150
|
+
|
151
|
+
#endif /* BASE_HPP_ */
|
@@ -0,0 +1,182 @@
|
|
1
|
+
#include "dc_measurement.hpp"
|
2
|
+
|
3
|
+
using namespace std;
|
4
|
+
|
5
|
+
namespace Origen {
|
6
|
+
namespace TestMethod {
|
7
|
+
|
8
|
+
|
9
|
+
// Defaults
|
10
|
+
DCMeasurement::DCMeasurement() {
|
11
|
+
applyShutdown(1);
|
12
|
+
checkShutdown(1);
|
13
|
+
measure("VOLT");
|
14
|
+
settlingTime(0);
|
15
|
+
forceValue(0);
|
16
|
+
iRange(0);
|
17
|
+
processResults(1);
|
18
|
+
badc(0);
|
19
|
+
}
|
20
|
+
|
21
|
+
DCMeasurement::~DCMeasurement() { }
|
22
|
+
|
23
|
+
DCMeasurement & DCMeasurement::applyShutdown(int v) { _applyShutdown = v; return *this; }
|
24
|
+
DCMeasurement & DCMeasurement::shutdownPattern(string v) { _shutdownPattern = v; return *this; }
|
25
|
+
DCMeasurement & DCMeasurement::checkShutdown(int v) { _checkShutdown = v; return *this; }
|
26
|
+
DCMeasurement & DCMeasurement::measure(string v) { _measure = v; return *this; }
|
27
|
+
DCMeasurement & DCMeasurement::settlingTime(double v) { _settlingTime = v; return *this; }
|
28
|
+
DCMeasurement & DCMeasurement::pin(string v) { _pin = v; return *this; }
|
29
|
+
DCMeasurement & DCMeasurement::forceValue(double v) { _forceValue = v; return *this; }
|
30
|
+
DCMeasurement & DCMeasurement::iRange(double v) { _iRange = v; return *this; }
|
31
|
+
DCMeasurement & DCMeasurement::processResults(int v) { _processResults = v; return *this; }
|
32
|
+
DCMeasurement & DCMeasurement::badc(int v) { _badc = v; return *this; }
|
33
|
+
|
34
|
+
// All test methods must implement this function
|
35
|
+
DCMeasurement & DCMeasurement::getThis() { return *this; }
|
36
|
+
|
37
|
+
void DCMeasurement::execute() {
|
38
|
+
|
39
|
+
int site, physicalSites;
|
40
|
+
ARRAY_I sites;
|
41
|
+
|
42
|
+
RDI_INIT();
|
43
|
+
|
44
|
+
ON_FIRST_INVOCATION_BEGIN();
|
45
|
+
|
46
|
+
enableHiddenUpload();
|
47
|
+
GET_ACTIVE_SITES(activeSites);
|
48
|
+
physicalSites = GET_CONFIGURED_SITES(sites);
|
49
|
+
results.resize(physicalSites + 1);
|
50
|
+
funcResultsPre.resize(physicalSites + 1);
|
51
|
+
funcResultsPost.resize(physicalSites + 1);
|
52
|
+
GET_TESTSUITE_NAME(testSuiteName);
|
53
|
+
label = Primary.getLabel();
|
54
|
+
|
55
|
+
pin(extractPinsFromGroup(_pin));
|
56
|
+
|
57
|
+
if (_applyShutdown) {
|
58
|
+
if (_shutdownPattern.empty()) {
|
59
|
+
ostringstream pat;
|
60
|
+
pat << label << "_part1";
|
61
|
+
shutdownPattern(pat.str());
|
62
|
+
}
|
63
|
+
}
|
64
|
+
|
65
|
+
if (!_iRange && _measure == "CURR") {
|
66
|
+
double l = loLimit();
|
67
|
+
double h = hiLimit();
|
68
|
+
if (l == 0 && h == 0) {
|
69
|
+
cout << "ERROR: If your current measurement does not have a limit, you must supply the current range" << endl;
|
70
|
+
ERROR_EXIT(TM::ABORT_FLOW);
|
71
|
+
}
|
72
|
+
if (abs(l) > abs(h))
|
73
|
+
_iRange = abs(l);
|
74
|
+
else
|
75
|
+
_iRange = abs(h);
|
76
|
+
}
|
77
|
+
|
78
|
+
|
79
|
+
callPreTestFunc();
|
80
|
+
|
81
|
+
RDI_BEGIN();
|
82
|
+
|
83
|
+
rdi.func(testSuiteName + "f1").label(label).execute();
|
84
|
+
|
85
|
+
callHoldStateFunc();
|
86
|
+
|
87
|
+
if(_measure == "VOLT") {
|
88
|
+
|
89
|
+
if (_badc) {
|
90
|
+
rdi.dc(testSuiteName)
|
91
|
+
.pin(_pin, TA::BADC)
|
92
|
+
.measWait(_settlingTime)
|
93
|
+
.vMeas()
|
94
|
+
.execute();
|
95
|
+
|
96
|
+
} else {
|
97
|
+
SMART_RDI::dcBase & prdi = rdi.dc(testSuiteName)
|
98
|
+
.pin(_pin)
|
99
|
+
.iForce(_forceValue)
|
100
|
+
.measWait(_settlingTime)
|
101
|
+
.relay(TA::ppmuRly_onPPMU_offACDC,TA::ppmuRly_onAC_offDCPPMU)
|
102
|
+
.vMeas();
|
103
|
+
filterRDI(prdi);
|
104
|
+
prdi.execute();
|
105
|
+
|
106
|
+
}
|
107
|
+
|
108
|
+
|
109
|
+
|
110
|
+
} else {
|
111
|
+
|
112
|
+
SMART_RDI::dcBase & prdi = rdi.dc(testSuiteName)
|
113
|
+
.pin(_pin)
|
114
|
+
.vForce(_forceValue)
|
115
|
+
.relay(TA::ppmuRly_onPPMU_offACDC,TA::ppmuRly_onAC_offDCPPMU)
|
116
|
+
.measWait(_settlingTime)
|
117
|
+
.iRange(_iRange)
|
118
|
+
.iMeas();
|
119
|
+
filterRDI(prdi);
|
120
|
+
prdi.execute();
|
121
|
+
}
|
122
|
+
|
123
|
+
if (_applyShutdown) rdi.func(testSuiteName + "f2").label(_shutdownPattern).execute();
|
124
|
+
|
125
|
+
RDI_END();
|
126
|
+
|
127
|
+
FOR_EACH_SITE_BEGIN();
|
128
|
+
site = CURRENT_SITE_NUMBER();
|
129
|
+
funcResultsPre[site] = rdi.id(testSuiteName + "f1").getPassFail();
|
130
|
+
if (_applyShutdown) funcResultsPost[site] = rdi.id(testSuiteName + "f2").getPassFail();
|
131
|
+
// TODO: This retrieval needs to move to the SMC func in the async case
|
132
|
+
if (offline()) {
|
133
|
+
if (!loLimit() && !hiLimit()) {
|
134
|
+
results[site] = 0;
|
135
|
+
} else if(loLimit() && hiLimit()) {
|
136
|
+
results[site] = ((hiLimit() - loLimit()) / 2) + loLimit();
|
137
|
+
} else if (loLimit()) {
|
138
|
+
results[site] = loLimit();
|
139
|
+
} else {
|
140
|
+
results[site] = hiLimit();
|
141
|
+
}
|
142
|
+
|
143
|
+
} else {
|
144
|
+
results[site] = rdi.id(testSuiteName).getValue();
|
145
|
+
}
|
146
|
+
|
147
|
+
FOR_EACH_SITE_END();
|
148
|
+
|
149
|
+
ON_FIRST_INVOCATION_END();
|
150
|
+
|
151
|
+
callPostTestFunc(this);
|
152
|
+
}
|
153
|
+
|
154
|
+
void DCMeasurement::serialProcessing(int site) {
|
155
|
+
if (_processResults) {
|
156
|
+
logFunctionalTest(testSuiteName, site, funcResultsPre[site] == 1, label);
|
157
|
+
TESTSET().cont(true).judgeAndLog_FunctionalTest(funcResultsPre[site] == 1);
|
158
|
+
|
159
|
+
logParametricTest(testSuiteName, site, filterResult(results[site]), limits(), _pin);
|
160
|
+
TESTSET().judgeAndLog_ParametricTest(_pin, testSuiteName, limits(), filterResult(results[site]));
|
161
|
+
|
162
|
+
if (_applyShutdown && _checkShutdown) {
|
163
|
+
logFunctionalTest(testSuiteName, site, funcResultsPost[site] == 1, _shutdownPattern);
|
164
|
+
TESTSET().cont(true).judgeAndLog_FunctionalTest(funcResultsPost[site] == 1);
|
165
|
+
}
|
166
|
+
}
|
167
|
+
}
|
168
|
+
|
169
|
+
void DCMeasurement::SMC_backgroundProcessing() {
|
170
|
+
for (int i = 0; i < activeSites.size(); i++) {
|
171
|
+
int site = activeSites[i];
|
172
|
+
processFunc(site);
|
173
|
+
if (_processResults) {
|
174
|
+
SMC_TEST(site, "", testSuiteName, LIMIT(TM::GE, 1, TM::LE, 1), funcResultsPre[site]);
|
175
|
+
if (_applyShutdown && _checkShutdown) SMC_TEST(site, "", testSuiteName, LIMIT(TM::GE, 1, TM::LE, 1), funcResultsPost[site]);
|
176
|
+
SMC_TEST(site, _pin, testSuiteName, limits(), filterResult(results[site]));
|
177
|
+
}
|
178
|
+
}
|
179
|
+
}
|
180
|
+
|
181
|
+
}
|
182
|
+
}
|