origen_testers 0.5.7 → 0.6.0

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