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.
- 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.cpp +18 -0
- data/{stdlib/v93k → src/advantest/smt7}/origen/origen.hpp +3 -3
- data/{stdlib/v93k → src/advantest/smt7}/origen/origen/helpers.hpp +25 -8
- 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/src/advantest/smt7/origen/origen/site.cpp +237 -0
- data/src/advantest/smt7/origen/origen/site.hpp +49 -0
- data/{stdlib/v93k → src/advantest/smt7}/origen/origen/test_method.hpp +1 -3
- 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/utils.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/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.cpp +0 -22
- 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 -118
- data/stdlib/v93k/origen/origen/test_method/functional_test.hpp +0 -51
- data/stdlib/v93k/origen/origen/utils/version.cpp +0 -79
- 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
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
#include "version.hpp"
|
|
2
|
+
using namespace std;
|
|
3
|
+
|
|
4
|
+
#include <sstream>
|
|
5
|
+
|
|
6
|
+
namespace Origen {
|
|
7
|
+
namespace Utils {
|
|
8
|
+
|
|
9
|
+
Version::Version(string ver) {
|
|
10
|
+
vector<int> v = parse(ver);
|
|
11
|
+
_major = v[0];
|
|
12
|
+
_minor = v[1];
|
|
13
|
+
_tiny = v[2];
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
int Version::major() { return _major; }
|
|
17
|
+
int Version::minor() { return _minor; }
|
|
18
|
+
int Version::tiny() { return _tiny; }
|
|
19
|
+
|
|
20
|
+
string Version::str() {
|
|
21
|
+
ostringstream str;
|
|
22
|
+
str << _major;
|
|
23
|
+
str << ".";
|
|
24
|
+
str << _minor;
|
|
25
|
+
str << ".";
|
|
26
|
+
str << _tiny;
|
|
27
|
+
return str.str();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
bool Version::operator==(string rhs) {
|
|
31
|
+
vector<int> v = parse(rhs);
|
|
32
|
+
return _major == v[0] && _minor == v[1] && _tiny == v[2];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
bool Version::operator!=(string rhs) {
|
|
36
|
+
vector<int> v = parse(rhs);
|
|
37
|
+
return _major != v[0] || _minor != v[1] || _tiny != v[2];
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
bool Version::operator<(string rhs) {
|
|
41
|
+
vector<int> v = parse(rhs);
|
|
42
|
+
return _major < v[0] || (_major == v[0] && _minor < v[1]) ||
|
|
43
|
+
(_major == v[0] && _minor == v[1] && _tiny < v[2]);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
bool Version::operator<=(string rhs) {
|
|
47
|
+
return operator==(rhs) || operator<(rhs);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
bool Version::operator>(string rhs) {
|
|
51
|
+
vector<int> v = parse(rhs);
|
|
52
|
+
return _major > v[0] || (_major == v[0] && _minor > v[1]) ||
|
|
53
|
+
(_major == v[0] && _minor == v[1] && _tiny > v[2]);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
bool Version::operator>=(string rhs) {
|
|
57
|
+
return operator==(rhs) || operator>(rhs);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
vector<int> Version::parse(string ver) {
|
|
61
|
+
vector<int> v(3);
|
|
62
|
+
|
|
63
|
+
istringstream parser(ver);
|
|
64
|
+
parser >> v[0];
|
|
65
|
+
for (int i = 1; i < 3; i++) {
|
|
66
|
+
parser.get(); // Skip dot
|
|
67
|
+
parser >> v[i];
|
|
68
|
+
}
|
|
69
|
+
return v;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
|
|
4
4
|
// GCC adds these macros by default, which clobbers our functions
|
|
5
5
|
// of the same name
|
|
6
|
-
#if (defined(__GNUC__) || defined(__GNUG__)) &&
|
|
6
|
+
#if (defined(__GNUC__) || defined(__GNUG__)) && \
|
|
7
|
+
!(defined(__clang__) || defined(__INTEL_COMPILER))
|
|
7
8
|
// Not exactly sure the version that this becomes a problem, but for
|
|
8
9
|
// now this fixes the build on the V93K production system
|
|
9
10
|
#if (__GNUC_MINOR__ > 1)
|
|
@@ -37,27 +38,25 @@ namespace Utils {
|
|
|
37
38
|
// // Do something
|
|
38
39
|
// }
|
|
39
40
|
class Version {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
string str();
|
|
41
|
+
private:
|
|
42
|
+
vector<int> parse(string ver);
|
|
43
|
+
int _major;
|
|
44
|
+
int _minor;
|
|
45
|
+
int _tiny;
|
|
46
|
+
|
|
47
|
+
public:
|
|
48
|
+
int major();
|
|
49
|
+
int minor();
|
|
50
|
+
int tiny();
|
|
51
|
+
Version(string ver);
|
|
52
|
+
bool operator==(string rhs);
|
|
53
|
+
bool operator!=(string rhs);
|
|
54
|
+
bool operator<(string rhs);
|
|
55
|
+
bool operator<=(string rhs);
|
|
56
|
+
bool operator>(string rhs);
|
|
57
|
+
bool operator>=(string rhs);
|
|
58
|
+
string str();
|
|
59
59
|
};
|
|
60
|
-
|
|
61
60
|
}
|
|
62
61
|
}
|
|
63
62
|
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
#include "testmethod.hpp"
|
|
2
|
+
|
|
3
|
+
// for test method API interfaces
|
|
4
|
+
#include "mapi.hpp"
|
|
5
|
+
using namespace std;
|
|
6
|
+
#include "origen.hpp"
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Test method class.
|
|
10
|
+
*
|
|
11
|
+
* For each testsuite using this test method, one object of this
|
|
12
|
+
* class is created.
|
|
13
|
+
*/
|
|
14
|
+
class OrigenApplyBin : public testmethod::TestMethod {
|
|
15
|
+
protected:
|
|
16
|
+
/**
|
|
17
|
+
*Initialize the parameter interface to the testflow.
|
|
18
|
+
*This method is called just once after a testsuite is created.
|
|
19
|
+
*/
|
|
20
|
+
virtual void initialize() {
|
|
21
|
+
// Add your initialization code here
|
|
22
|
+
// Note: Test Method API should not be used in this method!
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
*This test is invoked per site.
|
|
27
|
+
*/
|
|
28
|
+
virtual void run() {
|
|
29
|
+
if (Origen::site().bin() || Origen::site().softbin()) {
|
|
30
|
+
stringstream softbin;
|
|
31
|
+
softbin << Origen::site().softbin();
|
|
32
|
+
SET_MULTIBIN(softbin.str(), Origen::site().bin());
|
|
33
|
+
TESTSET().judgeAndLog_FunctionalTest(false);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
REGISTER_TESTMETHOD("ApplyBin", OrigenApplyBin);
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
#include "origen/test_method/dc_measurement.hpp"
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Test method class.
|
|
5
|
+
*
|
|
6
|
+
* For each testsuite using this test method, one object of this
|
|
7
|
+
* class is created.
|
|
8
|
+
*/
|
|
9
|
+
class OrigenDCMeasurement : public Origen::TestMethod::DCMeasurement {
|
|
10
|
+
protected:
|
|
11
|
+
int mApplyShutdown;
|
|
12
|
+
string mShutdownPattern;
|
|
13
|
+
string mMeasure;
|
|
14
|
+
double mSettlingTime;
|
|
15
|
+
string mPin;
|
|
16
|
+
string mPort;
|
|
17
|
+
double mForceValue;
|
|
18
|
+
double mIRange;
|
|
19
|
+
int mCheckShutdown;
|
|
20
|
+
int mBadc;
|
|
21
|
+
|
|
22
|
+
protected:
|
|
23
|
+
/**
|
|
24
|
+
*Initialize the parameter interface to the testflow.
|
|
25
|
+
*This method is called just once after a testsuite is created.
|
|
26
|
+
*/
|
|
27
|
+
virtual void init() {
|
|
28
|
+
// Add your initialization code here
|
|
29
|
+
// Note: Test Method API should not be used in this method!
|
|
30
|
+
addParameter("applyShutdown", "int", &mApplyShutdown,
|
|
31
|
+
testmethod::TM_PARAMETER_INPUT)
|
|
32
|
+
.setDefault("1")
|
|
33
|
+
.setComment("Apply a shutdown pattern after taking the measurement");
|
|
34
|
+
addParameter("shutdownPattern", "string", &mShutdownPattern,
|
|
35
|
+
testmethod::TM_PARAMETER_INPUT)
|
|
36
|
+
.setComment(
|
|
37
|
+
"The name of the shutdown pattern, by default it will be the main "
|
|
38
|
+
"pattern name appended with '_part1'");
|
|
39
|
+
addParameter("checkShutdown", "int", &mCheckShutdown,
|
|
40
|
+
testmethod::TM_PARAMETER_INPUT)
|
|
41
|
+
.setDefault("1")
|
|
42
|
+
.setComment("Check that the shutdown pattern passed (and fail if not)");
|
|
43
|
+
addParameter("measure", "string", &mMeasure, testmethod::TM_PARAMETER_INPUT)
|
|
44
|
+
.setDefault("VOLT")
|
|
45
|
+
.setComment("Measure 'CURR' or 'VOLT' (the default)");
|
|
46
|
+
addParameter("settlingTime", "double", &mSettlingTime,
|
|
47
|
+
testmethod::TM_PARAMETER_INPUT)
|
|
48
|
+
.setDefault("0")
|
|
49
|
+
.setComment(
|
|
50
|
+
"Time to wait between running the pattern and taking the "
|
|
51
|
+
"measurement, expressed in ms");
|
|
52
|
+
addParameter("pin", "PinString", &mPin, testmethod::TM_PARAMETER_INPUT)
|
|
53
|
+
.setComment("Pin to be measured");
|
|
54
|
+
addParameter("port", "string", &mPort, testmethod::TM_PARAMETER_INPUT)
|
|
55
|
+
.setDefault("")
|
|
56
|
+
.setComment("Port the pattern is to be executed on");
|
|
57
|
+
addParameter("forceValue", "double", &mForceValue,
|
|
58
|
+
testmethod::TM_PARAMETER_INPUT)
|
|
59
|
+
.setDefault("0")
|
|
60
|
+
.setComment("Value to be forced on the pin during the measurement");
|
|
61
|
+
addParameter("iRange", "double", &mIRange, testmethod::TM_PARAMETER_INPUT)
|
|
62
|
+
.setDefault("0")
|
|
63
|
+
.setComment(
|
|
64
|
+
"The current range to apply to the measurement (in A), will be "
|
|
65
|
+
"calculated if not supplied (set to 0)");
|
|
66
|
+
addParameter("badc", "int", &mBadc, testmethod::TM_PARAMETER_INPUT)
|
|
67
|
+
.setDefault("0")
|
|
68
|
+
.setComment(
|
|
69
|
+
"Perform the measurement using the Board ADC (rather than the "
|
|
70
|
+
"PPMU)");
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
*This test is invoked per site.
|
|
75
|
+
*/
|
|
76
|
+
virtual void body() {
|
|
77
|
+
origen.applyShutdown(mApplyShutdown)
|
|
78
|
+
.forceValue(mForceValue)
|
|
79
|
+
.shutdownPattern(mShutdownPattern)
|
|
80
|
+
.checkShutdown(mCheckShutdown)
|
|
81
|
+
.measure(mMeasure)
|
|
82
|
+
.settlingTime(mSettlingTime)
|
|
83
|
+
.pin(mPin)
|
|
84
|
+
.port(mPort)
|
|
85
|
+
.iRange(mIRange)
|
|
86
|
+
.badc(mBadc)
|
|
87
|
+
.execute();
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
REGISTER_TESTMETHOD("DCMeasurement", OrigenDCMeasurement);
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
#include "origen/test_method/frequency_measurement.hpp"
|
|
2
|
+
|
|
3
|
+
class OrigenFrequencyMeasurement
|
|
4
|
+
: public Origen::TestMethod::FrequencyMeasurement {
|
|
5
|
+
protected:
|
|
6
|
+
int mPeriodBased;
|
|
7
|
+
string mPin;
|
|
8
|
+
string mPort;
|
|
9
|
+
int mSamples;
|
|
10
|
+
int mPeriodInNs;
|
|
11
|
+
|
|
12
|
+
protected:
|
|
13
|
+
/**
|
|
14
|
+
*Initialize the parameter interface to the testflow.
|
|
15
|
+
*This method is called just once after a testsuite is created.
|
|
16
|
+
*/
|
|
17
|
+
virtual void init() {
|
|
18
|
+
addParameter("periodBased", "int", &mPeriodBased,
|
|
19
|
+
testmethod::TM_PARAMETER_INPUT)
|
|
20
|
+
.setDefault("0")
|
|
21
|
+
.setComment(
|
|
22
|
+
"Set to 1 if the limits are expressed as a period instead of a "
|
|
23
|
+
"frequency (the default)");
|
|
24
|
+
addParameter("pin", "PinString", &mPin, testmethod::TM_PARAMETER_INPUT)
|
|
25
|
+
.setComment("Pin to be measured");
|
|
26
|
+
addParameter("port", "string", &mPort, testmethod::TM_PARAMETER_INPUT)
|
|
27
|
+
.setDefault("")
|
|
28
|
+
.setComment("Port the pattern is to be executed on");
|
|
29
|
+
addParameter("samples", "int", &mSamples, testmethod::TM_PARAMETER_INPUT)
|
|
30
|
+
.setDefault("2000")
|
|
31
|
+
.setComment(
|
|
32
|
+
"The number of captures made by the pattern, defaults to 2000");
|
|
33
|
+
addParameter("periodInNs", "int", &mPeriodInNs,
|
|
34
|
+
testmethod::TM_PARAMETER_INPUT)
|
|
35
|
+
.setComment("The period of the capture vectors");
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
*This test is invoked per site.
|
|
40
|
+
*/
|
|
41
|
+
virtual void body() {
|
|
42
|
+
origen.periodBased(mPeriodBased)
|
|
43
|
+
.pin(mPin)
|
|
44
|
+
.port(mPort)
|
|
45
|
+
.samples(mSamples)
|
|
46
|
+
.periodInNs(mPeriodInNs)
|
|
47
|
+
.execute();
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
REGISTER_TESTMETHOD("FrequencyMeasurement", OrigenFrequencyMeasurement);
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#include "origen/test_method/functional_test.hpp"
|
|
2
|
+
|
|
3
|
+
class OrigenFunctionalTest : public Origen::TestMethod::FunctionalTest {
|
|
4
|
+
protected:
|
|
5
|
+
string mPort;
|
|
6
|
+
|
|
7
|
+
protected:
|
|
8
|
+
/**
|
|
9
|
+
*Initialize the parameter interface to the testflow.
|
|
10
|
+
*This method is called just once after a testsuite is created.
|
|
11
|
+
*/
|
|
12
|
+
virtual void init() {
|
|
13
|
+
// NOTE: The capture arguments are not listed here since it makes no sense
|
|
14
|
+
// to use them without
|
|
15
|
+
// corresponding functions to handle the captured data
|
|
16
|
+
|
|
17
|
+
addParameter("port", "string", &mPort, testmethod::TM_PARAMETER_INPUT)
|
|
18
|
+
.setDefault("")
|
|
19
|
+
.setComment("Port the pattern is to be executed on");
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
virtual void body() { origen.port(mPort).execute(); }
|
|
23
|
+
};
|
|
24
|
+
REGISTER_TESTMETHOD("FunctionalTest", OrigenFunctionalTest);
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#include "testmethod.hpp"
|
|
2
|
+
|
|
3
|
+
// for test method API interfaces
|
|
4
|
+
#include "mapi.hpp"
|
|
5
|
+
using namespace std;
|
|
6
|
+
#include "origen.hpp"
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Test method class.
|
|
10
|
+
*
|
|
11
|
+
* For each testsuite using this test method, one object of this
|
|
12
|
+
* class is created.
|
|
13
|
+
*/
|
|
14
|
+
class OrigenRecordBin : public testmethod::TestMethod {
|
|
15
|
+
protected:
|
|
16
|
+
int mBin;
|
|
17
|
+
int mSoftbin;
|
|
18
|
+
|
|
19
|
+
protected:
|
|
20
|
+
/**
|
|
21
|
+
*Initialize the parameter interface to the testflow.
|
|
22
|
+
*This method is called just once after a testsuite is created.
|
|
23
|
+
*/
|
|
24
|
+
virtual void initialize() {
|
|
25
|
+
// Add your initialization code here
|
|
26
|
+
// Note: Test Method API should not be used in this method!
|
|
27
|
+
addParameter("bin", "int", &mBin, testmethod::TM_PARAMETER_INPUT);
|
|
28
|
+
addParameter("softbin", "int", &mSoftbin, testmethod::TM_PARAMETER_INPUT);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
*This test is invoked per site.
|
|
33
|
+
*/
|
|
34
|
+
virtual void run() {
|
|
35
|
+
Origen::site().bin(mBin);
|
|
36
|
+
Origen::site().softbin(mSoftbin);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
REGISTER_TESTMETHOD("RecordBin", OrigenRecordBin);
|
|
@@ -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
|
+
}
|