origen_testers 0.4.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 (199) hide show
  1. checksums.yaml +7 -0
  2. data/config/application.rb +140 -0
  3. data/config/commands.rb +73 -0
  4. data/config/development.rb +12 -0
  5. data/config/environment.rb +1 -0
  6. data/config/shared_commands.rb +47 -0
  7. data/config/users.rb +18 -0
  8. data/config/version.rb +8 -0
  9. data/lib/commands/build.rb +69 -0
  10. data/lib/origen_testers.rb +23 -0
  11. data/lib/origen_testers/api.rb +258 -0
  12. data/lib/origen_testers/basic_test_setups.rb +105 -0
  13. data/lib/origen_testers/callback_handlers.rb +58 -0
  14. data/lib/origen_testers/generator.rb +279 -0
  15. data/lib/origen_testers/generator/flow_control_api.rb +611 -0
  16. data/lib/origen_testers/generator/identity_map.rb +23 -0
  17. data/lib/origen_testers/generator/placeholder.rb +11 -0
  18. data/lib/origen_testers/generator/test_numberer.rb +23 -0
  19. data/lib/origen_testers/igxl_based_tester.rb +12 -0
  20. data/lib/origen_testers/igxl_based_tester/base.rb +641 -0
  21. data/lib/origen_testers/igxl_based_tester/base/flow.rb +171 -0
  22. data/lib/origen_testers/igxl_based_tester/base/flow_line.rb +322 -0
  23. data/lib/origen_testers/igxl_based_tester/base/generator.rb +217 -0
  24. data/lib/origen_testers/igxl_based_tester/base/patgroup.rb +109 -0
  25. data/lib/origen_testers/igxl_based_tester/base/patgroups.rb +38 -0
  26. data/lib/origen_testers/igxl_based_tester/base/patset.rb +68 -0
  27. data/lib/origen_testers/igxl_based_tester/base/patset_pattern.rb +56 -0
  28. data/lib/origen_testers/igxl_based_tester/base/patsets.rb +38 -0
  29. data/lib/origen_testers/igxl_based_tester/base/patsubr.rb +68 -0
  30. data/lib/origen_testers/igxl_based_tester/base/patsubr_pattern.rb +56 -0
  31. data/lib/origen_testers/igxl_based_tester/base/patsubrs.rb +38 -0
  32. data/lib/origen_testers/igxl_based_tester/base/test_instance.rb +326 -0
  33. data/lib/origen_testers/igxl_based_tester/base/test_instance_group.rb +58 -0
  34. data/lib/origen_testers/igxl_based_tester/base/test_instances.rb +179 -0
  35. data/lib/origen_testers/igxl_based_tester/files.rb +43 -0
  36. data/lib/origen_testers/igxl_based_tester/j750.rb +248 -0
  37. data/lib/origen_testers/igxl_based_tester/j750/flow.rb +10 -0
  38. data/lib/origen_testers/igxl_based_tester/j750/flow_line.rb +19 -0
  39. data/lib/origen_testers/igxl_based_tester/j750/generator.rb +19 -0
  40. data/lib/origen_testers/igxl_based_tester/j750/patgroup.rb +9 -0
  41. data/lib/origen_testers/igxl_based_tester/j750/patgroups.rb +10 -0
  42. data/lib/origen_testers/igxl_based_tester/j750/patset.rb +9 -0
  43. data/lib/origen_testers/igxl_based_tester/j750/patset_pattern.rb +18 -0
  44. data/lib/origen_testers/igxl_based_tester/j750/patsets.rb +10 -0
  45. data/lib/origen_testers/igxl_based_tester/j750/patsubr.rb +9 -0
  46. data/lib/origen_testers/igxl_based_tester/j750/patsubr_pattern.rb +18 -0
  47. data/lib/origen_testers/igxl_based_tester/j750/patsubrs.rb +10 -0
  48. data/lib/origen_testers/igxl_based_tester/j750/templates/flow.txt.erb +9 -0
  49. data/lib/origen_testers/igxl_based_tester/j750/templates/instances.txt.erb +16 -0
  50. data/lib/origen_testers/igxl_based_tester/j750/templates/patgroups.txt.erb +8 -0
  51. data/lib/origen_testers/igxl_based_tester/j750/templates/patsets.txt.erb +10 -0
  52. data/lib/origen_testers/igxl_based_tester/j750/templates/patsubrs.txt.erb +10 -0
  53. data/lib/origen_testers/igxl_based_tester/j750/test_instance.rb +547 -0
  54. data/lib/origen_testers/igxl_based_tester/j750/test_instance_group.rb +9 -0
  55. data/lib/origen_testers/igxl_based_tester/j750/test_instances.rb +10 -0
  56. data/lib/origen_testers/igxl_based_tester/j750_hpt.rb +34 -0
  57. data/lib/origen_testers/igxl_based_tester/j750_hpt/flow.rb +9 -0
  58. data/lib/origen_testers/igxl_based_tester/j750_hpt/flow_line.rb +9 -0
  59. data/lib/origen_testers/igxl_based_tester/j750_hpt/generator.rb +19 -0
  60. data/lib/origen_testers/igxl_based_tester/j750_hpt/patgroup.rb +9 -0
  61. data/lib/origen_testers/igxl_based_tester/j750_hpt/patgroups.rb +9 -0
  62. data/lib/origen_testers/igxl_based_tester/j750_hpt/patset.rb +9 -0
  63. data/lib/origen_testers/igxl_based_tester/j750_hpt/patset_pattern.rb +9 -0
  64. data/lib/origen_testers/igxl_based_tester/j750_hpt/patsets.rb +9 -0
  65. data/lib/origen_testers/igxl_based_tester/j750_hpt/patsubr.rb +9 -0
  66. data/lib/origen_testers/igxl_based_tester/j750_hpt/patsubr_pattern.rb +9 -0
  67. data/lib/origen_testers/igxl_based_tester/j750_hpt/patsubrs.rb +9 -0
  68. data/lib/origen_testers/igxl_based_tester/j750_hpt/test_instance.rb +515 -0
  69. data/lib/origen_testers/igxl_based_tester/j750_hpt/test_instance_group.rb +9 -0
  70. data/lib/origen_testers/igxl_based_tester/j750_hpt/test_instances.rb +9 -0
  71. data/lib/origen_testers/igxl_based_tester/parser.rb +102 -0
  72. data/lib/origen_testers/igxl_based_tester/parser/ac_spec.rb +9 -0
  73. data/lib/origen_testers/igxl_based_tester/parser/ac_specs.rb +0 -0
  74. data/lib/origen_testers/igxl_based_tester/parser/dc_spec.rb +33 -0
  75. data/lib/origen_testers/igxl_based_tester/parser/dc_specs.rb +48 -0
  76. data/lib/origen_testers/igxl_based_tester/parser/descriptions.rb +339 -0
  77. data/lib/origen_testers/igxl_based_tester/parser/flow.rb +109 -0
  78. data/lib/origen_testers/igxl_based_tester/parser/flow_line.rb +203 -0
  79. data/lib/origen_testers/igxl_based_tester/parser/flows.rb +21 -0
  80. data/lib/origen_testers/igxl_based_tester/parser/pattern_set.rb +92 -0
  81. data/lib/origen_testers/igxl_based_tester/parser/pattern_sets.rb +31 -0
  82. data/lib/origen_testers/igxl_based_tester/parser/test_instance.rb +341 -0
  83. data/lib/origen_testers/igxl_based_tester/parser/test_instances.rb +24 -0
  84. data/lib/origen_testers/igxl_based_tester/parser/timeset.rb +13 -0
  85. data/lib/origen_testers/igxl_based_tester/parser/timesets.rb +0 -0
  86. data/lib/origen_testers/igxl_based_tester/ultraflex.rb +477 -0
  87. data/lib/origen_testers/igxl_based_tester/ultraflex/flow.rb +10 -0
  88. data/lib/origen_testers/igxl_based_tester/ultraflex/flow_line.rb +19 -0
  89. data/lib/origen_testers/igxl_based_tester/ultraflex/generator.rb +19 -0
  90. data/lib/origen_testers/igxl_based_tester/ultraflex/patgroup.rb +9 -0
  91. data/lib/origen_testers/igxl_based_tester/ultraflex/patgroups.rb +10 -0
  92. data/lib/origen_testers/igxl_based_tester/ultraflex/patset.rb +9 -0
  93. data/lib/origen_testers/igxl_based_tester/ultraflex/patset_pattern.rb +18 -0
  94. data/lib/origen_testers/igxl_based_tester/ultraflex/patsets.rb +10 -0
  95. data/lib/origen_testers/igxl_based_tester/ultraflex/patsubr.rb +9 -0
  96. data/lib/origen_testers/igxl_based_tester/ultraflex/patsubr_pattern.rb +18 -0
  97. data/lib/origen_testers/igxl_based_tester/ultraflex/patsubrs.rb +10 -0
  98. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/flow.txt.erb +9 -0
  99. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/instances.txt.erb +16 -0
  100. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/patgroups.txt.erb +9 -0
  101. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/patsets.txt.erb +10 -0
  102. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/patsubrs.txt.erb +10 -0
  103. data/lib/origen_testers/igxl_based_tester/ultraflex/test_instance.rb +270 -0
  104. data/lib/origen_testers/igxl_based_tester/ultraflex/test_instance_group.rb +9 -0
  105. data/lib/origen_testers/igxl_based_tester/ultraflex/test_instances.rb +10 -0
  106. data/lib/origen_testers/interface.rb +183 -0
  107. data/lib/origen_testers/parser.rb +22 -0
  108. data/lib/origen_testers/parser/description_lookup.rb +62 -0
  109. data/lib/origen_testers/parser/searchable_array.rb +30 -0
  110. data/lib/origen_testers/parser/searchable_hash.rb +30 -0
  111. data/lib/origen_testers/pattern_compilers.rb +116 -0
  112. data/lib/origen_testers/pattern_compilers/assembler.rb +88 -0
  113. data/lib/origen_testers/pattern_compilers/job.rb +96 -0
  114. data/lib/origen_testers/pattern_compilers/ultraflex_pattern_compiler.rb +599 -0
  115. data/lib/origen_testers/program_generators.rb +55 -0
  116. data/lib/origen_testers/smartest_based_tester.rb +8 -0
  117. data/lib/origen_testers/smartest_based_tester/base.rb +411 -0
  118. data/lib/origen_testers/smartest_based_tester/base/flow.rb +188 -0
  119. data/lib/origen_testers/smartest_based_tester/base/flow_node.rb +476 -0
  120. data/lib/origen_testers/smartest_based_tester/base/generator.rb +123 -0
  121. data/lib/origen_testers/smartest_based_tester/base/pattern_compiler.rb +23 -0
  122. data/lib/origen_testers/smartest_based_tester/base/pattern_master.rb +47 -0
  123. data/lib/origen_testers/smartest_based_tester/base/test_method.rb +143 -0
  124. data/lib/origen_testers/smartest_based_tester/base/test_methods.rb +73 -0
  125. data/lib/origen_testers/smartest_based_tester/base/test_methods/ac_tml.rb +33 -0
  126. data/lib/origen_testers/smartest_based_tester/base/test_methods/base_tml.rb +38 -0
  127. data/lib/origen_testers/smartest_based_tester/base/test_methods/custom_tml.rb +19 -0
  128. data/lib/origen_testers/smartest_based_tester/base/test_methods/dc_tml.rb +147 -0
  129. data/lib/origen_testers/smartest_based_tester/base/test_methods/limits.rb +43 -0
  130. data/lib/origen_testers/smartest_based_tester/base/test_suite.rb +166 -0
  131. data/lib/origen_testers/smartest_based_tester/base/test_suites.rb +58 -0
  132. data/lib/origen_testers/smartest_based_tester/v93k.rb +8 -0
  133. data/lib/origen_testers/smartest_based_tester/v93k/builder.rb +89 -0
  134. data/lib/origen_testers/smartest_based_tester/v93k/builder/flow.rb +169 -0
  135. data/lib/origen_testers/smartest_based_tester/v93k/builder/pattern_master.rb +54 -0
  136. data/lib/origen_testers/smartest_based_tester/v93k/flow.rb +10 -0
  137. data/lib/origen_testers/smartest_based_tester/v93k/flow_node.rb +9 -0
  138. data/lib/origen_testers/smartest_based_tester/v93k/generator.rb +19 -0
  139. data/lib/origen_testers/smartest_based_tester/v93k/pattern_compiler.rb +10 -0
  140. data/lib/origen_testers/smartest_based_tester/v93k/pattern_master.rb +10 -0
  141. data/lib/origen_testers/smartest_based_tester/v93k/templates/template.aiv.erb +17 -0
  142. data/lib/origen_testers/smartest_based_tester/v93k/templates/template.flow.erb +201 -0
  143. data/lib/origen_testers/smartest_based_tester/v93k/templates/template.pmfl.erb +13 -0
  144. data/lib/origen_testers/smartest_based_tester/v93k/test_method.rb +9 -0
  145. data/lib/origen_testers/smartest_based_tester/v93k/test_methods.rb +9 -0
  146. data/lib/origen_testers/smartest_based_tester/v93k/test_suite.rb +9 -0
  147. data/lib/origen_testers/smartest_based_tester/v93k/test_suites.rb +9 -0
  148. data/lib/origen_testers/test/basic_interface.rb +17 -0
  149. data/lib/origen_testers/test/block.rb +21 -0
  150. data/lib/origen_testers/test/dut.rb +184 -0
  151. data/lib/origen_testers/test/dut2.rb +76 -0
  152. data/lib/origen_testers/test/j750_base_interface.rb +119 -0
  153. data/lib/origen_testers/test/j750_hpt_interface.rb +8 -0
  154. data/lib/origen_testers/test/j750_interface.rb +8 -0
  155. data/lib/origen_testers/test/nvm.rb +94 -0
  156. data/lib/origen_testers/test/ultraflex_interface.rb +110 -0
  157. data/lib/origen_testers/test/v93k_interface.rb +115 -0
  158. data/lib/origen_testers/timing.rb +362 -0
  159. data/lib/origen_testers/vector.rb +203 -0
  160. data/lib/origen_testers/vector_based_tester.rb +42 -0
  161. data/lib/origen_testers/vector_generator.rb +623 -0
  162. data/lib/origen_testers/vector_pipeline.rb +288 -0
  163. data/pattern/dc_instr.rb +7 -0
  164. data/pattern/delay.rb +7 -0
  165. data/pattern/mem_test.rb +8 -0
  166. data/pattern/multi_vector.rb +117 -0
  167. data/pattern/multi_vector_plus1.rb +125 -0
  168. data/pattern/nvm/j750/add_late_pins.rb +3 -0
  169. data/pattern/nvm/j750/iterator_postfix_test_x_bx.rb +8 -0
  170. data/pattern/nvm/j750/iterator_test_x_bx.rb +8 -0
  171. data/pattern/nvm/j750/j750_halt.rb +159 -0
  172. data/pattern/nvm/j750/j750_workout.rb +202 -0
  173. data/pattern/nvm/j750/timing.rb +73 -0
  174. data/pattern/nvm/v93k/v93k_workout.rb +136 -0
  175. data/pattern/read_write_reg.rb +58 -0
  176. data/pattern/reset.rb +4 -0
  177. data/pattern/subroutines.rb +38 -0
  178. data/program/_additional_erase.rb +7 -0
  179. data/program/_efa_resources.rb +7 -0
  180. data/program/_erase.rb +25 -0
  181. data/program/_erase_vfy.rb +5 -0
  182. data/program/_iv_resources.rb +10 -0
  183. data/program/basic_interface.rb +5 -0
  184. data/program/components/_prb2_main.rb +6 -0
  185. data/program/flow_control.rb +164 -0
  186. data/program/prb1.rb +226 -0
  187. data/program/prb1_resources.rb +28 -0
  188. data/program/prb2.rb +40 -0
  189. data/program/test.rb +20 -0
  190. data/templates/example.txt.erb +53 -0
  191. data/templates/j750/_vt_flow.txt.erb +8 -0
  192. data/templates/j750/_vt_instances.txt.erb +4 -0
  193. data/templates/j750/program_sheet.txt.erb +9 -0
  194. data/templates/manifest/v93k.yaml.erb +22 -0
  195. data/templates/web/index.md.erb +51 -0
  196. data/templates/web/layouts/_basic.html.erb +15 -0
  197. data/templates/web/partials/_navbar.html.erb +22 -0
  198. data/templates/web/release_notes.md.erb +5 -0
  199. metadata +332 -0
@@ -0,0 +1,38 @@
1
+ module OrigenTesters
2
+ module IGXLBasedTester
3
+ class Base
4
+ class Patsets
5
+ include ::OrigenTesters::Generator
6
+
7
+ OUTPUT_POSTFIX = 'patsets'
8
+
9
+ def add(name, options = {})
10
+ p = platform::Patset.new(name, options)
11
+ collection << p
12
+ p
13
+ end
14
+
15
+ def finalize(options = {})
16
+ uniq!
17
+ sort!
18
+ end
19
+
20
+ # Present the patsets in the final sheet in alphabetical order
21
+ def sort!
22
+ collection.sort_by!(&:name)
23
+ end
24
+
25
+ # Removes all duplicate patsets
26
+ def uniq!
27
+ uniques = []
28
+ collection.each do |patset|
29
+ unless uniques.any? { |p| p == patset }
30
+ uniques << patset
31
+ end
32
+ end
33
+ self.collection = uniques
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,68 @@
1
+ module OrigenTesters
2
+ module IGXLBasedTester
3
+ class Base
4
+ class Patsubr
5
+ attr_accessor :index
6
+
7
+ # Specify multiple patterns by passing an array of attributes
8
+ # as the 2nd argument:
9
+ #
10
+ # Patset.new("mrd1_pset", :pattern => "nvm_mrd1.PAT")
11
+ #
12
+ # Patset.new("mrd1_pset", [{:pattern => "nvm_mrd1.PAT"},
13
+ # {:pattern => "nvm_global_subs.PAT, :start_label => "subr"}
14
+ # ])
15
+ def initialize(name, attrs = {})
16
+ attrs = [attrs] unless attrs.is_a? Array
17
+ attrs.each do |pattrs|
18
+ if pattrs[:pattern]
19
+ pat = Pathname.new(pattrs[:pattern].gsub('\\', '/')).basename('.*').to_s
20
+ Origen.interface.referenced_patterns << pat
21
+ end
22
+ lines << platform::PatsubrPattern.new(name, pattrs)
23
+ end
24
+ self.name = name
25
+ end
26
+
27
+ def ==(other_patset)
28
+ self.class == other_patset.class &&
29
+ name.to_s == other_patset.name.to_s &&
30
+ sorted_pattern_files == other_patset.sorted_pattern_files
31
+ end
32
+
33
+ def name
34
+ @name
35
+ end
36
+
37
+ def name=(n)
38
+ @name = n
39
+ lines.each { |l| l.pattern_set = n }
40
+ n
41
+ end
42
+
43
+ # Returns all lines in the pattern set
44
+ def lines
45
+ @lines ||= []
46
+ end
47
+
48
+ # Returns all pattern files in the pattern set in alphabetical order
49
+ def sorted_pattern_files
50
+ @lines.map(&:file_name).sort
51
+ end
52
+
53
+ # Returns the fully formatted pattern set for insertion into a patset sheet
54
+ def to_s
55
+ l = ''
56
+ lines.each do |line|
57
+ l += "#{line}\r\n"
58
+ end
59
+ l.chomp
60
+ end
61
+
62
+ def platform
63
+ Origen.interface.platform
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,56 @@
1
+ module OrigenTesters
2
+ module IGXLBasedTester
3
+ class Base
4
+ class PatsubrPattern
5
+ ALIASES = {
6
+ pattern: :file_name
7
+ }
8
+
9
+ def self.define
10
+ # Generate accessors for all attributes and their aliases
11
+ self::PATSUBR_ATTRS.each do |attr|
12
+ writer = "#{attr}=".to_sym
13
+ reader = attr.to_sym
14
+ attr_reader attr.to_sym unless method_defined? reader
15
+ attr_writer attr.to_sym unless method_defined? writer
16
+ end
17
+
18
+ ALIASES.each do |_alias, val|
19
+ writer = "#{_alias}=".to_sym
20
+ reader = _alias.to_sym
21
+ unless method_defined? writer
22
+ define_method("#{_alias}=") do |v|
23
+ send("#{val}=", v)
24
+ end
25
+ end
26
+ unless method_defined? reader
27
+ define_method("#{_alias}") do
28
+ send(val)
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ def initialize(patsubr, attrs = {})
35
+ # Set the defaults
36
+ self.class::PATSUBR_DEFAULTS.each do |k, v|
37
+ send("#{k}=", v)
38
+ end
39
+ # Then the values that have been supplied
40
+ self.pattern_subr = patsubr
41
+ attrs.each do |k, v|
42
+ send("#{k}=", v)
43
+ end
44
+ end
45
+
46
+ def to_s
47
+ l = "\t"
48
+ self.class::PATSUBR_ATTRS.each do |attr|
49
+ l += "#{send(attr)}\t"
50
+ end
51
+ "#{l}"
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,38 @@
1
+ module OrigenTesters
2
+ module IGXLBasedTester
3
+ class Base
4
+ class Patsubrs
5
+ include ::OrigenTesters::Generator
6
+
7
+ OUTPUT_POSTFIX = 'patsubrs'
8
+
9
+ def add(name, options = {})
10
+ p = Patsubr.new(name, options)
11
+ collection << p
12
+ p
13
+ end
14
+
15
+ def finalize(options = {})
16
+ uniq!
17
+ sort!
18
+ end
19
+
20
+ # Present the patsubrs in the final sheet in alphabetical order
21
+ def sort!
22
+ collection.sort_by!(&:name)
23
+ end
24
+
25
+ # Removes all duplicate patsubrs
26
+ def uniq!
27
+ uniques = []
28
+ collection.each do |patsubr|
29
+ unless uniques.any? { |p| p == patsubr }
30
+ uniques << patsubr
31
+ end
32
+ end
33
+ self.collection = uniques
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,326 @@
1
+ module OrigenTesters
2
+ module IGXLBasedTester
3
+ class Base
4
+ class TestInstance
5
+ attr_accessor :type, :index, :version, :append_version
6
+
7
+ def self.define
8
+ # Generate accessors for all attributes and their aliases
9
+ attrs.each do |attr|
10
+ writer = "#{attr}=".to_sym
11
+ reader = attr.to_sym
12
+ attr_reader attr.to_sym unless method_defined? reader
13
+ attr_writer attr.to_sym unless method_defined? writer
14
+ end
15
+
16
+ # Define the common aliases now, the instance type specific ones will
17
+ # be created when the instance type is known
18
+ self::TEST_INSTANCE_ALIASES.each do |_alias, val|
19
+ writer = "#{_alias}=".to_sym
20
+ reader = _alias.to_sym
21
+ unless val.is_a? Hash
22
+ unless method_defined? writer
23
+ define_method("#{_alias}=") do |v|
24
+ send("#{val}=", v)
25
+ end
26
+ end
27
+ unless method_defined? reader
28
+ define_method("#{_alias}") do
29
+ send(val)
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+
36
+ def self.attrs
37
+ @attrs ||= begin
38
+ attrs = self::TEST_INSTANCE_ATTRS.dup
39
+
40
+ self::TEST_INSTANCE_EXTRA_ARGS.times do |i|
41
+ attrs << "arg#{i}"
42
+ end
43
+ attrs << 'comment'
44
+ attrs
45
+ end
46
+ end
47
+
48
+ def initialize(name, type, attrs = {})
49
+ @type = type
50
+ @append_version = true
51
+ self.name = name
52
+ # Build the type specific accessors (aliases)
53
+ self.class::TEST_INSTANCE_ALIASES[@type.to_sym].each do |_alias, val|
54
+ define_singleton_method("#{_alias}=") do |v|
55
+ send("#{val}=", v) if self.respond_to?("#{val}=", v)
56
+ end
57
+ define_singleton_method("#{_alias}") do
58
+ send(val) if self.respond_to?(val)
59
+ end
60
+ end
61
+ # Set the defaults
62
+ self.class::TEST_INSTANCE_DEFAULTS[@type.to_sym].each do |k, v|
63
+ send("#{k}=", v) if self.respond_to?("#{k}=", v)
64
+ end
65
+ # Then the values that have been supplied
66
+ attrs.each do |k, v|
67
+ send("#{k}=", v) if self.respond_to?("#{k}=", v)
68
+ end
69
+ end
70
+
71
+ def ==(other_instance)
72
+ self.class == other_instance.class &&
73
+ unversioned_name.to_s == other_instance.unversioned_name.to_s &&
74
+ self.class.attrs.all? do |attr|
75
+ # Exclude test name, already examined above and don't want to include
76
+ # the version in the comparison
77
+ if attr == 'test_name'
78
+ true
79
+ else
80
+ send(attr) == other_instance.send(attr)
81
+ end
82
+ end
83
+ end
84
+
85
+ def self.new_empty(name, attrs = {})
86
+ new(name, :empty, attrs)
87
+ end
88
+
89
+ def self.new_functional(name, attrs = {})
90
+ new(name, :functional, attrs)
91
+ end
92
+
93
+ def self.new_board_pmu(name, attrs = {})
94
+ new(name, :board_pmu, attrs)
95
+ end
96
+
97
+ def self.new_pin_pmu(name, attrs = {})
98
+ new(name, :pin_pmu, attrs)
99
+ end
100
+
101
+ def self.new_apmu_powersupply(name, attrs = {})
102
+ new(name, :apmu_powersupply, attrs)
103
+ end
104
+
105
+ def self.new_mto_memory(name, attrs = {})
106
+ new(name, :mto_memory, attrs)
107
+ end
108
+
109
+ # Returns the fully formatted test instance for insertion into an instance sheet
110
+ def to_s(override_name = nil)
111
+ l = "\t"
112
+ self.class.attrs.each do |attr|
113
+ if attr == 'test_name' && override_name
114
+ l += "#{override_name}\t"
115
+ else
116
+ l += "#{send(attr)}\t"
117
+ end
118
+ end
119
+ "#{l}"
120
+ end
121
+
122
+ def name
123
+ if version && @append_version
124
+ "#{@test_name}_v#{version}"
125
+ else
126
+ @test_name.to_s
127
+ end
128
+ end
129
+ alias_method :test_name, :name
130
+
131
+ def name=(val)
132
+ self.test_name = val
133
+ end
134
+
135
+ def unversioned_name
136
+ @test_name.to_s
137
+ end
138
+
139
+ # Set the cpu wait flags for the given test instance
140
+ # instance.set_wait_flags(:a)
141
+ # instance.set_wait_flags(:a, :c)
142
+ def set_wait_flags(*flags)
143
+ # This method is tester-specific and must be overridden by the child class
144
+ fail 'The #{self.class} class has not defined a set_wait_flags method!'
145
+ end
146
+
147
+ # Set and enable the pre-charge voltage of a parametric test instance.
148
+ def set_pre_charge(val)
149
+ if val
150
+ self.pre_charge_enable = 1
151
+ self.pre_charge = val
152
+ else
153
+ self.pre_charge_enable = 0
154
+ end
155
+ self
156
+ end
157
+ alias_method :set_precharge, :set_pre_charge
158
+
159
+ # Set and enable the hi limit of a parametric test instance, passing in
160
+ # nil or false as the lim parameter will disable the hi limit.
161
+ def set_hi_limit(lim)
162
+ if lim
163
+ self.hi_lo_limit_valid = hi_lo_limit_valid | 2
164
+ self.hi_limit = lim
165
+ else
166
+ self.hi_lo_limit_valid = hi_lo_limit_valid & 1
167
+ end
168
+ self
169
+ end
170
+
171
+ # Set and enable the hi limit of a parametric test instance, passing in
172
+ # nil or false as the lim parameter will disable the hi limit.
173
+ def set_lo_limit(lim)
174
+ if lim
175
+ self.hi_lo_limit_valid = hi_lo_limit_valid | 1
176
+ self.lo_limit = lim
177
+ else
178
+ self.hi_lo_limit_valid = hi_lo_limit_valid & 2
179
+ end
180
+ self
181
+ end
182
+
183
+ # Set the current range of the test instance, the following are valid:
184
+ #
185
+ # Board PMU
186
+ # * 2uA
187
+ # * 20uA
188
+ # * 200uA
189
+ # * 2mA
190
+ # * 20mA
191
+ # * 200mA
192
+ # * :smart
193
+ #
194
+ # Pin PMU
195
+ # * 200nA
196
+ # * 2uA
197
+ # * 20uA
198
+ # * 200uA
199
+ # * 2mA
200
+ # * :auto
201
+ # * :smart
202
+ #
203
+ # Examples
204
+ # instance.set_irange(:smart)
205
+ # instance.set_irange(:ua => 2)
206
+ # instance.set_irange(2.uA) # Same as above
207
+ # instance.set_irange(:ma => 200)
208
+ # instance.set_irange(0.2) # Same as above
209
+ # instance.set_irange(:a => 0.2) # Same as above
210
+ def set_irange(r = nil, options = {})
211
+ r, options = nil, r if r.is_a?(Hash)
212
+ unless r
213
+ if r = options.delete(:na) || options.delete(:nA)
214
+ r = r / 1_000_000_000
215
+ elsif r = options.delete(:ua) || options.delete(:uA)
216
+ r = r / 1_000_000.0
217
+ elsif r = options.delete(:ma) || options.delete(:mA)
218
+ r = r / 1000.0
219
+ elsif r = options.delete(:a) || options.delete(:A)
220
+ else
221
+ fail "Can't determine requested irange!"
222
+ end
223
+ end
224
+
225
+ if @type == :board_pmu
226
+ if r == :smart
227
+ self.irange = 6
228
+ else
229
+ self.irange = case
230
+ when r > 0.02 then 5
231
+ when r > 0.002 then 4
232
+ when r > 0.0002 then 3
233
+ when r > 0.00002 then 2
234
+ when r > 0.000002 then 1
235
+ else 0
236
+ end
237
+ end
238
+
239
+ else # :pin_pmu
240
+ if r == :smart
241
+ self.irange = 5
242
+ elsif r == :auto
243
+ fail 'Auto range not available in FIMV mode!' if self.fimv?
244
+ self.irange = 6
245
+ else
246
+ if fimv?
247
+ self.irange = case
248
+ when r > 0.0002 then 2
249
+ else 4
250
+ end
251
+ else
252
+ self.irange = case
253
+ when r > 0.0002 then 2
254
+ when r > 0.00002 then 4
255
+ when r > 0.000002 then 0
256
+ when r > 0.0000002 then 1
257
+ else 3
258
+ end
259
+ end
260
+ end
261
+ end
262
+
263
+ self
264
+ end
265
+
266
+ # Set the voltage range of the test instance, the following are valid:
267
+ #
268
+ # Board PMU
269
+ # * 2V
270
+ # * 5V
271
+ # * 10V
272
+ # * 24V
273
+ # * :auto
274
+ # * :smart
275
+ #
276
+ # Examples
277
+ # instance.set_vrange(:auto)
278
+ # instance.set_vrange(:v => 5)
279
+ # instance.set_vrange(5) # Same as above
280
+ def set_vrange(r = nil, options = {})
281
+ r, options = nil, r if r.is_a?(Hash)
282
+ if r == :smart
283
+ self.vrange = 4
284
+ elsif r == :auto
285
+ self.vrange = 5
286
+ elsif !r
287
+ if r = options.delete(:v) || options.delete(:V)
288
+ else
289
+ fail "Can't determine requested vrange!"
290
+ end
291
+ end
292
+ self.vrange = case
293
+ when r > 10 then 3
294
+ when r > 5 then 2
295
+ when r > 2 then 1
296
+ else 0
297
+ end
298
+ self
299
+ end
300
+
301
+ # Set the meaure mode of a parametric test instance, either:
302
+ # * :voltage / :fimv
303
+ # * :current / :fvmi
304
+ def set_measure_mode(mode)
305
+ if mode == :current || mode == :fvmi
306
+ self.measure_mode = 0
307
+ elsif mode == :voltage || mode == :fimv
308
+ self.measure_mode = 1
309
+ else
310
+ fail "Unknown measure mode: #{mode}"
311
+ end
312
+ end
313
+
314
+ # Returns true if instance configured for force current, measure voltage
315
+ def fimv?
316
+ measure_mode == 1
317
+ end
318
+
319
+ # Returns true if instance configured for force voltage, measure current
320
+ def fvmi?
321
+ measure_mode == 0
322
+ end
323
+ end
324
+ end
325
+ end
326
+ end