origen_testers 0.51.0 → 0.51.2
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/version.rb +1 -1
- data/lib/origen_testers/atp/flow.rb +27 -0
- data/lib/origen_testers/atp/flow_api.rb +1 -1
- data/lib/origen_testers/atp/processor.rb +28 -0
- data/lib/origen_testers/charz/profile.rb +55 -3
- data/lib/origen_testers/charz/session.rb +18 -6
- data/lib/origen_testers/charz.rb +90 -1
- data/lib/origen_testers/igxl_based_tester/base/flow.rb +1 -1
- data/lib/origen_testers/smartest_based_tester/base/flow.rb +8 -0
- data/lib/origen_testers/test/interface.rb +22 -0
- data/program/charz.rb +25 -9
- data/program/flow_control.rb +10 -0
- data/templates/origen_guides/program/charz.md.erb +21 -1
- data/templates/origen_guides/program/flowapi.md.erb +13 -0
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d1ba41af6b65ac674916979e0732f2ec945cd3871a9764ed26eed0c1fc9ad9df
|
4
|
+
data.tar.gz: 63be076e3b7dfc1dfa525b420b233b8a79eb33f6c86a06852f0069f01cfd7668
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 13f984fad6402b0749eaa3029aa8ccecf3870f6e534c553884a6dc6de42a11b4383e268378ec84968b7e71ce2ed75b800fe9c8f7128f37c32e3b1b78a7d70ec7
|
7
|
+
data.tar.gz: a4b421dfd78750be92b44112ca13506a6f281a98ee9f84faa3ccf49b08a4e1f32fecfe979aa7f2eafb4f66a1875a66ad092949d39bd7638ccdbfb6ba812308a6
|
data/config/version.rb
CHANGED
@@ -220,6 +220,15 @@ module OrigenTesters::ATP
|
|
220
220
|
@pipeline[0] = add_volatile_flags(@pipeline[0], flags)
|
221
221
|
end
|
222
222
|
|
223
|
+
# Indicate the that given flags should keep state between units
|
224
|
+
# prevent them from being in the initialization block
|
225
|
+
# these flags will be the user's responsibility to initialize
|
226
|
+
def add_global_flag(*flags)
|
227
|
+
options = flags.pop if flags.last.is_a?(Hash)
|
228
|
+
flags = flags.flatten
|
229
|
+
@pipeline[0] = add_global_flag_to_node(@pipeline[0], flags)
|
230
|
+
end
|
231
|
+
|
223
232
|
# Record a description for a bin number
|
224
233
|
def describe_bin(number, description, options = {})
|
225
234
|
@pipeline[0] = add_bin_description(@pipeline[0], number, description, type: :hard)
|
@@ -947,6 +956,24 @@ module OrigenTesters::ATP
|
|
947
956
|
node.updated(nil, [name, v] + nodes)
|
948
957
|
end
|
949
958
|
|
959
|
+
# Ensures the flow ast has a global node, then adds the
|
960
|
+
# given flags to it
|
961
|
+
def add_global_flag_to_node(node, flags)
|
962
|
+
name, *nodes = *node
|
963
|
+
if nodes[0] && nodes[0].type == :global
|
964
|
+
v = nodes.shift
|
965
|
+
else
|
966
|
+
v = n0(:global)
|
967
|
+
end
|
968
|
+
existing = v.children.map { |f| f.type == :flag ? f.value : nil }.compact
|
969
|
+
new = []
|
970
|
+
flags.each do |flag|
|
971
|
+
new << n1(:flag, flag) unless existing.include?(flag)
|
972
|
+
end
|
973
|
+
v = v.updated(nil, v.children + new)
|
974
|
+
node.updated(nil, [name, v] + nodes)
|
975
|
+
end
|
976
|
+
|
950
977
|
# Ensures the flow ast has a bin descriptions node, then adds the
|
951
978
|
# given description to it
|
952
979
|
def add_bin_description(node, number, description, options)
|
@@ -8,7 +8,7 @@ module OrigenTesters::ATP
|
|
8
8
|
@atp
|
9
9
|
end
|
10
10
|
|
11
|
-
([:test, :bin, :pass, :continue, :cz, :log, :sub_test, :volatile, :set_flag, :set, :enable, :disable, :render,
|
11
|
+
([:test, :bin, :pass, :continue, :cz, :log, :sub_test, :volatile, :add_global_flag, :set_flag, :set, :enable, :disable, :render,
|
12
12
|
:context_changed?, :ids, :describe_bin, :describe_softbin, :describe_soft_bin, :loop] +
|
13
13
|
OrigenTesters::ATP::Flow::CONDITION_KEYS.keys + OrigenTesters::ATP::Flow::RELATIONAL_OPERATORS).each do |method|
|
14
14
|
define_method method do |*args, &block|
|
@@ -33,6 +33,8 @@ module OrigenTesters::ATP
|
|
33
33
|
n = process(node)
|
34
34
|
if n.respond_to?(:type) && n.type == :inline
|
35
35
|
results += n.children
|
36
|
+
elsif n.respond_to?(:type) && n.type == :global
|
37
|
+
add_global_flag(n.to_a[0].value)
|
36
38
|
else
|
37
39
|
results << n unless n.respond_to?(:type) && n.type == :remove
|
38
40
|
end
|
@@ -64,6 +66,32 @@ module OrigenTesters::ATP
|
|
64
66
|
result
|
65
67
|
end
|
66
68
|
|
69
|
+
def add_global_flag(flag)
|
70
|
+
# Had to do @@ because the state got lost after the recursive calls
|
71
|
+
@@globals ||= {}
|
72
|
+
@@globals[:flags] ||= []
|
73
|
+
@@globals[:flags] << flag
|
74
|
+
end
|
75
|
+
|
76
|
+
def extract_globals(flow)
|
77
|
+
@@globals ||= {}
|
78
|
+
if v = flow.find(:global)
|
79
|
+
@@globals[:flags] ||= []
|
80
|
+
@@globals[:flags] += Array(v.find_all(:flag)).map(&:value) if v.respond_to?(:find_all) && v.method(:find_all).parameters.size == 1
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def global_flags
|
85
|
+
@@globals ||= {}
|
86
|
+
@@globals[:flags] || []
|
87
|
+
end
|
88
|
+
|
89
|
+
# Returns true if the given flag name has been marked as global
|
90
|
+
def global_flag?(flag)
|
91
|
+
result = global_flags.any? { |f| clean_flag(f) == clean_flag(flag) }
|
92
|
+
result
|
93
|
+
end
|
94
|
+
|
67
95
|
def clean_flag(flag)
|
68
96
|
flag = flag.dup.to_s
|
69
97
|
flag[0] = '' if flag[0] == '$'
|
@@ -19,7 +19,7 @@ module OrigenTesters
|
|
19
19
|
# @return [Array] list of charz routines to be called under this profile
|
20
20
|
# @!attribute charz_only
|
21
21
|
# @return [Boolean] indicates if the point tests should or shouldn't be added to the flow
|
22
|
-
attr_accessor :id, :name, :placement, :on_result, :enables, :flags, :routines, :charz_only
|
22
|
+
attr_accessor :id, :name, :placement, :on_result, :enables, :flags, :routines, :charz_only, :and_enables, :and_flags
|
23
23
|
|
24
24
|
def initialize(id, options, &block)
|
25
25
|
@id = id
|
@@ -74,8 +74,20 @@ module OrigenTesters
|
|
74
74
|
end
|
75
75
|
|
76
76
|
unless @gate_checks == false
|
77
|
-
|
78
|
-
|
77
|
+
if @and_enables && @and_flags
|
78
|
+
Origen.log.error "@and_enables and @and_flags are both set to true. Please only 'and' one gate type"
|
79
|
+
fail
|
80
|
+
end
|
81
|
+
if @and_enables
|
82
|
+
gate_check(@flags, :flags) if @flags
|
83
|
+
gate_check_and(@enables, :enables, @flags) if @enables
|
84
|
+
elsif @and_flags
|
85
|
+
gate_check(@enables, :enables) if @enables
|
86
|
+
gate_check_and(@flags, :flags, @enables) if @flags
|
87
|
+
else
|
88
|
+
gate_check(@enables, :enable) if @enables
|
89
|
+
gate_check(@flags, :flags) if @flags
|
90
|
+
end
|
79
91
|
end
|
80
92
|
end
|
81
93
|
|
@@ -112,6 +124,46 @@ module OrigenTesters
|
|
112
124
|
end
|
113
125
|
end
|
114
126
|
|
127
|
+
def gate_check_and(gates, gate_type, other_gate)
|
128
|
+
if other_gate.is_a? Hash
|
129
|
+
Origen.log.error "Profile #{id}: #{other_gate} When using &&-ing feature, the non-anded gate can not be of type hash."
|
130
|
+
fail
|
131
|
+
end
|
132
|
+
case gates
|
133
|
+
when Symbol, String
|
134
|
+
return
|
135
|
+
when Array
|
136
|
+
unknown_gates = gates.reject { |gate| [String, Symbol].include? gate.class }
|
137
|
+
if unknown_gates.empty?
|
138
|
+
return
|
139
|
+
else
|
140
|
+
Origen.log.error "Profile #{id}: Unknown #{gate_type} type(s) in #{gate_type} array."
|
141
|
+
Origen.log.error "Arrays must contain Strings and/or Symbols, but #{unknown_gates.map(&:class).uniq } were found in #{gates}"
|
142
|
+
fail
|
143
|
+
end
|
144
|
+
when Hash
|
145
|
+
gates.each do |gated_routine, gates|
|
146
|
+
if gated_routine.is_a? Hash
|
147
|
+
Origen.log.error "Profile #{id}: #{gate_type} Hash keys cannot be of type Hash, but only Symbol, String, or Array"
|
148
|
+
fail
|
149
|
+
end
|
150
|
+
unless @defined_routines.include?(gated_routine)
|
151
|
+
Origen.log.error "Profile #{id}: #{gated_routine} Hash keys for &&-ed gates must be defined routines."
|
152
|
+
fail
|
153
|
+
end
|
154
|
+
gates = [gates] unless gates.is_a? Array
|
155
|
+
unknown_gates = gates.reject { |gate| [String, Symbol].include? gate.class }
|
156
|
+
unless unknown_gates.empty?
|
157
|
+
Origen.log.error "Gate array must contain Strings and/or Symbols, but #{unknown_gates.map(&:class).uniq } were found in #{gates}"
|
158
|
+
fail
|
159
|
+
end
|
160
|
+
end
|
161
|
+
else
|
162
|
+
Origen.log.error "Profile #{id}: Unknown #{gate_type} type: #{gates.class}. #{gate_type} must be of type Symbol, String, Array, or Hash"
|
163
|
+
fail
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
115
167
|
def method_missing(m, *args, &block)
|
116
168
|
ivar = "@#{m.to_s.gsub('=', '')}"
|
117
169
|
ivar_sym = ":#{ivar}"
|
@@ -16,12 +16,13 @@ module OrigenTesters
|
|
16
16
|
@defaults = options[:defaults]
|
17
17
|
else
|
18
18
|
@defaults = {
|
19
|
-
placement:
|
20
|
-
on_result:
|
21
|
-
enables:
|
22
|
-
flags:
|
23
|
-
|
24
|
-
|
19
|
+
placement: :inline,
|
20
|
+
on_result: nil,
|
21
|
+
enables: nil,
|
22
|
+
flags: nil,
|
23
|
+
enables_and: nil,
|
24
|
+
name: 'charz',
|
25
|
+
charz_only: false
|
25
26
|
}
|
26
27
|
end
|
27
28
|
end
|
@@ -53,6 +54,17 @@ module OrigenTesters
|
|
53
54
|
return @valid
|
54
55
|
end
|
55
56
|
@defined_routines = options.delete(:defined_routines)
|
57
|
+
|
58
|
+
if charz_obj.and_flags
|
59
|
+
@and_flags = charz_obj.and_flags
|
60
|
+
else
|
61
|
+
@and_flags = false
|
62
|
+
end
|
63
|
+
if charz_obj.and_enables
|
64
|
+
@and_enables = charz_obj.and_enables
|
65
|
+
else
|
66
|
+
@and_enables = false
|
67
|
+
end
|
56
68
|
assign_by_priority(:placement, charz_obj, options)
|
57
69
|
assign_by_priority(:on_result, charz_obj, options)
|
58
70
|
assign_by_priority(:enables, charz_obj, options)
|
data/lib/origen_testers/charz.rb
CHANGED
@@ -334,13 +334,102 @@ module OrigenTesters
|
|
334
334
|
#
|
335
335
|
# This is the final method of handling the insert_charz_test usecases, where the block thats been passed around is finally called
|
336
336
|
# the user's provided block is passed the current routine (one at a time) to then take its info to generate a charz test
|
337
|
+
|
338
|
+
# Pass an "and_if_true" variable for enables and flags? And use that to to decide what to do? Then we don't need 4.
|
339
|
+
# But the hash has to be structured a different way for the enable_and (routine is key, enables is value.)
|
337
340
|
def process_gates(options, &block)
|
338
341
|
if options[:skip_gates] || !(charz_session.enables || charz_session.flags)
|
339
342
|
charz_session.routines.each do |routine|
|
340
343
|
block.call(options.merge(current_routine: routine))
|
341
344
|
end
|
342
345
|
else
|
343
|
-
if charz_session.
|
346
|
+
if charz_session.and_enables
|
347
|
+
if charz_session.flags
|
348
|
+
# Wrap all tests in flag, wrap some tests in anded enables.
|
349
|
+
ungated_routines = charz_session.routines - charz_session.enables.keys
|
350
|
+
ungated_routines.each do |routine|
|
351
|
+
if_flag charz_session.flags do
|
352
|
+
block.call(options.merge(current_routine: routine))
|
353
|
+
end
|
354
|
+
end
|
355
|
+
gated_routines = charz_session.routines - ungated_routines
|
356
|
+
# Build the proc which contains the nested if statements for each routine so they are anded.
|
357
|
+
gated_routines.each do |routine|
|
358
|
+
my_proc = -> do
|
359
|
+
if_flag charz_session.flags do
|
360
|
+
block.call(options.merge(current_routine: routine))
|
361
|
+
end
|
362
|
+
end
|
363
|
+
charz_session.enables[routine].inject(my_proc) do |my_block, enable|
|
364
|
+
lambda do
|
365
|
+
if_enable :"#{enable}" do
|
366
|
+
my_block.call
|
367
|
+
end
|
368
|
+
end
|
369
|
+
end.call
|
370
|
+
end
|
371
|
+
else
|
372
|
+
ungated_routines = charz_session.routines - charz_session.enables.keys
|
373
|
+
ungated_routines.each do |routine|
|
374
|
+
block.call(options.merge(current_routine: routine))
|
375
|
+
end
|
376
|
+
# Build the proc which contains the nested if statements for each routine so they are anded.
|
377
|
+
gated_routines = charz_session.routines - ungated_routines
|
378
|
+
gated_routines.each do |routine|
|
379
|
+
my_proc = -> { block.call(options.merge(current_routine: routine)) }
|
380
|
+
charz_session.enables[routine].inject(my_proc) do |my_block, enable|
|
381
|
+
lambda do
|
382
|
+
if_enable :"#{enable}" do
|
383
|
+
my_block.call
|
384
|
+
end
|
385
|
+
end
|
386
|
+
end.call
|
387
|
+
end
|
388
|
+
end
|
389
|
+
elsif charz_session.and_flags
|
390
|
+
if charz_session.enables
|
391
|
+
# Wrap all tests in enable, some tests in anded flags.
|
392
|
+
ungated_routines = charz_session.routines - charz_session.flags.keys
|
393
|
+
ungated_routines.each do |routine|
|
394
|
+
if_enable charz_session.enables do
|
395
|
+
block.call(options.merge(current_routine: routine))
|
396
|
+
end
|
397
|
+
end
|
398
|
+
# Build the proc which contains the nested if statemements for each routine so they are anded.
|
399
|
+
gated_routines = charz_session.routines - ungated_routines
|
400
|
+
gated_routines.each do |routine|
|
401
|
+
my_proc = -> do
|
402
|
+
if_enable charz_session.enables do
|
403
|
+
block.call(options.merge(current_routine: routine))
|
404
|
+
end
|
405
|
+
end
|
406
|
+
charz_session.flags[routine].inject(my_proc) do |my_block, flag|
|
407
|
+
lambda do
|
408
|
+
if_flag :"#{flag}" do
|
409
|
+
my_block.call
|
410
|
+
end
|
411
|
+
end
|
412
|
+
end.call
|
413
|
+
end
|
414
|
+
else
|
415
|
+
ungated_routines = charz_session.routines - charz_session.flags.keys
|
416
|
+
ungated_routines.each do |routine|
|
417
|
+
block.call(options.merge(current_routine: routine))
|
418
|
+
end
|
419
|
+
# Build the proc which contains the nested if statemements for each routine so they are anded.
|
420
|
+
gated_routines = charz_session.routines - ungated_routines
|
421
|
+
gated_routines.each do |routine|
|
422
|
+
my_proc = -> { block.call(options.merge(current_routine: routine)) }
|
423
|
+
charz_session.flags[routine].inject(my_proc) do |my_block, flag|
|
424
|
+
lambda do
|
425
|
+
if_flag :"#{flag}" do
|
426
|
+
my_block.call
|
427
|
+
end
|
428
|
+
end
|
429
|
+
end.call
|
430
|
+
end
|
431
|
+
end
|
432
|
+
elsif charz_session.enables && charz_session.flags
|
344
433
|
if charz_session.enables.is_a?(Hash) && !charz_session.flags.is_a?(Hash)
|
345
434
|
# wrap all tests in flags, wrap specific tests in enables
|
346
435
|
if_flag charz_session.flags do
|
@@ -129,7 +129,7 @@ module OrigenTesters
|
|
129
129
|
current_line.flag_pass = flag
|
130
130
|
end
|
131
131
|
else
|
132
|
-
|
132
|
+
if !set_previously && !global_flags.include?(flag)
|
133
133
|
completed_lines << platform::FlowLine.new(:defaults, flag_fail: flag)
|
134
134
|
end
|
135
135
|
completed_lines << new_line(:flag_true, parameter: flag)
|
@@ -37,6 +37,10 @@ module OrigenTesters
|
|
37
37
|
@var_filename || 'global'
|
38
38
|
end
|
39
39
|
|
40
|
+
def set_var_filename(new_var_filename)
|
41
|
+
@var_filename = new_var_filename
|
42
|
+
end
|
43
|
+
|
40
44
|
def subdirectory
|
41
45
|
@subdirectory ||= begin
|
42
46
|
if smt8?
|
@@ -218,6 +222,10 @@ module OrigenTesters
|
|
218
222
|
@post_test_lines = []
|
219
223
|
@stack = { on_fail: [], on_pass: [] }
|
220
224
|
@set_runtime_variables = ast.excluding_sub_flows.set_flags
|
225
|
+
global_flags.each do |global_var_name|
|
226
|
+
@set_runtime_variables.delete(global_var_name)
|
227
|
+
@set_runtime_variables.delete('$' + global_var_name)
|
228
|
+
end
|
221
229
|
process(ast)
|
222
230
|
unless smt8?
|
223
231
|
unless flow_variables[:empty?]
|
@@ -50,6 +50,28 @@ module OrigenTesters
|
|
50
50
|
profile.enables = { ['$MyEnable1'] => [:routine1], ['$MyEnable2'] => [:routine2, :routine3], '$MyEnable3' => :routine5 }
|
51
51
|
profile.routines = [:routine1, :routine2, :routine3, :routine4, :routine5, :routine6]
|
52
52
|
end
|
53
|
+
|
54
|
+
add_charz_profile :simple_anded_flags do |profile|
|
55
|
+
profile.and_flags = true
|
56
|
+
profile.routines = [:routine1]
|
57
|
+
end
|
58
|
+
|
59
|
+
add_charz_profile :simple_anded_enables do |profile|
|
60
|
+
profile.and_enables = true
|
61
|
+
profile.routines = [:routine1]
|
62
|
+
end
|
63
|
+
|
64
|
+
add_charz_profile :complex_anded_flags do |profile|
|
65
|
+
profile.and_flags = true
|
66
|
+
profile.enables = :my_enable
|
67
|
+
profile.routines = [:routine1]
|
68
|
+
end
|
69
|
+
|
70
|
+
add_charz_profile :complex_anded_enables do |profile|
|
71
|
+
profile.and_enables = true
|
72
|
+
profile.flags = :my_flag
|
73
|
+
profile.routines = [:routine1]
|
74
|
+
end
|
53
75
|
end
|
54
76
|
|
55
77
|
# Test that the block form of flow control methods like this can
|
data/program/charz.rb
CHANGED
@@ -7,11 +7,11 @@ Flow.create interface: 'OrigenTesters::Test::Interface' do
|
|
7
7
|
|
8
8
|
if tester.v93k? && tester.smt7?
|
9
9
|
charz_on :complex_gates, { on_result: :fail }
|
10
|
-
|
10
|
+
func_with_charz :func_complex_gates_on_fail
|
11
11
|
charz_off
|
12
12
|
|
13
13
|
charz_on :complex_gates, { enables: :my_enable }
|
14
|
-
|
14
|
+
func_with_charz :func_complex_flag_simple_enable
|
15
15
|
charz_off
|
16
16
|
|
17
17
|
charz_on :complex_gates, { flags: :my_flag } do
|
@@ -19,17 +19,17 @@ Flow.create interface: 'OrigenTesters::Test::Interface' do
|
|
19
19
|
end
|
20
20
|
|
21
21
|
charz_on :cz_only, { placement: :eof }
|
22
|
-
|
22
|
+
func_with_charz :func_charz_only
|
23
23
|
charz_off
|
24
24
|
|
25
25
|
func_with_charz :func_test_level_routine, charz: [:routine1, { type: :routine }]
|
26
26
|
|
27
27
|
charz_on :cz
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
28
|
+
func_with_charz :func_skip_group, skip_group: true
|
29
|
+
charz_pause
|
30
|
+
func_with_charz :func_pause_charz
|
31
|
+
charz_resume
|
32
|
+
func_with_charz :func_resume_charz
|
33
33
|
charz_off
|
34
34
|
|
35
35
|
charz_on :simple_gates, { on_result: :pass } do
|
@@ -43,6 +43,22 @@ Flow.create interface: 'OrigenTesters::Test::Interface' do
|
|
43
43
|
charz_on :simple_gates, { flags: nil }
|
44
44
|
func_with_charz :func_simple_enables
|
45
45
|
charz_off
|
46
|
-
end
|
47
46
|
|
47
|
+
charz_on :simple_anded_flags, { flags: { routine1: [:my_flag1, :my_flag2]}}
|
48
|
+
func_with_charz :func_simple_anded_flags
|
49
|
+
charz_off
|
50
|
+
|
51
|
+
charz_on :simple_anded_enables, {enables: { routine1: [:my_enable1, :my_enable2]}}
|
52
|
+
func_with_charz :func_simple_anded_enables
|
53
|
+
charz_off
|
54
|
+
|
55
|
+
charz_on :complex_anded_flags, {flags: { routine1: [:my_flag1, :my_flag2]}}
|
56
|
+
func_with_charz :func_complex_anded_flags
|
57
|
+
charz_off
|
58
|
+
|
59
|
+
charz_on :complex_anded_enables, {enables: { routine1: [:my_enable1, :my_enable2]}}
|
60
|
+
func_with_charz :func_complex_anded_enables
|
61
|
+
charz_off
|
62
|
+
|
63
|
+
end
|
48
64
|
end
|
data/program/flow_control.rb
CHANGED
@@ -309,6 +309,16 @@ Flow.create interface: 'OrigenTesters::Test::Interface', flow_name: "Flow Contro
|
|
309
309
|
test :test2, number: 51470
|
310
310
|
end
|
311
311
|
|
312
|
+
log 'Test global flag functionality'
|
313
|
+
add_global_flag :global
|
314
|
+
test :global_test1, on_fail: { set_flag: :$non_global }, continue: true
|
315
|
+
unless_flag "$global" do
|
316
|
+
set_flag '$non_global'
|
317
|
+
end
|
318
|
+
if_flag "$non_global" do
|
319
|
+
set_flag '$global'
|
320
|
+
end
|
321
|
+
|
312
322
|
if tester.v93k?
|
313
323
|
log "This should retain the set-run-flag in the else conditional"
|
314
324
|
func :test22, id: :at22, number: 51480
|
@@ -48,7 +48,7 @@ end
|
|
48
48
|
Charz profiles contain a collection of routines, as well as test creation meta data related to test placement, production test result dependence, and conditional execution.
|
49
49
|
|
50
50
|
The interface adds charz profiles by calling the `add_charz_profile` method. To create a profile that contains previously defined vmin and vmax search routines, whose resulting searches
|
51
|
-
only run if the production test failed, and sets the vmax search routine to only run if the 'VmaxEnable' variable is set
|
51
|
+
only run if the production test failed, and sets the vmax search routine to only run if the 'VmaxEnable' variable is set.
|
52
52
|
|
53
53
|
~~~ruby
|
54
54
|
add_charz_profile :fail_searches do |profile|
|
@@ -59,6 +59,26 @@ add_charz_profile :fail_searches do |profile|
|
|
59
59
|
end
|
60
60
|
~~~
|
61
61
|
|
62
|
+
The default behavior for gates is to "OR" them if multiple are defined. The below will result in each routine being nested inside 'my_enable1 or my_enable2'.
|
63
|
+
~~~ruby
|
64
|
+
add_charz_profile :enables do |profile|
|
65
|
+
profile.name = 'enables'
|
66
|
+
profile.routines = [:vmin, :vmax]
|
67
|
+
profile.enables = [:my_enable1, :my_enable2]
|
68
|
+
end
|
69
|
+
~~~
|
70
|
+
|
71
|
+
The profile can be updated to "AND" together multiple enables or flags. To set up this functionality
|
72
|
+
create a hash which maps a routine name to multiple flags and set the corresponding "and_" profile attribute to true.
|
73
|
+
~~~ruby
|
74
|
+
add_charz_profile :anded_enables do |profile|
|
75
|
+
profile.name = 'anded_enables'
|
76
|
+
profile.routines = [:vmin, :vmax]
|
77
|
+
profile.and_enables = true
|
78
|
+
profile.enables = { vmin: [:overall_enable, :vmin_enable], vmax: [:overall_enable, :vmax_enable]}
|
79
|
+
end
|
80
|
+
~~~
|
81
|
+
|
62
82
|
### Charz Session
|
63
83
|
|
64
84
|
The charz session (stored in your interfaces `@charz_session` attribute) monitors the current state of characterization at a given point in flow generation.
|
@@ -305,6 +305,19 @@ end
|
|
305
305
|
|
306
306
|
In all cases the `$` will be removed from the final flag name that appears in the test program.
|
307
307
|
|
308
|
+
Whenever you set a flag or automation initializes a variable, you can remove the variable from initialization flow by labeling as a global flag
|
309
|
+
with the `add_global_flag` API. The below example will set the `global` variable in the flow but not initialize it to a value. `non_global` will behave as normal.
|
310
|
+
|
311
|
+
~~~ruby
|
312
|
+
add_global_flag :global
|
313
|
+
test :global_test1, on_fail: { set_flag: :$non_global }, continue: true
|
314
|
+
unless_flag "$global" do
|
315
|
+
set_flag '$non_global'
|
316
|
+
end
|
317
|
+
if_flag "$non_global" do
|
318
|
+
set_flag '$global'
|
319
|
+
end
|
320
|
+
~~~
|
308
321
|
|
309
322
|
|
310
323
|
#### Adding the V93K bypass option:
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: origen_testers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.51.
|
4
|
+
version: 0.51.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stephen McGinty
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-07-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: origen
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: 0.60.7
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.
|
26
|
+
version: 0.60.7
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: dentaku
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -601,7 +601,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
601
601
|
- !ruby/object:Gem::Version
|
602
602
|
version: '0'
|
603
603
|
requirements: []
|
604
|
-
rubygems_version: 3.
|
604
|
+
rubygems_version: 3.2.3
|
605
605
|
signing_key:
|
606
606
|
specification_version: 4
|
607
607
|
summary: This plugin provides Origen tester models to drive ATE type testers like
|