origen_testers 0.31.0 → 0.40.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -0,0 +1,14 @@
|
|
1
|
+
module OrigenTesters
|
2
|
+
module SmartestBasedTester
|
3
|
+
class V93K_SMT8
|
4
|
+
require 'origen_testers/smartest_based_tester/base/limits_file'
|
5
|
+
class LimitsFile < Base::LimitsFile
|
6
|
+
TEMPLATE = "#{Origen.root!}/lib/origen_testers/smartest_based_tester/v93k_smt8/templates/limits.csv.erb"
|
7
|
+
|
8
|
+
def fully_formatted_filename
|
9
|
+
"Main.#{@filename}_Tests.csv"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,148 @@
|
|
1
|
+
require 'rodf'
|
2
|
+
module OrigenTesters
|
3
|
+
module SmartestBasedTester
|
4
|
+
class V93K_SMT8
|
5
|
+
# Responsible for creating a limits workbook for each program generation run
|
6
|
+
# Each limits file will generate a sheet within this workbook
|
7
|
+
class LimitsWorkbook
|
8
|
+
include OrigenTesters::Generator
|
9
|
+
|
10
|
+
def initialize(options = {})
|
11
|
+
@softbins = {}
|
12
|
+
@bins = {}
|
13
|
+
end
|
14
|
+
|
15
|
+
def add_softbin(number, options = {})
|
16
|
+
options = {
|
17
|
+
name: nil,
|
18
|
+
bin: nil,
|
19
|
+
result: 'FAIL',
|
20
|
+
color: 'RED',
|
21
|
+
priority: 2
|
22
|
+
}.merge(options)
|
23
|
+
attrs = @softbins[number] || {}
|
24
|
+
|
25
|
+
attrs[:name] = options[:name] if options[:name]
|
26
|
+
attrs[:bin] = options[:bin] if options[:bin]
|
27
|
+
if !attrs[:result] || (options[:result] && options[:result] != 'FAIL')
|
28
|
+
attrs[:result] = options[:result]
|
29
|
+
end
|
30
|
+
if !attrs[:color] || (options[:color] && options[:color] != 'RED')
|
31
|
+
attrs[:color] = options[:color]
|
32
|
+
end
|
33
|
+
if !attrs[:priority] || (options[:priority] && options[:priority] != 2)
|
34
|
+
attrs[:priority] = options[:priority]
|
35
|
+
end
|
36
|
+
|
37
|
+
@softbins[number] = attrs
|
38
|
+
end
|
39
|
+
|
40
|
+
def add_bin(number, options = {})
|
41
|
+
options = {
|
42
|
+
name: nil,
|
43
|
+
result: 'FAIL'
|
44
|
+
}.merge(options)
|
45
|
+
|
46
|
+
attrs = @bins[number] || {}
|
47
|
+
|
48
|
+
attrs[:name] = options[:name] if options[:name]
|
49
|
+
if !attrs[:result] || (options[:result] && options[:result] != 'FAIL')
|
50
|
+
attrs[:result] = options[:result]
|
51
|
+
end
|
52
|
+
|
53
|
+
@bins[number] = attrs
|
54
|
+
end
|
55
|
+
|
56
|
+
def fully_formatted_filename
|
57
|
+
'limits.ods'
|
58
|
+
end
|
59
|
+
|
60
|
+
def subdirectory
|
61
|
+
"#{tester.package_namespace}/common"
|
62
|
+
end
|
63
|
+
|
64
|
+
def write_to_file(options = {})
|
65
|
+
Origen.log.info "Writing... #{output_file}"
|
66
|
+
spreadsheet = RODF::Spreadsheet.new
|
67
|
+
Origen.interface.flow_sheets.each do |name, flow|
|
68
|
+
if flow.limits_file
|
69
|
+
limits_name = flow.limits_file.filename.sub('.csv', '')
|
70
|
+
table = spreadsheet.table limits_name
|
71
|
+
flow.limits_file.output_file.readlines.each_with_index do |line, i|
|
72
|
+
# Need to fix the first row, SMT8 won't allow the Low/High limits cells not to be merged
|
73
|
+
if i == 0
|
74
|
+
row = table.row
|
75
|
+
x = nil
|
76
|
+
line.chomp.split(',').each do |word|
|
77
|
+
if word == 'Low Limit'
|
78
|
+
x = 0
|
79
|
+
elsif word == 'High Limit'
|
80
|
+
row.cell 'Low Limit', span: x + 1
|
81
|
+
x = 0
|
82
|
+
elsif word == 'Unit'
|
83
|
+
row.cell 'High Limit', span: x + 1
|
84
|
+
row.cell word
|
85
|
+
x = nil
|
86
|
+
elsif x
|
87
|
+
x += 1
|
88
|
+
else
|
89
|
+
row.cell word
|
90
|
+
end
|
91
|
+
end
|
92
|
+
else
|
93
|
+
row = table.row
|
94
|
+
line.chomp.split(',').each do |word|
|
95
|
+
row.cell word
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
if tester.separate_bins_file
|
102
|
+
bins_file = output_file.sub('.ods', '_bins.ods')
|
103
|
+
Origen.log.info "Writing... #{bins_file}"
|
104
|
+
bins_ss = RODF::Spreadsheet.new
|
105
|
+
add_bin_sheets(bins_ss)
|
106
|
+
bins_ss.write_to(bins_file)
|
107
|
+
else
|
108
|
+
add_bin_sheets(spreadsheet)
|
109
|
+
end
|
110
|
+
spreadsheet.write_to(output_file)
|
111
|
+
end
|
112
|
+
|
113
|
+
def add_bin_sheets(spreadsheet)
|
114
|
+
table = spreadsheet.table 'Software_Bins'
|
115
|
+
row = table.row
|
116
|
+
row.cell 'Software Bin'
|
117
|
+
row.cell 'Software Bin Name'
|
118
|
+
row.cell 'Hardware Bin'
|
119
|
+
row.cell 'Result'
|
120
|
+
row.cell 'Color'
|
121
|
+
row.cell 'Priority'
|
122
|
+
@softbins.each do |sbin, attrs|
|
123
|
+
row = table.row
|
124
|
+
row.cell sbin
|
125
|
+
row.cell attrs[:name]
|
126
|
+
row.cell attrs[:bin]
|
127
|
+
row.cell attrs[:result]
|
128
|
+
row.cell attrs[:color]
|
129
|
+
row.cell attrs[:priority]
|
130
|
+
end
|
131
|
+
|
132
|
+
# Write out the bin table
|
133
|
+
table = spreadsheet.table 'Hardware_Bins'
|
134
|
+
row = table.row
|
135
|
+
row.cell 'Hardware Bin'
|
136
|
+
row.cell 'Hardware Bin Name'
|
137
|
+
row.cell 'Result'
|
138
|
+
@bins.each do |bin, attrs|
|
139
|
+
row = table.row
|
140
|
+
row.cell bin
|
141
|
+
row.cell attrs[:name]
|
142
|
+
row.cell attrs[:result]
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
flow <%= flow_name %> {
|
2
|
+
% input_variables.each do |var|
|
3
|
+
% if var.is_a?(Array)
|
4
|
+
in <%= var[0].to_s %> = <%= var[1].is_a?(String) || var[1].is_a?(Symbol) ? "\"#{var[1]}\"" : var[1] %>;
|
5
|
+
% else
|
6
|
+
in <%= var.to_s %> = -1;
|
7
|
+
% end
|
8
|
+
% end
|
9
|
+
|
10
|
+
% output_variables.each do |var|
|
11
|
+
% if var.is_a?(Array)
|
12
|
+
out <%= var[0].to_s %> = <%= var[1].is_a?(String) || var[1].is_a?(Symbol) ? "\"#{var[1]}\"" : var[1] %>;
|
13
|
+
% else
|
14
|
+
out <%= var.to_s %> = -1;
|
15
|
+
% end
|
16
|
+
% end
|
17
|
+
|
18
|
+
setup {
|
19
|
+
% test_suites.sorted_collection.each do |suite|
|
20
|
+
% suite.lines.each do |line|
|
21
|
+
<%= line %>
|
22
|
+
% end
|
23
|
+
|
24
|
+
% end
|
25
|
+
% sub_flows.each do |name, path|
|
26
|
+
flow <%= name %> calls <%= path %> { }
|
27
|
+
% end
|
28
|
+
}
|
29
|
+
|
30
|
+
execute {
|
31
|
+
% flow_header.each do |line|
|
32
|
+
<%= line %>
|
33
|
+
% end
|
34
|
+
% lines.each do |line|
|
35
|
+
<%= line %>
|
36
|
+
% end
|
37
|
+
% flow_footer.each do |line|
|
38
|
+
<%= line %>
|
39
|
+
% end
|
40
|
+
}
|
41
|
+
}
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module OrigenTesters
|
2
|
+
module SmartestBasedTester
|
3
|
+
class V93K_SMT8
|
4
|
+
require 'origen_testers/smartest_based_tester/base/test_suite'
|
5
|
+
class TestSuite < Base::TestSuite
|
6
|
+
ATTRS =
|
7
|
+
%w(
|
8
|
+
name
|
9
|
+
comment
|
10
|
+
|
11
|
+
test_method
|
12
|
+
|
13
|
+
pattern
|
14
|
+
specification
|
15
|
+
)
|
16
|
+
|
17
|
+
ALIASES = {
|
18
|
+
spec: :specification,
|
19
|
+
test_function: :test_method
|
20
|
+
}
|
21
|
+
|
22
|
+
DEFAULTS = {
|
23
|
+
}
|
24
|
+
|
25
|
+
# Generate accessors for all attributes and their aliases
|
26
|
+
ATTRS.each do |attr|
|
27
|
+
if attr == 'name' || attr == 'pattern'
|
28
|
+
attr_reader attr.to_sym
|
29
|
+
else
|
30
|
+
attr_accessor attr.to_sym
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# Define the aliases
|
35
|
+
ALIASES.each do |_alias, val|
|
36
|
+
define_method("#{_alias}=") do |v|
|
37
|
+
send("#{val}=", v)
|
38
|
+
end
|
39
|
+
define_method("#{_alias}") do
|
40
|
+
send(val)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def lines
|
45
|
+
l = []
|
46
|
+
l << "suite #{name} calls #{test_method.klass} {"
|
47
|
+
if pattern && !pattern.to_s.empty?
|
48
|
+
l << " measurement.pattern = setupRef(#{tester.package_namespace}.patterns.#{pattern});"
|
49
|
+
end
|
50
|
+
if specification && !specification.to_s.empty?
|
51
|
+
l << " measurement.specification = setupRef(#{tester.package_namespace}.specs.#{specification});"
|
52
|
+
end
|
53
|
+
test_method.sorted_parameters.each do |param|
|
54
|
+
name = param[0]
|
55
|
+
unless name.is_a?(String)
|
56
|
+
name = name.to_s[0] == '_' ? name.to_s.camelize(:upper) : name.to_s.camelize(:lower)
|
57
|
+
end
|
58
|
+
l << " #{name} = #{wrap_if_string(test_method.format(param[0]))};"
|
59
|
+
end
|
60
|
+
l << '}'
|
61
|
+
l
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -252,6 +252,10 @@ module OrigenTesters
|
|
252
252
|
Origen.log.warning "Call to match loop on pin #{pin.id} is not supported by the STIL generator and has been ignored"
|
253
253
|
end
|
254
254
|
|
255
|
+
def match_block(timeout_in_cycles, options = {}, &block)
|
256
|
+
Origen.log.warning 'Call to match loop block is not supported by the STIL generator and has been ignored'
|
257
|
+
end
|
258
|
+
|
255
259
|
# Add a loop to the pattern.
|
256
260
|
#
|
257
261
|
# Pass in the number of times to execute it, all vectors
|
@@ -3,9 +3,13 @@ module OrigenTesters
|
|
3
3
|
class Interface
|
4
4
|
include OrigenTesters::ProgramGenerators
|
5
5
|
|
6
|
+
attr_accessor :include_additional_prb2_test
|
7
|
+
attr_reader :environment
|
8
|
+
|
6
9
|
# Options passed to Flow.create and Library.create will be passed in here, use as
|
7
10
|
# desired to configure your interface
|
8
11
|
def initialize(options = {})
|
12
|
+
@environment = options[:environment]
|
9
13
|
end
|
10
14
|
|
11
15
|
# Test that the block form of flow control methods like this can
|
@@ -62,7 +66,12 @@ module OrigenTesters
|
|
62
66
|
tm = test_methods.ac_tml.ac_test.functional_test
|
63
67
|
ts = test_suites.run(name, options)
|
64
68
|
ts.test_method = tm
|
65
|
-
|
69
|
+
if tester.smt8?
|
70
|
+
ts.spec = options.delete(:pin_levels) if options[:pin_levels]
|
71
|
+
ts.spec ||= 'specs.Nominal'
|
72
|
+
else
|
73
|
+
ts.levels = options.delete(:pin_levels) if options[:pin_levels]
|
74
|
+
end
|
66
75
|
if block
|
67
76
|
ts.pattern = "#{name}_b#{i}"
|
68
77
|
else
|
@@ -241,7 +250,12 @@ module OrigenTesters
|
|
241
250
|
tm = test_methods.dc_tml.dc_test.general_pmu
|
242
251
|
ts = test_suites.run(name, options)
|
243
252
|
ts.test_method = tm
|
244
|
-
|
253
|
+
if tester.smt8?
|
254
|
+
ts.spec = options.delete(:pin_levels) if options[:pin_levels]
|
255
|
+
ts.spec ||= 'specs.Nominal'
|
256
|
+
else
|
257
|
+
ts.levels = options.delete(:pin_levels) if options[:pin_levels]
|
258
|
+
end
|
245
259
|
ts.lo_limit = options[:lo_limit] if options[:lo_limit]
|
246
260
|
ts.hi_limit = options[:hi_limit] if options[:hi_limit]
|
247
261
|
ts.pattern = name.to_s
|
@@ -280,6 +280,7 @@ module OrigenTesters
|
|
280
280
|
# Vector objects (vector lines)
|
281
281
|
#
|
282
282
|
def format(vector_array, section)
|
283
|
+
tester_writing_pattern = respond_to?(:open_and_write_pattern)
|
283
284
|
# Go through vector_array and print out both
|
284
285
|
# vectors and non-vectors to pattern (via 'yield line')
|
285
286
|
vector_array.each do |vec|
|
@@ -298,14 +299,14 @@ module OrigenTesters
|
|
298
299
|
end
|
299
300
|
pipeline.flush do |vector|
|
300
301
|
expand_vector(vector) do |line|
|
301
|
-
yield line
|
302
|
+
yield line unless tester_writing_pattern
|
302
303
|
end
|
303
304
|
end
|
304
305
|
end
|
305
306
|
# now flush buffer if there is still a vector
|
306
307
|
pipeline.empty(min_vectors: section == :footer ? @min_pattern_vectors : nil) do |vector|
|
307
308
|
expand_vector(vector) do |line|
|
308
|
-
yield line
|
309
|
+
yield line unless tester_writing_pattern
|
309
310
|
end
|
310
311
|
end
|
311
312
|
end
|
@@ -335,7 +336,7 @@ module OrigenTesters
|
|
335
336
|
@dont_compress = val
|
336
337
|
end
|
337
338
|
|
338
|
-
# expands (
|
339
|
+
# expands (un-compresses to pattern) vector if desired or leaves it as is
|
339
340
|
# allows for tracking and formatting of vector
|
340
341
|
# if comment then return without modification
|
341
342
|
def expand_vector(vec)
|
@@ -349,10 +350,14 @@ module OrigenTesters
|
|
349
350
|
yield track_and_format_vector(vec)
|
350
351
|
end
|
351
352
|
else
|
352
|
-
yield vec # Return comments without modification
|
353
|
+
yield track_and_format_comment(vec) # Return comments without modification
|
353
354
|
end
|
354
355
|
end
|
355
356
|
|
357
|
+
def track_and_format_comment(comment)
|
358
|
+
comment
|
359
|
+
end
|
360
|
+
|
356
361
|
# Update tracking info (stats object) and allow for
|
357
362
|
# any additional formatting via format_vector
|
358
363
|
# method if overridden
|
@@ -72,6 +72,13 @@ Pattern.create do
|
|
72
72
|
:pin2 => $nvm.pin(:fail), :state2 => :low)
|
73
73
|
$nvm.pin(:fail).assert(0)
|
74
74
|
|
75
|
+
ss "Test a block match loop"
|
76
|
+
tester.wait match: true, time_in_us: 5000 do
|
77
|
+
$nvm.pin(:done).assert(1)
|
78
|
+
$nvm.pin(:fail).assert(1)
|
79
|
+
1.cycle
|
80
|
+
end
|
81
|
+
|
75
82
|
ss "Test looping, these vectors should be executed once"
|
76
83
|
$tester.loop_vector("test_loop_1", 1) do
|
77
84
|
$nvm.pins(:porta).drive(0xAA)
|
data/program/_erase_vfy.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
Flow.create do |options|
|
2
2
|
|
3
|
-
|
3
|
+
# Added set-flag to test that manually set flags are brought up to the top-level for SMT8
|
4
|
+
func :margin_read1_all1, number: options[:number], on_fail: { set_flag: :ers_vfy_failed }
|
4
5
|
|
5
6
|
end
|
@@ -1,6 +1,10 @@
|
|
1
1
|
Flow.create do |options|
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
if environment == :probe
|
4
|
+
func :pgm_ckbd, number: options[:number] + 10
|
5
|
+
func :mrd_ckbd, number: options[:number] + 20
|
6
|
+
end
|
7
|
+
|
8
|
+
self.include_additional_prb2_test = true
|
5
9
|
|
6
10
|
end
|
data/program/flow_control.rb
CHANGED
@@ -434,13 +434,13 @@ Flow.create interface: 'OrigenTesters::Test::Interface', flow_name: "Flow Contro
|
|
434
434
|
func :test2, unless_flag: :$Alarm, number: 51950
|
435
435
|
|
436
436
|
# The is auto-generated comment from hashtag
|
437
|
-
func_with_comment :test1
|
437
|
+
func_with_comment :test1, number: 51952
|
438
438
|
|
439
439
|
cc 'The is auto-generated comment from cc'
|
440
|
-
func_with_comment :test1
|
440
|
+
func_with_comment :test1, number: 51954
|
441
441
|
|
442
442
|
log 'Use bin_attrs to set not_over_on'
|
443
|
-
func :test1n, number:
|
443
|
+
func :test1n, number: 51956, bin: 12, bin_attrs: { not_over_on: true }
|
444
444
|
|
445
445
|
end
|
446
446
|
|