origen_testers 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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