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,109 @@
1
+ module OrigenTesters
2
+ class IGXLBasedTester
3
+ class Parser
4
+ class Flow < ::OrigenTesters::Parser::SearchableArray
5
+ require 'pathname'
6
+
7
+ attr_accessor :parser, :file
8
+
9
+ def initialize(file, options = {}) # :nodoc:
10
+ @parser = options[:parser]
11
+ @file = Pathname.new(file)
12
+ parse
13
+ end
14
+
15
+ def description
16
+ @parser.descriptions.flow_summary(file: file)
17
+ end
18
+ alias_method :summary, :description
19
+
20
+ # Returns the filename of the sheet that contained the current flow
21
+ def filename
22
+ @file.basename.to_s
23
+ end
24
+ alias_method :name, :filename
25
+
26
+ # Returns all flow lines that are tests, optionally supply a context to
27
+ # have only the test that will execute in that context returned
28
+ #
29
+ # $tester.flow.first.tests.size
30
+ # => 20
31
+ # $tester.flow.first.tests(:job => "P1").size
32
+ # => 10
33
+ # $tester.flow.first.tests(:job => "P1", :enable => "data_collection").size
34
+ # => 15
35
+ def tests(context = {})
36
+ run_context(context)
37
+ end
38
+
39
+ # Returns all tests in the current flow, regardless of context
40
+ def all_tests
41
+ where(opcode: %w(Test characterize), exact: true)
42
+ end
43
+
44
+ def run_context(context) # :nodoc:
45
+ capture = true
46
+ waiting_for_label = false
47
+ select do |line|
48
+ if capture
49
+ if !waiting_for_label || waiting_for_label == line.label
50
+ waiting_for_label = false
51
+ case line.type
52
+ when 'Test', 'characterize'
53
+ line.executes_under_context?(context)
54
+ when 'set-device', 'stop'
55
+ capture = false if line.executes_under_context?(context)
56
+ false
57
+ when 'enable-flow-word'
58
+ if line.executes_under_context?(context)
59
+ context[:enable] = [context[:enable]].flatten
60
+ context[:enable] << line.parameter
61
+ end
62
+ false
63
+ when 'flag-true'
64
+ if line.executes_under_context?(context)
65
+ context[:true_flags] = [context[:true_flags]].flatten
66
+ context[:true_flags] << line.parameter
67
+ end
68
+ false
69
+ when 'flag-false'
70
+ if line.executes_under_context?(context)
71
+ context[:false_flags] = [context[:false_flags]].flatten
72
+ context[:false_flags] << line.parameter
73
+ end
74
+ false
75
+ when 'disable-flow-word'
76
+ if line.executes_under_context?(context)
77
+ context[:enable] = [context[:enable]].flatten
78
+ context[:enable].delete(line.parameter)
79
+ end
80
+ false
81
+ when 'logprint', 'nop', 'print'
82
+ false
83
+ when 'goto'
84
+ waiting_for_label = line.parameter
85
+ false
86
+ else
87
+ fail "Don't know how to process: #{line.type}, in file #{filename}"
88
+ end
89
+ else
90
+ false
91
+ end
92
+ end
93
+ end
94
+ end
95
+
96
+ def parse # :nodoc:
97
+ File.readlines(@file).each do |line|
98
+ l = FlowLine.new(line, parser: parser, flow: self)
99
+ self << l if l.valid?
100
+ end
101
+ end
102
+
103
+ def inspect # :nodoc:
104
+ "<TestFlow: #{filename}, Lines: #{size}>"
105
+ end
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,203 @@
1
+ module OrigenTesters
2
+ class IGXLBasedTester
3
+ class Parser
4
+ class FlowLine
5
+ attr_accessor :parser, :flow, :line
6
+
7
+ TYPES = %w(
8
+ Test characterize defaults enable-flow-word disable-flow-word error-print goto
9
+ goto-on-all-done goto-on-all-lastfail goto-on-all-lastfaildoall logprint modify
10
+ nop print reset set-device set-device-new set-error-bin set-retest-bin skip
11
+ stop assign-integer create-integer delete-integer create-site-var assign-site-var
12
+ flag-clear flag-clear-all flag-false flag-false-all flag-true flag-true-all
13
+ state-clear-all state-false-all state-true-all
14
+ )
15
+
16
+ ATTRS = %w(
17
+ label enable job part env opcode parameter
18
+ tname tnum bin_pass bin_fail sort_pass sort_fail result flag_pass
19
+ flag_fail state group_specifier group_sense group_condition group_name
20
+ device_sense device_condition device_name debug_assume debug_sites
21
+ comment
22
+ )
23
+
24
+ ALIASES = {
25
+ bin: :bin_fail,
26
+ softbin: :sort_fail,
27
+ soft_bin: :sort_fail,
28
+ name: :tname,
29
+ number: :tnum,
30
+ test_number: :tnum,
31
+ test_num: :tnum,
32
+ type: :opcode
33
+ }
34
+
35
+ # Make readers for each low level attribute
36
+ ATTRS.each do |attr|
37
+ attr_reader attr
38
+ end
39
+
40
+ # And the aliases
41
+ ALIASES.each do |_alias, attr|
42
+ define_method("#{_alias}") do
43
+ send(attr)
44
+ end
45
+ end
46
+
47
+ # Returns the test instance called by the given line or nil
48
+ def self.extract_test(line)
49
+ l = new(line)
50
+ if l.valid? && l.test?
51
+ l.test_instance_name
52
+ end
53
+ end
54
+
55
+ def initialize(line, options = {})
56
+ @parser = options[:parser]
57
+ @flow = options[:flow]
58
+ @line = line
59
+ parse
60
+ if valid?
61
+ ATTRS.each_with_index do |attr, i|
62
+ instance_variable_set("@#{attr}", components[i + 1])
63
+ end
64
+ end
65
+ end
66
+
67
+ def inspect # :nodoc:
68
+ "<FlowLine: #{type}, Parameter: #{parameter}>"
69
+ end
70
+
71
+ def description
72
+ from_instance = test_instance ? test_instance.description : ''
73
+ from_flow = parser.descriptions.flow_line(name: test_instance_name, flow: flow.file)
74
+ if !from_instance.empty? && !from_flow.empty?
75
+ [from_instance, "\n", from_flow].flatten
76
+ elsif from_instance.empty?
77
+ from_flow
78
+ else
79
+ from_instance
80
+ end
81
+ end
82
+
83
+ def parse
84
+ @components = @line.split("\t") unless @line.strip.empty?
85
+ end
86
+
87
+ def valid?
88
+ components[6] && TYPES.include?(components[6])
89
+ end
90
+
91
+ def components
92
+ @components ||= []
93
+ end
94
+
95
+ def test?
96
+ %w(Test characterize).include? opcode
97
+ end
98
+
99
+ def executes_under_context?(context)
100
+ enable_conditions_met?(context) &&
101
+ job_conditions_met?(context) &&
102
+ part_conditions_met?(context) &&
103
+ env_conditions_met?(context)
104
+ end
105
+
106
+ def enable_conditions_met?(context)
107
+ conditions_met?(enable, context[:enable])
108
+ end
109
+
110
+ def job_conditions_met?(context)
111
+ conditions_met?(job, context[:job])
112
+ end
113
+
114
+ def part_conditions_met?(context)
115
+ conditions_met?(part, context[:part])
116
+ end
117
+
118
+ def env_conditions_met?(context)
119
+ conditions_met?(env, context[:env])
120
+ end
121
+
122
+ def conditions_met?(conditions, values)
123
+ if conditions.empty?
124
+ true
125
+ else
126
+ values = [values].flatten
127
+ conditions = conditions.split(',').map(&:strip)
128
+ not_conditions = conditions.select { |c| c =~ /^!/ }
129
+ conditions = conditions - not_conditions
130
+ # Make sure all -ve conditions are not met
131
+ if not_conditions.all? do |c|
132
+ c =~ /^!(.*)/
133
+ c = Regexp.last_match[1]
134
+ !values.include?(c)
135
+ end
136
+ # And then any +ve conditions
137
+ if conditions.empty?
138
+ true
139
+ else
140
+ values.any? { |v| conditions.include?(v) }
141
+ end
142
+ else
143
+ false
144
+ end
145
+ end
146
+ end
147
+
148
+ def test_instance_name
149
+ parameter
150
+ end
151
+ alias_method :instance_name, :test_instance_name
152
+
153
+ def test_instance
154
+ instances = parser.test_instances.where(name: parameter, exact: true)
155
+ if instances.size > 1
156
+ puts "Warning multiple instances of #{name} found, using the first one"
157
+ end
158
+ if instances.size == 0
159
+ nil
160
+ else
161
+ instances.first
162
+ end
163
+ end
164
+ alias_method :instance, :test_instance
165
+
166
+ # Returns an array of patterns used by the given test, if there are none
167
+ # an empty array is returned.
168
+ # Optionally supply patterns to exclude if you want to ignore common subroutine
169
+ # patterns for example.
170
+ def patterns(options = {})
171
+ if i = test_instance
172
+ pats = i.patterns
173
+ if options[:ignore] && pats
174
+ pats.reject { |p| [options[:ignore]].flatten.include?(p) }
175
+ else
176
+ []
177
+ end
178
+ else
179
+ []
180
+ end
181
+ end
182
+ alias_method :pattern, :patterns
183
+
184
+ # Returns a string summarizing any conditions (enable words, jobs, etc.) that
185
+ # gate the execution of this line
186
+ def conditions
187
+ c = []
188
+ c << "Enable: #{enable}" unless enable.empty?
189
+ c << "Job: #{job}" unless job.empty?
190
+ c << "Part: #{part}" unless part.empty?
191
+ c << "Env: #{env}" unless env.empty?
192
+ c.join('; ')
193
+ end
194
+
195
+ def vdd
196
+ if i = test_instance
197
+ i.vdd
198
+ end
199
+ end
200
+ end
201
+ end
202
+ end
203
+ end
@@ -0,0 +1,21 @@
1
+ module OrigenTesters
2
+ class IGXLBasedTester
3
+ class Parser
4
+ class Flows < ::OrigenTesters::Parser::SearchableArray
5
+ attr_accessor :parser
6
+
7
+ def initialize(options = {})
8
+ @parser = options[:parser]
9
+ end
10
+
11
+ def import(file)
12
+ self << Flow.new(file, parser: parser)
13
+ end
14
+
15
+ def inspect
16
+ "<TestFlows: #{size}>"
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,92 @@
1
+ module OrigenTesters
2
+ class IGXLBasedTester
3
+ class Parser
4
+ class PatternSet
5
+ class Pattern
6
+ attr_accessor :parser
7
+
8
+ ATTRS = %w(pattern_set file_name start_label stop_label comment)
9
+
10
+ ALIASES = {
11
+ pattern: :file_name,
12
+ file: :file_name,
13
+ name: :file_name
14
+ }
15
+
16
+ # Generate readers for all attributes and their aliases
17
+ ATTRS.each do |attr|
18
+ attr_reader attr.to_sym
19
+ end
20
+
21
+ ALIASES.each do |_alias, attr|
22
+ define_method("#{_alias}") do
23
+ send(attr)
24
+ end
25
+ end
26
+
27
+ def initialize(line)
28
+ @line = line
29
+ parse
30
+ if valid?
31
+ ATTRS.each_with_index do |attr, i|
32
+ instance_variable_set("@#{attr}", components[i + 1])
33
+ end
34
+ end
35
+ end
36
+
37
+ def parse
38
+ @components = @line.split("\t") unless @line.strip.empty?
39
+ end
40
+
41
+ def valid?
42
+ components[1] && !components[1].empty? && components[1] != 'Pattern Set' &&
43
+ components[2] && !components[2].empty?
44
+ end
45
+
46
+ def components
47
+ @components ||= []
48
+ end
49
+ end
50
+
51
+ def initialize(line, options = {})
52
+ @parser = options[:parser]
53
+ p = add_pattern_line(line)
54
+ @name = p.pattern_set if p.valid?
55
+ end
56
+
57
+ def inspect # :nodoc:
58
+ "<PatternSet: #{name}>"
59
+ end
60
+
61
+ def name
62
+ @name
63
+ end
64
+
65
+ def patterns
66
+ @patterns ||= []
67
+ end
68
+
69
+ def self.extract_name(line)
70
+ new(line).name
71
+ end
72
+
73
+ def add_pattern_line(line)
74
+ p = Pattern.new(line)
75
+ patterns << Pattern.new(line) if p.valid?
76
+ p
77
+ end
78
+
79
+ def valid?
80
+ patterns.all?(&:valid?)
81
+ end
82
+
83
+ # Returns an array containing all pattern names contained in this
84
+ # pattern set
85
+ def pattern_names
86
+ # This removes the path and extensions
87
+ patterns.map { |pat| pat.name.gsub(/.*[\\\/]/, '').gsub(/\..*/, '') }
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,31 @@
1
+ module OrigenTesters
2
+ class IGXLBasedTester
3
+ class Parser
4
+ class PatternSets < ::OrigenTesters::Parser::SearchableHash
5
+ attr_accessor :parser
6
+
7
+ def initialize(options = {})
8
+ @parser = options[:parser]
9
+ end
10
+
11
+ def import(file)
12
+ File.readlines(file).each do |line|
13
+ name = PatternSet.extract_name(line)
14
+ if name
15
+ if self[name]
16
+ self[name].add_pattern_line(line)
17
+ else
18
+ l = PatternSet.new(line, parser: parser)
19
+ self[l.name] = l if l.valid?
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ def inspect
26
+ "<Patsets: #{size}>"
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end