origen_testers 0.51.4 → 0.52.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/config/commands.rb +1 -1
- data/config/version.rb +2 -2
- data/lib/origen_testers/atp/flow.rb +39 -0
- data/lib/origen_testers/atp/flow_api.rb +2 -2
- data/lib/origen_testers/smartest_based_tester/base/flow.rb +61 -17
- data/lib/origen_testers/smartest_based_tester/base/generator.rb +5 -1
- data/lib/origen_testers/smartest_based_tester/base/processors/extract_flow_vars.rb +18 -1
- data/lib/origen_testers/smartest_based_tester/base/test_method.rb +25 -3
- data/lib/origen_testers/smartest_based_tester/base/variables_file.rb +1 -1
- data/lib/origen_testers/smartest_based_tester/base.rb +28 -4
- data/lib/origen_testers/smartest_based_tester/v93k_smt8/flow.rb +69 -5
- data/lib/origen_testers/smartest_based_tester/v93k_smt8/limits_workbook.rb +28 -26
- data/lib/origen_testers/smartest_based_tester/v93k_smt8/templates/template.flow.erb +3 -0
- data/lib/origen_testers/smartest_based_tester/v93k_smt8/test_suite.rb +111 -4
- data/lib/origen_testers/stil_based_tester/base.rb +77 -24
- data/lib/origen_testers/test/custom_test_interface.rb +36 -2
- data/lib/origen_testers/test/interface.rb +123 -0
- data/program/components/_prb1_main.rb +9 -0
- data/program/custom_tests.rb +3 -0
- data/program/flow_control.rb +37 -8
- data/templates/origen_guides/pattern/stil.md.erb +17 -0
- data/templates/origen_guides/program/flowapi.md.erb +26 -1
- data/templates/origen_guides/program/v93k.md.erb +14 -0
- data/templates/origen_guides/program/v93ksmt8.md.erb +25 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 806f6c174a2b26a0ead003ab2a26ad6874ab43ceaeb1f72b90183f0c549f0b0f
|
4
|
+
data.tar.gz: 997ca9d806de6b205cf98013f9260b5b44e2e0a82dda42b2aa98020a9a9c961c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 79ade702c6acb3876aa888ca66570afea165a48a52c08fb0d19f41707f0f02a6c32151d694fd4d4a4cbff45dd1b53c73ca27c5e2e56bd733a48975452a4f8f66
|
7
|
+
data.tar.gz: d84b6632197fb9305b4fb7032eecf5620a424fb292ab46c6b24376116f7701aff2dabeec31a11c5b18214285adbfab98fc38f739a720c62feb9494389c2ff2f3
|
data/config/commands.rb
CHANGED
@@ -200,7 +200,7 @@ when "examples", "test"
|
|
200
200
|
puts
|
201
201
|
puts "To approve any diffs in the reference.list files run the following command:"
|
202
202
|
puts
|
203
|
-
platforms = %w(j750 j750_literals j750_hpt ultraflex ultraflex_literals v93k v93k_multiport v93k_enable_flow v93k_disable_flow v93k_limits_file v93k_global v93k_smt8) # put here the various platforms used in examples/program_generator.rb
|
203
|
+
platforms = %w(j750 j750_literals j750_hpt ultraflex ultraflex_literals v93k v93k_multiport v93k_enable_flow v93k_disable_flow v93k_limits_file v93k_global v93k_smt8 v93k_flowgrouping) # put here the various platforms used in examples/program_generator.rb
|
204
204
|
reflist_command = ''
|
205
205
|
platforms.each do |platform|
|
206
206
|
unless reflist_command == ''
|
data/config/version.rb
CHANGED
@@ -479,6 +479,21 @@ module OrigenTesters::ATP
|
|
479
479
|
end
|
480
480
|
end
|
481
481
|
|
482
|
+
def add_auxiliary_flow(name, options = {})
|
483
|
+
if tester.smt8?
|
484
|
+
if name.to_s != options[:path].split('.').last.to_s
|
485
|
+
fail "Auxiliary flow path does not end in '#{name}'. The path instead is '#{options[:path]}'. Please update the path to align with the provided name."
|
486
|
+
end
|
487
|
+
extract_meta!(options) do
|
488
|
+
apply_conditions(options) do
|
489
|
+
n2(:auxiliary_flow, n1(:name, name), n1(:path, options[:path]))
|
490
|
+
end
|
491
|
+
end
|
492
|
+
else
|
493
|
+
fail 'Auxiliary flow API is only usable in SMT8.'
|
494
|
+
end
|
495
|
+
end
|
496
|
+
|
482
497
|
def bin(number, options = {})
|
483
498
|
if number.is_a?(Hash)
|
484
499
|
fail 'The bin number must be passed as the first argument'
|
@@ -547,6 +562,22 @@ module OrigenTesters::ATP
|
|
547
562
|
end
|
548
563
|
end
|
549
564
|
|
565
|
+
def unset_flag(flag, options = {})
|
566
|
+
extract_meta!(options) do
|
567
|
+
apply_conditions(options) do
|
568
|
+
unset_flag_node(flag)
|
569
|
+
end
|
570
|
+
end
|
571
|
+
end
|
572
|
+
|
573
|
+
def add_flag(flag, options = {})
|
574
|
+
extract_meta!(options) do
|
575
|
+
apply_conditions(options) do
|
576
|
+
add_flag_node(flag)
|
577
|
+
end
|
578
|
+
end
|
579
|
+
end
|
580
|
+
|
550
581
|
def set(var, val, options = {})
|
551
582
|
extract_meta!(options) do
|
552
583
|
apply_conditions(options) do
|
@@ -938,6 +969,14 @@ module OrigenTesters::ATP
|
|
938
969
|
n1(:set_flag, flag)
|
939
970
|
end
|
940
971
|
|
972
|
+
def unset_flag_node(flag)
|
973
|
+
n1(:unset_flag, flag)
|
974
|
+
end
|
975
|
+
|
976
|
+
def add_flag_node(flag)
|
977
|
+
n1(:add_flag, flag)
|
978
|
+
end
|
979
|
+
|
941
980
|
# Ensures the flow ast has a volatile node, then adds the
|
942
981
|
# given flags to it
|
943
982
|
def add_volatile_flags(node, flags)
|
@@ -8,8 +8,8 @@ module OrigenTesters::ATP
|
|
8
8
|
@atp
|
9
9
|
end
|
10
10
|
|
11
|
-
([:test, :bin, :pass, :continue, :cz, :log, :sub_test, :volatile, :add_global_flag, :set_flag, :set, :enable, :disable, :render,
|
12
|
-
:context_changed?, :ids, :describe_bin, :describe_softbin, :describe_soft_bin, :loop] +
|
11
|
+
([:test, :bin, :pass, :continue, :cz, :log, :sub_test, :volatile, :add_global_flag, :set_flag, :unset_flag, :add_flag, :set, :enable, :disable, :render,
|
12
|
+
:context_changed?, :ids, :describe_bin, :describe_softbin, :describe_soft_bin, :loop, :add_auxiliary_flow] +
|
13
13
|
OrigenTesters::ATP::Flow::CONDITION_KEYS.keys + OrigenTesters::ATP::Flow::RELATIONAL_OPERATORS).each do |method|
|
14
14
|
define_method method do |*args, &block|
|
15
15
|
options = args.pop if args.last.is_a?(Hash)
|
@@ -50,7 +50,12 @@ module OrigenTesters
|
|
50
50
|
parents.unshift(File.basename(f.filename, '.*').to_s.downcase)
|
51
51
|
f = f.parent
|
52
52
|
end
|
53
|
-
|
53
|
+
# need to variablize this for internal usage!!
|
54
|
+
if Origen.interface.respond_to?(:insertion)
|
55
|
+
File.join tester.package_namespace, Origen.interface.insertion.to_s, 'flows', *parents
|
56
|
+
else
|
57
|
+
File.join tester.package_namespace, 'flows', *parents
|
58
|
+
end
|
54
59
|
else
|
55
60
|
'testflow/mfh.testflow.group'
|
56
61
|
end
|
@@ -447,17 +452,26 @@ module OrigenTesters
|
|
447
452
|
|
448
453
|
def on_whenever(node)
|
449
454
|
expressions, *nodes = *node
|
450
|
-
|
455
|
+
and_string = ' and '
|
456
|
+
or_string = ' or '
|
457
|
+
if smt8?
|
458
|
+
and_string = ' && '
|
459
|
+
or_string = ' || '
|
460
|
+
end
|
451
461
|
case node.type
|
452
462
|
when :whenever_all
|
453
|
-
condition = expressions.map { |e| "#{generate_expr_string(e)}" }.join(
|
463
|
+
condition = expressions.map { |e| "#{generate_expr_string(e)}" }.join(and_string)
|
454
464
|
when :whenever_any
|
455
|
-
condition = expressions.map { |e| "#{generate_expr_string(e)}" }.join(
|
465
|
+
condition = expressions.map { |e| "#{generate_expr_string(e)}" }.join(or_string)
|
456
466
|
else
|
457
467
|
condition = expressions.map { |e| "#{generate_expr_string(e)}" }.join('ERROR')
|
458
468
|
end
|
459
469
|
|
460
|
-
|
470
|
+
if smt8?
|
471
|
+
line "if (#{condition})"
|
472
|
+
else
|
473
|
+
line "if #{condition} then"
|
474
|
+
end
|
461
475
|
line '{'
|
462
476
|
@indent += 1
|
463
477
|
process_all(node.children)
|
@@ -471,13 +485,23 @@ module OrigenTesters
|
|
471
485
|
alias_method :on_whenever_all, :on_whenever
|
472
486
|
|
473
487
|
def on_loop(node, options = {})
|
474
|
-
# TODO: don't have the SMT8 way to do this yet
|
475
|
-
if smt8?
|
476
|
-
fail 'Flow loop control not yet supported for SMT8!'
|
477
|
-
end
|
478
488
|
start = node.to_a[0]
|
489
|
+
if start.is_a?(String)
|
490
|
+
start = generate_flag_name(start)
|
491
|
+
unless smt8?
|
492
|
+
start = "@#{start}"
|
493
|
+
end
|
494
|
+
end
|
479
495
|
stop = node.to_a[1]
|
496
|
+
if stop.is_a?(String) && smt8?
|
497
|
+
stop = generate_flag_name(stop)
|
498
|
+
elsif stop.is_a?(String)
|
499
|
+
fail 'loops with \'stop\' defined as a variable cannot be supported in the defined environments.'
|
500
|
+
end
|
480
501
|
step = node.to_a[2]
|
502
|
+
if smt8? && !(step == -1 || step == 1)
|
503
|
+
fail 'SMT8 does not support steps other than -1 or 1.'
|
504
|
+
end
|
481
505
|
if node.to_a[3].nil?
|
482
506
|
fail 'You must supply a loop variable name!'
|
483
507
|
else
|
@@ -487,7 +511,7 @@ module OrigenTesters
|
|
487
511
|
unless smt8?
|
488
512
|
var = "@#{var}"
|
489
513
|
end
|
490
|
-
num = (stop - start) / step + 1
|
514
|
+
# num = (stop - start) / step + 1
|
491
515
|
# Handle increment/decrement
|
492
516
|
if step < 0
|
493
517
|
compare = '>'
|
@@ -496,13 +520,24 @@ module OrigenTesters
|
|
496
520
|
compare = '<'
|
497
521
|
incdec = "+ #{step}"
|
498
522
|
end
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
523
|
+
if tester.smt7?
|
524
|
+
line "for #{var} = #{start}; #{var} #{compare} #{stop + step} ; #{var} = #{var} #{incdec}; do"
|
525
|
+
line "test_number_loop_increment = #{test_num_inc}"
|
526
|
+
line '{'
|
527
|
+
@indent += 1
|
528
|
+
process_all(node.children)
|
529
|
+
@indent -= 1
|
530
|
+
line '}'
|
531
|
+
elsif smt8?
|
532
|
+
line "for (#{var} : #{start}..#{stop})"
|
533
|
+
line '{'
|
534
|
+
@indent += 1
|
535
|
+
process_all(node.children)
|
536
|
+
@indent -= 1
|
537
|
+
line '}'
|
538
|
+
else
|
539
|
+
fail 'Environment was not supported for flow loops.'
|
540
|
+
end
|
506
541
|
end
|
507
542
|
|
508
543
|
def generate_expr_string(node, options = {})
|
@@ -614,6 +649,15 @@ module OrigenTesters
|
|
614
649
|
end
|
615
650
|
end
|
616
651
|
|
652
|
+
def on_unset_flag(node)
|
653
|
+
flag = generate_flag_name(node.value)
|
654
|
+
if smt8?
|
655
|
+
line "#{flag} = 0;"
|
656
|
+
else
|
657
|
+
line "@#{flag} = 0;"
|
658
|
+
end
|
659
|
+
end
|
660
|
+
|
617
661
|
# Note that for smt8?, this should never be hit anymore since groups are now generated as sub-flows
|
618
662
|
def on_group(node)
|
619
663
|
on_fail = node.children.find { |n| n.try(:type) == :on_fail }
|
@@ -88,7 +88,11 @@ module OrigenTesters
|
|
88
88
|
return flow_sheets[id] if flow_sheets[id] # will return flow if already existing
|
89
89
|
p = platform::Flow.new
|
90
90
|
p.inhibit_output if Origen.interface.resources_mode?
|
91
|
-
|
91
|
+
if id == Origen.file_handler.current_file.basename('.rb').to_s && Origen.interface.try(:use_flow_name_for_top_level)
|
92
|
+
p.filename = Origen.interface.flow_name
|
93
|
+
else
|
94
|
+
p.filename = filename
|
95
|
+
end
|
92
96
|
p.test_suites ||= platform::TestSuites.new(p)
|
93
97
|
p.test_methods ||= platform::TestMethods.new(p)
|
94
98
|
flow_sheets[id] = p
|
@@ -7,7 +7,8 @@ module OrigenTesters
|
|
7
7
|
# and their default values
|
8
8
|
class ExtractFlowVars < ATP::Processor
|
9
9
|
OWNERS = [:all, :this_flow, :sub_flows]
|
10
|
-
CATEGORIES = [:jobs, :referenced_flags, :set_flags, :
|
10
|
+
CATEGORIES = [:jobs, :referenced_flags, :set_flags, :unset_flags, :add_flags,
|
11
|
+
:set_flags_extern, :unset_flags_extern, :add_flags_extern,
|
11
12
|
:referenced_enables, :set_enables]
|
12
13
|
|
13
14
|
def run(node, options = {})
|
@@ -72,6 +73,22 @@ module OrigenTesters
|
|
72
73
|
end
|
73
74
|
end
|
74
75
|
|
76
|
+
def on_unset_flag(node)
|
77
|
+
add generate_flag_name(node.value), :unset_flags
|
78
|
+
# Also separate flags which have been set and which should be externally visible
|
79
|
+
if !node.to_a.include?('auto_generated') || node.to_a.include?('extern')
|
80
|
+
add generate_flag_name(node.value), :unset_flags_extern
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def on_add_flag(node)
|
85
|
+
add generate_flag_name(node.value), :add_flags
|
86
|
+
# Also separate flags which have been set and which should be externally visible
|
87
|
+
if !node.to_a.include?('auto_generated') || node.to_a.include?('extern')
|
88
|
+
add generate_flag_name(node.value), :add_flags_extern
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
75
92
|
def on_if_enabled(node)
|
76
93
|
flag, *nodes = *node
|
77
94
|
[flag].flatten.each do |f|
|
@@ -2,7 +2,7 @@ module OrigenTesters
|
|
2
2
|
module SmartestBasedTester
|
3
3
|
class Base
|
4
4
|
class TestMethod
|
5
|
-
FORMAT_TYPES = [:current, :voltage, :time, :string, :integer, :double, :boolean]
|
5
|
+
FORMAT_TYPES = [:current, :voltage, :time, :string, :integer, :double, :boolean, :class, :list_strings, :list_classes]
|
6
6
|
|
7
7
|
# Returns the object representing the test method library that the
|
8
8
|
# given test method is defined in
|
@@ -107,10 +107,20 @@ module OrigenTesters
|
|
107
107
|
type = send(name)
|
108
108
|
elsif respond_to?(name.sub(/b$/, ''))
|
109
109
|
type = inverse_of(send(name.sub(/b$/, '')))
|
110
|
+
elsif parameters[attr].is_a?(Hash) || parameters[attr.to_sym].is_a?(Hash)
|
111
|
+
type = :hash
|
110
112
|
else
|
111
113
|
fail "Unknown attribute type: #{parameters[attr]}"
|
112
114
|
end
|
113
115
|
end
|
116
|
+
if val.nil? && !tester.print_all_params
|
117
|
+
nil
|
118
|
+
else
|
119
|
+
handle_val_type(val, type, attr)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def handle_val_type(val, type, attr)
|
114
124
|
case type
|
115
125
|
when :current, 'CURR'
|
116
126
|
"#{val}[A]"
|
@@ -126,9 +136,9 @@ module OrigenTesters
|
|
126
136
|
val
|
127
137
|
when :boolean
|
128
138
|
# Check for valid values
|
129
|
-
if [0, 1, true, false].include?(val)
|
139
|
+
if [0, 1, true, false, 'true', 'false'].include?(val)
|
130
140
|
# Use true/false for smt8 and 0/1 for smt7
|
131
|
-
if [1, true].include?(val)
|
141
|
+
if [1, true, 'true'].include?(val)
|
132
142
|
tester.smt8? ? true : 1
|
133
143
|
else
|
134
144
|
tester.smt8? ? false : 0
|
@@ -136,6 +146,18 @@ module OrigenTesters
|
|
136
146
|
else
|
137
147
|
fail "Unknown boolean value for attribute #{attr}: #{val}"
|
138
148
|
end
|
149
|
+
when :hash, :class
|
150
|
+
val
|
151
|
+
when :list_strings
|
152
|
+
unless val.is_a?(Array)
|
153
|
+
fail "#{val} is not an Array. List_strings must have Array values"
|
154
|
+
end
|
155
|
+
"##{val}"
|
156
|
+
when :list_classes
|
157
|
+
unless val.is_a?(Array)
|
158
|
+
fail "#{val} is not an Array. List_classes must have Array values"
|
159
|
+
end
|
160
|
+
"##{val.to_s.gsub('"', '')}"
|
139
161
|
else
|
140
162
|
fail "Unknown type for attribute #{attr}: #{type}"
|
141
163
|
end
|
@@ -48,7 +48,7 @@ module OrigenTesters
|
|
48
48
|
# What SMT7 calls a declaration
|
49
49
|
def declarations
|
50
50
|
if variables
|
51
|
-
(variables[:all][:jobs] + variables[:all][:referenced_flags] + variables[:all][:set_flags]).uniq.sort do |x, y|
|
51
|
+
(variables[:all][:jobs] + variables[:all][:referenced_flags] + variables[:all][:set_flags] + variables[:all][:unset_flags] + variables[:all][:add_flags]).uniq.sort do |x, y|
|
52
52
|
x = x[0] if x.is_a?(Array)
|
53
53
|
y = y[0] if y.is_a?(Array)
|
54
54
|
# Need to use strings for the comparison as some declarations can be a string and some a symbol
|
@@ -19,6 +19,9 @@ module OrigenTesters
|
|
19
19
|
# flow, the default value is :signature
|
20
20
|
attr_reader :unique_test_names
|
21
21
|
|
22
|
+
# use flow variable grouping or not
|
23
|
+
attr_accessor :flow_variable_grouping
|
24
|
+
|
22
25
|
# Returns the SMT version, defaults to 7
|
23
26
|
attr_reader :smt_version
|
24
27
|
|
@@ -66,6 +69,8 @@ module OrigenTesters
|
|
66
69
|
# defaults to the application's namespace if not defined (SMT8 only)
|
67
70
|
attr_writer :package_namespace
|
68
71
|
|
72
|
+
attr_writer :spec_path, :seq_path
|
73
|
+
|
69
74
|
# When set to true, the bins and softbins sheets from the limits spreadsheet will
|
70
75
|
# be written out to a standalone (spreadsheet) file instead (SMT8 only)
|
71
76
|
attr_accessor :separate_bins_file
|
@@ -74,6 +79,10 @@ module OrigenTesters
|
|
74
79
|
# format (SMT8 only)
|
75
80
|
attr_accessor :zip_patterns
|
76
81
|
|
82
|
+
# When set to true (the default), parameters will be generated in the flow file regardless if the default is selected
|
83
|
+
# (SMT8 only)
|
84
|
+
attr_accessor :print_all_params
|
85
|
+
|
77
86
|
def initialize(options = {})
|
78
87
|
options = {
|
79
88
|
# whether to use multiport bursts or not, if so this indicates the name of the port to use
|
@@ -104,6 +113,7 @@ module OrigenTesters
|
|
104
113
|
if smt8?
|
105
114
|
@pat_extension = 'pat'
|
106
115
|
@program_comment_char = ['println', '//']
|
116
|
+
@print_all_params = options[:print_all_params].nil? ? true : options[:print_all_params]
|
107
117
|
else
|
108
118
|
@pat_extension = 'avc'
|
109
119
|
@program_comment_char = ['print_dl', '//']
|
@@ -135,15 +145,20 @@ module OrigenTesters
|
|
135
145
|
@unique_test_names = :signature
|
136
146
|
end
|
137
147
|
end
|
138
|
-
if
|
139
|
-
@create_limits_file =
|
148
|
+
if options.key?(:create_limits_file)
|
149
|
+
@create_limits_file = options[:create_limits_file]
|
140
150
|
else
|
141
|
-
if
|
142
|
-
@create_limits_file =
|
151
|
+
if smt8?
|
152
|
+
@create_limits_file = true
|
143
153
|
else
|
144
154
|
@create_limits_file = false
|
145
155
|
end
|
146
156
|
end
|
157
|
+
|
158
|
+
if options.key?(:flow_variable_grouping)
|
159
|
+
@flow_variable_grouping = options[:flow_variable_grouping]
|
160
|
+
end
|
161
|
+
|
147
162
|
if options[:literal_flags]
|
148
163
|
@literal_flags = true
|
149
164
|
end
|
@@ -152,6 +167,8 @@ module OrigenTesters
|
|
152
167
|
end
|
153
168
|
|
154
169
|
@package_namespace = options.delete(:package_namespace)
|
170
|
+
@spec_path = options.delete(:spec_path)
|
171
|
+
@seq_path = options.delete(:seq_path)
|
155
172
|
self.limitfile_test_modes = options[:limitfile_test_modes] || options[:limitsfile_test_modes]
|
156
173
|
self.force_pass_on_continue = options[:force_pass_on_continue]
|
157
174
|
self.delayed_binning = options[:delayed_binning]
|
@@ -167,6 +184,13 @@ module OrigenTesters
|
|
167
184
|
@package_namespace || Origen.app.namespace
|
168
185
|
end
|
169
186
|
|
187
|
+
def spec_path
|
188
|
+
@spec_path || 'specs'
|
189
|
+
end
|
190
|
+
|
191
|
+
def seq_path
|
192
|
+
@seq_path || 'specs'
|
193
|
+
end
|
170
194
|
# Set the test mode(s) that you want to see in the limits files, supply an array of mode names
|
171
195
|
# to set multiple.
|
172
196
|
def limitfile_test_modes=(val)
|
@@ -4,6 +4,7 @@ module OrigenTesters
|
|
4
4
|
require 'origen_testers/smartest_based_tester/base/flow'
|
5
5
|
class Flow < Base::Flow
|
6
6
|
TEMPLATE = "#{Origen.root!}/lib/origen_testers/smartest_based_tester/v93k_smt8/templates/template.flow.erb"
|
7
|
+
IN_IDENTIFIER = '_AUTOIN'
|
7
8
|
|
8
9
|
def on_test(node)
|
9
10
|
test_suite = node.find(:object).to_a[0]
|
@@ -93,18 +94,44 @@ module OrigenTesters
|
|
93
94
|
@sub_flows ||= {}
|
94
95
|
path = Pathname.new(node.find(:path).value)
|
95
96
|
name = path.basename('.*').to_s
|
97
|
+
path = Origen.interface.sub_flow_path_overwrite(path) if Origen.interface.respond_to? :sub_flow_path_overwrite
|
96
98
|
@sub_flows[name] = "#{path.dirname}.#{name}".gsub(/(\/|\\)/, '.')
|
97
99
|
# Pass down all input variables before executing
|
100
|
+
if sub_flow.input_variables.size > 0 && tester.flow_variable_grouping
|
101
|
+
line "// #{name} sub-flow input variables"
|
102
|
+
line '{'
|
103
|
+
@indent += 1
|
104
|
+
end
|
98
105
|
sub_flow.input_variables.each do |var|
|
99
|
-
|
100
|
-
|
106
|
+
# Handle the inout variables
|
107
|
+
# Get the main value into the temporary input variable
|
108
|
+
if sub_flow.inout_variables.keys.include?(var)
|
109
|
+
var = var[0] if var.is_a?(Array)
|
110
|
+
line "#{name}.#{var} = #{sub_flow.inout_variables[var]};"
|
111
|
+
else
|
112
|
+
var = var[0] if var.is_a?(Array)
|
113
|
+
line "#{name}.#{var} = #{var};"
|
114
|
+
end
|
115
|
+
end
|
116
|
+
if sub_flow.input_variables.size > 0 && tester.flow_variable_grouping
|
117
|
+
@indent -= 1
|
118
|
+
line '}'
|
101
119
|
end
|
102
120
|
line "#{name}.execute();"
|
103
121
|
# And then retrieve all common output variables
|
122
|
+
if (output_variables & sub_flow.output_variables).size > 0 && tester.flow_variable_grouping
|
123
|
+
line "// #{name} sub-flow output variables"
|
124
|
+
line '{'
|
125
|
+
@indent += 1
|
126
|
+
end
|
104
127
|
(output_variables & sub_flow.output_variables).sort.each do |var|
|
105
128
|
var = var[0] if var.is_a?(Array)
|
106
129
|
line "#{var} = #{name}.#{var};"
|
107
130
|
end
|
131
|
+
if (output_variables & sub_flow.output_variables).size > 0 && tester.flow_variable_grouping
|
132
|
+
@indent -= 1
|
133
|
+
line '}'
|
134
|
+
end
|
108
135
|
if on_pass = node.find(:on_pass)
|
109
136
|
pass_lines = capture_lines do
|
110
137
|
@indent += 1
|
@@ -146,20 +173,48 @@ module OrigenTesters
|
|
146
173
|
end
|
147
174
|
end
|
148
175
|
|
176
|
+
def on_auxiliary_flow(node)
|
177
|
+
@auxiliary_flows ||= {}
|
178
|
+
path = node.find(:path).value
|
179
|
+
name = node.find(:name).value
|
180
|
+
@auxiliary_flows[name] = "#{path}"
|
181
|
+
line "#{name}.execute();"
|
182
|
+
end
|
183
|
+
|
149
184
|
def sub_flows
|
150
185
|
@sub_flows || {}
|
151
186
|
end
|
152
187
|
|
188
|
+
def auxiliary_flows
|
189
|
+
@auxiliary_flows || {}
|
190
|
+
end
|
191
|
+
|
192
|
+
def inout_variables
|
193
|
+
@inout_variables || {}
|
194
|
+
end
|
195
|
+
|
153
196
|
# Variables which should be defined as an input to the current flow
|
154
197
|
def input_variables
|
155
198
|
vars = flow_variables
|
156
199
|
# Jobs and enables flow into a sub-flow
|
157
|
-
(vars[:all][:jobs] + vars[:all][:referenced_enables] + vars[:all][:set_enables] +
|
200
|
+
in_var_array = (vars[:all][:jobs] + vars[:all][:referenced_enables] + vars[:all][:set_enables] +
|
158
201
|
# As do any flags which are referenced by it but which are not set within it
|
159
|
-
(vars[:all][:referenced_flags] - vars[:all][:set_flags])).uniq
|
202
|
+
(vars[:all][:referenced_flags] - vars[:all][:set_flags] - vars[:all][:unset_flags])).uniq
|
203
|
+
identified_inout_variables = in_var_array.select { |e| output_variables.include?(e) }
|
204
|
+
result = in_var_array.reject { |e| output_variables.include?(e) }
|
205
|
+
@inout_variables = {}
|
206
|
+
# create inout variables with unique ids to reduce user conflicts
|
207
|
+
identified_inout_variables.each do |var|
|
208
|
+
unique_id = 0
|
209
|
+
var.each_byte { |n| unique_id += n }
|
210
|
+
identifier = IN_IDENTIFIER + "_#{unique_id.to_s[0..4]}"
|
211
|
+
@inout_variables[:"#{var}#{identifier}"] = var
|
212
|
+
end
|
213
|
+
result += @inout_variables.keys
|
214
|
+
result.uniq.sort do |x, y|
|
160
215
|
x = x[0] if x.is_a?(Array)
|
161
216
|
y = y[0] if y.is_a?(Array)
|
162
|
-
x <=> y
|
217
|
+
x.to_s <=> y.to_s
|
163
218
|
end
|
164
219
|
end
|
165
220
|
|
@@ -170,6 +225,10 @@ module OrigenTesters
|
|
170
225
|
(vars[:this_flow][:set_flags] +
|
171
226
|
# As do any flags set by its children which are marked as external
|
172
227
|
vars[:all][:set_flags_extern] +
|
228
|
+
# Other test methods are setting the flags
|
229
|
+
vars[:this_flow][:add_flags] +
|
230
|
+
# Other test methods are set in the children
|
231
|
+
vars[:all][:add_flags_extern] +
|
173
232
|
# And any flags which are set by a child and referenced in this flow
|
174
233
|
(vars[:this_flow][:referenced_flags] & vars[:sub_flows][:set_flags]) +
|
175
234
|
# And also intermediate flags, those are flags which are set by a child and referenced
|
@@ -217,6 +276,11 @@ module OrigenTesters
|
|
217
276
|
h << i + "#{var} = -1;"
|
218
277
|
end
|
219
278
|
end
|
279
|
+
# Handle the inout variables
|
280
|
+
# Use the original variable name and get the value out of the temporary input variable
|
281
|
+
inout_variables.each do |inout_var, orig_var|
|
282
|
+
h << i + "#{orig_var} = #{inout_var};"
|
283
|
+
end
|
220
284
|
h << '' unless flow_variables[:this_flow][:set_flags].empty?
|
221
285
|
h
|
222
286
|
end
|
@@ -65,35 +65,37 @@ module OrigenTesters
|
|
65
65
|
Origen.log.info "Writing... #{output_file}"
|
66
66
|
spreadsheet = RODF::Spreadsheet.new
|
67
67
|
Origen.interface.flow_sheets.each do |name, flow|
|
68
|
-
if
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
x
|
88
|
-
|
68
|
+
if tester.create_limits_file
|
69
|
+
if flow.limits_file
|
70
|
+
limits_name = flow.limits_file.filename.sub('.csv', '')
|
71
|
+
table = spreadsheet.table limits_name
|
72
|
+
flow.limits_file.output_file.readlines.each_with_index do |line, i|
|
73
|
+
# Need to fix the first row, SMT8 won't allow the Low/High limits cells not to be merged
|
74
|
+
if i == 0
|
75
|
+
row = table.row
|
76
|
+
x = nil
|
77
|
+
line.chomp.split(',').each do |word|
|
78
|
+
if word == 'Low Limit'
|
79
|
+
x = 0
|
80
|
+
elsif word == 'High Limit'
|
81
|
+
row.cell 'Low Limit', span: x + 1
|
82
|
+
x = 0
|
83
|
+
elsif word == 'Unit'
|
84
|
+
row.cell 'High Limit', span: x + 1
|
85
|
+
row.cell word
|
86
|
+
x = nil
|
87
|
+
elsif x
|
88
|
+
x += 1
|
89
|
+
else
|
90
|
+
row.cell word
|
91
|
+
end
|
92
|
+
end
|
93
|
+
else
|
94
|
+
row = table.row
|
95
|
+
line.chomp.split(',').each do |word|
|
89
96
|
row.cell word
|
90
97
|
end
|
91
98
|
end
|
92
|
-
else
|
93
|
-
row = table.row
|
94
|
-
line.chomp.split(',').each do |word|
|
95
|
-
row.cell word
|
96
|
-
end
|
97
99
|
end
|
98
100
|
end
|
99
101
|
end
|