origen_std_lib 0.9.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. checksums.yaml +5 -5
  2. data/config/application.rb +7 -19
  3. data/config/commands.rb +9 -0
  4. data/config/version.rb +1 -2
  5. data/lib/origen_std_lib/v93k.rb +17 -1
  6. data/{stdlib/v93k → src/advantest/smt7}/origen/.cproject +0 -0
  7. data/{stdlib/v93k → src/advantest/smt7}/origen/.project +0 -0
  8. data/src/advantest/smt7/origen/origen.cpp +18 -0
  9. data/{stdlib/v93k → src/advantest/smt7}/origen/origen.hpp +3 -3
  10. data/{stdlib/v93k → src/advantest/smt7}/origen/origen/helpers.hpp +25 -8
  11. data/src/advantest/smt7/origen/origen/helpers/console.cpp +94 -0
  12. data/src/advantest/smt7/origen/origen/helpers/misc.cpp +456 -0
  13. data/src/advantest/smt7/origen/origen/helpers/time.cpp +64 -0
  14. data/src/advantest/smt7/origen/origen/site.cpp +237 -0
  15. data/src/advantest/smt7/origen/origen/site.hpp +49 -0
  16. data/{stdlib/v93k → src/advantest/smt7}/origen/origen/test_method.hpp +1 -3
  17. data/src/advantest/smt7/origen/origen/test_method/base.cpp +231 -0
  18. data/src/advantest/smt7/origen/origen/test_method/base.hpp +155 -0
  19. data/src/advantest/smt7/origen/origen/test_method/dc_measurement.cpp +266 -0
  20. data/src/advantest/smt7/origen/origen/test_method/dc_measurement.hpp +58 -0
  21. data/src/advantest/smt7/origen/origen/test_method/empty.cpp +13 -0
  22. data/src/advantest/smt7/origen/origen/test_method/empty.hpp +24 -0
  23. data/src/advantest/smt7/origen/origen/test_method/frequency_measurement.cpp +133 -0
  24. data/src/advantest/smt7/origen/origen/test_method/frequency_measurement.hpp +46 -0
  25. data/src/advantest/smt7/origen/origen/test_method/functional_test.cpp +168 -0
  26. data/src/advantest/smt7/origen/origen/test_method/functional_test.hpp +53 -0
  27. data/{stdlib/v93k → src/advantest/smt7}/origen/origen/utils.hpp +1 -3
  28. data/src/advantest/smt7/origen/origen/utils/version.cpp +72 -0
  29. data/{stdlib/v93k → src/advantest/smt7}/origen/origen/utils/version.hpp +20 -21
  30. data/src/advantest/smt7/origen/test_methods/ApplyBin.cpp +37 -0
  31. data/src/advantest/smt7/origen/test_methods/DCMeasurement.cpp +90 -0
  32. data/src/advantest/smt7/origen/test_methods/FrequencyMeasurement.cpp +50 -0
  33. data/src/advantest/smt7/origen/test_methods/FunctionalTest.cpp +24 -0
  34. data/src/advantest/smt7/origen/test_methods/RecordBin.cpp +39 -0
  35. data/src/advantest/smt8/origen/common/Origen.java +334 -0
  36. data/src/advantest/smt8/origen/common/OrigenData.java +391 -0
  37. data/src/advantest/smt8/origen/common/OrigenHelpers.java +170 -0
  38. data/src/advantest/smt8/origen/test_methods/Base.java +265 -0
  39. data/src/advantest/smt8/origen/test_methods/DC_Measurement.java +302 -0
  40. data/src/advantest/smt8/origen/test_methods/Empty.java +12 -0
  41. data/src/advantest/smt8/origen/test_methods/Functional_test.java +474 -0
  42. data/templates/web/faq.md.erb +1 -52
  43. data/templates/web/guides/intro.md.erb +8 -0
  44. data/templates/web/guides/{v93k/intro.md.erb → v93ksmt7/capture.md.erb} +0 -2
  45. data/templates/web/guides/v93ksmt7/complete.md.erb +68 -0
  46. data/templates/web/guides/v93ksmt7/customizable.md.erb +139 -0
  47. data/templates/web/guides/v93ksmt7/helpers.md.erb +3 -0
  48. data/templates/web/guides/{v93k → v93ksmt7}/install.md.erb +1 -1
  49. data/templates/web/guides/v93ksmt7/integration.md.erb +3 -0
  50. data/templates/web/guides/v93ksmt7/intro.md.erb +8 -0
  51. data/templates/web/guides/v93ksmt7/patching.md.erb +3 -0
  52. data/templates/web/guides/v93ksmt8/intro.md.erb +9 -0
  53. data/templates/web/index.md.erb +23 -6
  54. data/templates/web/layouts/_guides.html.erb +15 -3
  55. data/templates/web/partials/_common_args.md.erb +13 -0
  56. data/templates/web/partials/_navbar.html.erb +2 -2
  57. metadata +52 -33
  58. data/stdlib/v93k/origen/origen.cpp +0 -22
  59. data/stdlib/v93k/origen/origen/helpers/console.cpp +0 -105
  60. data/stdlib/v93k/origen/origen/helpers/misc.cpp +0 -311
  61. data/stdlib/v93k/origen/origen/site.cpp +0 -220
  62. data/stdlib/v93k/origen/origen/site.hpp +0 -51
  63. data/stdlib/v93k/origen/origen/test_method/base.hpp +0 -156
  64. data/stdlib/v93k/origen/origen/test_method/dc_measurement.cpp +0 -182
  65. data/stdlib/v93k/origen/origen/test_method/dc_measurement.hpp +0 -59
  66. data/stdlib/v93k/origen/origen/test_method/frequency_measurement.cpp +0 -107
  67. data/stdlib/v93k/origen/origen/test_method/frequency_measurement.hpp +0 -48
  68. data/stdlib/v93k/origen/origen/test_method/functional_test.cpp +0 -118
  69. data/stdlib/v93k/origen/origen/test_method/functional_test.hpp +0 -51
  70. data/stdlib/v93k/origen/origen/utils/version.cpp +0 -79
  71. data/stdlib/v93k/origen/test_methods/ApplyBin.cpp +0 -41
  72. data/stdlib/v93k/origen/test_methods/DCMeasurement.cpp +0 -129
  73. data/stdlib/v93k/origen/test_methods/FrequencyMeasurement.cpp +0 -93
  74. data/stdlib/v93k/origen/test_methods/FunctionalTest.cpp +0 -94
  75. data/stdlib/v93k/origen/test_methods/RecordBin.cpp +0 -48
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 90e033ed9a86e3be90b87659b9c9e5dc7f861240
4
- data.tar.gz: b24eb49d30dba303bf7660150872b8a7a82269ff
2
+ SHA256:
3
+ metadata.gz: 14b8444afc790a16b209561fafbdf315859448bdaa3b56672fa49bf9a3d626f6
4
+ data.tar.gz: 33df693bbc10b1d9b37fb8da1afb27947f029a46fc65ac74e88652cb9bcf53b6
5
5
  SHA512:
6
- metadata.gz: ebca35973aa2876aa8d8d9586958ea342d305e2c963aa0948afb62dfaf64160937b514e01bca3bf1716705ceb953af207bff30935337b4a8cde3ed46ef89e05e
7
- data.tar.gz: 4f134a1d9a9013d8217b93bae014dd4f42e34b9729b9c6ca6f7493f54db7246d56b54e4c4729f9bfe91ed7efbbac7d0b577acb7cd6075de4e0fd17c459f5ca60
6
+ metadata.gz: a8673d212602dcc57418e3d59da651cd76feeb430dc279bff640be8bb13de98782271bea9f0cffc451c1077d63e96c988dcebf60cd4629a83de81cfab750710b
7
+ data.tar.gz: dc9b3b4278b940f2e683c00f95835b143dbc812ab146c1d0f858fc4a229425094bd9d959c0b4e206cea6a493524f821a5350930cdc8503de41daaf169caaba65
@@ -38,29 +38,18 @@ class OrigenStdLibApplication < Origen::Application
38
38
 
39
39
  config.semantically_version = true
40
40
 
41
- # Copy the std lib into the app area for inclusion in the gem package
42
41
  def before_release_gem
43
- d = "#{Origen.root}/stdlib/v93k"
44
- FileUtils.rm_rf(d) if File.exist?(d)
45
- FileUtils.mkdir_p(d)
46
42
  # Remove all untracked files, e.g. compiled binaries
47
- system "git clean -f -d -x #{Origen.root}/../v93k"
48
- system "git clean -f -d #{Origen.root}/../v93k"
49
- FileUtils.cp_r("#{Origen.root}/../v93k/src/origen", d)
50
- end
51
-
52
- # Get rid of the local std lib copy after building
53
- def after_release_gem
54
- FileUtils.rm_rf "#{Origen.root}/stdlib"
43
+ system "git clean -f -d -x #{Origen.root}/src"
44
+ system "git clean -f -d #{Origen.root}/src"
55
45
  end
56
46
 
57
47
  def after_web_site_compile(options={})
58
48
  if options[:api]
59
- Dir.chdir "#{Origen.app.rc.root}/v93k" do
60
- system "doxygen .doxygen"
61
- d = "#{Origen.root}/web/output"
62
- FileUtils.mkdir_p(d)
63
- FileUtils.mv "html", "#{d}/v93k"
49
+ f = Origen.root.join "web", "output", "v93k_smt7"
50
+ FileUtils.mkdir_p(f)
51
+ Dir.chdir Origen.root.join "src", "advantest", "smt7", "origen" do
52
+ system "doxygen #{Origen.root.join('config', 'doxygen', 'v93k_smt7')}"
64
53
  end
65
54
  end
66
55
  end
@@ -92,7 +81,7 @@ class OrigenStdLibApplication < Origen::Application
92
81
  def before_release_tag(identifier, note, type, selector, options)
93
82
  v = Origen::VersionString.new(identifier)
94
83
  # Update the version in the C code
95
- f = "#{Origen.app.rc.root}/v93k/src/origen/origen.hpp"
84
+ f = File.join(Origen.root, "src", "advantest", "smt7", "origen", "origen.hpp")
96
85
  data = File.read(f)
97
86
  filtered_data = data.sub(/#define ORIGEN_VERSION \"\d+\.\d+\.\d+\"/, "#define ORIGEN_VERSION \"#{v}\"")
98
87
  File.open(f, "w") do |f|
@@ -138,5 +127,4 @@ class OrigenStdLibApplication < Origen::Application
138
127
  #config.pattern_name_translator do |name|
139
128
  # name.gsub(/_b\d/, "_bx")
140
129
  #end
141
-
142
130
  end
@@ -13,6 +13,14 @@ aliases ={
13
13
  # Now branch to the specific task code
14
14
  case @command
15
15
 
16
+ when "format"
17
+ Dir.glob("#{Origen.root}/src/**/*.{cpp,hpp}").each do |f|
18
+ system "clang-format -i #{f}"
19
+ end
20
+ java_files = Dir.glob("#{Origen.root}/src/**/*.java")
21
+ system "java -jar vendor/google-java-format-1.7-all-deps.jar --replace #{java_files.join(' ')}"
22
+ exit 0
23
+
16
24
  ## Example of how to make a command to run unit tests, this simply invokes RSpec on
17
25
  ## the spec directory
18
26
  #when "specs"
@@ -55,6 +63,7 @@ else
55
63
  # before handing control back to Origen. Un-comment the example below to get started.
56
64
  @application_commands = <<-EOT
57
65
  examples Run the examples (tests), -c will enable coverage
66
+ format Format/prettify the library source files (requires clang-format and java to be available)
58
67
  EOT
59
68
 
60
69
  end
@@ -1,8 +1,7 @@
1
1
  module OrigenStdLib
2
2
  MAJOR = 0
3
- MINOR = 9
3
+ MINOR = 13
4
4
  BUGFIX = 0
5
5
  DEV = nil
6
-
7
6
  VERSION = [MAJOR, MINOR, BUGFIX].join(".") + (DEV ? ".pre#{DEV}" : '')
8
7
  end
@@ -4,6 +4,11 @@ module OrigenStdLib
4
4
  class_name: 'origen',
5
5
 
6
6
  functional_test: {
7
+ port: [:string, ''],
8
+ test_name: [:string, ''],
9
+ force_pass: [:boolean, false],
10
+ on_pass_flag: [:string, ''],
11
+ on_fail_flag: [:string, '']
7
12
  },
8
13
 
9
14
  dc_measurement: {
@@ -15,9 +20,15 @@ module OrigenStdLib
15
20
  measure: [:string, 'VOLT', %w(VOLT CURR v i voltage current)],
16
21
  settling_time: [:double, 0],
17
22
  pin: [:string, nil],
23
+ port: [:string, ''],
18
24
  force_value: [:double, 0],
19
25
  i_range: [:integer, nil],
20
26
  badc: [:integer, 0],
27
+ test_name: [:string, ''],
28
+ force_pass: [:boolean, false],
29
+ on_pass_flag: [:string, ''],
30
+ on_fail_flag: [:string, ''],
31
+
21
32
  methods: {
22
33
  finalize: lambda do |tm|
23
34
  # Clean up the measurement type parameter
@@ -40,8 +51,13 @@ module OrigenStdLib
40
51
  frequency_measurement: {
41
52
  period_based: [:integer, 0],
42
53
  pin: [:string, nil],
54
+ port: [:string, ''],
43
55
  samples: [:integer, 2000],
44
- period_in_ns: [:integer, nil]
56
+ period_in_ns: [:integer, nil],
57
+ test_name: [:string, ''],
58
+ force_pass: [:boolean, false],
59
+ on_pass_flag: [:string, ''],
60
+ on_fail_flag: [:string, '']
45
61
  },
46
62
 
47
63
  record_bin: {
@@ -0,0 +1,18 @@
1
+ /** @file */
2
+ #include "origen.hpp"
3
+
4
+ namespace Origen {
5
+
6
+ Utils::Version version() {
7
+ Utils::Version v(ORIGEN_VERSION);
8
+ return v;
9
+ }
10
+
11
+ vector<Site> Sites;
12
+
13
+ Site& site() { return Sites[CURRENT_SITE_NUMBER()]; }
14
+
15
+ Site& site(int site) { return Sites[site]; }
16
+
17
+ bool invertFunctionalResults = false;
18
+ }
@@ -1,15 +1,15 @@
1
1
  #ifndef ORIGEN_HPP_INCLUDED
2
2
  #define ORIGEN_HPP_INCLUDED
3
3
 
4
- #define ORIGEN_VERSION "0.9.0"
4
+ #define ORIGEN_VERSION "0.13.0"
5
5
 
6
6
  #ifndef debugger
7
7
  #define debugger __asm__("int $3");
8
8
  #endif
9
9
 
10
- #include "origen/utils.hpp"
11
10
  #include "origen/helpers.hpp"
12
11
  #include "origen/site.hpp"
12
+ #include "origen/utils.hpp"
13
13
 
14
14
  namespace Origen {
15
15
 
@@ -17,6 +17,6 @@ extern vector Sites;
17
17
  Utils::Version version();
18
18
  Site& site();
19
19
  Site& site(int site);
20
-
20
+ extern bool invertFunctionalResults;
21
21
  }
22
22
  #endif
@@ -1,28 +1,33 @@
1
1
  #ifndef ORIGEN_HELPERS_INCLUDED
2
2
  #define ORIGEN_HELPERS_INCLUDED
3
3
 
4
+ #include <stdlib.h>
5
+ #include <cerrno>
6
+ #include <string>
7
+ #include "../origen.hpp"
4
8
  #include "mapi.hpp"
5
9
  #include "rdi.hpp"
6
- #include <string>
7
10
 
8
11
  using namespace std;
9
12
 
10
13
  namespace Origen {
11
14
 
12
15
  string extractPinsFromGroup(const string&);
16
+ bool pinExists(const string& pinName);
13
17
  void synchronize(double = 1);
14
18
  double calculateFrequency(const ARRAY_I&, double);
15
19
  double calculatePeriod(const ARRAY_I&, double);
20
+ void overlaySubroutineOutput(string, string, uint64_t, int, int, int);
16
21
  void overlaySubroutine(string, string, uint64_t, int);
17
22
  void reverseOverlaySubroutine(string, string, uint64_t, int);
18
23
  int numberOfOnes(uint32_t);
19
24
  int numberOfZeros(uint32_t);
20
- int64_t toInt (string, int = 0);
21
- uint64_t toUInt (string, int = 0);
25
+ int64_t toInt(string, int = 0);
26
+ uint64_t toUInt(string, int = 0);
22
27
  vector<string> split(const string&, char);
23
28
  void split(const string&, char, vector<string>&);
24
- string toHex (const uint64_t&);
25
- string toStr (const uint64_t&);
29
+ string toHex(const uint64_t&);
30
+ string toStr(const uint64_t&);
26
31
  void initializeSites();
27
32
  void logParametricTest(string, int, double, LIMIT, string);
28
33
  void logFunctionalTest(string, int, bool, string);
@@ -30,16 +35,28 @@ bool isPass(double, LIMIT);
30
35
  string loStr(LIMIT);
31
36
  string hiStr(LIMIT);
32
37
  string upcase(string);
38
+ string downcase(string);
33
39
  string lpad(string, int, char);
34
40
  string rpad(string, int, char);
35
41
  bool isEven(uint64_t);
36
42
  bool isOdd(uint64_t);
37
43
  LIMIT noLimits();
38
44
  uint64_t flip(uint64_t, int);
39
- string ltrim(string, const char * remove_chars = " \n\t\r\f\v");
40
- string rtrim(string, const char * remove_chars = " \n\t\r\f\v");
41
- string trim(string, const char * remove_chars = " \n\t\r\f\v");
45
+ string ltrim(string, const char* remove_chars = " \n\t\r\f\v");
46
+ string rtrim(string, const char* remove_chars = " \n\t\r\f\v");
47
+ string trim(string, const char* remove_chars = " \n\t\r\f\v");
48
+ double getUnitMultiplier(const string& units);
49
+ string getLabelFromBurst(const string& burst, const string& port);
50
+ string checksum16bits(const string&);
42
51
 
52
+ namespace Time {
53
+ void initTime(bool = false);
54
+ int month();
55
+ int day();
56
+ int hour();
57
+ int minute();
58
+ int second();
59
+ }
43
60
  }
44
61
 
45
62
  #endif
@@ -0,0 +1,94 @@
1
+ /** @file */
2
+ #include "../helpers.hpp"
3
+
4
+ namespace Origen {
5
+
6
+ /// Prints the result of a parametric test to the console
7
+ void logParametricTest(string name, int site, double result, LIMIT limits,
8
+ string pin) {
9
+ cout << site << " ";
10
+ if (isPass(result, limits))
11
+ cout << " ";
12
+ else
13
+ cout << "FAIL ";
14
+ cout << left << setw(65) << setfill(' ') << name << " ";
15
+ cout << left << setw(20) << setfill(' ') << loStr(limits) << " ";
16
+ cout << left << setw(20) << setfill(' ') << result;
17
+ cout << left << setw(20) << setfill(' ') << hiStr(limits);
18
+ cout << pin << endl;
19
+ }
20
+
21
+ /// Returns a LIMIT object with no limits enabled
22
+ LIMIT noLimits() { return LIMIT(TM::NA, 0, TM::NA, 0); }
23
+
24
+ /// Prints the result of a functional test to the console
25
+ void logFunctionalTest(string name, int site, bool passed, string pattern) {
26
+ cout << site << " ";
27
+ if (passed)
28
+ cout << " ";
29
+ else
30
+ cout << "FAIL ";
31
+ cout << left << setw(65) << setfill(' ') << name << " ";
32
+ cout << pattern << endl;
33
+ }
34
+
35
+ /// Converts the low limit in the given LIMIT object into a string, where an
36
+ /// empty string will be returned if the limit is not enabled
37
+ string loStr(LIMIT limits) {
38
+ double lo = 0.0;
39
+ double* plo = &lo;
40
+ TM::COMPARE clo;
41
+
42
+ clo = limits.getLow(plo);
43
+
44
+ if (clo == TM::NA) {
45
+ return "";
46
+ } else {
47
+ stringstream val;
48
+ val << lo;
49
+ return val.str();
50
+ }
51
+ }
52
+
53
+ /// Converts the high limit in the given LIMIT object into a string, where an
54
+ /// empty string will be returned if the limit is not enabled
55
+ string hiStr(LIMIT limits) {
56
+ double hi = 0.0;
57
+ double* phi = &hi;
58
+ TM::COMPARE chi;
59
+
60
+ chi = limits.getHigh(phi);
61
+
62
+ if (chi == TM::NA) {
63
+ return "";
64
+ } else {
65
+ stringstream val;
66
+ val << hi;
67
+ return val.str();
68
+ }
69
+ }
70
+ /// Returns true if the result is within the given limits
71
+ bool isPass(double val, LIMIT limits) {
72
+ double lo = 0.0;
73
+ double hi = 0.0;
74
+ double* plo = &lo;
75
+ double* phi = &hi;
76
+ TM::COMPARE clo, chi;
77
+ bool result;
78
+
79
+ clo = limits.getLow(plo);
80
+ chi = limits.getHigh(phi);
81
+
82
+ result = true;
83
+
84
+ if (clo != TM::NA) {
85
+ if (clo == TM::GE && val < lo) result = false;
86
+ if (clo == TM::GT && val <= lo) result = false;
87
+ }
88
+ if (chi != TM::NA) {
89
+ if (chi == TM::LE && val > hi) result = false;
90
+ if (chi == TM::LT && val >= hi) result = false;
91
+ }
92
+ return result;
93
+ }
94
+ }
@@ -0,0 +1,456 @@
1
+ /** @file */
2
+ #include "../helpers.hpp"
3
+
4
+ using namespace std;
5
+
6
+ namespace Origen {
7
+
8
+ uint64_t flip(uint64_t input, int size) {
9
+ uint64_t output = 0;
10
+ for (int i = 0; i < size; i++) {
11
+ output <<= 1;
12
+ output |= input & 1;
13
+ input >>= 1;
14
+ }
15
+ return output;
16
+ }
17
+
18
+ /// Split the given string by the given delimiter and return the results in a
19
+ /// vector of strings
20
+ ///
21
+ /// split("AB1234-24", '-') // => ["AB1234", "24"]
22
+ vector<string> split(const string &str, char delim) {
23
+ vector<string> elems;
24
+ split(str, delim, elems);
25
+ return elems;
26
+ }
27
+
28
+ /// This version places the result in the supplied vector rather than returning
29
+ /// a new one
30
+ void split(const string &str, char delim, vector<string> &elems) {
31
+ stringstream ss;
32
+ ss.str(str);
33
+ string item;
34
+ while (getline(ss, item, delim)) {
35
+ elems.push_back(item);
36
+ }
37
+ }
38
+
39
+ ///
40
+ string ltrim(string str, const char *remove_chars /* = " \n\t\r\f\v" */) {
41
+ str.erase(0, str.find_first_not_of(remove_chars));
42
+ return str;
43
+ }
44
+
45
+ string rtrim(string str, const char *remove_chars /* = " \n\t\r\f\v" */) {
46
+ str.erase(str.find_last_not_of(remove_chars) + 1);
47
+ return str;
48
+ }
49
+
50
+ string trim(string str, const char *remove_chars /* = " \n\t\r\f\v" */) {
51
+ str = rtrim(str, remove_chars);
52
+ str = ltrim(str, remove_chars);
53
+ return str;
54
+ }
55
+
56
+ /// Convert the given string to a 64-bit integer. Works for both decimal and hex
57
+ /// strings as
58
+ /// shown in the examples below.
59
+ ///
60
+ /// If the string is not successfully converted the site in focus will be binned
61
+ /// out.
62
+ ///
63
+ /// toInt("0xFF") // => 255
64
+ /// toInt("FF", 16) // => 255 (must declare base 16 if no leading 0x)
65
+ /// toInt("255") // => 255
66
+ int64_t toInt(string str, int base) {
67
+ str = trim(str); // Remove any whitespace
68
+ str = ltrim(str, "0"); // Remove any leading 0's
69
+ if (str == "") {
70
+ return 0;
71
+ }
72
+ char *end;
73
+ char *cstr = const_cast<char *>(str.c_str());
74
+ long long int l;
75
+ errno = 0;
76
+ l = strtoll(cstr, &end, base);
77
+ if ((errno == ERANGE && l == LLONG_MAX) || l > LLONG_MAX) {
78
+ cout << "ERROR: String conversion overflowed a 64-bit integer - " << str
79
+ << endl;
80
+ ERROR_EXIT(TM::EXIT_FLOW);
81
+ }
82
+ if ((errno == ERANGE && l == LLONG_MIN) || l < LLONG_MIN) {
83
+ cout << "ERROR: String conversion underflowed a 64-bit integer - " << str
84
+ << endl;
85
+ ERROR_EXIT(TM::EXIT_FLOW);
86
+ }
87
+ if (*cstr == '\0' || *end != '\0') {
88
+ cout << "ERROR: String is not convertible to a 64-bit integer - " << str
89
+ << endl;
90
+ ERROR_EXIT(TM::EXIT_FLOW);
91
+ }
92
+ return (int64_t)l;
93
+ }
94
+
95
+ /// See toInt, but returns an unsigned 64-bit integer
96
+ uint64_t toUInt(string str, int base) {
97
+ str = trim(str); // Remove any whitespace
98
+ str = ltrim(str, "0"); // Remove any leading 0's
99
+ if (str == "") {
100
+ return 0;
101
+ }
102
+
103
+ char *end;
104
+ char *cstr = const_cast<char *>(str.c_str());
105
+ unsigned long long int l;
106
+ errno = 0;
107
+ l = strtoull(cstr, &end, base);
108
+ if (errno == ERANGE && l == ULLONG_MAX) {
109
+ cout << "ERROR: String conversion was out of the range of a UInt64 - "
110
+ << str << endl;
111
+ ERROR_EXIT(TM::EXIT_FLOW);
112
+ }
113
+ if (*cstr == '\0' || *end != '\0') {
114
+ cout << "ERROR: String is not convertible to a UInt64 - " << str << endl;
115
+ ERROR_EXIT(TM::EXIT_FLOW);
116
+ }
117
+ return (uint64_t)l;
118
+ }
119
+
120
+ /// Convert the given number to a hex string
121
+ ///
122
+ /// toHex(255); // => "ff"
123
+ string toHex(const uint64_t &val) {
124
+ stringstream stream;
125
+ stream << hex << val;
126
+ return stream.str();
127
+ }
128
+
129
+ /// Convert the given number to a string
130
+ ///
131
+ /// toStr(255); // => "255"
132
+ string toStr(const uint64_t &val) {
133
+ stringstream stream;
134
+ stream << val;
135
+ return stream.str();
136
+ }
137
+
138
+ /// Uppercase the given string
139
+ ///
140
+ /// upcase("ff"); // => "FF"
141
+ string upcase(string base) {
142
+ transform(base.begin(), base.end(), base.begin(), ::toupper);
143
+ return base;
144
+ }
145
+
146
+ /// Lowercase the given string
147
+ ///
148
+ /// downcase("FF"); // => "ff"
149
+ string downcase(string base) {
150
+ transform(base.begin(), base.end(), base.begin(), ::tolower);
151
+ return base;
152
+ }
153
+
154
+ /// Extend the string to the given size, padding with the given character on the
155
+ /// left
156
+ ///
157
+ /// lpad("FF", 4, '0'); // => "00FF"
158
+ string lpad(string base, int length, char fill) {
159
+ stringstream padded;
160
+ padded << right << setw(length) << setfill(fill) << base;
161
+ return padded.str();
162
+ }
163
+
164
+ /// Extend the string to the given size, padding with the given character on the
165
+ /// right
166
+ ///
167
+ /// rpad("FF", 4, ' '); // => "FF "
168
+ string rpad(string base, int length, char fill) {
169
+ stringstream padded;
170
+ padded << left << setw(length) << setfill(fill) << base;
171
+ return padded.str();
172
+ }
173
+
174
+ /// Returns true if the given number is even
175
+ bool isEven(uint64_t number) { return number % 2 == 0; }
176
+
177
+ /// Returns true if the given number is odd
178
+ bool isOdd(uint64_t number) { return number % 2 != 0; }
179
+
180
+ /// Overlays the given data on the given pin, starting from the first vector of
181
+ /// the given pattern
182
+ /// must provide the waveform indices used for output high and low
183
+ void overlaySubroutineOutput(string subroutinePattern, string pin,
184
+ uint64_t data, int size, int loOutputIndex,
185
+ int hiOutputIndex) {
186
+ string p = extractPinsFromGroup(pin);
187
+ // string pat = getTdiLabelName(subroutinePattern);
188
+ string pat = subroutinePattern;
189
+ VEC_LABEL_EDIT ov(pat, p);
190
+
191
+ // Need to use a vector here so the size can be determined at runtime
192
+ vector<VECTOR_DATA> vecData(size);
193
+
194
+ for (int i = 0; i < size; i++) {
195
+ int val = (data & (1 << i)) >> i;
196
+ if (val == 1)
197
+ val = hiOutputIndex;
198
+ else
199
+ val = loOutputIndex;
200
+ VECTOR_DATA v = {i, val};
201
+ vecData[i] = v;
202
+ }
203
+
204
+ // However the downloadUserVectors function only accepts an array, so use this
205
+ // trick
206
+ // to create an array instance that points to the vector data
207
+ VECTOR_DATA *vecDataArray = &vecData[0];
208
+
209
+ ov.downloadUserVectors(vecDataArray, size);
210
+ }
211
+
212
+ /// Overlays the given data on the given pin, starting from the first vector of
213
+ /// the given pattern
214
+ void overlaySubroutine(string subroutinePattern, string pin, uint64_t data,
215
+ int size) {
216
+ string p = extractPinsFromGroup(pin);
217
+ string pat = subroutinePattern;
218
+ VEC_LABEL_EDIT ov(pat, p);
219
+
220
+ // Need to use a vector here so the size can be determined at runtime
221
+ vector<VECTOR_DATA> vecData(size);
222
+
223
+ for (int i = 0; i < size; i++) {
224
+ int val = (data & (1 << i)) >> i;
225
+ VECTOR_DATA v = {i, val};
226
+ vecData[i] = v;
227
+ }
228
+
229
+ // However the downloadUserVectors function only accepts an array, so use this
230
+ // trick
231
+ // to create an array instance that points to the vector data
232
+ VECTOR_DATA *vecDataArray = &vecData[0];
233
+
234
+ ov.downloadUserVectors(vecDataArray, size);
235
+ }
236
+
237
+ /// Same as overlaySubroutine but the data is applied in reverse order
238
+ void reverseOverlaySubroutine(string subroutinePattern, string pin,
239
+ uint64_t data, int size) {
240
+ string p = extractPinsFromGroup(pin);
241
+ string pat = subroutinePattern;
242
+ VEC_LABEL_EDIT ov(pat, p);
243
+
244
+ // Need to use a vector here so the size can be determined at runtime
245
+ vector<VECTOR_DATA> vecData(size);
246
+
247
+ for (int i = 0; i < size; i++) {
248
+ int j = size - 1 - i;
249
+ int val = (data & (1 << j)) >> j;
250
+ VECTOR_DATA v = {i, val};
251
+ vecData[i] = v;
252
+ }
253
+
254
+ // However the downloadUserVectors function only accepts an array, so use this
255
+ // trick
256
+ // to create an array instance that points to the vector data
257
+ VECTOR_DATA *vecDataArray = &vecData[0];
258
+
259
+ ov.downloadUserVectors(vecDataArray, size);
260
+ }
261
+
262
+ /// Returns the number of 1's (bits that are set) in the given 32-bit number
263
+ int numberOfOnes(uint32_t i) {
264
+ i = i - ((i >> 1) & 0x55555555);
265
+ i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
266
+ return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
267
+ }
268
+
269
+ /// Returns the number of 0's (bits that are not set) in the given 32-bit number
270
+ int numberOfZeros(uint32_t i) { return 32 - numberOfOnes(i); }
271
+
272
+ double calculateFrequency(const ARRAY_I &captureData, double periodInNs) {
273
+ int iFreqCount;
274
+ double dFreq_MHz;
275
+
276
+ iFreqCount = 0;
277
+ for (int j = 0; j < captureData.size() - 1; j++) {
278
+ if ((captureData[j + 1] - captureData[j]) == 1) {
279
+ iFreqCount++;
280
+ }
281
+ }
282
+ dFreq_MHz = iFreqCount / ((periodInNs / 1000) * captureData.size());
283
+ return dFreq_MHz * 1000000;
284
+ }
285
+
286
+ double calculatePeriod(const ARRAY_I &captureData, double periodInNs) {
287
+ return 1 / calculateFrequency(captureData, periodInNs);
288
+ }
289
+
290
+ /// Call to wait for all SMC threads to complete, supply the max amount of
291
+ /// seconds to wait
292
+ void synchronize(double timeout) {
293
+ bool ok;
294
+ int site = CURRENT_SITE_NUMBER();
295
+
296
+ if (timeout) {
297
+ ok = SMC_SYNCHRONIZE(timeout s);
298
+ } else {
299
+ ok = SMC_SYNCHRONIZE();
300
+ }
301
+
302
+ if (!ok) {
303
+ cout << "ERROR: All SMC threads not complete after " << timeout
304
+ << " second(s) on site " << site << endl;
305
+ ERROR_EXIT(TM::EXIT_FLOW);
306
+ }
307
+ }
308
+
309
+ // Check to see if a pin exists in current pin config
310
+ bool pinExists(const string &pinName) {
311
+ stringstream fw_command;
312
+ string fw_answer;
313
+ bool result;
314
+
315
+ fw_command << "dfpn? (" << pinName << ")" << endl;
316
+
317
+ FW_TASK(fw_command.str(), fw_answer);
318
+ fw_command.str(std::string());
319
+
320
+ result = !(fw_answer.empty());
321
+ return result;
322
+ }
323
+
324
+ /// Supply a pin alias name and get the name of the physical pin returned
325
+ string extractPinsFromGroup(const string &groupname) {
326
+ string pinlist;
327
+
328
+ try {
329
+ pinlist = PinUtility.createPinListFromPinNames(
330
+ PinUtility.getDigitalPinNamesFromPinList(
331
+ groupname, TM::ALL_DIGITAL, true, true,
332
+ PIN_UTILITY::DEFINITION_ORDER));
333
+ } catch (...) {
334
+ cout << "ERROR: Pingroup " << groupname << " not found." << endl;
335
+ ERROR_EXIT(TM::ABORT_FLOW);
336
+ }
337
+
338
+ return pinlist;
339
+ }
340
+
341
+ // Initializes the site objects that are used to store the ECID, this should be
342
+ // called at
343
+ // the start of the test flow if using the Origen.site API
344
+ void initializeSites() {
345
+ INT num_of_sites;
346
+ ARRAY_I sites;
347
+
348
+ ON_FIRST_INVOCATION_BEGIN();
349
+
350
+ num_of_sites = GET_CONFIGURED_SITES(sites);
351
+
352
+ // Leave an empty space at 0, easier then to fetch by site number (which start
353
+ // at 1)
354
+ Origen::Sites.resize(num_of_sites + 1, Origen::Site(0));
355
+
356
+ Origen::Time::initTime(); // take snapshot of current time for later use
357
+
358
+ ON_FIRST_INVOCATION_END();
359
+
360
+ // Instantiate a new site object and save it in the global site array
361
+ Origen::Site site(CURRENT_SITE_NUMBER());
362
+
363
+ Origen::Sites[CURRENT_SITE_NUMBER()] = site;
364
+ }
365
+
366
+ double getUnitMultiplier(const string &units) {
367
+ double mult;
368
+
369
+ if (units.find("nA") != string::npos) {
370
+ mult = 1e9;
371
+ } else if (units.find("uA") != string::npos) {
372
+ mult = 1e6;
373
+ } else if (units.find("mA") != string::npos) {
374
+ mult = 1e3;
375
+ } else if (units.find("A") != string::npos) {
376
+ mult = 1;
377
+ } else if (units.find("nV") != string::npos) {
378
+ mult = 1e9;
379
+ } else if (units.find("uV") != string::npos) {
380
+ mult = 1e6;
381
+ } else if (units.find("mV") != string::npos) {
382
+ mult = 1e3;
383
+ } else if (units.find("V") != string::npos) {
384
+ mult = 1;
385
+ } else if (units.find("Kohm") != string::npos) {
386
+ mult = 1e-3;
387
+ } else if (units.find("ns") != string::npos) {
388
+ mult = 1e9;
389
+ } else if (units.find("us") != string::npos) {
390
+ mult = 1e6;
391
+ } else if (units.find("ms") != string::npos) {
392
+ mult = 1e3;
393
+ } else if (units.find("s") != string::npos) {
394
+ mult = 1;
395
+ } else if (units.find("KHz") != string::npos) {
396
+ mult = 1e-3;
397
+ } else if (units.find("MHz") != string::npos) {
398
+ mult = 1e-6;
399
+ } else {
400
+ mult = 1;
401
+ }
402
+
403
+ return mult;
404
+ }
405
+
406
+ string getLabelFromBurst(const string &burst, const string &port) {
407
+ ////////////////////////////////////////////////////////////////////
408
+ // Note this function will always return the first label in a burst
409
+ ////////////////////////////////////////////////////////////////////
410
+ string answer;
411
+ stringstream ss;
412
+
413
+ ss << "sqpg? \"" << burst << "\",(" << port << ")" << endl;
414
+
415
+ FW_TASK(ss.str(), answer);
416
+
417
+ ss.str("");
418
+
419
+ int fc = answer.find_first_of("\"") + 1;
420
+ int len = answer.find_last_of("\"") - fc;
421
+
422
+ return (answer.substr(fc, len));
423
+ }
424
+
425
+ string checksum16bits(const string &mystring) {
426
+ long flag;
427
+ long poly = 0xa001;
428
+ long crc = 0xffff;
429
+ string crc16;
430
+
431
+ vector<char> ch(mystring.begin(), mystring.end());
432
+
433
+ for (unsigned int i = 0; i < ch.size(); i++) {
434
+ crc ^= static_cast<int>(ch[i]);
435
+
436
+ for (unsigned int j = 0; j < 8; j++) {
437
+ flag = crc & long(0x1);
438
+ crc /= long(0x2);
439
+
440
+ if (flag == 1) crc ^= poly;
441
+ }
442
+ }
443
+
444
+ unsigned n;
445
+ stringstream ss;
446
+ ss << hex << (crc & long(0xffff));
447
+ ss >> n;
448
+ ss.str("");
449
+
450
+ bitset<16> bstr(n);
451
+
452
+ crc16 = bstr.to_string();
453
+
454
+ return crc16;
455
+ }
456
+ }