origen_testers 0.5.7 → 0.6.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 (81) hide show
  1. checksums.yaml +4 -4
  2. data/config/shared_commands.rb +6 -0
  3. data/config/version.rb +2 -2
  4. data/lib/commands/run.rb +44 -0
  5. data/lib/origen_testers.rb +19 -1
  6. data/lib/origen_testers/flow.rb +382 -0
  7. data/lib/origen_testers/generator.rb +32 -29
  8. data/lib/origen_testers/igxl_based_tester/base/ac_specsets.rb +79 -0
  9. data/lib/origen_testers/igxl_based_tester/base/dc_specsets.rb +98 -0
  10. data/lib/origen_testers/igxl_based_tester/base/edge.rb +60 -0
  11. data/lib/origen_testers/igxl_based_tester/base/edges.rb +24 -0
  12. data/lib/origen_testers/igxl_based_tester/base/edgeset.rb +39 -0
  13. data/lib/origen_testers/igxl_based_tester/base/edgesets.rb +97 -0
  14. data/lib/origen_testers/igxl_based_tester/base/flow.rb +390 -115
  15. data/lib/origen_testers/igxl_based_tester/base/flow_line.rb +4 -54
  16. data/lib/origen_testers/igxl_based_tester/base/generator.rb +257 -11
  17. data/lib/origen_testers/igxl_based_tester/base/level_io_se.rb +59 -0
  18. data/lib/origen_testers/igxl_based_tester/base/level_supply.rb +39 -0
  19. data/lib/origen_testers/igxl_based_tester/base/levels.rb +31 -0
  20. data/lib/origen_testers/igxl_based_tester/base/levelset.rb +109 -0
  21. data/lib/origen_testers/igxl_based_tester/base/pinmap.rb +93 -0
  22. data/lib/origen_testers/igxl_based_tester/base/test_instance.rb +33 -1
  23. data/lib/origen_testers/igxl_based_tester/base/timeset.rb +37 -0
  24. data/lib/origen_testers/igxl_based_tester/base/timesets.rb +47 -0
  25. data/lib/origen_testers/igxl_based_tester/j750/templates/flow.txt.erb +2 -2
  26. data/lib/origen_testers/igxl_based_tester/ultraflex/ac_specsets.rb +10 -0
  27. data/lib/origen_testers/igxl_based_tester/ultraflex/custom_test_instance.rb +4 -0
  28. data/lib/origen_testers/igxl_based_tester/ultraflex/dc_specsets.rb +10 -0
  29. data/lib/origen_testers/igxl_based_tester/ultraflex/edge.rb +9 -0
  30. data/lib/origen_testers/igxl_based_tester/ultraflex/edges.rb +9 -0
  31. data/lib/origen_testers/igxl_based_tester/ultraflex/edgeset.rb +9 -0
  32. data/lib/origen_testers/igxl_based_tester/ultraflex/edgesets.rb +10 -0
  33. data/lib/origen_testers/igxl_based_tester/ultraflex/flow.rb +137 -0
  34. data/lib/origen_testers/igxl_based_tester/ultraflex/level_io_se.rb +9 -0
  35. data/lib/origen_testers/igxl_based_tester/ultraflex/level_supply.rb +9 -0
  36. data/lib/origen_testers/igxl_based_tester/ultraflex/levels.rb +9 -0
  37. data/lib/origen_testers/igxl_based_tester/ultraflex/levelset.rb +10 -0
  38. data/lib/origen_testers/igxl_based_tester/ultraflex/pinmap.rb +10 -0
  39. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/ac_specsets.txt.erb +58 -0
  40. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/dc_specsets.txt.erb +58 -0
  41. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/edgesets.txt.erb +95 -0
  42. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/flow.txt.erb +2 -2
  43. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/levelset.txt.erb +121 -0
  44. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/pinmap.txt.erb +24 -0
  45. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/timesets.txt.erb +137 -0
  46. data/lib/origen_testers/igxl_based_tester/ultraflex/test_instance.rb +4 -0
  47. data/lib/origen_testers/igxl_based_tester/ultraflex/timeset.rb +9 -0
  48. data/lib/origen_testers/igxl_based_tester/ultraflex/timesets.rb +10 -0
  49. data/lib/origen_testers/interface.rb +41 -6
  50. data/lib/origen_testers/no_interface.rb +7 -0
  51. data/lib/origen_testers/origen_ext/application/runner.rb +25 -0
  52. data/lib/origen_testers/origen_ext/generator.rb +37 -0
  53. data/lib/origen_testers/origen_ext/generator/flow.rb +70 -0
  54. data/lib/origen_testers/origen_ext/generator/resources.rb +21 -0
  55. data/lib/origen_testers/program_generators.rb +0 -1
  56. data/lib/origen_testers/smartest_based_tester/base/flow.rb +158 -134
  57. data/lib/origen_testers/smartest_based_tester/base/generator.rb +2 -3
  58. data/lib/origen_testers/smartest_based_tester/base/test_suite.rb +4 -0
  59. data/lib/origen_testers/smartest_based_tester/v93k/templates/template.flow.erb +5 -6
  60. data/lib/origen_testers/test/dut.rb +5 -0
  61. data/lib/origen_testers/test/j750_base_interface.rb +0 -3
  62. data/lib/origen_testers/test/ultraflex_interface.rb +230 -4
  63. data/lib/origen_testers/test/v93k_interface.rb +5 -23
  64. data/program/components/_temp.rb +6 -0
  65. data/program/flow_control.rb +190 -62
  66. data/program/prb1.rb +13 -50
  67. data/program/prb2.rb +0 -16
  68. data/program/test.rb +12 -3
  69. data/program/uflex_resources.rb +159 -0
  70. metadata +66 -16
  71. data/lib/origen_testers/doc.rb +0 -224
  72. data/lib/origen_testers/doc/generator.rb +0 -124
  73. data/lib/origen_testers/doc/generator/flow.rb +0 -69
  74. data/lib/origen_testers/doc/generator/flow_line.rb +0 -201
  75. data/lib/origen_testers/doc/generator/test.rb +0 -66
  76. data/lib/origen_testers/doc/generator/test_group.rb +0 -64
  77. data/lib/origen_testers/doc/generator/tests.rb +0 -45
  78. data/lib/origen_testers/doc/model.rb +0 -160
  79. data/lib/origen_testers/generator/flow_control_api.rb +0 -611
  80. data/lib/origen_testers/smartest_based_tester/base/flow_node.rb +0 -476
  81. data/lib/origen_testers/smartest_based_tester/v93k/flow_node.rb +0 -9
@@ -95,6 +95,10 @@ module OrigenTesters
95
95
  end
96
96
  end
97
97
 
98
+ def inspect
99
+ "<TestSuite: #{name}>"
100
+ end
101
+
98
102
  # The name is immutable once the test_suite is created, this will raise an error when called
99
103
  def name=(val, options = {})
100
104
  fail 'Once assigned the name of a test suite cannot be changed!'
@@ -28,6 +28,9 @@ declarations
28
28
  % flow_control_variables.each do |var|
29
29
  @<%= var.to_s.upcase %> = -1;
30
30
  % end
31
+ % runtime_control_variables.each do |var|
32
+ @<%= var.to_s.upcase %> = -1;
33
+ % end
31
34
  % end
32
35
  end
33
36
  --------------------------------------------------
@@ -160,16 +163,12 @@ test_flow
160
163
  % end
161
164
  % else
162
165
  {
163
- % flow_control_variables.each do |var|
166
+ % runtime_control_variables.each do |var|
164
167
  @<%= var.to_s.upcase %> = -1;
165
168
  % end
166
169
  }, open,"Init Flow Control Vars", ""
167
- % collection.each do |node|
168
- % unless node.rendered? || node.deleted? || node.empty?
169
- % node.lines.each do |line|
170
+ % lines.each do |line|
170
171
  <%= line %>
171
- % end
172
- % end
173
172
  % end
174
173
  % end
175
174
  end
@@ -20,6 +20,11 @@ module OrigenTesters
20
20
  add_pin :tdi
21
21
  add_pin :tdo
22
22
  add_pin :tms
23
+ # add_pin_group :jtag, :tdi, :tdo, :tms
24
+ add_power_pin_group :vdd1
25
+ add_power_pin_group :vdd2
26
+ add_virtual_pin :virtual1, type: :virtual_pin
27
+ add_virtual_pin :virtual2, type: :ate_ch
23
28
 
24
29
  reg :testme32, 0x007a do |reg|
25
30
  reg.bits 31..16, :portB
@@ -111,9 +111,6 @@ module OrigenTesters
111
111
  end
112
112
  end
113
113
  end
114
-
115
- def bin(number, options = {})
116
- end
117
114
  end
118
115
  end
119
116
  end
@@ -51,6 +51,11 @@ module OrigenTesters
51
51
  ins = test_instances.functional(name)
52
52
  ins.set_wait_flags(:a) if options[:duration] == :dynamic
53
53
  ins.pin_levels = options.delete(:pin_levels) if options[:pin_levels]
54
+ ins.lo_limit = options[:lo_limit]
55
+ ins.hi_limit = options[:hi_limit]
56
+ ins.scale = options[:scale]
57
+ ins.units = options[:units]
58
+ ins.defer_limits = options[:defer_limits]
54
59
 
55
60
  pname = "#{name}_pset"
56
61
  patsets.add(pname, [{ pattern: "#{name}.PAT" },
@@ -59,10 +64,7 @@ module OrigenTesters
59
64
  if options[:cz_setup]
60
65
  flow.cz(ins, options[:cz_setup], options)
61
66
  else
62
- use_limit_params = [:lo_limit, :hi_limit, :scale, :units] # define options to strip for flow.test
63
- options_use_limit = options.dup # duplicate, as modifying options directly, even an assigned copy modifies original
64
- flow.test(ins, options.reject! { |k, _| use_limit_params.include? k }) # set up test skipping use-limit options
65
- flow.use_limit(name, options_use_limit) if options_use_limit[:hi_limit] || options_use_limit[:lo_limit] # Only use use-limit if limits present in flow
67
+ flow.test(ins, options)
66
68
  end
67
69
  end
68
70
 
@@ -105,6 +107,230 @@ module OrigenTesters
105
107
 
106
108
  def bin(number, options = {})
107
109
  end
110
+
111
+ # Assign relevant pins for pinmap sheet generation
112
+ def pinmap(name, options = {})
113
+ pinmap = pinmaps("#{name}")
114
+ Origen.top_level.add_pin_group :JTAG, :tdi, :tdo, :tms
115
+ Origen.top_level.power_pin_groups.keys.each do |grp_key|
116
+ pinmap.add_power_pin(grp_key, type: 'Power', comment: "# #{grp_key}")
117
+ end
118
+ Origen.top_level.virtual_pins.keys.each do |util_pin|
119
+ upin = Origen.top_level.virtual_pins(util_pin)
120
+ case upin.type
121
+ when :virtual_pin
122
+ pinmap.add_utility_pin(upin.name, type: 'Utility', comment: "# #{util_pin}")
123
+ when :ate_ch
124
+ pinmap.add_utility_pin(upin.name, type: 'I/O', comment: "# #{util_pin}")
125
+ end
126
+ end
127
+ Origen.top_level.pin.keys.each do |pkey|
128
+ pinmap.add_pin(Origen.top_level.pin(pkey).name, type: 'I/O', comment: "# #{pkey}")
129
+ end
130
+ Origen.top_level.pin_groups.keys.sort.each do |gkey|
131
+ # Do not include pins that are aliased to themselves
132
+ Origen.top_level.pin(gkey).each do |pin|
133
+ pinmap.add_group_pin(gkey, Origen.top_level.pin(pin.id).name, type: 'I/O', comment: "# #{gkey}")
134
+ end
135
+ end
136
+ end
137
+
138
+ # Assign relevant edges in preparation for edgeset/timeset sheet generation
139
+ def edge(category, pin, options = {})
140
+ options = {
141
+ d_src: 'PAT', # source of the channel drive data (e.g. pattern, drive_hi, drive_lo, etc.)
142
+ d_fmt: 'NR', # drive data format (NR, RL, RH, etc.)
143
+ d0_edge: '', # time at which the input drive is turned on
144
+ d1_edge: '', # time of the initial data drive edge
145
+ d2_edge: '', # time of the return format data drive edge
146
+ d3_edge: '', # time at which the input drive is turned off
147
+ c_mode: 'Edge', # output compare mode
148
+ c1_edge: '', # time of the initial output compare edge
149
+ c2_edge: '', # time of the final output compare edge (window compare)
150
+ t_res: 'Machine', # timing resolution (possibly ATE-specific)
151
+ clk_per: '' # clock period equation - for use with MCG
152
+ }.merge(options)
153
+
154
+ @edge_collection = edges
155
+ @edge_collection.add(category, pin, options)
156
+ end
157
+
158
+ def edge_collection
159
+ @edge_collection
160
+ end
161
+
162
+ def edgeset(sheet_name, options = {})
163
+ options = {
164
+ edgeset: :es_default,
165
+ period: 'cycle', # tester cycle period
166
+ t_mode: 'Machine' # edgeset timing mode (possibly ATE-specific)
167
+ }.merge(options)
168
+ edgeset = options.delete(:edgeset)
169
+ pin = options.delete(:pin)
170
+ edge = options.delete(:edge)
171
+
172
+ @edgeset = edgesets(sheet_name)
173
+ @edgeset.add(edgeset, pin, edge, options)
174
+ collect_ac_specs(@edgeset.es[edgeset].spec_sheet, edge)
175
+ end
176
+
177
+ def timeset(sheet_name, options = {})
178
+ options = {
179
+ timeset: :default,
180
+ master_ts: :default
181
+ }.merge(options)
182
+ timeset = options.delete(:timeset)
183
+ pin = options.delete(:pin)
184
+ eset = options.delete(:eset)
185
+
186
+ @timeset = timesets(sheet_name)
187
+ @timeset.add(timeset, pin, eset, options)
188
+ end
189
+
190
+ def ac_specset(sheet_name, expression, options = {})
191
+ options = {
192
+ specset: :default,
193
+ nom: { typ: nil }
194
+ }.merge(options)
195
+
196
+ ss = ac_specsets(sheet_name)
197
+ add_ac_specs(ss, expression, options)
198
+ end
199
+
200
+ # Collects AC Spec object(s) from the given expression and adds them to the given Specset
201
+ def collect_ac_specs(ssname, edge, options = {})
202
+ options = {
203
+ nom: { typ: nil }
204
+ }.merge(options)
205
+
206
+ # Create a Specsets object from the UFlex program generator API
207
+ ss = ac_specsets(ssname.to_sym)
208
+ add_ac_specs(ss, edge.clk_per, options)
209
+ add_ac_specs(ss, edge.d0_edge, options)
210
+ add_ac_specs(ss, edge.d1_edge, options)
211
+ add_ac_specs(ss, edge.d2_edge, options)
212
+ add_ac_specs(ss, edge.d3_edge, options)
213
+ add_ac_specs(ss, edge.c1_edge, options)
214
+ add_ac_specs(ss, edge.c2_edge, options)
215
+ end
216
+
217
+ # Adds new AC Spec object(s) to the given Specset
218
+ def add_ac_specs(ss, expression, options = {})
219
+ options = {
220
+ specset: :default
221
+ }.merge(options)
222
+
223
+ return unless expression.is_a? String
224
+ # collect all variable names within the expression
225
+ vars = expression.scan(/[a-zA-Z][\w]+/).map(&:to_sym)
226
+ vars.each do |var|
227
+ next if var =~ /^(d0_edge|d1_edge|d2_edge|d3_edge|c1_edge|c2_edge)$/
228
+ # The substitutions below are used for backward compatibility
229
+ next if var =~ /^(d_on|d_data|d_ret|d_off|c_open|c_close)$/
230
+ next if var =~ /^(nS|uS|mS|S)$/i
231
+ next if ss.ac_specsets.key?(options[:specset]) && ss.ac_specsets[options[:specset]].include?(var)
232
+
233
+ ss.add(var, options)
234
+ end
235
+ end
236
+
237
+ # Assign relevant power supply levels in preparation for levelset sheet generation
238
+ def pwr_level(category, options = {})
239
+ options = {
240
+ vmain: 1.8, # Main supply voltage
241
+ valt: 1.8, # Alternate supply voltage
242
+ ifold: 1, # Supply clamp current
243
+ delay: 0 # Supply power-up delay
244
+ }.merge(options)
245
+
246
+ @level_collection = levels
247
+ @level_collection.add_power_level(category, options)
248
+ end
249
+
250
+ # Assign relevant single-ended pin levels in preparation for levelset sheet generation
251
+ def pin_level_se(category, options = {})
252
+ options = {
253
+ vil: 0, # Input drive low
254
+ vih: 1.8, # Input drive high
255
+ vol: 1.0, # Output compare low
256
+ voh: 0.8, # Output compare high
257
+ vcl: -1, # Voltage clamp low
258
+ vch: 2.5, # Voltage clamp high
259
+ vt: 0.9, # Termination voltage
260
+ voutlotyp: 0, #
261
+ vouthityp: 0, #
262
+ dmode: 'Largeswing-VT' # Driver mode
263
+ }.merge(options)
264
+
265
+ @level_collection = levels
266
+ @level_collection.add_se_pin_level(category, options)
267
+ end
268
+
269
+ def level_collection
270
+ @level_collection
271
+ end
272
+
273
+ def levelset(sheet_name, options = {})
274
+ pin = options.delete(:pin)
275
+ level = options.delete(:level)
276
+
277
+ @levelset = levelsets(sheet_name)
278
+ @levelset.add(sheet_name, pin, level, options)
279
+ collect_dc_specs(@levelset.spec_sheet, level)
280
+ end
281
+
282
+ def dc_specset(sheet_name, expression, options = {})
283
+ options = {
284
+ min: { min: nil },
285
+ nom: { typ: nil },
286
+ max: { max: nil }
287
+ }.merge(options)
288
+
289
+ ss = dc_specsets(sheet_name.to_sym)
290
+ add_dc_specs(ss, expression, options)
291
+ end
292
+
293
+ # Collects DC Spec object(s) from the given expression and adds them to the given Specset
294
+ def collect_dc_specs(ssname, level, options = {})
295
+ options = {
296
+ nom: { typ: nil },
297
+ min: { min: nil },
298
+ max: { max: nil }
299
+ }.merge(options)
300
+
301
+ # Create a Specsets object from the UFlex program generator API
302
+ ss = dc_specsets(ssname.to_sym)
303
+ if level.respond_to?(:vmain)
304
+ add_dc_specs(ss, level.vmain, options)
305
+ add_dc_specs(ss, level.valt, options)
306
+ add_dc_specs(ss, level.ifold, options)
307
+ elsif level.respond_to?(:vil)
308
+ add_dc_specs(ss, level.vil, options)
309
+ add_dc_specs(ss, level.vih, options)
310
+ add_dc_specs(ss, level.vol, options)
311
+ add_dc_specs(ss, level.voh, options)
312
+ add_dc_specs(ss, level.vcl, options)
313
+ add_dc_specs(ss, level.vch, options)
314
+ add_dc_specs(ss, level.vt, options)
315
+ add_dc_specs(ss, level.voutlotyp, options)
316
+ add_dc_specs(ss, level.vouthityp, options)
317
+ end
318
+ end
319
+
320
+ # Adds new DC Spec object(s) to the given Specset
321
+ def add_dc_specs(ss, expression, options = {})
322
+ options = {
323
+ specset: :default
324
+ }.merge(options)
325
+
326
+ return unless expression.is_a? String
327
+ vars = expression.scan(/[a-zA-Z][\w]+/).map(&:to_sym)
328
+ vars.each do |var|
329
+ next if var =~ /^(nA|uA|mA|A|nV|uV|mV|V)$/i
330
+
331
+ ss.add(var, options)
332
+ end
333
+ end
108
334
  end
109
335
  end
110
336
  end
@@ -9,7 +9,7 @@ module OrigenTesters
9
9
  end
10
10
 
11
11
  def log(msg)
12
- flow.print_to_datalog(msg)
12
+ flow.log(msg)
13
13
  end
14
14
 
15
15
  def func(name, options = {})
@@ -17,12 +17,12 @@ module OrigenTesters
17
17
  duration: :static
18
18
  }.merge(options)
19
19
 
20
- block_loop(name, options) do |block, i, group|
20
+ block_loop(name, options) do |block, i|
21
21
  tm = test_methods.ac_tml.ac_test.functional_test
22
22
  ts = test_suites.run(name, options)
23
23
  ts.test_method = tm
24
24
  ts.levels = options.delete(:pin_levels) if options[:pin_levels]
25
- if group
25
+ if block
26
26
  ts.pattern = "#{name}_b#{i}"
27
27
  else
28
28
  ts.pattern = name.to_s
@@ -68,9 +68,9 @@ module OrigenTesters
68
68
 
69
69
  def block_loop(name, options)
70
70
  if options[:by_block]
71
- flow.group name, options do |group|
71
+ flow.group name, options do
72
72
  $dut.blocks.each_with_index do |block, i|
73
- yield block, i, group
73
+ yield block, i
74
74
  end
75
75
  end
76
76
  else
@@ -89,27 +89,9 @@ module OrigenTesters
89
89
  # print "UltraFLEX Parametric Test not yet supported for UltraFLEX!\n"
90
90
  end
91
91
 
92
- # OR 2 IDS together into 1 flag
93
- # def or_ids(options = {})
94
- # flow.or_flags(options[:id1], options[:id2], options)
95
- # end
96
-
97
- def nop(options = {})
98
- # flow.nop options
99
- end
100
-
101
92
  def mto_memory(name, options = {})
102
93
  # Seriously?!
103
94
  end
104
-
105
- # OR 2 IDS together into 1 flag
106
- def or_ids(options = {})
107
- # Eh?
108
- end
109
-
110
- def bin(number, options = {})
111
- flow.good_bin(number, bin_desc: options[:description])
112
- end
113
95
  end
114
96
  end
115
97
  end
@@ -0,0 +1,6 @@
1
+ Flow.create do |options|
2
+
3
+ meas :bgap_voltage_meas, tnum: 1050, bin: 119, soft_bin: 2, hi_limit: 45
4
+ meas :bgap_voltage_meas1
5
+
6
+ end
@@ -51,18 +51,6 @@ Flow.create do
51
51
  func :read0
52
52
  end
53
53
 
54
- log "Test that skip works"
55
- skip do
56
- func :read0
57
- func :read0
58
- end
59
-
60
- log "Test that conditional skip works"
61
- skip if_passed: :t4 do
62
- func :read0
63
- func :read0
64
- end
65
-
66
54
  log "Test that if_job works"
67
55
  func :cold_test, if_job: :fc
68
56
 
@@ -99,66 +87,206 @@ Flow.create do
99
87
  func :long_test2
100
88
  end
101
89
 
102
- if $tester.v93k?
103
- log "Test that an id can be assigned to a test group"
104
- func :read1, id: :r1, bin: 10, by_block: true
105
- func :erase1, if_failed: :r1
90
+ log "Test that if_any_failed works"
91
+ func :test1, id: :ifa1
92
+ func :test2, id: :ifa2
93
+ func :test3, if_any_failed: [:ifa1, :ifa2]
94
+
95
+ log "Test the block form of if_any_failed"
96
+ func :test1, id: :oof_passcode1
97
+ func :test2, id: :oof_passcode2
98
+ if_any_failed :oof_passcode1, :oof_passcode2 do
99
+ func :test3
100
+ func :test4
101
+ end
102
+
103
+ log "Test that if_all_failed works"
104
+ func :test1, id: :ifall1
105
+ func :test2, id: :ifall2
106
+ func :test3, if_all_failed: [:ifall1, :ifall2]
107
+
108
+ log "Test the block form of if_all_failed"
109
+ func :test1, id: :ifallb1
110
+ func :test2, id: :ifallb2
111
+ if_all_failed [:ifallb1, :ifallb2] do
112
+ func :test3
113
+ func :test4
114
+ end
115
+
116
+ log "Test that if_any_passed works"
117
+ func :test1, id: :ifap1
118
+ func :test2, id: :ifap2
119
+ func :test3, if_any_passed: [:ifap1, :ifap2]
120
+
121
+ log "Test the block form of if_any_passed"
122
+ func :test1, id: :ifapb1
123
+ func :test2, id: :ifapb2
124
+ if_any_passed :ifapb1, :ifapb2 do
125
+ func :test3
126
+ func :test4
127
+ end
128
+
129
+ log "Test that if_all_passed works"
130
+ func :test1, id: :ifallp1
131
+ func :test2, id: :ifallp2
132
+ func :test3, if_all_passed: [:ifallp1, :ifallp2]
133
+
134
+ log "Test the block form of if_all_passed"
135
+ func :test1, id: :ifallpb1
136
+ func :test2, id: :ifallpb2
137
+ if_all_passed :ifallpb1, :ifallpb2 do
138
+ func :test3
139
+ func :test4
140
+ end
141
+
142
+ log "Test that group-level dependencies work"
143
+ group "grp1", id: :grp1 do
144
+ func :grp1_test1, bin: 5
145
+ func :grp1_test2, bin: 5
146
+ func :grp1_test3, bin: 5
147
+ end
148
+
149
+ group "grp2", if_failed: :grp1 do
150
+ func :grp2_test1, bin: 5
151
+ func :grp2_test2, bin: 5
152
+ func :grp2_test3, bin: 5
153
+ end
154
+
155
+ log "Another group-level dependencies test based on a real life use case"
156
+ func :gt1, bin: 90
157
+ group "gt_grp1", id: :gt_grp1 do
158
+ func :gt_grp1_test1, bin: 90, id: :gt_grp1
159
+ func :gt_grp1_test2, bin: 90, id: :gt_grp1
160
+ end
161
+ func :gt2, bin: 90, if_failed: :gt_grp1
162
+ group "gt_grp2", id: :gt_grp2, if_failed: :gt_grp1 do
163
+ # The if_failed and IDs here are redundant, but it should still generate
164
+ # valid output if an application were to do this
165
+ func :gt_grp2_test1, bin: 90, id: :gt_grp2, if_failed: :gt_grp1
166
+ func :gt_grp2_test2, bin: 90, id: :gt_grp2, if_failed: :gt_grp1
167
+ end
168
+ func :gt3, bin: 90, if_failed: :gt_grp2
106
169
 
107
- log "Test that group-level dependencies work"
108
- group "grp1", id: :grp1 do
109
- func :grp1_test1, bin: 5
110
- func :grp1_test2, bin: 5
111
- func :grp1_test3, bin: 5
170
+ log "Test that nested groups work"
171
+ group "level1" do
172
+ func :lev1_test1, bin: 5
173
+ func :lev1_test2, bin: 5
174
+ func :lev1_test3, id: :l1t3, bin: 10
175
+ func :lev1_test4, if_failed: :l1t3, bin: 12
176
+ func :lev1_test5, id: :l1t5, bin: 12
177
+ group "level2" do
178
+ func :lev2_test1, bin: 5
179
+ func :lev2_test2, bin: 5
180
+ func :lev2_test3, id: :l2t3, bin: 10
181
+ func :lev2_test4, if_failed: :l2t3, bin: 12
182
+ # Test dependency on a test from another group
183
+ func :lev2_test5, if_failed: :l1t5, bin: 12
112
184
  end
185
+ end
113
186
 
114
- group "grp2", if_failed: :grp1 do
115
- func :grp2_test1, bin: 5
116
- func :grp2_test2, bin: 5
117
- func :grp2_test3, bin: 5
187
+ log "Test nested conditions on a group"
188
+ func :nt1, bin: 10, id: :nt1
189
+ if_failed :nt1 do
190
+ func :nt2, bin: 11, id: :nt2
191
+ group "ntg1", id: :ntg1, if_passed: :nt2 do
192
+ func :nt3, bin: 12
118
193
  end
194
+ group "ntg2", id: :ntg2, if_failed: :nt2 do
195
+ func :nt4, bin: 13
196
+ end
197
+ end
119
198
 
120
- log "Another group-level dependencies test based on a real life use case"
121
- func :gt1, bin: 90
122
- group "gt_grp1", id: :gt_grp1 do
123
- func :gt_grp1_test1, bin: 90, id: :gt_grp1
124
- func :gt_grp1_test2, bin: 90, id: :gt_grp1
199
+ log "Embedded conditional tests 1"
200
+ func :test1, id: :ect1_1
201
+ if_failed :ect1_1 do
202
+ func :test2
203
+ func :test3, id: :ect1_3
204
+ if_failed :ect1_3 do
205
+ func :test4
125
206
  end
126
- func :gt2, bin: 90, if_failed: :gt_grp1
127
- group "gt_grp2", id: :gt_grp2, if_failed: :gt_grp1 do
128
- # The if_failed and IDs here are redundant, but it should still generate
129
- # valid output if an application were to do this
130
- func :gt_grp2_test1, bin: 90, id: :gt_grp2, if_failed: :gt_grp1
131
- func :gt_grp2_test2, bin: 90, id: :gt_grp2, if_failed: :gt_grp1
207
+ end
208
+
209
+ log "Embedded conditional tests 2"
210
+ func :test1, id: :ect2_1
211
+ func :test2, id: :ect2_2
212
+ if_failed :ect2_1 do
213
+ func :test3, if_failed: :ect2_2
214
+ func :test4, if_enable: "en1"
215
+ if_enable "en2" do
216
+ func :test5
217
+ func :test6
132
218
  end
133
- func :gt3, bin: 90, if_failed: :gt_grp2
134
-
135
- log "Test that nested groups work"
136
- group "level1" do
137
- func :lev1_test1, bin: 5
138
- func :lev1_test2, bin: 5
139
- func :lev1_test3, id: :l1t3, bin: 10
140
- func :lev1_test4, if_failed: :l1t3, bin: 12
141
- func :lev1_test5, id: :l1t5, bin: 12
142
- group "level2" do
143
- func :lev2_test1, bin: 5
144
- func :lev2_test2, bin: 5
145
- func :lev2_test3, id: :l2t3, bin: 10
146
- func :lev2_test4, if_failed: :l2t3, bin: 12
147
- # Test dependency on a test from another group
148
- func :lev2_test5, if_failed: :l1t5, bin: 12
149
- end
219
+ func :test7
220
+ end
221
+ func :test8
222
+
223
+ log "Nested enable word test 1"
224
+ if_enable "word1" do
225
+ func :test1
226
+ if_enable "word2" do
227
+ func :test2
150
228
  end
229
+ end
151
230
 
152
- log "Test nested conditions on a group"
153
- func :nt1, bin: 10, id: :nt1
154
- if_failed :nt1 do
155
- func :nt2, bin: 11, id: :nt2
156
- group "ntg1", id: :ntg1, if_passed: :nt2 do
157
- func :nt3, bin: 12
158
- end
159
- group "ntg2", id: :ntg2, if_failed: :nt2 do
160
- func :nt4, bin: 13
231
+ log "Nested enable word test 2"
232
+ if_enable "word1" do
233
+ func :test1
234
+ unless_enable "word2" do
235
+ func :test2
236
+ end
237
+ end
238
+
239
+ log "Nested enable word test 3"
240
+ if_enable ["word1", "word2"] do
241
+ func :test1
242
+ if_enable "word3" do
243
+ func :test2
244
+ end
245
+ end
246
+
247
+ log "Conditional enable test"
248
+ enable :nvm_minimum_ft, if_enable: "nvm_minimum_room", if_job: :fr
249
+ enable :nvm_minimum_ft, if_enable: "nvm_minimum_cold", if_job: :fc
250
+ disable :nvm_minimum_ft, if_enable: "nvm_minimum_hot", if_job: :fh
251
+
252
+ log "Test enable words that wrap a lot of tests"
253
+ if_enable :word1 do
254
+ 5.times do
255
+ func :test1
256
+ end
257
+ if_enable :word2 do
258
+ 4.times do
259
+ func :test1
161
260
  end
261
+ func :test1, enable: :word3
162
262
  end
163
263
  end
264
+
265
+ if tester.j750?
266
+ log "This should generate an AND flag"
267
+ func :test1, id: :at1
268
+ func :test2, id: :at2
269
+ if_failed :at1 do
270
+ func :test3, if_failed: :at2
271
+ # This should re-use the AND flag, rather than create a duplicate
272
+ func :test4, if_failed: :at2
273
+ end
274
+ log "This should NOT generate an AND flag"
275
+ # Creating an AND flag here is logically correct, but creates un-necessary flow lines. Since
276
+ # the test at11 is already gated by the at21 condition, it does not need to be applied to any
277
+ # tests that are dependent on at11.
278
+ func :test1, id: :at11
279
+ if_failed :at11 do
280
+ func :test2, id: :at21
281
+ func :test3, if_failed: :at21
282
+ func :test4, if_failed: :at21
283
+ end
284
+ end
285
+
286
+ log "Manual flag setting"
287
+ test :test1, on_fail: { set_flag: :my_flag }, continue: true
288
+ test :test2, if_flag: :my_flag
289
+ unless_flag :my_flag do
290
+ test :test3
291
+ end
164
292
  end