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,188 @@
1
+ module OrigenTesters
2
+ module SmartestBasedTester
3
+ class Base
4
+ class Flow
5
+ include OrigenTesters::Generator
6
+ include OrigenTesters::Generator::FlowControlAPI
7
+
8
+ attr_accessor :test_suites, :test_methods, :pattern_master
9
+
10
+ def subdirectory
11
+ 'testflow'
12
+ end
13
+
14
+ def filename
15
+ super.gsub('_flow', '')
16
+ end
17
+
18
+ def finalize(options = {})
19
+ super
20
+ flow_control_variables.uniq!
21
+ collection.each { |n| n.finalize if n.respond_to?(:finalize) }
22
+ test_suites.finalize
23
+ test_methods.finalize
24
+ end
25
+
26
+ # Convenience method that will automatically generate a run and branch if a :bin
27
+ # option is supplied. If no :bin option is present then it will generate a simple
28
+ # run entry in the flow.
29
+ def test(test_suite, options = {})
30
+ sbin = options[:sbin] || options[:softbin] || options[:soft_bin]
31
+ if options[:bin] || sbin
32
+ node = run_and_branch(test_suite, options)
33
+ options.delete(:id)
34
+ # Only pass options to configure the bin, don't pass flow control options, those apply to the main
35
+ # test only in this case
36
+ bin = bad_bin(options[:bin], options.slice(*(FlowNode::ATTRS[:bad_bin].keys + FlowNode::ALIASES[:bad_bin].keys)))
37
+ node.else_nodes << bin
38
+ node
39
+ else
40
+ run(test_suite, options)
41
+ end
42
+ end
43
+
44
+ # This module contains methods that correspond to the test flow primitives available
45
+ # in the palette window of the test flow editor
46
+ module Palette
47
+ def run(test_suite, options = {})
48
+ add(:run, { test_suite: test_suite }.merge(options))
49
+ end
50
+ alias_method :run_test, :run
51
+
52
+ def run_and_branch(test_suite, options = {})
53
+ add(:run_and_branch, { test_suite: test_suite }.merge(options))
54
+ end
55
+
56
+ def good_bin(number, options = {})
57
+ add(:good_bin, { bin: number }.merge(options))
58
+ end
59
+
60
+ def bad_bin(number, options = {})
61
+ add(:bad_bin, { bin: number }.merge(options))
62
+ end
63
+
64
+ def multi_bin(number, options = {})
65
+ fail 'V93K Flow#multi_bin method has not been implemented yet!'
66
+ end
67
+
68
+ def print(msg, options = {})
69
+ add(:print, { value: msg }.merge(options))
70
+ end
71
+
72
+ def print_to_datalog(msg, options = {})
73
+ add(:print_to_datalog, { value: msg }.merge(options))
74
+ end
75
+
76
+ def assign_value(variable, value, options = {})
77
+ add(:assign_value, { variable: variable, value: value }.merge(options))
78
+ end
79
+
80
+ def if_then(condition, options = {})
81
+ add(:if_then, { condition: condition }.merge(options))
82
+ end
83
+
84
+ def group(name, options = {})
85
+ name = make_unique(:group, name)
86
+ g = add(:group, { name: name }.merge(options))
87
+ if block_given?
88
+ open_groups << g
89
+ yield g
90
+ open_groups.pop
91
+ end
92
+ g
93
+ end
94
+ end
95
+ include Palette
96
+
97
+ # Convenience method to provide similar functionality to enabling a Teradyne flow word/variable
98
+ def enable_flow_word(variable, options = {})
99
+ assign_value(variable, 1, options)
100
+ end
101
+
102
+ def skip(identifier = nil, options = {})
103
+ identifier, options = nil, identifier if identifier.is_a?(Hash)
104
+ open_skips << []
105
+ yield
106
+ nodes = open_skips.pop
107
+ s = if_then(:skip, options)
108
+ s.else_nodes = nodes
109
+ end
110
+
111
+ def hardware_bin_descriptions
112
+ @hardware_bin_descriptions ||= {}
113
+ end
114
+
115
+ def flow_control_variables
116
+ @flow_control_variables ||= []
117
+ end
118
+
119
+ private
120
+
121
+ def add(type, options = {})
122
+ options = save_context(options) if [:run, :run_and_branch].include?(type)
123
+
124
+ # Delete the ID if a test within a group with the same ID to avoid a duplicate ID
125
+ # error.
126
+ if options[:id]
127
+ id = Origen.interface.filter_id(options[:id], options)
128
+ options.delete(:id) if group_opened? && open_groups.any? { |g| g.id == id }
129
+ end
130
+ node = track_relationships(options) do |options|
131
+ platform::FlowNode.create(self, type, options)
132
+ end
133
+ unless Origen.interface.resources_mode?
134
+ if skip_opened?
135
+ open_skips.last << node
136
+ node.parent = open_skips.last
137
+ else
138
+ if group_opened?
139
+ open_groups.last.nodes << node
140
+ node.parent = open_groups.last.nodes
141
+ else
142
+ collection << node
143
+ end
144
+ end
145
+ end
146
+ if node.test?
147
+ node.test_suite = options[:test_suite]
148
+ c = Origen.interface.consume_comments
149
+ unless Origen.interface.resources_mode?
150
+ Origen.interface.descriptions.add_for_test_usage(node.test_suite.name, Origen.interface.top_level_flow, c)
151
+ end
152
+ else
153
+ Origen.interface.discard_comments
154
+ end
155
+ node
156
+ end
157
+
158
+ def open_skips
159
+ @open_skips ||= []
160
+ end
161
+
162
+ def skip_opened?
163
+ open_skips.size > 0
164
+ end
165
+
166
+ def open_groups
167
+ @open_groups ||= []
168
+ end
169
+
170
+ def group_opened?
171
+ open_groups.size > 0
172
+ end
173
+
174
+ def make_unique(type, name, options = {})
175
+ @uniques ||= {}
176
+ t = @uniques[type] ||= {}
177
+ t[name] ||= 0
178
+ t[name] += 1
179
+ if t[name] == 1
180
+ name
181
+ else
182
+ "#{name}_#{t[name]}"
183
+ end
184
+ end
185
+ end
186
+ end
187
+ end
188
+ end
@@ -0,0 +1,476 @@
1
+ module OrigenTesters
2
+ module SmartestBasedTester
3
+ class Base
4
+ class FlowNode
5
+ attr_accessor :type, :id, :rendered, :parent, :deleted
6
+ alias_method :rendered?, :rendered
7
+ alias_method :deleted?, :deleted
8
+ attr_reader :flow
9
+
10
+ TYPES = [:run, :run_and_branch, :print, :print_to_datalog, :good_bin, :bad_bin, :group,
11
+ :assign_value, :if_then
12
+ ]
13
+
14
+ ATTRS = {
15
+ good_bin: {
16
+ soft_bin: nil,
17
+ soft_bin_desc: nil,
18
+ bin: nil,
19
+ bin_desc: nil,
20
+ bin_type: :good,
21
+ reprobe: false,
22
+ color: :green,
23
+ overon: true
24
+ },
25
+ bad_bin: {
26
+ soft_bin: nil,
27
+ soft_bin_desc: 'fail',
28
+ bin: nil,
29
+ bin_desc: nil,
30
+ bin_type: :bad,
31
+ reprobe: false,
32
+ color: :red,
33
+ overon: true
34
+ },
35
+ run: {
36
+ nodes: [],
37
+ else_nodes: [],
38
+ test_suite: nil,
39
+ id: nil
40
+ },
41
+ run_and_branch: {
42
+ nodes: [],
43
+ else_nodes: [],
44
+ test_suite: nil,
45
+ id: nil
46
+ },
47
+ if_then: {
48
+ condition: nil,
49
+ nodes: [],
50
+ else_nodes: []
51
+ },
52
+ print: {
53
+ value: nil
54
+ },
55
+ print_to_datalog: {
56
+ value: nil
57
+ },
58
+ group: {
59
+ name: nil,
60
+ nodes: [],
61
+ comment: nil,
62
+ bypass: nil
63
+ },
64
+ assign_value: {
65
+ variable: nil,
66
+ value: nil
67
+ }
68
+ }
69
+
70
+ ALIASES = {
71
+ good_bin: {
72
+ sbin: :soft_bin,
73
+ softbin: :soft_bin
74
+ },
75
+ bad_bin: {
76
+ sbin: :soft_bin,
77
+ softbin: :soft_bin
78
+ }
79
+ }
80
+
81
+ def parent
82
+ @parent || flow.collection
83
+ end
84
+
85
+ # Call this instead of FlowNode.new, this will return a dedicated object for the given
86
+ # type if one exists, otherwise it will instantiate a generic FlowNode object
87
+ def self.create(flow, type, attrs = {})
88
+ unless TYPES.include?(type)
89
+ fail "Uknown flow node type :#{type}, valid types are #{TYPES.map { |t| ':' + t.to_s }.join(', ')}"
90
+ end
91
+ attrs[:_flow] = flow
92
+ attrs[:called_internally] = true
93
+ FlowNode.new(type, attrs)
94
+ end
95
+
96
+ def initialize(type, attrs = {})
97
+ unless attrs.delete(:called_internally)
98
+ fail "Don't use FlowNode.new, use FlowNode.create instead"
99
+ end
100
+ @flow = attrs.delete(:_flow)
101
+ ATTRS[type].each do |attr, default|
102
+ define_singleton_method("#{attr}=") do |v|
103
+ instance_variable_set("@#{attr}", v)
104
+ end
105
+ define_singleton_method("#{attr}") do
106
+ instance_variable_get("@#{attr}")
107
+ end
108
+ send("#{attr}=", default.respond_to?(:each) ? default.dup : default)
109
+ end
110
+ if ALIASES[type]
111
+ ALIASES[type].each do |alias_, attr|
112
+ define_singleton_method("#{alias_}=") do |v|
113
+ send("#{attr}=", v)
114
+ end
115
+ define_singleton_method("#{alias_}") do
116
+ send(attr)
117
+ end
118
+ end
119
+ end
120
+ @type = type
121
+ attrs.each do |k, v|
122
+ send("#{k}=", v) if respond_to?("#{k}=")
123
+ end
124
+ end
125
+
126
+ def inspect
127
+ "<#{self.class}:#{object_id} type: #{type}>"
128
+ end
129
+
130
+ # This module implements the flow control API for the V93K
131
+ module FlowControlAPI
132
+ def enable
133
+ @enable
134
+ end
135
+
136
+ def enable=(val)
137
+ @enable = val
138
+ end
139
+ alias_method :if_enable=, :enable=
140
+ alias_method :if_enabled=, :enable=
141
+ alias_method :enabled=, :enable=
142
+
143
+ def unless_enable
144
+ @unless_enable
145
+ end
146
+
147
+ def unless_enable=(val)
148
+ @unless_enable = val
149
+ end
150
+ alias_method :unless_enabled=, :unless_enable=
151
+
152
+ def if_jobs
153
+ @if_jobs ||= []
154
+ end
155
+
156
+ def unless_jobs
157
+ @unless_jobs ||= []
158
+ end
159
+
160
+ def if_job=(jobs)
161
+ [jobs].flatten.compact.each do |job|
162
+ job = job.to_s.upcase
163
+ if_jobs << job unless if_jobs.include?(job)
164
+ end
165
+ end
166
+ alias_method :if_jobs=, :if_job=
167
+ alias_method :add_if_jobs, :if_job=
168
+ alias_method :add_if_job, :if_job=
169
+
170
+ def unless_job=(jobs)
171
+ [jobs].flatten.compact.each do |job|
172
+ job = job.to_s.upcase
173
+ job.gsub!('!', '')
174
+ unless_jobs << job unless unless_jobs.include?(job)
175
+ end
176
+ end
177
+ alias_method :unless_jobs=, :unless_job=
178
+ alias_method :add_unless_jobs, :unless_job=
179
+ alias_method :add_unless_job, :unless_job=
180
+
181
+ # Run the test only if the given flow variable is true
182
+ def flag_true=(var)
183
+ c = "@#{var.to_s.upcase} == 1"
184
+ if type == :if_then && condition == :skip
185
+ self.condition = c
186
+ self
187
+ else
188
+ node = FlowNode.create(flow, :if_then)
189
+ node.parent = parent
190
+ node.condition = c
191
+ node.nodes << self
192
+ # Replace self in the main flow with the conditional node (which includes self
193
+ # in its parent collection)
194
+ parent[parent.index(self)] = node
195
+ flow.replace_relationship_dependent(self, node)
196
+ end
197
+ end
198
+
199
+ # Run the test unless the given flow variable is true
200
+ def flag_clear=(var)
201
+ c = "@#{var.to_s.upcase} != 1"
202
+ if type == :if_then && condition == :skip
203
+ self.condition = c
204
+ self
205
+ else
206
+ node = FlowNode.create(flow, :if_then)
207
+ node.parent = parent
208
+ node.condition = c
209
+ node.nodes << self
210
+ # Replace self in the main flow with the conditional node (which includes self
211
+ # in its parent collection)
212
+ parent[parent.index(self)] = node
213
+ flow.replace_relationship_dependent(self, node)
214
+ end
215
+ end
216
+
217
+ def continue_on_fail
218
+ if group? || if_then?
219
+ nodes.reject! do |n|
220
+ if n.bin?
221
+ n.deleted = true
222
+ parent.delete(n)
223
+ true
224
+ end
225
+ end
226
+ nodes.each { |n| n.continue_on_fail if n.test? || n.if_then? }
227
+ if if_then?
228
+ else_nodes.reject! do |n|
229
+ if n.bin?
230
+ n.deleted = true
231
+ parent.delete(n)
232
+ true
233
+ end
234
+ end
235
+ else_nodes.each { |n| n.continue_on_fail if n.test? || n.if_then? }
236
+ end
237
+ else
238
+ else_nodes.reject! do |n|
239
+ if n.bin?
240
+ n.deleted = true
241
+ parent.delete(n)
242
+ true
243
+ end
244
+ end
245
+ end
246
+ end
247
+
248
+ def set_flag_on_fail(id = id)
249
+ var = "#{id}_FAILED"
250
+ if group?
251
+ nodes.each { |n| n.set_flag_on_fail(id) if n.test? || n.if_then? }
252
+ elsif if_then?
253
+ nodes.each { |n| n.set_flag_on_fail(id) if n.test? || n.if_then? }
254
+ else_nodes.each { |n| n.set_flag_on_fail(id) if n.test? || n.if_then? }
255
+ else
256
+ @fail_flags_set ||= []
257
+ unless @fail_flags_set.include?(var)
258
+ flow.flow_control_variables << var
259
+ else_nodes << flow.assign_value(var, 1)
260
+ @fail_flags_set << var
261
+ end
262
+ end
263
+ var
264
+ end
265
+
266
+ def set_flag_on_pass(id = id)
267
+ var = "#{id}_PASSED"
268
+ if group?
269
+ nodes.each { |n| n.set_flag_on_pass(id) if n.test? || n.if_then? }
270
+ elsif if_then?
271
+ nodes.each { |n| n.set_flag_on_pass(id) if n.test? || n.if_then? }
272
+ else_nodes.each { |n| n.set_flag_on_pass(id) if n.test? || n.if_then? }
273
+ else
274
+ @pass_flags_set ||= []
275
+ unless @pass_flags_set.include?(var)
276
+ flow.flow_control_variables << var
277
+ nodes << flow.assign_value(var, 1)
278
+ @pass_flags_set << var
279
+ end
280
+ end
281
+ var
282
+ end
283
+
284
+ def set_flag_on_ran(id = id)
285
+ var = "#{id}_RAN"
286
+ if group?
287
+ nodes.each { |n| n.set_flag_on_ran(id) if n.test? }
288
+ else
289
+ @ran_flags_set ||= []
290
+ unless @ran_flags_set.include?(var)
291
+ flow.flow_control_variables << var
292
+ nodes << flow.assign_value(var, 1)
293
+ else_nodes << flow.assign_value(var, 1)
294
+ @ran_flags_set << var
295
+ end
296
+ end
297
+ var
298
+ end
299
+
300
+ def run_if_all_passed(parent)
301
+ end
302
+
303
+ def run_if_any_passed(parent)
304
+ end
305
+
306
+ def run_if_all_failed(parent)
307
+ end
308
+
309
+ def run_if_any_failed(parent)
310
+ end
311
+ end
312
+ include FlowControlAPI
313
+
314
+ def empty?
315
+ return false if type == :run
316
+ if respond_to?(:nodes)
317
+ nodes.each { |n| return false unless n.deleted? || n.rendered? || n.empty? }
318
+ if respond_to?(:else_nodes)
319
+ else_nodes.each { |n| return false unless n.deleted? || n.rendered? || n.empty? }
320
+ end
321
+ true
322
+ end
323
+ end
324
+
325
+ def lines(options = {})
326
+ return [] if empty?
327
+ # Convert Run nodes to Run and Branch as required
328
+ if type == :run && (!nodes.empty? || !else_nodes.empty?)
329
+ self.type = :run_and_branch
330
+ end
331
+ case type
332
+ when :good_bin, :bad_bin
333
+ l = ["stop_bin \"#{soft_bin || bin}\", \"#{soft_bin_desc}\", , #{bin_type}, #{reprobe ? 'reprobe' : 'noreprobe'}, #{color}, #{bin}, #{overon ? 'over_on' : 'not_over_on'};"]
334
+ when :print
335
+ l = ["print(\"#{value}\");"]
336
+ when :print_to_datalog
337
+ l = ["print_dl(\"#{value}\");"]
338
+ when :run
339
+ l = ["run(#{test_suite.name});"]
340
+ when :run_and_branch
341
+ l = [
342
+ "run_and_branch(#{test_suite.name})",
343
+ 'then',
344
+ '{'
345
+ ]
346
+ nodes.each do |node|
347
+ l << node.lines(indent: 3) unless node.rendered
348
+ node.rendered = true
349
+ end
350
+ l += [
351
+ '}',
352
+ 'else',
353
+ '{'
354
+ ]
355
+ else_nodes.each do |node|
356
+ l << node.lines(indent: 3) unless node.rendered
357
+ node.rendered = true
358
+ end
359
+ l << '}'
360
+ l.flatten!
361
+
362
+ when :if_then
363
+ c = condition == :skip ? '1' : condition
364
+ l = [
365
+ "if #{c} then",
366
+ '{'
367
+ ]
368
+ nodes.each do |node|
369
+ l << node.lines(indent: 3) unless node.rendered
370
+ node.rendered = true
371
+ end
372
+ l += [
373
+ '}',
374
+ 'else',
375
+ '{'
376
+ ]
377
+ else_nodes.each do |node|
378
+ l << node.lines(indent: 3) unless node.rendered
379
+ node.rendered = true
380
+ end
381
+ l << '}'
382
+ l.flatten!
383
+
384
+ when :group
385
+ l = ['{']
386
+ nodes.each do |node|
387
+ l << node.lines(indent: 3) unless node.rendered
388
+ node.rendered = true
389
+ end
390
+ l << "}, #{bypass ? 'groupbypass, ' : ''}open,\"#{name}\", \"#{comment}\""
391
+ l.flatten!
392
+ when :assign_value
393
+ l = ["@#{variable.to_s.upcase} = #{value};"]
394
+ else
395
+ fail "Don't know how to render: #{type}"
396
+ end
397
+ if options[:indent]
398
+ l.map! { |line| (' ' * options[:indent]) + line }
399
+ end
400
+ l
401
+ end
402
+
403
+ def finalize(options = {})
404
+ case type
405
+ when :good_bin, :bad_bin
406
+ if bin && bin_desc
407
+ flow.hardware_bin_descriptions[bin] = bin_desc
408
+ end
409
+ end
410
+
411
+ # Implement job/enable branches
412
+ unless if_jobs.empty?
413
+ condition = if_jobs.map { |j| "@JOB == \"#{j}\"" }.join(' or ')
414
+ node = FlowNode.create(flow, :if_then)
415
+ node.parent = parent
416
+ node.condition = condition
417
+ node.nodes << self
418
+ parent[parent.index(self)] = node
419
+ self.parent = node.nodes
420
+ end
421
+ unless unless_jobs.empty?
422
+ condition = unless_jobs.map { |j| "@JOB != \"#{j}\"" }.join(' and ')
423
+ node = FlowNode.create(flow, :if_then)
424
+ node.parent = parent
425
+ node.condition = condition
426
+ node.nodes << self
427
+ parent[parent.index(self)] = node
428
+ self.parent = node.nodes
429
+ end
430
+ if enable
431
+ condition = "@#{enable.to_s.upcase} == 1"
432
+ node = FlowNode.create(flow, :if_then)
433
+ node.parent = parent
434
+ node.condition = condition
435
+ node.nodes << self
436
+ parent[parent.index(self)] = node
437
+ self.parent = node.nodes
438
+ end
439
+ if unless_enable
440
+ condition = "@#{unless_enable.to_s.upcase} == 1"
441
+ node = FlowNode.create(flow, :if_then)
442
+ node.parent = parent
443
+ node.condition = condition
444
+ node.else_nodes << self
445
+ parent[parent.index(self)] = node
446
+ self.parent = node.else_nodes
447
+ end
448
+ end
449
+
450
+ def group?
451
+ type == :group
452
+ end
453
+
454
+ def test?
455
+ [:run, :run_and_branch].include?(@type)
456
+ end
457
+
458
+ def if_then?
459
+ type == :if_then
460
+ end
461
+
462
+ def bin?
463
+ [:stop_bin, :bad_bin].include?(@type)
464
+ end
465
+
466
+ def self.platform
467
+ Origen.interface.platform
468
+ end
469
+
470
+ def platform
471
+ self.class.platform
472
+ end
473
+ end
474
+ end
475
+ end
476
+ end