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.
- 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/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/{stdlib/v93k → src/advantest/smt7}/origen/origen/helpers.hpp +25 -8
- data/src/advantest/smt7/origen/origen/site.cpp +237 -0
- data/src/advantest/smt7/origen/origen/site.hpp +50 -0
- 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/test_method.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/{stdlib/v93k → src/advantest/smt7}/origen/origen/utils.hpp +1 -3
- data/src/advantest/smt7/origen/origen.cpp +18 -0
- data/{stdlib/v93k → src/advantest/smt7}/origen/origen.hpp +3 -3
- 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/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 -125
- data/stdlib/v93k/origen/origen/test_method/functional_test.hpp +0 -52
- data/stdlib/v93k/origen/origen/utils/version.cpp +0 -79
- data/stdlib/v93k/origen/origen.cpp +0 -22
- 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
|
@@ -1,156 +0,0 @@
|
|
|
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 base test number
|
|
40
|
-
int testnumber() {
|
|
41
|
-
return GET_TESTNUMBER("Functional").getOffset();
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/// Returns the high limit value in whole units, i.e. A or V
|
|
45
|
-
double hiLimit() {
|
|
46
|
-
double lim = 0.0;
|
|
47
|
-
double * plim = &lim;
|
|
48
|
-
|
|
49
|
-
limits().getHigh(plim);
|
|
50
|
-
return lim;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/// Returns the low limit value in whole units, i.e. A or V
|
|
54
|
-
double loLimit() {
|
|
55
|
-
double lim = 0.0;
|
|
56
|
-
double * plim = &lim;
|
|
57
|
-
|
|
58
|
-
limits().getLow(plim);
|
|
59
|
-
return lim;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// Called immediately before the first RDI operation is executed
|
|
63
|
-
virtual void preTestFunc() {
|
|
64
|
-
}
|
|
65
|
-
virtual void preTestFunc(int site) {
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// Called before the main RDI operation is executed, giving the chance to add
|
|
69
|
-
// additional settings to it
|
|
70
|
-
virtual void filterRDI(SMART_RDI::dcBase & prdi) {
|
|
71
|
-
}
|
|
72
|
-
virtual void filterRDI(SMART_RDI::DIG_CAP & prdi) {
|
|
73
|
-
}
|
|
74
|
-
virtual void filterRDI(SMART_RDI::FUNC & prdi) {
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// If the test has a hold state, this will be called immediately after the hold
|
|
78
|
-
// state pattern has run
|
|
79
|
-
virtual void holdStateFunc() {
|
|
80
|
-
}
|
|
81
|
-
virtual void holdStateFunc(int site) {
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// Called after the last RDI operation has executed and all results have been
|
|
85
|
-
// fetched
|
|
86
|
-
virtual void postTestFunc() {
|
|
87
|
-
}
|
|
88
|
-
virtual void postTestFunc(int site) {
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// Called immediately before the final result processing. If the test is configured for async
|
|
92
|
-
// processing then this will be called later in the background. Contrast this with the
|
|
93
|
-
// postTestFunc which will be called before the main test body completes.
|
|
94
|
-
virtual void processFunc(int site) {
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// Called before the main test result is judged, giving a chance to transform it
|
|
98
|
-
virtual double filterResult(double result) {
|
|
99
|
-
return result;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
virtual bool async() {
|
|
103
|
-
return _async;
|
|
104
|
-
}
|
|
105
|
-
virtual bool syncup() {
|
|
106
|
-
return _syncup;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
virtual void serialProcessing(int site) {};
|
|
110
|
-
|
|
111
|
-
void enableHiddenUpload() {
|
|
112
|
-
if (async()) {
|
|
113
|
-
rdi.hiddenUpload(TA::ALL);
|
|
114
|
-
} else {
|
|
115
|
-
rdi.hiddenUpload(TA::NO);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
void callPreTestFunc() {
|
|
120
|
-
if (syncup()) {
|
|
121
|
-
synchronize();
|
|
122
|
-
}
|
|
123
|
-
preTestFunc();
|
|
124
|
-
FOR_EACH_SITE_BEGIN();
|
|
125
|
-
preTestFunc(CURRENT_SITE_NUMBER());
|
|
126
|
-
FOR_EACH_SITE_END();
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
void callHoldStateFunc() {
|
|
130
|
-
holdStateFunc();
|
|
131
|
-
FOR_EACH_SITE_BEGIN();
|
|
132
|
-
holdStateFunc(CURRENT_SITE_NUMBER());
|
|
133
|
-
FOR_EACH_SITE_END();
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
template <class T>
|
|
137
|
-
void callPostTestFunc(T* obj) {
|
|
138
|
-
ON_FIRST_INVOCATION_BEGIN();
|
|
139
|
-
postTestFunc();
|
|
140
|
-
FOR_EACH_SITE_BEGIN();
|
|
141
|
-
postTestFunc(CURRENT_SITE_NUMBER());
|
|
142
|
-
FOR_EACH_SITE_END();
|
|
143
|
-
ON_FIRST_INVOCATION_END();
|
|
144
|
-
|
|
145
|
-
if (async()) {
|
|
146
|
-
SMC_ARM_internal(obj);
|
|
147
|
-
} else {
|
|
148
|
-
processFunc(CURRENT_SITE_NUMBER());
|
|
149
|
-
this->serialProcessing(CURRENT_SITE_NUMBER());
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
};
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
#endif /* BASE_HPP_ */
|
|
@@ -1,182 +0,0 @@
|
|
|
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
|
-
pin(extractPinsFromGroup(_pin));
|
|
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
|
-
|
|
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().testnumber(testnumber()).cont(true).testname(testSuiteName + "_PRE").judgeAndLog_FunctionalTest(funcResultsPre[site] == 1);
|
|
158
|
-
|
|
159
|
-
logParametricTest(testSuiteName, site, filterResult(results[site]), limits(), _pin);
|
|
160
|
-
TESTSET().testnumber(testnumber() + 1).cont(true).judgeAndLog_ParametricTest(_pin, testSuiteName, limits(), filterResult(results[site]));
|
|
161
|
-
|
|
162
|
-
if (_applyShutdown && _checkShutdown) {
|
|
163
|
-
logFunctionalTest(testSuiteName, site, funcResultsPost[site] == 1, _shutdownPattern);
|
|
164
|
-
TESTSET().testnumber(testnumber() + 2).cont(true).testname(testSuiteName + "_POST").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
|
-
}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
#ifndef ORIGEN_TEST_METHOD_DC_MEASUREMENT_INCLUDED
|
|
2
|
-
#define ORIGEN_TEST_METHOD_DC_MEASUREMENT_INCLUDED
|
|
3
|
-
|
|
4
|
-
#include "base.hpp"
|
|
5
|
-
#include "mapi.hpp"
|
|
6
|
-
#include "rdi.hpp"
|
|
7
|
-
|
|
8
|
-
using namespace std;
|
|
9
|
-
|
|
10
|
-
namespace Origen {
|
|
11
|
-
namespace TestMethod {
|
|
12
|
-
|
|
13
|
-
class DCMeasurement: public Base {
|
|
14
|
-
void serialProcessing(int site);
|
|
15
|
-
|
|
16
|
-
int _applyShutdown;
|
|
17
|
-
string _shutdownPattern;
|
|
18
|
-
int _checkShutdown;
|
|
19
|
-
string _measure;
|
|
20
|
-
double _settlingTime;
|
|
21
|
-
string _pin;
|
|
22
|
-
double _forceValue;
|
|
23
|
-
double _iRange;
|
|
24
|
-
int _processResults;
|
|
25
|
-
int _badc;
|
|
26
|
-
|
|
27
|
-
public:
|
|
28
|
-
DCMeasurement();
|
|
29
|
-
virtual ~DCMeasurement();
|
|
30
|
-
void SMC_backgroundProcessing();
|
|
31
|
-
void execute();
|
|
32
|
-
|
|
33
|
-
DCMeasurement & applyShutdown(int v);
|
|
34
|
-
DCMeasurement & shutdownPattern(string v);
|
|
35
|
-
DCMeasurement & checkShutdown(int v);
|
|
36
|
-
DCMeasurement & measure(string v);
|
|
37
|
-
DCMeasurement & settlingTime(double v);
|
|
38
|
-
DCMeasurement & pin(string v);
|
|
39
|
-
DCMeasurement & forceValue(double v);
|
|
40
|
-
DCMeasurement & iRange(double v);
|
|
41
|
-
DCMeasurement & processResults(int v);
|
|
42
|
-
DCMeasurement & badc(int v);
|
|
43
|
-
|
|
44
|
-
protected:
|
|
45
|
-
DCMeasurement & getThis();
|
|
46
|
-
|
|
47
|
-
// Member/instance variables, declared outside the execute function body since
|
|
48
|
-
// they may be useful to refer to in callback functions
|
|
49
|
-
ARRAY_I activeSites;
|
|
50
|
-
string testSuiteName;
|
|
51
|
-
string label;
|
|
52
|
-
vector<int> funcResultsPre;
|
|
53
|
-
vector<int> funcResultsPost;
|
|
54
|
-
vector<double> results;
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
#endif
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
#include "frequency_measurement.hpp"
|
|
2
|
-
|
|
3
|
-
using namespace std;
|
|
4
|
-
|
|
5
|
-
namespace Origen {
|
|
6
|
-
namespace TestMethod {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
FrequencyMeasurement::FrequencyMeasurement() {
|
|
10
|
-
samples(2000);
|
|
11
|
-
processResults(1);
|
|
12
|
-
}
|
|
13
|
-
FrequencyMeasurement::~FrequencyMeasurement() { }
|
|
14
|
-
|
|
15
|
-
/// By default the limits are assumed to be expressed as a frequency, set this to 1 if they refer to a target period
|
|
16
|
-
FrequencyMeasurement & FrequencyMeasurement::periodBased(int v) { _periodBased = v; return *this; }
|
|
17
|
-
/// REQUIRED: The name of the pin being measured
|
|
18
|
-
FrequencyMeasurement & FrequencyMeasurement::pin(string v) { _pin = v; return *this; }
|
|
19
|
-
/// The number of samples captured by the pattern, the default is 2000
|
|
20
|
-
FrequencyMeasurement & FrequencyMeasurement::samples(int v) { _samples = v; return *this; }
|
|
21
|
-
/// REQUIRED: Supply the period of the captured vectors in nanoseconds
|
|
22
|
-
FrequencyMeasurement & FrequencyMeasurement::periodInNs(int v) { _periodInNs = v; return *this; }
|
|
23
|
-
/// When set to 0 the results of the test will not be judged or logged
|
|
24
|
-
FrequencyMeasurement & FrequencyMeasurement::processResults(int v) { _processResults = v; return *this; }
|
|
25
|
-
|
|
26
|
-
// All test methods must implement these functions
|
|
27
|
-
FrequencyMeasurement & FrequencyMeasurement::getThis() { return *this; }
|
|
28
|
-
|
|
29
|
-
void FrequencyMeasurement::execute() {
|
|
30
|
-
|
|
31
|
-
int site, physicalSites;
|
|
32
|
-
ARRAY_I sites;
|
|
33
|
-
|
|
34
|
-
ON_FIRST_INVOCATION_BEGIN();
|
|
35
|
-
|
|
36
|
-
enableHiddenUpload();
|
|
37
|
-
GET_ACTIVE_SITES(activeSites);
|
|
38
|
-
physicalSites = GET_CONFIGURED_SITES(sites);
|
|
39
|
-
funcResults.resize(physicalSites + 1);
|
|
40
|
-
GET_TESTSUITE_NAME(testSuiteName);
|
|
41
|
-
label = Primary.getLabel();
|
|
42
|
-
pin(extractPinsFromGroup(_pin));
|
|
43
|
-
|
|
44
|
-
callPreTestFunc();
|
|
45
|
-
|
|
46
|
-
RDI_BEGIN();
|
|
47
|
-
|
|
48
|
-
SMART_RDI::DIG_CAP & prdi = rdi.digCap(testSuiteName)
|
|
49
|
-
.label(label)
|
|
50
|
-
.pin(_pin)
|
|
51
|
-
.bitPerWord(1)
|
|
52
|
-
.samples(_samples);
|
|
53
|
-
|
|
54
|
-
filterRDI(prdi);
|
|
55
|
-
prdi.execute();
|
|
56
|
-
|
|
57
|
-
RDI_END();
|
|
58
|
-
|
|
59
|
-
FOR_EACH_SITE_BEGIN();
|
|
60
|
-
site = CURRENT_SITE_NUMBER();
|
|
61
|
-
funcResults[site] = rdi.getBurstPassFail();
|
|
62
|
-
FOR_EACH_SITE_END();
|
|
63
|
-
|
|
64
|
-
ON_FIRST_INVOCATION_END();
|
|
65
|
-
|
|
66
|
-
callPostTestFunc(this);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
void FrequencyMeasurement::serialProcessing(int site) {
|
|
70
|
-
if (_processResults) {
|
|
71
|
-
double result;
|
|
72
|
-
ARRAY_I captureData = rdi.site(site).id(testSuiteName).getVector();
|
|
73
|
-
|
|
74
|
-
if (_periodBased) {
|
|
75
|
-
result = calculatePeriod(captureData, _periodInNs);
|
|
76
|
-
} else {
|
|
77
|
-
result = calculateFrequency(captureData, _periodInNs);
|
|
78
|
-
}
|
|
79
|
-
logFunctionalTest(testSuiteName, site, funcResults[site] == 1, label);
|
|
80
|
-
TESTSET().testnumber(testnumber()).cont(true).testname(testSuiteName).judgeAndLog_FunctionalTest(funcResults[site] == 1);
|
|
81
|
-
|
|
82
|
-
logParametricTest(testSuiteName, site, filterResult(result), limits(), _pin);
|
|
83
|
-
TESTSET().testnumber(testnumber() + 1).judgeAndLog_ParametricTest(_pin, testSuiteName, limits(), filterResult(result));
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
void FrequencyMeasurement::SMC_backgroundProcessing() {
|
|
88
|
-
double result;
|
|
89
|
-
|
|
90
|
-
for (int i = 0; i < activeSites.size(); i++) {
|
|
91
|
-
int site = activeSites[i];
|
|
92
|
-
processFunc(site);
|
|
93
|
-
if (_processResults) {
|
|
94
|
-
ARRAY_I captureData = rdi.site(site).id(testSuiteName).getVector();
|
|
95
|
-
if (_periodBased) {
|
|
96
|
-
result = calculatePeriod(captureData, _periodInNs);
|
|
97
|
-
} else {
|
|
98
|
-
result = calculateFrequency(captureData, _periodInNs);
|
|
99
|
-
}
|
|
100
|
-
SMC_TEST(site, "", testSuiteName, LIMIT(TM::GE, 1, TM::LE, 1), funcResults[site]);
|
|
101
|
-
SMC_TEST(site, _pin, testSuiteName, limits(), filterResult(result));
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
}
|
|
107
|
-
}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
#ifndef ORIGEN_TEST_METHOD_FREQUENCY_MEASUREMENT_INCLUDED
|
|
2
|
-
#define ORIGEN_TEST_METHOD_FREQUENCY_MEASUREMENT_INCLUDED
|
|
3
|
-
|
|
4
|
-
#include "base.hpp"
|
|
5
|
-
#include "mapi.hpp"
|
|
6
|
-
#include "rdi.hpp"
|
|
7
|
-
|
|
8
|
-
using namespace std;
|
|
9
|
-
|
|
10
|
-
namespace Origen {
|
|
11
|
-
namespace TestMethod {
|
|
12
|
-
|
|
13
|
-
class FrequencyMeasurement: public Base {
|
|
14
|
-
void serialProcessing(int site);
|
|
15
|
-
|
|
16
|
-
int _periodBased;
|
|
17
|
-
string _pin;
|
|
18
|
-
int _samples;
|
|
19
|
-
int _periodInNs;
|
|
20
|
-
int _processResults;
|
|
21
|
-
|
|
22
|
-
public:
|
|
23
|
-
FrequencyMeasurement();
|
|
24
|
-
virtual ~FrequencyMeasurement();
|
|
25
|
-
void SMC_backgroundProcessing();
|
|
26
|
-
void execute();
|
|
27
|
-
|
|
28
|
-
FrequencyMeasurement & periodBased(int v);
|
|
29
|
-
FrequencyMeasurement & pin(string v);
|
|
30
|
-
FrequencyMeasurement & samples(int v);
|
|
31
|
-
FrequencyMeasurement & periodInNs(int v);
|
|
32
|
-
FrequencyMeasurement & processResults(int v);
|
|
33
|
-
|
|
34
|
-
protected:
|
|
35
|
-
FrequencyMeasurement & getThis();
|
|
36
|
-
|
|
37
|
-
// Internal variables, declared outside the the execute function body since
|
|
38
|
-
// they may be useful in callback functions
|
|
39
|
-
ARRAY_I activeSites;
|
|
40
|
-
string testSuiteName;
|
|
41
|
-
string label;
|
|
42
|
-
vector<int> funcResults;
|
|
43
|
-
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
#endif
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
#include "functional_test.hpp"
|
|
2
|
-
|
|
3
|
-
using namespace std;
|
|
4
|
-
|
|
5
|
-
namespace Origen {
|
|
6
|
-
namespace TestMethod {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
FunctionalTest::FunctionalTest() {
|
|
10
|
-
pin("");
|
|
11
|
-
capture(0);
|
|
12
|
-
processResults(1);
|
|
13
|
-
bitPerWord(1);
|
|
14
|
-
pattern("");
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
FunctionalTest::~FunctionalTest() { }
|
|
18
|
-
|
|
19
|
-
/// The functional test method can optionally capture data by supplying the number of vectors to capture
|
|
20
|
-
FunctionalTest & FunctionalTest::capture(int v) { _capture = v; return *this; }
|
|
21
|
-
/// If data capture is requested, supply the pin to capture data from
|
|
22
|
-
FunctionalTest & FunctionalTest::pin(string v) { _pin = v; return *this; }
|
|
23
|
-
/// Serial capture data will be grouped into words, specify how many bits per word in the serial stream (default 1)
|
|
24
|
-
FunctionalTest & FunctionalTest::bitPerWord(int v) { _bitPerWord = v; return *this; }
|
|
25
|
-
/// When set to 0 the results of the test will not be judged or logged
|
|
26
|
-
FunctionalTest & FunctionalTest::processResults(int v) { _processResults = v; return *this; }
|
|
27
|
-
/// Override the pattern argument from the test suite
|
|
28
|
-
FunctionalTest & FunctionalTest::pattern(string v) { _pattern = v; return *this; }
|
|
29
|
-
|
|
30
|
-
// All test methods must implement this function
|
|
31
|
-
FunctionalTest & FunctionalTest::getThis() { return *this; }
|
|
32
|
-
|
|
33
|
-
void FunctionalTest::execute() {
|
|
34
|
-
|
|
35
|
-
int site, physicalSites;
|
|
36
|
-
ARRAY_I sites;
|
|
37
|
-
|
|
38
|
-
ON_FIRST_INVOCATION_BEGIN();
|
|
39
|
-
|
|
40
|
-
enableHiddenUpload();
|
|
41
|
-
GET_ACTIVE_SITES(activeSites);
|
|
42
|
-
physicalSites = GET_CONFIGURED_SITES(sites);
|
|
43
|
-
results.resize(physicalSites + 1);
|
|
44
|
-
GET_TESTSUITE_NAME(testSuiteName);
|
|
45
|
-
// testSuiteName = testSuiteName + toStr(CURRENT_SITE_NUMBER());
|
|
46
|
-
// cout << testSuiteName << endl;
|
|
47
|
-
if (_pattern == "") {
|
|
48
|
-
label = Primary.getLabel();
|
|
49
|
-
} else {
|
|
50
|
-
label = _pattern;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
if (_capture) {
|
|
54
|
-
pinName = extractPinsFromGroup(_pin);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
callPreTestFunc();
|
|
58
|
-
|
|
59
|
-
RDI_BEGIN();
|
|
60
|
-
|
|
61
|
-
if (_capture) {
|
|
62
|
-
SMART_RDI::DIG_CAP & prdi = rdi.digCap(testSuiteName)
|
|
63
|
-
.label(label)
|
|
64
|
-
.pin(pinName)
|
|
65
|
-
.bitPerWord(_bitPerWord)
|
|
66
|
-
.samples(_capture);
|
|
67
|
-
filterRDI(prdi);
|
|
68
|
-
prdi.execute();
|
|
69
|
-
|
|
70
|
-
} else {
|
|
71
|
-
SMART_RDI::FUNC & prdi = rdi.func(testSuiteName).label(label);
|
|
72
|
-
// SMART_RDI::FUNC & prdi = rdi.func(testSuiteName).burst(label);
|
|
73
|
-
filterRDI(prdi);
|
|
74
|
-
prdi.execute();
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
RDI_END();
|
|
78
|
-
|
|
79
|
-
FOR_EACH_SITE_BEGIN();
|
|
80
|
-
site = CURRENT_SITE_NUMBER();
|
|
81
|
-
if (_capture) {
|
|
82
|
-
results[site] = rdi.site(site).getBurstPassFail();
|
|
83
|
-
// cout << "PRE " << site << ": " << results[site] << endl;
|
|
84
|
-
|
|
85
|
-
} else {
|
|
86
|
-
results[site] = rdi.site(site).id(testSuiteName).getPassFail();
|
|
87
|
-
// cout << "PRE " << site << ": " << results[site] << endl;
|
|
88
|
-
}
|
|
89
|
-
FOR_EACH_SITE_END();
|
|
90
|
-
|
|
91
|
-
ON_FIRST_INVOCATION_END();
|
|
92
|
-
|
|
93
|
-
callPostTestFunc(this);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
/// Returns the captured data for the site currently in focus
|
|
97
|
-
ARRAY_I FunctionalTest::capturedData() {
|
|
98
|
-
return rdi.id(testSuiteName).getVector(pinName);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/// Returns the captured data for the given site number
|
|
102
|
-
ARRAY_I FunctionalTest::capturedData(int site) {
|
|
103
|
-
return rdi.site(site).id(testSuiteName).getVector(pinName);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
void FunctionalTest::serialProcessing(int site) {
|
|
107
|
-
if (_processResults) {
|
|
108
|
-
// cout << "POST " << site << ": " << results[site] << endl;
|
|
109
|
-
logFunctionalTest(testSuiteName, site, results[site] == 1, label);
|
|
110
|
-
TESTSET().testnumber(testnumber()).testname(testSuiteName).judgeAndLog_FunctionalTest(results[site] == 1);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
void FunctionalTest::SMC_backgroundProcessing() {
|
|
115
|
-
for (int i = 0; i < activeSites.size(); i++) {
|
|
116
|
-
int site = activeSites[i];
|
|
117
|
-
processFunc(site);
|
|
118
|
-
if (_processResults) {
|
|
119
|
-
SMC_TEST(site, "", testSuiteName, LIMIT(TM::GE, 1, TM::LE, 1), results[activeSites[i]]);
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
}
|
|
125
|
-
}
|