origen_testers 0.31.0 → 0.40.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/application.rb +3 -1
- data/config/shared_commands.rb +4 -0
- data/config/version.rb +1 -1
- data/lib/origen_testers/api.rb +8 -0
- data/lib/origen_testers/atp/flow.rb +30 -9
- data/lib/origen_testers/flow.rb +36 -2
- data/lib/origen_testers/generator.rb +44 -5
- data/lib/origen_testers/interface.rb +22 -2
- data/lib/origen_testers/origen_ext/generator.rb +4 -3
- data/lib/origen_testers/origen_ext/generator/flow.rb +99 -5
- data/lib/origen_testers/program_generators.rb +5 -1
- data/lib/origen_testers/smartest_based_tester.rb +1 -0
- data/lib/origen_testers/smartest_based_tester/base.rb +177 -114
- data/lib/origen_testers/smartest_based_tester/base/flow.rb +329 -127
- data/lib/origen_testers/smartest_based_tester/base/generator.rb +25 -7
- data/lib/origen_testers/smartest_based_tester/base/limits_file.rb +186 -60
- data/lib/origen_testers/smartest_based_tester/base/pattern_compiler.rb +4 -0
- data/lib/origen_testers/smartest_based_tester/base/pattern_master.rb +4 -0
- data/lib/origen_testers/smartest_based_tester/base/processors/extract_bin_names.rb +5 -1
- data/lib/origen_testers/smartest_based_tester/base/processors/extract_flow_vars.rb +108 -0
- data/lib/origen_testers/smartest_based_tester/base/test_method.rb +8 -3
- data/lib/origen_testers/smartest_based_tester/base/test_suite.rb +9 -108
- data/lib/origen_testers/smartest_based_tester/base/test_suites.rb +17 -7
- data/lib/origen_testers/smartest_based_tester/base/variables_file.rb +29 -7
- data/lib/origen_testers/smartest_based_tester/smt7.rb +59 -0
- data/lib/origen_testers/smartest_based_tester/smt8.rb +218 -0
- data/lib/origen_testers/smartest_based_tester/v93k/flow.rb +32 -0
- data/lib/origen_testers/smartest_based_tester/v93k/templates/vars.tf.erb +2 -2
- data/lib/origen_testers/smartest_based_tester/v93k/test_suite.rb +109 -0
- data/lib/origen_testers/smartest_based_tester/v93k_smt8.rb +8 -0
- data/lib/origen_testers/smartest_based_tester/v93k_smt8/flow.rb +234 -0
- data/lib/origen_testers/smartest_based_tester/v93k_smt8/generator.rb +48 -0
- data/lib/origen_testers/smartest_based_tester/v93k_smt8/limits_file.rb +14 -0
- data/lib/origen_testers/smartest_based_tester/v93k_smt8/limits_workbook.rb +148 -0
- data/lib/origen_testers/smartest_based_tester/v93k_smt8/templates/limits.csv.erb +3 -0
- data/lib/origen_testers/smartest_based_tester/v93k_smt8/templates/template.flow.erb +41 -0
- data/lib/origen_testers/smartest_based_tester/v93k_smt8/test_suite.rb +66 -0
- data/lib/origen_testers/stil_based_tester/base.rb +4 -0
- data/lib/origen_testers/test/interface.rb +16 -2
- data/lib/origen_testers/vector_generator.rb +9 -4
- data/lib/origen_testers/vector_pipeline.rb +1 -1
- data/pattern/nvm/v93k/v93k_workout.rb +7 -0
- data/program/_erase_vfy.rb +2 -1
- data/program/components/_deep_nested.rb +3 -0
- data/program/components/_prb1_main.rb +1 -1
- data/program/components/_prb2_main.rb +6 -2
- data/program/flow_control.rb +3 -3
- data/program/prb1.rb +4 -0
- data/program/prb2.rb +7 -3
- data/templates/origen_guides/pattern/v93k.md.erb +24 -0
- data/templates/origen_guides/program/v93k.md.erb +6 -148
- data/templates/origen_guides/program/v93ksmt7.md.erb +165 -0
- data/templates/origen_guides/program/v93ksmt8.md.erb +112 -0
- metadata +30 -3
- data/lib/origen_testers/smartest_based_tester/base/test_methods/smart_calc_tml.rb +0 -23
@@ -60,6 +60,8 @@ module OrigenTesters
|
|
60
60
|
@@pattern_masters = nil
|
61
61
|
@@pattern_compilers = nil
|
62
62
|
@@variables_files = nil
|
63
|
+
@@limits_workbook = nil
|
64
|
+
limits_workbook if tester.smt8? && !generating_sub_program?
|
63
65
|
end
|
64
66
|
alias_method :reset_globals, :at_run_start
|
65
67
|
|
@@ -77,16 +79,31 @@ module OrigenTesters
|
|
77
79
|
@pattern_master_filename || 'global'
|
78
80
|
end
|
79
81
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
82
|
+
# Returns the current flow object (Origen.interface.flow)
|
83
|
+
def flow(id = Origen.file_handler.current_file.basename('.rb').to_s)
|
84
|
+
return @current_flow if @current_flow
|
85
|
+
id = id.to_s.sub(/_resources?/, '')
|
86
|
+
filename = id.split('.').last
|
87
|
+
return flow_sheets[id] if flow_sheets[id] # will return flow if already existing
|
84
88
|
p = platform::Flow.new
|
85
89
|
p.inhibit_output if Origen.interface.resources_mode?
|
86
|
-
p.filename =
|
90
|
+
p.filename = filename
|
87
91
|
p.test_suites ||= platform::TestSuites.new(p)
|
88
92
|
p.test_methods ||= platform::TestMethods.new(p)
|
89
|
-
flow_sheets[
|
93
|
+
flow_sheets[id] = p
|
94
|
+
end
|
95
|
+
|
96
|
+
# @api private
|
97
|
+
def with_flow(name)
|
98
|
+
@flow_stack ||= []
|
99
|
+
@current_flow = nil
|
100
|
+
f = flow(name)
|
101
|
+
@flow_stack << f
|
102
|
+
@current_flow = @flow_stack.last
|
103
|
+
yield
|
104
|
+
@flow_stack.pop
|
105
|
+
@current_flow = @flow_stack.last
|
106
|
+
f
|
90
107
|
end
|
91
108
|
|
92
109
|
# Returns the pattern master file (.pmfl) for the current flow, by default a common pattern
|
@@ -165,7 +182,7 @@ module OrigenTesters
|
|
165
182
|
end
|
166
183
|
|
167
184
|
def flow_sheets
|
168
|
-
@@flow_sheets ||= {}
|
185
|
+
@@flow_sheets ||= {}.with_indifferent_access
|
169
186
|
end
|
170
187
|
|
171
188
|
# Returns an array containing all sheet generators.
|
@@ -184,6 +201,7 @@ module OrigenTesters
|
|
184
201
|
variables_files.each do |name, sheet|
|
185
202
|
g << sheet
|
186
203
|
end
|
204
|
+
g << limits_workbook if tester.smt8? && !generating_sub_program?
|
187
205
|
g
|
188
206
|
end
|
189
207
|
|
@@ -5,30 +5,66 @@ module OrigenTesters
|
|
5
5
|
class LimitsFile < ATP::Formatter
|
6
6
|
include OrigenTesters::Generator
|
7
7
|
|
8
|
-
attr_reader :
|
8
|
+
attr_reader :flow, :test_modes, :flowname, :bin_names
|
9
9
|
|
10
|
-
def initialize(flow,
|
10
|
+
def initialize(flow, options = {})
|
11
11
|
@flow = flow
|
12
|
-
@ast = ast
|
13
12
|
@flowname = flow.filename.sub(/\..*/, '') # Base off the filename since it will include any prefix
|
14
13
|
@used_test_numbers = {}
|
15
|
-
@bin_names = Processors::ExtractBinNames.new.run(ast)
|
16
14
|
@test_modes = Array(options[:test_modes])
|
17
15
|
@empty = true
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
16
|
+
@smt8 = tester.smt8?
|
17
|
+
end
|
18
|
+
|
19
|
+
def header
|
20
|
+
if smt8?
|
21
|
+
@test_path = []
|
22
|
+
l = 'Test Suite,Test,Test Number,Test Text'
|
23
|
+
if test_modes.empty?
|
24
|
+
l += ',Low Limit,High Limit'
|
25
|
+
else
|
26
|
+
l += ',Low Limit'
|
27
|
+
(test_modes.size - 1).times { l += ',' }
|
28
|
+
l += ',High Limit'
|
29
|
+
(test_modes.size - 1).times { l += ',' }
|
30
|
+
end
|
31
|
+
l += ',Unit,Soft Bin'
|
24
32
|
lines << l
|
25
|
-
|
26
|
-
|
27
|
-
|
33
|
+
|
34
|
+
l = ',,,'
|
35
|
+
if test_modes.empty?
|
36
|
+
l += ',default,default'
|
37
|
+
else
|
38
|
+
test_modes.each { |mode| l += ",#{mode}" }
|
39
|
+
test_modes.each { |mode| l += ",#{mode}" }
|
28
40
|
end
|
29
|
-
l += ',,,,,,,,'
|
30
41
|
lines << l
|
42
|
+
|
43
|
+
else
|
44
|
+
l = '"Suite name","Pins","Test name","Test number"'
|
45
|
+
if test_modes.empty?
|
46
|
+
l += ',"Lsl","Lsl_typ","Usl_typ","Usl","Units","Bin_s_num","Bin_s_name","Bin_h_num","Bin_h_name","Bin_type","Bin_reprobe","Bin_overon","Test_remarks"'
|
47
|
+
lines << l
|
48
|
+
else
|
49
|
+
l += (',"Lsl","Lsl_typ","Usl_typ","Usl","Units"' * test_modes.size) + ',"Bin_s_num","Bin_s_name","Bin_h_num","Bin_h_name","Bin_type","Bin_reprobe","Bin_overon","Test_remarks"'
|
50
|
+
lines << l
|
51
|
+
l = '"Test mode",,,'
|
52
|
+
test_modes.each do |mode|
|
53
|
+
l += ",\"#{mode}\",\"#{mode}\",\"#{mode}\",\"#{mode}\",\"#{mode}\""
|
54
|
+
end
|
55
|
+
l += ',,,,,,,,'
|
56
|
+
lines << l
|
57
|
+
end
|
31
58
|
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_modes=(modes)
|
62
|
+
@test_modes = Array(modes)
|
63
|
+
end
|
64
|
+
|
65
|
+
def generate(ast)
|
66
|
+
@bin_names = Processors::ExtractBinNames.new.run(ast)
|
67
|
+
header
|
32
68
|
process(ast)
|
33
69
|
end
|
34
70
|
|
@@ -37,12 +73,16 @@ module OrigenTesters
|
|
37
73
|
end
|
38
74
|
|
39
75
|
def subdirectory
|
40
|
-
|
76
|
+
if tester.smt7?
|
77
|
+
'testtable/limits'
|
78
|
+
else
|
79
|
+
"#{tester.package_namespace}/limits"
|
80
|
+
end
|
41
81
|
end
|
42
82
|
|
43
83
|
def on_test(node)
|
44
84
|
o = {}
|
45
|
-
o[:suite_name] = extract_test_suite_name(node
|
85
|
+
o[:suite_name] = extract_test_suite_name(node)
|
46
86
|
|
47
87
|
lines << line(extract_line_options(node, o))
|
48
88
|
|
@@ -53,14 +93,28 @@ module OrigenTesters
|
|
53
93
|
process_all(node.children)
|
54
94
|
end
|
55
95
|
|
96
|
+
def on_sub_flow(node)
|
97
|
+
@test_path << Pathname.new(node.find(:path).value).basename('.*').to_s
|
98
|
+
process_all(node.children)
|
99
|
+
@test_path.pop
|
100
|
+
end
|
101
|
+
|
56
102
|
# Returns true if the AST provided when initializing this limits table generator did not
|
57
103
|
# contain any tests, i.e. the resultant limits file is empty
|
58
104
|
def empty?
|
59
105
|
@empty
|
60
106
|
end
|
61
107
|
|
108
|
+
def limits_workbook
|
109
|
+
Origen.interface.limits_workbook
|
110
|
+
end
|
111
|
+
|
62
112
|
private
|
63
113
|
|
114
|
+
def smt8?
|
115
|
+
@smt8
|
116
|
+
end
|
117
|
+
|
64
118
|
def extract_line_options(node, o)
|
65
119
|
o[:test_name] = extract_test_name(node, o)
|
66
120
|
o[:test_number] = extract_test_number(node, o)
|
@@ -84,6 +138,14 @@ module OrigenTesters
|
|
84
138
|
else
|
85
139
|
o[:bin_overon] = 'no'
|
86
140
|
end
|
141
|
+
if smt8?
|
142
|
+
if o[:bin_s_num]
|
143
|
+
limits_workbook.add_softbin o[:bin_s_num], name: o[:bin_s_name], bin: o[:bin_h_num]
|
144
|
+
end
|
145
|
+
if o[:bin_h_num]
|
146
|
+
limits_workbook.add_bin o[:bin_h_num], name: o[:bin_h_name]
|
147
|
+
end
|
148
|
+
end
|
87
149
|
end
|
88
150
|
o
|
89
151
|
end
|
@@ -144,71 +206,135 @@ module OrigenTesters
|
|
144
206
|
end
|
145
207
|
end
|
146
208
|
|
147
|
-
def extract_test_suite_name(node
|
209
|
+
def extract_test_suite_name(node)
|
148
210
|
test_obj = node.find(:object).to_a[0]
|
149
|
-
test_obj.
|
211
|
+
if test_obj.is_a?(Hash)
|
212
|
+
name = test_obj['Test']
|
213
|
+
else
|
214
|
+
name = test_obj.respond_to?(:name) ? test_obj.name : test_obj if test_obj
|
215
|
+
end
|
216
|
+
name
|
150
217
|
end
|
151
218
|
|
152
219
|
def extract_test_name(node, o)
|
153
|
-
|
220
|
+
test_obj = node.find(:object).to_a[0]
|
221
|
+
if smt8?
|
222
|
+
if test_obj.is_a?(Hash) && test_obj['Sub Test Name']
|
223
|
+
name = test_obj['Sub Test Name']
|
224
|
+
else
|
225
|
+
name = test_obj.try(:sub_test_name)
|
226
|
+
end
|
227
|
+
end
|
228
|
+
unless name
|
229
|
+
if test_obj.is_a?(Hash) && test_obj['Test Name']
|
230
|
+
name = test_obj['Test Name']
|
231
|
+
elsif test_obj.is_a?(String)
|
232
|
+
name = test_obj
|
233
|
+
else
|
234
|
+
name = (node.find(:name) || []).to_a[0] || extract_test_suite_name(node, o) || o[:suite_name]
|
235
|
+
end
|
236
|
+
end
|
237
|
+
name
|
154
238
|
end
|
155
239
|
|
156
240
|
def line(options)
|
157
241
|
@empty = false
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
#
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
242
|
+
|
243
|
+
if smt8?
|
244
|
+
# "Test Suite"
|
245
|
+
if @test_path.empty?
|
246
|
+
l = "#{options[:suite_name]}"
|
247
|
+
else
|
248
|
+
l = "#{@test_path.join('.')}.#{options[:suite_name]}"
|
249
|
+
end
|
250
|
+
# "Test"
|
251
|
+
l << f(options[:test_name])
|
252
|
+
# "Test Number"
|
253
|
+
l << f(options[:test_number])
|
254
|
+
# "Test Text"
|
255
|
+
# l << f(options[:bin_s_name] || options[:bin_h_name])
|
256
|
+
names = ["#{options[:suite_name]}", "#{options[:test_name]}"]
|
257
|
+
l << f(names.uniq.join('.'))
|
258
|
+
if test_modes.empty?
|
259
|
+
# "Low Limit"
|
260
|
+
l << f((options[:limits][nil] || {})[:lsl])
|
261
|
+
# "High Limit"
|
262
|
+
l << f((options[:limits][nil] || {})[:usl])
|
263
|
+
else
|
264
|
+
test_modes.each do |mode|
|
265
|
+
# "Low Limit"
|
266
|
+
l << f((options[:limits][mode] || options[:limits][nil] || {})[:lsl] || 'na')
|
267
|
+
end
|
268
|
+
test_modes.each do |mode|
|
269
|
+
# "High Limit"
|
270
|
+
l << f((options[:limits][mode] || options[:limits][nil] || {})[:usl] || 'na')
|
271
|
+
end
|
272
|
+
end
|
273
|
+
# "Unit"
|
176
274
|
l << f((options[:limits][nil] || {})[:units])
|
275
|
+
# "Soft Bin"
|
276
|
+
l << f(options[:bin_s_num])
|
277
|
+
|
177
278
|
else
|
178
|
-
|
279
|
+
# "Suite name"
|
280
|
+
l = "\"#{options[:suite_name]}\""
|
281
|
+
# "Pins"
|
282
|
+
l << f(options[:pins])
|
283
|
+
# "Test name"
|
284
|
+
l << f(options[:test_name])
|
285
|
+
# "Test number"
|
286
|
+
l << f(options[:test_number])
|
287
|
+
if test_modes.empty?
|
179
288
|
# "Lsl"
|
180
|
-
l << f((options[:limits][
|
289
|
+
l << f((options[:limits][nil] || {})[:lsl])
|
181
290
|
# "Lsl_typ"
|
182
|
-
l << f((options[:limits][
|
291
|
+
l << f((options[:limits][nil] || {})[:lsl_typ])
|
183
292
|
# "Usl_typ"
|
184
|
-
l << f((options[:limits][
|
293
|
+
l << f((options[:limits][nil] || {})[:usl_typ])
|
185
294
|
# "Usl"
|
186
|
-
l << f((options[:limits][
|
295
|
+
l << f((options[:limits][nil] || {})[:usl])
|
187
296
|
# "Units"
|
188
|
-
l << f((options[:limits][
|
297
|
+
l << f((options[:limits][nil] || {})[:units])
|
298
|
+
else
|
299
|
+
test_modes.each do |mode|
|
300
|
+
# "Lsl"
|
301
|
+
l << f((options[:limits][mode] || options[:limits][nil] || {})[:lsl])
|
302
|
+
# "Lsl_typ"
|
303
|
+
l << f((options[:limits][mode] || options[:limits][nil] || {})[:lsl_typ])
|
304
|
+
# "Usl_typ"
|
305
|
+
l << f((options[:limits][mode] || options[:limits][nil] || {})[:usl_typ])
|
306
|
+
# "Usl"
|
307
|
+
l << f((options[:limits][mode] || options[:limits][nil] || {})[:usl])
|
308
|
+
# "Units"
|
309
|
+
l << f((options[:limits][mode] || options[:limits][nil] || {})[:units])
|
310
|
+
end
|
189
311
|
end
|
312
|
+
# "Bin_s_num"
|
313
|
+
l << f(options[:bin_s_num])
|
314
|
+
# "Bin_s_name"
|
315
|
+
l << f(options[:bin_s_name])
|
316
|
+
# "Bin_h_num"
|
317
|
+
l << f(options[:bin_h_num])
|
318
|
+
# "Bin_h_name"
|
319
|
+
l << f(options[:bin_h_name])
|
320
|
+
# "Bin_type"
|
321
|
+
l << f(options[:bin_type])
|
322
|
+
# "Bin_reprobe"
|
323
|
+
l << f(options[:bin_reprobe])
|
324
|
+
# "Bin_overon"
|
325
|
+
l << f(options[:bin_overon])
|
326
|
+
# "Test_remarks"
|
327
|
+
l << f(options[:test_remarks])
|
190
328
|
end
|
191
|
-
# "Bin_s_num"
|
192
|
-
l << f(options[:bin_s_num])
|
193
|
-
# "Bin_s_name"
|
194
|
-
l << f(options[:bin_s_name])
|
195
|
-
# "Bin_h_num"
|
196
|
-
l << f(options[:bin_h_num])
|
197
|
-
# "Bin_h_name"
|
198
|
-
l << f(options[:bin_h_name])
|
199
|
-
# "Bin_type"
|
200
|
-
l << f(options[:bin_type])
|
201
|
-
# "Bin_reprobe"
|
202
|
-
l << f(options[:bin_reprobe])
|
203
|
-
# "Bin_overon"
|
204
|
-
l << f(options[:bin_overon])
|
205
|
-
# "Test_remarks"
|
206
|
-
l << f(options[:test_remarks])
|
207
329
|
l
|
208
330
|
end
|
209
331
|
|
210
332
|
def f(value)
|
211
|
-
|
333
|
+
if smt8?
|
334
|
+
",#{value}"
|
335
|
+
else
|
336
|
+
",\"#{value}\""
|
337
|
+
end
|
212
338
|
end
|
213
339
|
end
|
214
340
|
end
|
@@ -42,7 +42,11 @@ module OrigenTesters
|
|
42
42
|
|
43
43
|
def default_name(node)
|
44
44
|
test_obj = node.find(:object).to_a[0]
|
45
|
-
|
45
|
+
if test_obj.is_a?(Hash)
|
46
|
+
suite_name = test_obj['Test']
|
47
|
+
else
|
48
|
+
suite_name = test_obj.respond_to?(:name) ? test_obj.name : test_obj
|
49
|
+
end
|
46
50
|
test_name = (node.find(:name) || []).to_a[0] || suite_name
|
47
51
|
if suite_name == test_name
|
48
52
|
suite_name
|
@@ -0,0 +1,108 @@
|
|
1
|
+
require 'set'
|
2
|
+
module OrigenTesters
|
3
|
+
module SmartestBasedTester
|
4
|
+
class Base
|
5
|
+
module Processors
|
6
|
+
# Returns an array containing all runtime control variables from the given AST node
|
7
|
+
# and their default values
|
8
|
+
class ExtractFlowVars < ATP::Processor
|
9
|
+
OWNERS = [:all, :this_flow, :sub_flows]
|
10
|
+
CATEGORIES = [:jobs, :referenced_flags, :set_flags, :set_flags_extern,
|
11
|
+
:referenced_enables, :set_enables]
|
12
|
+
|
13
|
+
def run(node, options = {})
|
14
|
+
@variables = {}
|
15
|
+
@variables[:empty?] = true
|
16
|
+
OWNERS.each do |t|
|
17
|
+
@variables[t] = {}
|
18
|
+
CATEGORIES.each { |c| @variables[t][c] = Set.new }
|
19
|
+
end
|
20
|
+
@sub_flow_depth = 0
|
21
|
+
process(node)
|
22
|
+
OWNERS.each do |t|
|
23
|
+
CATEGORIES.each do |c|
|
24
|
+
@variables[t][c] = @variables[t][c].to_a.sort do |x, y|
|
25
|
+
x = x[0] if x.is_a?(Array)
|
26
|
+
y = y[0] if y.is_a?(Array)
|
27
|
+
x <=> y
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
@variables
|
32
|
+
end
|
33
|
+
|
34
|
+
def on_sub_flow(node)
|
35
|
+
@sub_flow_depth += 1
|
36
|
+
children = node.children
|
37
|
+
on_fail = node.find_all(:on_fail)
|
38
|
+
children -= on_fail
|
39
|
+
on_pass = node.find_all(:on_pass)
|
40
|
+
children -= on_pass
|
41
|
+
process_all(children)
|
42
|
+
@sub_flow_depth -= 1
|
43
|
+
process_all(on_fail)
|
44
|
+
process_all(on_pass)
|
45
|
+
end
|
46
|
+
|
47
|
+
def on_if_job(node)
|
48
|
+
add ['JOB', ''], :jobs
|
49
|
+
process_all(node.children)
|
50
|
+
end
|
51
|
+
alias_method :on_unless_job, :on_if_job
|
52
|
+
|
53
|
+
def on_if_flag(node)
|
54
|
+
flag, *nodes = *node
|
55
|
+
[flag].flatten.each do |f|
|
56
|
+
add generate_flag_name(f), :referenced_flags
|
57
|
+
end
|
58
|
+
process_all(nodes)
|
59
|
+
end
|
60
|
+
alias_method :on_unless_flag, :on_if_flag
|
61
|
+
|
62
|
+
def on_set_flag(node)
|
63
|
+
add generate_flag_name(node.value), :set_flags
|
64
|
+
# Also separate flags which have been set and which should be externally visible
|
65
|
+
if !node.to_a.include?('auto_generated') || node.to_a.include?('extern')
|
66
|
+
add generate_flag_name(node.value), :set_flags_extern
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def on_if_enabled(node)
|
71
|
+
flag, *nodes = *node
|
72
|
+
[flag].flatten.each do |f|
|
73
|
+
add generate_flag_name(f), :referenced_enables
|
74
|
+
end
|
75
|
+
process_all(nodes)
|
76
|
+
end
|
77
|
+
alias_method :on_unless_enabled, :on_if_enabled
|
78
|
+
|
79
|
+
def on_enable(node)
|
80
|
+
flag = node.value.upcase
|
81
|
+
add flag, :set_enables
|
82
|
+
end
|
83
|
+
alias_method :on_disable, :on_enable
|
84
|
+
|
85
|
+
private
|
86
|
+
|
87
|
+
def in_sub_flow?
|
88
|
+
@sub_flow_depth > 0
|
89
|
+
end
|
90
|
+
|
91
|
+
def add(var, type)
|
92
|
+
@variables[:empty?] = false
|
93
|
+
@variables[:all][type] << var
|
94
|
+
if in_sub_flow?
|
95
|
+
@variables[:sub_flows][type] << var
|
96
|
+
else
|
97
|
+
@variables[:this_flow][type] << var
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def generate_flag_name(flag)
|
102
|
+
SmartestBasedTester::Base::Flow.generate_flag_name(flag)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|