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.
- checksums.yaml +4 -4
- data/config/shared_commands.rb +6 -0
- data/config/version.rb +2 -2
- data/lib/commands/run.rb +44 -0
- data/lib/origen_testers.rb +19 -1
- data/lib/origen_testers/flow.rb +382 -0
- data/lib/origen_testers/generator.rb +32 -29
- data/lib/origen_testers/igxl_based_tester/base/ac_specsets.rb +79 -0
- data/lib/origen_testers/igxl_based_tester/base/dc_specsets.rb +98 -0
- data/lib/origen_testers/igxl_based_tester/base/edge.rb +60 -0
- data/lib/origen_testers/igxl_based_tester/base/edges.rb +24 -0
- data/lib/origen_testers/igxl_based_tester/base/edgeset.rb +39 -0
- data/lib/origen_testers/igxl_based_tester/base/edgesets.rb +97 -0
- data/lib/origen_testers/igxl_based_tester/base/flow.rb +390 -115
- data/lib/origen_testers/igxl_based_tester/base/flow_line.rb +4 -54
- data/lib/origen_testers/igxl_based_tester/base/generator.rb +257 -11
- data/lib/origen_testers/igxl_based_tester/base/level_io_se.rb +59 -0
- data/lib/origen_testers/igxl_based_tester/base/level_supply.rb +39 -0
- data/lib/origen_testers/igxl_based_tester/base/levels.rb +31 -0
- data/lib/origen_testers/igxl_based_tester/base/levelset.rb +109 -0
- data/lib/origen_testers/igxl_based_tester/base/pinmap.rb +93 -0
- data/lib/origen_testers/igxl_based_tester/base/test_instance.rb +33 -1
- data/lib/origen_testers/igxl_based_tester/base/timeset.rb +37 -0
- data/lib/origen_testers/igxl_based_tester/base/timesets.rb +47 -0
- data/lib/origen_testers/igxl_based_tester/j750/templates/flow.txt.erb +2 -2
- data/lib/origen_testers/igxl_based_tester/ultraflex/ac_specsets.rb +10 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/custom_test_instance.rb +4 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/dc_specsets.rb +10 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/edge.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/edges.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/edgeset.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/edgesets.rb +10 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/flow.rb +137 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/level_io_se.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/level_supply.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/levels.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/levelset.rb +10 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/pinmap.rb +10 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/ac_specsets.txt.erb +58 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/dc_specsets.txt.erb +58 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/edgesets.txt.erb +95 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/flow.txt.erb +2 -2
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/levelset.txt.erb +121 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/pinmap.txt.erb +24 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/timesets.txt.erb +137 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/test_instance.rb +4 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/timeset.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/timesets.rb +10 -0
- data/lib/origen_testers/interface.rb +41 -6
- data/lib/origen_testers/no_interface.rb +7 -0
- data/lib/origen_testers/origen_ext/application/runner.rb +25 -0
- data/lib/origen_testers/origen_ext/generator.rb +37 -0
- data/lib/origen_testers/origen_ext/generator/flow.rb +70 -0
- data/lib/origen_testers/origen_ext/generator/resources.rb +21 -0
- data/lib/origen_testers/program_generators.rb +0 -1
- data/lib/origen_testers/smartest_based_tester/base/flow.rb +158 -134
- data/lib/origen_testers/smartest_based_tester/base/generator.rb +2 -3
- data/lib/origen_testers/smartest_based_tester/base/test_suite.rb +4 -0
- data/lib/origen_testers/smartest_based_tester/v93k/templates/template.flow.erb +5 -6
- data/lib/origen_testers/test/dut.rb +5 -0
- data/lib/origen_testers/test/j750_base_interface.rb +0 -3
- data/lib/origen_testers/test/ultraflex_interface.rb +230 -4
- data/lib/origen_testers/test/v93k_interface.rb +5 -23
- data/program/components/_temp.rb +6 -0
- data/program/flow_control.rb +190 -62
- data/program/prb1.rb +13 -50
- data/program/prb2.rb +0 -16
- data/program/test.rb +12 -3
- data/program/uflex_resources.rb +159 -0
- metadata +66 -16
- data/lib/origen_testers/doc.rb +0 -224
- data/lib/origen_testers/doc/generator.rb +0 -124
- data/lib/origen_testers/doc/generator/flow.rb +0 -69
- data/lib/origen_testers/doc/generator/flow_line.rb +0 -201
- data/lib/origen_testers/doc/generator/test.rb +0 -66
- data/lib/origen_testers/doc/generator/test_group.rb +0 -64
- data/lib/origen_testers/doc/generator/tests.rb +0 -45
- data/lib/origen_testers/doc/model.rb +0 -160
- data/lib/origen_testers/generator/flow_control_api.rb +0 -611
- data/lib/origen_testers/smartest_based_tester/base/flow_node.rb +0 -476
- 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
|
-
%
|
|
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
|
-
%
|
|
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
|
|
@@ -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
|
-
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
71
|
+
flow.group name, options do
|
|
72
72
|
$dut.blocks.each_with_index do |block, i|
|
|
73
|
-
yield block, i
|
|
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
|
data/program/flow_control.rb
CHANGED
|
@@ -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
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
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
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
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
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
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 :
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
func :
|
|
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
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
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
|