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,171 @@
1
+ module OrigenTesters
2
+ module IGXLBasedTester
3
+ class Base
4
+ class Flow
5
+ include OrigenTesters::Generator
6
+ include OrigenTesters::Generator::FlowControlAPI
7
+
8
+ OUTPUT_POSTFIX = 'flow'
9
+
10
+ def add(type, options = {})
11
+ ins = false
12
+ options = save_context(options) if [:test, :cz].include?(type)
13
+ branch_unless_enabled(options) do |options|
14
+ ins = track_relationships(options) do |options|
15
+ platform::FlowLine.new(type, options)
16
+ end
17
+ collection << ins unless Origen.interface.resources_mode?
18
+ if ins.test?
19
+ c = Origen.interface.consume_comments
20
+ unless Origen.interface.resources_mode?
21
+ Origen.interface.descriptions.add_for_test_usage(ins.parameter, Origen.interface.top_level_flow, c)
22
+ end
23
+ else
24
+ Origen.interface.discard_comments
25
+ end
26
+ end
27
+ ins
28
+ end
29
+
30
+ def logprint(message, options = {})
31
+ message.gsub!(/\s/, '_')
32
+ add(:logprint, options.merge(parameter: message))
33
+ end
34
+
35
+ def test(instance, options = {})
36
+ add(:test, options.merge(parameter: instance))
37
+ end
38
+
39
+ def cz(instance, cz_setup, options = {})
40
+ add(:cz, options.merge(parameter: instance, cz_setup: cz_setup))
41
+ end
42
+
43
+ def use_limit(name, options = {})
44
+ add(:use_limit, options)
45
+ end
46
+
47
+ def goto(label, options = {})
48
+ add(:goto, options.merge(parameter: label))
49
+ end
50
+
51
+ def nop(options = {})
52
+ add(:nop, options.merge(parameter: nil))
53
+ end
54
+
55
+ def set_device(options = {})
56
+ add(:set_device, options)
57
+ end
58
+
59
+ def set_error_bin(options = {})
60
+ add(:set_error_bin, options)
61
+ end
62
+
63
+ def enable_flow_word(word, options = {})
64
+ add(:enable_flow_word, options.merge(parameter: word))
65
+ end
66
+
67
+ def disable_flow_word(word, options = {})
68
+ add(:disable_flow_word, options.merge(parameter: word))
69
+ end
70
+
71
+ def flag_false(name, options = {})
72
+ add(:flag_false, options.merge(parameter: name))
73
+ end
74
+
75
+ def flag_false_all(name, options = {})
76
+ add(:flag_false_all, options.merge(parameter: name))
77
+ end
78
+
79
+ # def flag_true(name, options = {})
80
+ def flag_true(options = {})
81
+ add(:flag_true, options)
82
+ end
83
+
84
+ def flag_true_all(name, options = {})
85
+ add(:flag_true_all, options.merge(parameter: name))
86
+ end
87
+
88
+ # Generates 2 flow lines of flag-true to help set a single flag based on OR of 2 other flags
89
+ def or_flags(name1, name2, options = {})
90
+ options = {
91
+ condition: :fail, # condition to check for
92
+ flowname: false, # if flowname provided
93
+ }.merge(options)
94
+
95
+ case options[:condition]
96
+ when :fail
97
+ options[:condition] = 'FAILED'
98
+ when :pass
99
+ options[:condition] = 'PASSED'
100
+ else
101
+ options[:condition] = 'RAN'
102
+ end
103
+ id = options.delete(:id) # get original ID
104
+
105
+ # set parameter names
106
+ parameter = "#{id}"
107
+ parameter += "_#{options[:flowname]}" if options[:flowname]
108
+ parameter += "_#{options[:condition]}"
109
+
110
+ options[:id] = id
111
+ add(:flag_true_all, options.merge(parameter: parameter))
112
+ options.delete(:id)
113
+ add(:flag_false, options.merge(parameter: parameter, if_passed: name1, result: '', flag_pass: '', flag_fail: '')) # No ID
114
+ add(:flag_false, options.merge(parameter: parameter, if_passed: name2)) # No ID
115
+ nop
116
+ end
117
+
118
+ # All tests generated will not run unless the given enable word is asserted.
119
+ #
120
+ # This is specially implemented for J750 since it does not have a native
121
+ # support for flow word not enabled.
122
+ # It will generate a goto branch around the tests contained with the block
123
+ # if the given flow word is enabled.
124
+ def unless_enable(word, options = {})
125
+ if options[:or]
126
+ yield
127
+ else
128
+ @unless_enable_block = word
129
+ options = options.merge(unless_enable: word)
130
+ branch_unless_enabled(options.merge(_force_unless_enable: true)) do
131
+ yield
132
+ end
133
+ @unless_enable_block = nil
134
+ end
135
+ end
136
+ alias_method :unless_enabled, :unless_enable
137
+
138
+ def start_flow_branch(identifier, options = {})
139
+ goto(identifier, options)
140
+ end
141
+
142
+ def skip(identifier = nil, options = {})
143
+ identifier, options = nil, identifier if identifier.is_a?(Hash)
144
+ identifier = generate_unique_label(identifier)
145
+ goto(identifier, options)
146
+ yield
147
+ nop(label: identifier)
148
+ end
149
+
150
+ private
151
+
152
+ # If the test has an unless_enable then branch around it
153
+ def branch_unless_enabled(options)
154
+ word = options.delete(:unless_enable) || options.delete(:unless_enabled)
155
+ if word && (word != @unless_enable_block || options.delete(:_force_unless_enable))
156
+ # Not sure if this is really required, but duplicating these hashes here to ensure
157
+ # that all other flow context keys are preserved and applied to the branch lines
158
+ orig_options = options.merge({})
159
+ close_options = options.merge({})
160
+ label = generate_unique_label
161
+ goto(label, options.merge(if_enable: word))
162
+ yield orig_options
163
+ nop(close_options.merge(label: label))
164
+ else
165
+ yield options
166
+ end
167
+ end
168
+ end
169
+ end
170
+ end
171
+ end
@@ -0,0 +1,322 @@
1
+ module OrigenTesters
2
+ module IGXLBasedTester
3
+ class Base
4
+ class FlowLine
5
+ attr_accessor :type, :id, :cz_setup # cz_setup is a virtual attrib since it is not part of the regular flow line
6
+ # cz_setup combine with instance name when characterize opcode is used
7
+
8
+ # Map any aliases to the official names here, multiple aliases for a given attribute
9
+ # are allowed
10
+ ALIASES = {
11
+ bin: :bin_fail,
12
+ softbin: :sort_fail,
13
+ soft_bin: :sort_fail,
14
+ sbin: :sort_fail,
15
+ name: :tname,
16
+ number: :tnum,
17
+ if_enable: :enable,
18
+ if_enabled: :enable,
19
+ enabled: :enable,
20
+ hi_limit: :hilim,
21
+ hi: :hilim,
22
+ lo_limit: :lolim,
23
+ lo: :lolim,
24
+ # Aliases can also be used to set defaults on multiple attributes like this,
25
+ # use :value to refer to the value passed in to the given alias
26
+ flag_false: { device_condition: 'flag-false',
27
+ device_name: :value
28
+ },
29
+ flag_true: { device_condition: 'flag-true',
30
+ device_name: :value
31
+ },
32
+ flag_false_any: { group_specifier: 'any-active',
33
+ group_condition: 'flag-false',
34
+ group_name: :value
35
+ },
36
+ flag_false_all: { group_specifier: 'all-active',
37
+ group_condition: 'flag-false',
38
+ group_name: :value
39
+ },
40
+ flag_true_any: { group_specifier: 'any-active',
41
+ group_condition: 'flag-true',
42
+ group_name: :value
43
+ },
44
+ flag_true_all: { group_specifier: 'all-active',
45
+ group_condition: 'flag-true',
46
+ group_name: :value
47
+ },
48
+ flag_clear: { device_condition: 'flag-clear',
49
+ device_name: :value
50
+ }
51
+ }
52
+
53
+ # Assign attribute defaults here, generally this should match whatever defaults
54
+ # Teradyne has set whenever you create a new test instance, etc.
55
+ DEFAULTS = {
56
+ test: {
57
+ opcode: 'Test',
58
+ result: 'Fail'
59
+ },
60
+ cz: {
61
+ opcode: 'characterize',
62
+ result: 'None'
63
+ },
64
+ goto: {
65
+ opcode: 'goto'
66
+ },
67
+ nop: {
68
+ opcode: 'nop'
69
+ },
70
+ set_device: {
71
+ opcode: 'set-device'
72
+ },
73
+ set_error_bin: {
74
+ opcode: 'set-error-bin'
75
+ },
76
+ enable_flow_word: {
77
+ opcode: 'enable-flow-word'
78
+ },
79
+ disable_flow_word: {
80
+ opcode: 'disable-flow-word'
81
+ },
82
+ logprint: {
83
+ opcode: 'logprint'
84
+ },
85
+ use_limit: {
86
+ opcode: 'Use-Limit',
87
+ result: 'Fail'
88
+ },
89
+ flag_false: {
90
+ opcode: 'flag-false'
91
+ },
92
+ flag_false_all: {
93
+ opcode: 'flag-false-all'
94
+ },
95
+ flag_true: {
96
+ opcode: 'flag-true'
97
+ },
98
+ flag_true_all: {
99
+ opcode: 'flag-true-all'
100
+ }
101
+ }
102
+
103
+ def self.define
104
+ # Generate accessors for all attributes and their aliases
105
+ self::TESTER_FLOWLINE_ATTRS.each do |attr|
106
+ writer = "#{attr}=".to_sym
107
+ reader = attr.to_sym
108
+ attr_reader attr.to_sym unless method_defined? reader
109
+ attr_writer attr.to_sym unless method_defined? writer
110
+ end
111
+
112
+ ALIASES.each do |_alias, val|
113
+ if val.is_a? Hash
114
+ if ((self::TESTER_FLOWLINE_ATTRS.map(&:to_sym)) & val.keys) == val.keys
115
+ writer = "#{_alias}=".to_sym
116
+ unless method_defined? writer
117
+ define_method("#{_alias}=") do |v|
118
+ val.each do |k, _v|
119
+ myval = _v == :value ? v : _v
120
+ send("#{k}=", myval)
121
+ end
122
+ end
123
+ end
124
+ end
125
+ else
126
+
127
+ if self::TESTER_FLOWLINE_ATTRS.include? "#{val}"
128
+ writer = "#{_alias}=".to_sym
129
+ reader = _alias.to_sym
130
+ unless method_defined? writer
131
+ define_method("#{_alias}=") do |v|
132
+ send("#{val}=", v)
133
+ end
134
+ end
135
+ unless method_defined? reader
136
+ define_method("#{_alias}") do
137
+ send(val)
138
+ end
139
+ end
140
+ end
141
+ end
142
+ end
143
+ end
144
+
145
+ def initialize(type, attrs = {})
146
+ @ignore_missing_instance = attrs.delete(:instance_not_available)
147
+ self.cz_setup = attrs.delete(:cz_setup)
148
+ @type = type
149
+ # Set the defaults
150
+ DEFAULTS[@type.to_sym].each do |k, v|
151
+ send("#{k}=", v) if self.respond_to?("#{k}=")
152
+ end
153
+ # Then the values that have been supplied
154
+ attrs.each do |k, v|
155
+ send("#{k}=", v) if self.respond_to?("#{k}=")
156
+ end
157
+ end
158
+
159
+ def parameter=(value)
160
+ if (@type == :test || @test == :cz) && !@ignore_missing_instance
161
+ if value.is_a?(String) || value.is_a?(Symbol)
162
+ fail "You must supply the actual test instance object for #{value} when adding it to the flow"
163
+ end
164
+ end
165
+ @parameter = value
166
+ end
167
+
168
+ def parameter
169
+ # When referring to the test instance take the opportunity to refresh the current
170
+ # version of the test instance
171
+ @parameter = Origen.interface.identity_map.current_version_of(@parameter)
172
+ end
173
+
174
+ # Returns the fully formatted flow line for insertion into a flow sheet
175
+ def to_s
176
+ l = "\t"
177
+ self.class::TESTER_FLOWLINE_ATTRS.each do |attr|
178
+ if attr == 'parameter'
179
+ ins = parameter
180
+ if ins.respond_to?(:name)
181
+ l += "#{ins.name}"
182
+ else
183
+ l += "#{ins}"
184
+ end
185
+ if type == :cz && cz_setup
186
+ l += " #{cz_setup}\t"
187
+ else
188
+ l += "\t"
189
+ end
190
+ else
191
+ l += "#{send(attr)}\t"
192
+ end
193
+ end
194
+ "#{l}"
195
+ end
196
+
197
+ def job
198
+ if !if_jobs.empty? && !unless_jobs.empty?
199
+ fail "Both if and unless jobs have been defined for test: #{parameter}"
200
+ elsif !if_jobs.empty?
201
+ if_jobs.join(',')
202
+ elsif !unless_jobs.empty?
203
+ unless_jobs.map { |j| "!#{j}" }.join(',')
204
+ else
205
+ ''
206
+ end
207
+ end
208
+ alias_method :jobs, :job
209
+
210
+ def unless_enable=(*args)
211
+ end
212
+ alias_method :unless_enabled=, :unless_enable=
213
+
214
+ def if_jobs
215
+ @if_jobs ||= []
216
+ end
217
+
218
+ def unless_jobs
219
+ @unless_jobs ||= []
220
+ end
221
+
222
+ def if_job=(jobs)
223
+ [jobs].flatten.compact.each do |job|
224
+ job = job.to_s.upcase
225
+ if job =~ /!/
226
+ self.unless_job = job
227
+ else
228
+ if_jobs << job unless if_jobs.include?(job)
229
+ end
230
+ end
231
+ end
232
+ alias_method :if_jobs=, :if_job=
233
+ alias_method :add_if_jobs, :if_job=
234
+ alias_method :add_if_job, :if_job=
235
+
236
+ def unless_job=(jobs)
237
+ [jobs].flatten.compact.each do |job|
238
+ job = job.to_s.upcase
239
+ job.gsub!('!', '')
240
+ unless_jobs << job unless unless_jobs.include?(job)
241
+ end
242
+ end
243
+ alias_method :unless_jobs=, :unless_job=
244
+ alias_method :add_unless_jobs, :unless_job=
245
+ alias_method :add_unless_job, :unless_job=
246
+
247
+ def continue_on_fail
248
+ self.result = 'None'
249
+ end
250
+
251
+ def continue_pass
252
+ self.result = 'Pass'
253
+ end
254
+
255
+ def debug_assume_pass
256
+ self.debug_assume = 'Pass'
257
+ end
258
+
259
+ def debug_assume_fail
260
+ self.debug_assume = 'Fail'
261
+ end
262
+
263
+ # def debug_sites
264
+ # self.debug_sites = "All"
265
+ # end
266
+
267
+ def set_flag_on_fail
268
+ self.flag_fail = "#{id}_FAILED"
269
+ end
270
+
271
+ def set_flag_on_pass
272
+ self.flag_pass = "#{id}_PASSED"
273
+ end
274
+
275
+ def set_flag_on_ran
276
+ self.flag_pass = "#{id}_RAN"
277
+ end
278
+
279
+ def run_if_any_passed(parent)
280
+ parent.continue_on_fail
281
+ self.flag_true_any = parent.set_flag_on_pass
282
+ end
283
+
284
+ def run_if_all_passed(parent)
285
+ parent.continue_on_fail
286
+ self.flag_true_all = parent.set_flag_on_pass
287
+ end
288
+
289
+ def run_if_any_failed(parent)
290
+ parent.continue_on_fail
291
+ self.flag_true_any = parent.set_flag_on_fail
292
+ end
293
+
294
+ def run_if_all_failed(parent)
295
+ parent.continue_on_fail
296
+ self.flag_true_all = parent.set_flag_on_fail
297
+ end
298
+
299
+ def run_if_all_(args)
300
+ # code
301
+ end
302
+
303
+ def id
304
+ @id || "#{parameter}_#{unique_counter}"
305
+ end
306
+
307
+ def unique_counter
308
+ @unique_counter ||= self.class.unique_counter
309
+ end
310
+
311
+ def self.unique_counter
312
+ @ix ||= -1
313
+ @ix += 1
314
+ end
315
+
316
+ def test?
317
+ @type == :test
318
+ end
319
+ end
320
+ end
321
+ end
322
+ end