origen_testers 0.4.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 +7 -0
- data/config/application.rb +140 -0
- data/config/commands.rb +73 -0
- data/config/development.rb +12 -0
- data/config/environment.rb +1 -0
- data/config/shared_commands.rb +47 -0
- data/config/users.rb +18 -0
- data/config/version.rb +8 -0
- data/lib/commands/build.rb +69 -0
- data/lib/origen_testers.rb +23 -0
- data/lib/origen_testers/api.rb +258 -0
- data/lib/origen_testers/basic_test_setups.rb +105 -0
- data/lib/origen_testers/callback_handlers.rb +58 -0
- data/lib/origen_testers/generator.rb +279 -0
- data/lib/origen_testers/generator/flow_control_api.rb +611 -0
- data/lib/origen_testers/generator/identity_map.rb +23 -0
- data/lib/origen_testers/generator/placeholder.rb +11 -0
- data/lib/origen_testers/generator/test_numberer.rb +23 -0
- data/lib/origen_testers/igxl_based_tester.rb +12 -0
- data/lib/origen_testers/igxl_based_tester/base.rb +641 -0
- data/lib/origen_testers/igxl_based_tester/base/flow.rb +171 -0
- data/lib/origen_testers/igxl_based_tester/base/flow_line.rb +322 -0
- data/lib/origen_testers/igxl_based_tester/base/generator.rb +217 -0
- data/lib/origen_testers/igxl_based_tester/base/patgroup.rb +109 -0
- data/lib/origen_testers/igxl_based_tester/base/patgroups.rb +38 -0
- data/lib/origen_testers/igxl_based_tester/base/patset.rb +68 -0
- data/lib/origen_testers/igxl_based_tester/base/patset_pattern.rb +56 -0
- data/lib/origen_testers/igxl_based_tester/base/patsets.rb +38 -0
- data/lib/origen_testers/igxl_based_tester/base/patsubr.rb +68 -0
- data/lib/origen_testers/igxl_based_tester/base/patsubr_pattern.rb +56 -0
- data/lib/origen_testers/igxl_based_tester/base/patsubrs.rb +38 -0
- data/lib/origen_testers/igxl_based_tester/base/test_instance.rb +326 -0
- data/lib/origen_testers/igxl_based_tester/base/test_instance_group.rb +58 -0
- data/lib/origen_testers/igxl_based_tester/base/test_instances.rb +179 -0
- data/lib/origen_testers/igxl_based_tester/files.rb +43 -0
- data/lib/origen_testers/igxl_based_tester/j750.rb +248 -0
- data/lib/origen_testers/igxl_based_tester/j750/flow.rb +10 -0
- data/lib/origen_testers/igxl_based_tester/j750/flow_line.rb +19 -0
- data/lib/origen_testers/igxl_based_tester/j750/generator.rb +19 -0
- data/lib/origen_testers/igxl_based_tester/j750/patgroup.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/j750/patgroups.rb +10 -0
- data/lib/origen_testers/igxl_based_tester/j750/patset.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/j750/patset_pattern.rb +18 -0
- data/lib/origen_testers/igxl_based_tester/j750/patsets.rb +10 -0
- data/lib/origen_testers/igxl_based_tester/j750/patsubr.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/j750/patsubr_pattern.rb +18 -0
- data/lib/origen_testers/igxl_based_tester/j750/patsubrs.rb +10 -0
- data/lib/origen_testers/igxl_based_tester/j750/templates/flow.txt.erb +9 -0
- data/lib/origen_testers/igxl_based_tester/j750/templates/instances.txt.erb +16 -0
- data/lib/origen_testers/igxl_based_tester/j750/templates/patgroups.txt.erb +8 -0
- data/lib/origen_testers/igxl_based_tester/j750/templates/patsets.txt.erb +10 -0
- data/lib/origen_testers/igxl_based_tester/j750/templates/patsubrs.txt.erb +10 -0
- data/lib/origen_testers/igxl_based_tester/j750/test_instance.rb +547 -0
- data/lib/origen_testers/igxl_based_tester/j750/test_instance_group.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/j750/test_instances.rb +10 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt.rb +34 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/flow.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/flow_line.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/generator.rb +19 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patgroup.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patgroups.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patset.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patset_pattern.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patsets.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patsubr.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patsubr_pattern.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patsubrs.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/test_instance.rb +515 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/test_instance_group.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/j750_hpt/test_instances.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/parser.rb +102 -0
- data/lib/origen_testers/igxl_based_tester/parser/ac_spec.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/parser/ac_specs.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/parser/dc_spec.rb +33 -0
- data/lib/origen_testers/igxl_based_tester/parser/dc_specs.rb +48 -0
- data/lib/origen_testers/igxl_based_tester/parser/descriptions.rb +339 -0
- data/lib/origen_testers/igxl_based_tester/parser/flow.rb +109 -0
- data/lib/origen_testers/igxl_based_tester/parser/flow_line.rb +203 -0
- data/lib/origen_testers/igxl_based_tester/parser/flows.rb +21 -0
- data/lib/origen_testers/igxl_based_tester/parser/pattern_set.rb +92 -0
- data/lib/origen_testers/igxl_based_tester/parser/pattern_sets.rb +31 -0
- data/lib/origen_testers/igxl_based_tester/parser/test_instance.rb +341 -0
- data/lib/origen_testers/igxl_based_tester/parser/test_instances.rb +24 -0
- data/lib/origen_testers/igxl_based_tester/parser/timeset.rb +13 -0
- data/lib/origen_testers/igxl_based_tester/parser/timesets.rb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex.rb +477 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/flow.rb +10 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/flow_line.rb +19 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/generator.rb +19 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/patgroup.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/patgroups.rb +10 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/patset.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/patset_pattern.rb +18 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/patsets.rb +10 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/patsubr.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/patsubr_pattern.rb +18 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/patsubrs.rb +10 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/flow.txt.erb +9 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/instances.txt.erb +16 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/patgroups.txt.erb +9 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/patsets.txt.erb +10 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/patsubrs.txt.erb +10 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/test_instance.rb +270 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/test_instance_group.rb +9 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/test_instances.rb +10 -0
- data/lib/origen_testers/interface.rb +183 -0
- data/lib/origen_testers/parser.rb +22 -0
- data/lib/origen_testers/parser/description_lookup.rb +62 -0
- data/lib/origen_testers/parser/searchable_array.rb +30 -0
- data/lib/origen_testers/parser/searchable_hash.rb +30 -0
- data/lib/origen_testers/pattern_compilers.rb +116 -0
- data/lib/origen_testers/pattern_compilers/assembler.rb +88 -0
- data/lib/origen_testers/pattern_compilers/job.rb +96 -0
- data/lib/origen_testers/pattern_compilers/ultraflex_pattern_compiler.rb +599 -0
- data/lib/origen_testers/program_generators.rb +55 -0
- data/lib/origen_testers/smartest_based_tester.rb +8 -0
- data/lib/origen_testers/smartest_based_tester/base.rb +411 -0
- data/lib/origen_testers/smartest_based_tester/base/flow.rb +188 -0
- data/lib/origen_testers/smartest_based_tester/base/flow_node.rb +476 -0
- data/lib/origen_testers/smartest_based_tester/base/generator.rb +123 -0
- data/lib/origen_testers/smartest_based_tester/base/pattern_compiler.rb +23 -0
- data/lib/origen_testers/smartest_based_tester/base/pattern_master.rb +47 -0
- data/lib/origen_testers/smartest_based_tester/base/test_method.rb +143 -0
- data/lib/origen_testers/smartest_based_tester/base/test_methods.rb +73 -0
- data/lib/origen_testers/smartest_based_tester/base/test_methods/ac_tml.rb +33 -0
- data/lib/origen_testers/smartest_based_tester/base/test_methods/base_tml.rb +38 -0
- data/lib/origen_testers/smartest_based_tester/base/test_methods/custom_tml.rb +19 -0
- data/lib/origen_testers/smartest_based_tester/base/test_methods/dc_tml.rb +147 -0
- data/lib/origen_testers/smartest_based_tester/base/test_methods/limits.rb +43 -0
- data/lib/origen_testers/smartest_based_tester/base/test_suite.rb +166 -0
- data/lib/origen_testers/smartest_based_tester/base/test_suites.rb +58 -0
- data/lib/origen_testers/smartest_based_tester/v93k.rb +8 -0
- data/lib/origen_testers/smartest_based_tester/v93k/builder.rb +89 -0
- data/lib/origen_testers/smartest_based_tester/v93k/builder/flow.rb +169 -0
- data/lib/origen_testers/smartest_based_tester/v93k/builder/pattern_master.rb +54 -0
- data/lib/origen_testers/smartest_based_tester/v93k/flow.rb +10 -0
- data/lib/origen_testers/smartest_based_tester/v93k/flow_node.rb +9 -0
- data/lib/origen_testers/smartest_based_tester/v93k/generator.rb +19 -0
- data/lib/origen_testers/smartest_based_tester/v93k/pattern_compiler.rb +10 -0
- data/lib/origen_testers/smartest_based_tester/v93k/pattern_master.rb +10 -0
- data/lib/origen_testers/smartest_based_tester/v93k/templates/template.aiv.erb +17 -0
- data/lib/origen_testers/smartest_based_tester/v93k/templates/template.flow.erb +201 -0
- data/lib/origen_testers/smartest_based_tester/v93k/templates/template.pmfl.erb +13 -0
- data/lib/origen_testers/smartest_based_tester/v93k/test_method.rb +9 -0
- data/lib/origen_testers/smartest_based_tester/v93k/test_methods.rb +9 -0
- data/lib/origen_testers/smartest_based_tester/v93k/test_suite.rb +9 -0
- data/lib/origen_testers/smartest_based_tester/v93k/test_suites.rb +9 -0
- data/lib/origen_testers/test/basic_interface.rb +17 -0
- data/lib/origen_testers/test/block.rb +21 -0
- data/lib/origen_testers/test/dut.rb +184 -0
- data/lib/origen_testers/test/dut2.rb +76 -0
- data/lib/origen_testers/test/j750_base_interface.rb +119 -0
- data/lib/origen_testers/test/j750_hpt_interface.rb +8 -0
- data/lib/origen_testers/test/j750_interface.rb +8 -0
- data/lib/origen_testers/test/nvm.rb +94 -0
- data/lib/origen_testers/test/ultraflex_interface.rb +110 -0
- data/lib/origen_testers/test/v93k_interface.rb +115 -0
- data/lib/origen_testers/timing.rb +362 -0
- data/lib/origen_testers/vector.rb +203 -0
- data/lib/origen_testers/vector_based_tester.rb +42 -0
- data/lib/origen_testers/vector_generator.rb +623 -0
- data/lib/origen_testers/vector_pipeline.rb +288 -0
- data/pattern/dc_instr.rb +7 -0
- data/pattern/delay.rb +7 -0
- data/pattern/mem_test.rb +8 -0
- data/pattern/multi_vector.rb +117 -0
- data/pattern/multi_vector_plus1.rb +125 -0
- data/pattern/nvm/j750/add_late_pins.rb +3 -0
- data/pattern/nvm/j750/iterator_postfix_test_x_bx.rb +8 -0
- data/pattern/nvm/j750/iterator_test_x_bx.rb +8 -0
- data/pattern/nvm/j750/j750_halt.rb +159 -0
- data/pattern/nvm/j750/j750_workout.rb +202 -0
- data/pattern/nvm/j750/timing.rb +73 -0
- data/pattern/nvm/v93k/v93k_workout.rb +136 -0
- data/pattern/read_write_reg.rb +58 -0
- data/pattern/reset.rb +4 -0
- data/pattern/subroutines.rb +38 -0
- data/program/_additional_erase.rb +7 -0
- data/program/_efa_resources.rb +7 -0
- data/program/_erase.rb +25 -0
- data/program/_erase_vfy.rb +5 -0
- data/program/_iv_resources.rb +10 -0
- data/program/basic_interface.rb +5 -0
- data/program/components/_prb2_main.rb +6 -0
- data/program/flow_control.rb +164 -0
- data/program/prb1.rb +226 -0
- data/program/prb1_resources.rb +28 -0
- data/program/prb2.rb +40 -0
- data/program/test.rb +20 -0
- data/templates/example.txt.erb +53 -0
- data/templates/j750/_vt_flow.txt.erb +8 -0
- data/templates/j750/_vt_instances.txt.erb +4 -0
- data/templates/j750/program_sheet.txt.erb +9 -0
- data/templates/manifest/v93k.yaml.erb +22 -0
- data/templates/web/index.md.erb +51 -0
- data/templates/web/layouts/_basic.html.erb +15 -0
- data/templates/web/partials/_navbar.html.erb +22 -0
- data/templates/web/release_notes.md.erb +5 -0
- metadata +332 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module IGXLBasedTester
|
|
3
|
+
class Base
|
|
4
|
+
class Flow
|
|
5
|
+
include OrigenTesters::Generator
|
|
6
|
+
include OrigenTesters::Generator::FlowControlAPI
|
|
7
|
+
|
|
8
|
+
OUTPUT_POSTFIX = 'flow'
|
|
9
|
+
|
|
10
|
+
def add(type, options = {})
|
|
11
|
+
ins = false
|
|
12
|
+
options = save_context(options) if [:test, :cz].include?(type)
|
|
13
|
+
branch_unless_enabled(options) do |options|
|
|
14
|
+
ins = track_relationships(options) do |options|
|
|
15
|
+
platform::FlowLine.new(type, options)
|
|
16
|
+
end
|
|
17
|
+
collection << ins unless Origen.interface.resources_mode?
|
|
18
|
+
if ins.test?
|
|
19
|
+
c = Origen.interface.consume_comments
|
|
20
|
+
unless Origen.interface.resources_mode?
|
|
21
|
+
Origen.interface.descriptions.add_for_test_usage(ins.parameter, Origen.interface.top_level_flow, c)
|
|
22
|
+
end
|
|
23
|
+
else
|
|
24
|
+
Origen.interface.discard_comments
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
ins
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def logprint(message, options = {})
|
|
31
|
+
message.gsub!(/\s/, '_')
|
|
32
|
+
add(:logprint, options.merge(parameter: message))
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def test(instance, options = {})
|
|
36
|
+
add(:test, options.merge(parameter: instance))
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def cz(instance, cz_setup, options = {})
|
|
40
|
+
add(:cz, options.merge(parameter: instance, cz_setup: cz_setup))
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def use_limit(name, options = {})
|
|
44
|
+
add(:use_limit, options)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def goto(label, options = {})
|
|
48
|
+
add(:goto, options.merge(parameter: label))
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def nop(options = {})
|
|
52
|
+
add(:nop, options.merge(parameter: nil))
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def set_device(options = {})
|
|
56
|
+
add(:set_device, options)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def set_error_bin(options = {})
|
|
60
|
+
add(:set_error_bin, options)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def enable_flow_word(word, options = {})
|
|
64
|
+
add(:enable_flow_word, options.merge(parameter: word))
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def disable_flow_word(word, options = {})
|
|
68
|
+
add(:disable_flow_word, options.merge(parameter: word))
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def flag_false(name, options = {})
|
|
72
|
+
add(:flag_false, options.merge(parameter: name))
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def flag_false_all(name, options = {})
|
|
76
|
+
add(:flag_false_all, options.merge(parameter: name))
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# def flag_true(name, options = {})
|
|
80
|
+
def flag_true(options = {})
|
|
81
|
+
add(:flag_true, options)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def flag_true_all(name, options = {})
|
|
85
|
+
add(:flag_true_all, options.merge(parameter: name))
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Generates 2 flow lines of flag-true to help set a single flag based on OR of 2 other flags
|
|
89
|
+
def or_flags(name1, name2, options = {})
|
|
90
|
+
options = {
|
|
91
|
+
condition: :fail, # condition to check for
|
|
92
|
+
flowname: false, # if flowname provided
|
|
93
|
+
}.merge(options)
|
|
94
|
+
|
|
95
|
+
case options[:condition]
|
|
96
|
+
when :fail
|
|
97
|
+
options[:condition] = 'FAILED'
|
|
98
|
+
when :pass
|
|
99
|
+
options[:condition] = 'PASSED'
|
|
100
|
+
else
|
|
101
|
+
options[:condition] = 'RAN'
|
|
102
|
+
end
|
|
103
|
+
id = options.delete(:id) # get original ID
|
|
104
|
+
|
|
105
|
+
# set parameter names
|
|
106
|
+
parameter = "#{id}"
|
|
107
|
+
parameter += "_#{options[:flowname]}" if options[:flowname]
|
|
108
|
+
parameter += "_#{options[:condition]}"
|
|
109
|
+
|
|
110
|
+
options[:id] = id
|
|
111
|
+
add(:flag_true_all, options.merge(parameter: parameter))
|
|
112
|
+
options.delete(:id)
|
|
113
|
+
add(:flag_false, options.merge(parameter: parameter, if_passed: name1, result: '', flag_pass: '', flag_fail: '')) # No ID
|
|
114
|
+
add(:flag_false, options.merge(parameter: parameter, if_passed: name2)) # No ID
|
|
115
|
+
nop
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# All tests generated will not run unless the given enable word is asserted.
|
|
119
|
+
#
|
|
120
|
+
# This is specially implemented for J750 since it does not have a native
|
|
121
|
+
# support for flow word not enabled.
|
|
122
|
+
# It will generate a goto branch around the tests contained with the block
|
|
123
|
+
# if the given flow word is enabled.
|
|
124
|
+
def unless_enable(word, options = {})
|
|
125
|
+
if options[:or]
|
|
126
|
+
yield
|
|
127
|
+
else
|
|
128
|
+
@unless_enable_block = word
|
|
129
|
+
options = options.merge(unless_enable: word)
|
|
130
|
+
branch_unless_enabled(options.merge(_force_unless_enable: true)) do
|
|
131
|
+
yield
|
|
132
|
+
end
|
|
133
|
+
@unless_enable_block = nil
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
alias_method :unless_enabled, :unless_enable
|
|
137
|
+
|
|
138
|
+
def start_flow_branch(identifier, options = {})
|
|
139
|
+
goto(identifier, options)
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def skip(identifier = nil, options = {})
|
|
143
|
+
identifier, options = nil, identifier if identifier.is_a?(Hash)
|
|
144
|
+
identifier = generate_unique_label(identifier)
|
|
145
|
+
goto(identifier, options)
|
|
146
|
+
yield
|
|
147
|
+
nop(label: identifier)
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
private
|
|
151
|
+
|
|
152
|
+
# If the test has an unless_enable then branch around it
|
|
153
|
+
def branch_unless_enabled(options)
|
|
154
|
+
word = options.delete(:unless_enable) || options.delete(:unless_enabled)
|
|
155
|
+
if word && (word != @unless_enable_block || options.delete(:_force_unless_enable))
|
|
156
|
+
# Not sure if this is really required, but duplicating these hashes here to ensure
|
|
157
|
+
# that all other flow context keys are preserved and applied to the branch lines
|
|
158
|
+
orig_options = options.merge({})
|
|
159
|
+
close_options = options.merge({})
|
|
160
|
+
label = generate_unique_label
|
|
161
|
+
goto(label, options.merge(if_enable: word))
|
|
162
|
+
yield orig_options
|
|
163
|
+
nop(close_options.merge(label: label))
|
|
164
|
+
else
|
|
165
|
+
yield options
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
end
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module IGXLBasedTester
|
|
3
|
+
class Base
|
|
4
|
+
class FlowLine
|
|
5
|
+
attr_accessor :type, :id, :cz_setup # cz_setup is a virtual attrib since it is not part of the regular flow line
|
|
6
|
+
# cz_setup combine with instance name when characterize opcode is used
|
|
7
|
+
|
|
8
|
+
# Map any aliases to the official names here, multiple aliases for a given attribute
|
|
9
|
+
# are allowed
|
|
10
|
+
ALIASES = {
|
|
11
|
+
bin: :bin_fail,
|
|
12
|
+
softbin: :sort_fail,
|
|
13
|
+
soft_bin: :sort_fail,
|
|
14
|
+
sbin: :sort_fail,
|
|
15
|
+
name: :tname,
|
|
16
|
+
number: :tnum,
|
|
17
|
+
if_enable: :enable,
|
|
18
|
+
if_enabled: :enable,
|
|
19
|
+
enabled: :enable,
|
|
20
|
+
hi_limit: :hilim,
|
|
21
|
+
hi: :hilim,
|
|
22
|
+
lo_limit: :lolim,
|
|
23
|
+
lo: :lolim,
|
|
24
|
+
# Aliases can also be used to set defaults on multiple attributes like this,
|
|
25
|
+
# use :value to refer to the value passed in to the given alias
|
|
26
|
+
flag_false: { device_condition: 'flag-false',
|
|
27
|
+
device_name: :value
|
|
28
|
+
},
|
|
29
|
+
flag_true: { device_condition: 'flag-true',
|
|
30
|
+
device_name: :value
|
|
31
|
+
},
|
|
32
|
+
flag_false_any: { group_specifier: 'any-active',
|
|
33
|
+
group_condition: 'flag-false',
|
|
34
|
+
group_name: :value
|
|
35
|
+
},
|
|
36
|
+
flag_false_all: { group_specifier: 'all-active',
|
|
37
|
+
group_condition: 'flag-false',
|
|
38
|
+
group_name: :value
|
|
39
|
+
},
|
|
40
|
+
flag_true_any: { group_specifier: 'any-active',
|
|
41
|
+
group_condition: 'flag-true',
|
|
42
|
+
group_name: :value
|
|
43
|
+
},
|
|
44
|
+
flag_true_all: { group_specifier: 'all-active',
|
|
45
|
+
group_condition: 'flag-true',
|
|
46
|
+
group_name: :value
|
|
47
|
+
},
|
|
48
|
+
flag_clear: { device_condition: 'flag-clear',
|
|
49
|
+
device_name: :value
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
# Assign attribute defaults here, generally this should match whatever defaults
|
|
54
|
+
# Teradyne has set whenever you create a new test instance, etc.
|
|
55
|
+
DEFAULTS = {
|
|
56
|
+
test: {
|
|
57
|
+
opcode: 'Test',
|
|
58
|
+
result: 'Fail'
|
|
59
|
+
},
|
|
60
|
+
cz: {
|
|
61
|
+
opcode: 'characterize',
|
|
62
|
+
result: 'None'
|
|
63
|
+
},
|
|
64
|
+
goto: {
|
|
65
|
+
opcode: 'goto'
|
|
66
|
+
},
|
|
67
|
+
nop: {
|
|
68
|
+
opcode: 'nop'
|
|
69
|
+
},
|
|
70
|
+
set_device: {
|
|
71
|
+
opcode: 'set-device'
|
|
72
|
+
},
|
|
73
|
+
set_error_bin: {
|
|
74
|
+
opcode: 'set-error-bin'
|
|
75
|
+
},
|
|
76
|
+
enable_flow_word: {
|
|
77
|
+
opcode: 'enable-flow-word'
|
|
78
|
+
},
|
|
79
|
+
disable_flow_word: {
|
|
80
|
+
opcode: 'disable-flow-word'
|
|
81
|
+
},
|
|
82
|
+
logprint: {
|
|
83
|
+
opcode: 'logprint'
|
|
84
|
+
},
|
|
85
|
+
use_limit: {
|
|
86
|
+
opcode: 'Use-Limit',
|
|
87
|
+
result: 'Fail'
|
|
88
|
+
},
|
|
89
|
+
flag_false: {
|
|
90
|
+
opcode: 'flag-false'
|
|
91
|
+
},
|
|
92
|
+
flag_false_all: {
|
|
93
|
+
opcode: 'flag-false-all'
|
|
94
|
+
},
|
|
95
|
+
flag_true: {
|
|
96
|
+
opcode: 'flag-true'
|
|
97
|
+
},
|
|
98
|
+
flag_true_all: {
|
|
99
|
+
opcode: 'flag-true-all'
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
def self.define
|
|
104
|
+
# Generate accessors for all attributes and their aliases
|
|
105
|
+
self::TESTER_FLOWLINE_ATTRS.each do |attr|
|
|
106
|
+
writer = "#{attr}=".to_sym
|
|
107
|
+
reader = attr.to_sym
|
|
108
|
+
attr_reader attr.to_sym unless method_defined? reader
|
|
109
|
+
attr_writer attr.to_sym unless method_defined? writer
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
ALIASES.each do |_alias, val|
|
|
113
|
+
if val.is_a? Hash
|
|
114
|
+
if ((self::TESTER_FLOWLINE_ATTRS.map(&:to_sym)) & val.keys) == val.keys
|
|
115
|
+
writer = "#{_alias}=".to_sym
|
|
116
|
+
unless method_defined? writer
|
|
117
|
+
define_method("#{_alias}=") do |v|
|
|
118
|
+
val.each do |k, _v|
|
|
119
|
+
myval = _v == :value ? v : _v
|
|
120
|
+
send("#{k}=", myval)
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
else
|
|
126
|
+
|
|
127
|
+
if self::TESTER_FLOWLINE_ATTRS.include? "#{val}"
|
|
128
|
+
writer = "#{_alias}=".to_sym
|
|
129
|
+
reader = _alias.to_sym
|
|
130
|
+
unless method_defined? writer
|
|
131
|
+
define_method("#{_alias}=") do |v|
|
|
132
|
+
send("#{val}=", v)
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
unless method_defined? reader
|
|
136
|
+
define_method("#{_alias}") do
|
|
137
|
+
send(val)
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def initialize(type, attrs = {})
|
|
146
|
+
@ignore_missing_instance = attrs.delete(:instance_not_available)
|
|
147
|
+
self.cz_setup = attrs.delete(:cz_setup)
|
|
148
|
+
@type = type
|
|
149
|
+
# Set the defaults
|
|
150
|
+
DEFAULTS[@type.to_sym].each do |k, v|
|
|
151
|
+
send("#{k}=", v) if self.respond_to?("#{k}=")
|
|
152
|
+
end
|
|
153
|
+
# Then the values that have been supplied
|
|
154
|
+
attrs.each do |k, v|
|
|
155
|
+
send("#{k}=", v) if self.respond_to?("#{k}=")
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def parameter=(value)
|
|
160
|
+
if (@type == :test || @test == :cz) && !@ignore_missing_instance
|
|
161
|
+
if value.is_a?(String) || value.is_a?(Symbol)
|
|
162
|
+
fail "You must supply the actual test instance object for #{value} when adding it to the flow"
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
@parameter = value
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def parameter
|
|
169
|
+
# When referring to the test instance take the opportunity to refresh the current
|
|
170
|
+
# version of the test instance
|
|
171
|
+
@parameter = Origen.interface.identity_map.current_version_of(@parameter)
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
# Returns the fully formatted flow line for insertion into a flow sheet
|
|
175
|
+
def to_s
|
|
176
|
+
l = "\t"
|
|
177
|
+
self.class::TESTER_FLOWLINE_ATTRS.each do |attr|
|
|
178
|
+
if attr == 'parameter'
|
|
179
|
+
ins = parameter
|
|
180
|
+
if ins.respond_to?(:name)
|
|
181
|
+
l += "#{ins.name}"
|
|
182
|
+
else
|
|
183
|
+
l += "#{ins}"
|
|
184
|
+
end
|
|
185
|
+
if type == :cz && cz_setup
|
|
186
|
+
l += " #{cz_setup}\t"
|
|
187
|
+
else
|
|
188
|
+
l += "\t"
|
|
189
|
+
end
|
|
190
|
+
else
|
|
191
|
+
l += "#{send(attr)}\t"
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
"#{l}"
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
def job
|
|
198
|
+
if !if_jobs.empty? && !unless_jobs.empty?
|
|
199
|
+
fail "Both if and unless jobs have been defined for test: #{parameter}"
|
|
200
|
+
elsif !if_jobs.empty?
|
|
201
|
+
if_jobs.join(',')
|
|
202
|
+
elsif !unless_jobs.empty?
|
|
203
|
+
unless_jobs.map { |j| "!#{j}" }.join(',')
|
|
204
|
+
else
|
|
205
|
+
''
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
alias_method :jobs, :job
|
|
209
|
+
|
|
210
|
+
def unless_enable=(*args)
|
|
211
|
+
end
|
|
212
|
+
alias_method :unless_enabled=, :unless_enable=
|
|
213
|
+
|
|
214
|
+
def if_jobs
|
|
215
|
+
@if_jobs ||= []
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
def unless_jobs
|
|
219
|
+
@unless_jobs ||= []
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
def if_job=(jobs)
|
|
223
|
+
[jobs].flatten.compact.each do |job|
|
|
224
|
+
job = job.to_s.upcase
|
|
225
|
+
if job =~ /!/
|
|
226
|
+
self.unless_job = job
|
|
227
|
+
else
|
|
228
|
+
if_jobs << job unless if_jobs.include?(job)
|
|
229
|
+
end
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
alias_method :if_jobs=, :if_job=
|
|
233
|
+
alias_method :add_if_jobs, :if_job=
|
|
234
|
+
alias_method :add_if_job, :if_job=
|
|
235
|
+
|
|
236
|
+
def unless_job=(jobs)
|
|
237
|
+
[jobs].flatten.compact.each do |job|
|
|
238
|
+
job = job.to_s.upcase
|
|
239
|
+
job.gsub!('!', '')
|
|
240
|
+
unless_jobs << job unless unless_jobs.include?(job)
|
|
241
|
+
end
|
|
242
|
+
end
|
|
243
|
+
alias_method :unless_jobs=, :unless_job=
|
|
244
|
+
alias_method :add_unless_jobs, :unless_job=
|
|
245
|
+
alias_method :add_unless_job, :unless_job=
|
|
246
|
+
|
|
247
|
+
def continue_on_fail
|
|
248
|
+
self.result = 'None'
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
def continue_pass
|
|
252
|
+
self.result = 'Pass'
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
def debug_assume_pass
|
|
256
|
+
self.debug_assume = 'Pass'
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
def debug_assume_fail
|
|
260
|
+
self.debug_assume = 'Fail'
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
# def debug_sites
|
|
264
|
+
# self.debug_sites = "All"
|
|
265
|
+
# end
|
|
266
|
+
|
|
267
|
+
def set_flag_on_fail
|
|
268
|
+
self.flag_fail = "#{id}_FAILED"
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
def set_flag_on_pass
|
|
272
|
+
self.flag_pass = "#{id}_PASSED"
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
def set_flag_on_ran
|
|
276
|
+
self.flag_pass = "#{id}_RAN"
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
def run_if_any_passed(parent)
|
|
280
|
+
parent.continue_on_fail
|
|
281
|
+
self.flag_true_any = parent.set_flag_on_pass
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
def run_if_all_passed(parent)
|
|
285
|
+
parent.continue_on_fail
|
|
286
|
+
self.flag_true_all = parent.set_flag_on_pass
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
def run_if_any_failed(parent)
|
|
290
|
+
parent.continue_on_fail
|
|
291
|
+
self.flag_true_any = parent.set_flag_on_fail
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
def run_if_all_failed(parent)
|
|
295
|
+
parent.continue_on_fail
|
|
296
|
+
self.flag_true_all = parent.set_flag_on_fail
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
def run_if_all_(args)
|
|
300
|
+
# code
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
def id
|
|
304
|
+
@id || "#{parameter}_#{unique_counter}"
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
def unique_counter
|
|
308
|
+
@unique_counter ||= self.class.unique_counter
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
def self.unique_counter
|
|
312
|
+
@ix ||= -1
|
|
313
|
+
@ix += 1
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
def test?
|
|
317
|
+
@type == :test
|
|
318
|
+
end
|
|
319
|
+
end
|
|
320
|
+
end
|
|
321
|
+
end
|
|
322
|
+
end
|