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,109 @@
|
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
class IGXLBasedTester
|
|
3
|
+
class Parser
|
|
4
|
+
class Flow < ::OrigenTesters::Parser::SearchableArray
|
|
5
|
+
require 'pathname'
|
|
6
|
+
|
|
7
|
+
attr_accessor :parser, :file
|
|
8
|
+
|
|
9
|
+
def initialize(file, options = {}) # :nodoc:
|
|
10
|
+
@parser = options[:parser]
|
|
11
|
+
@file = Pathname.new(file)
|
|
12
|
+
parse
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def description
|
|
16
|
+
@parser.descriptions.flow_summary(file: file)
|
|
17
|
+
end
|
|
18
|
+
alias_method :summary, :description
|
|
19
|
+
|
|
20
|
+
# Returns the filename of the sheet that contained the current flow
|
|
21
|
+
def filename
|
|
22
|
+
@file.basename.to_s
|
|
23
|
+
end
|
|
24
|
+
alias_method :name, :filename
|
|
25
|
+
|
|
26
|
+
# Returns all flow lines that are tests, optionally supply a context to
|
|
27
|
+
# have only the test that will execute in that context returned
|
|
28
|
+
#
|
|
29
|
+
# $tester.flow.first.tests.size
|
|
30
|
+
# => 20
|
|
31
|
+
# $tester.flow.first.tests(:job => "P1").size
|
|
32
|
+
# => 10
|
|
33
|
+
# $tester.flow.first.tests(:job => "P1", :enable => "data_collection").size
|
|
34
|
+
# => 15
|
|
35
|
+
def tests(context = {})
|
|
36
|
+
run_context(context)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Returns all tests in the current flow, regardless of context
|
|
40
|
+
def all_tests
|
|
41
|
+
where(opcode: %w(Test characterize), exact: true)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def run_context(context) # :nodoc:
|
|
45
|
+
capture = true
|
|
46
|
+
waiting_for_label = false
|
|
47
|
+
select do |line|
|
|
48
|
+
if capture
|
|
49
|
+
if !waiting_for_label || waiting_for_label == line.label
|
|
50
|
+
waiting_for_label = false
|
|
51
|
+
case line.type
|
|
52
|
+
when 'Test', 'characterize'
|
|
53
|
+
line.executes_under_context?(context)
|
|
54
|
+
when 'set-device', 'stop'
|
|
55
|
+
capture = false if line.executes_under_context?(context)
|
|
56
|
+
false
|
|
57
|
+
when 'enable-flow-word'
|
|
58
|
+
if line.executes_under_context?(context)
|
|
59
|
+
context[:enable] = [context[:enable]].flatten
|
|
60
|
+
context[:enable] << line.parameter
|
|
61
|
+
end
|
|
62
|
+
false
|
|
63
|
+
when 'flag-true'
|
|
64
|
+
if line.executes_under_context?(context)
|
|
65
|
+
context[:true_flags] = [context[:true_flags]].flatten
|
|
66
|
+
context[:true_flags] << line.parameter
|
|
67
|
+
end
|
|
68
|
+
false
|
|
69
|
+
when 'flag-false'
|
|
70
|
+
if line.executes_under_context?(context)
|
|
71
|
+
context[:false_flags] = [context[:false_flags]].flatten
|
|
72
|
+
context[:false_flags] << line.parameter
|
|
73
|
+
end
|
|
74
|
+
false
|
|
75
|
+
when 'disable-flow-word'
|
|
76
|
+
if line.executes_under_context?(context)
|
|
77
|
+
context[:enable] = [context[:enable]].flatten
|
|
78
|
+
context[:enable].delete(line.parameter)
|
|
79
|
+
end
|
|
80
|
+
false
|
|
81
|
+
when 'logprint', 'nop', 'print'
|
|
82
|
+
false
|
|
83
|
+
when 'goto'
|
|
84
|
+
waiting_for_label = line.parameter
|
|
85
|
+
false
|
|
86
|
+
else
|
|
87
|
+
fail "Don't know how to process: #{line.type}, in file #{filename}"
|
|
88
|
+
end
|
|
89
|
+
else
|
|
90
|
+
false
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def parse # :nodoc:
|
|
97
|
+
File.readlines(@file).each do |line|
|
|
98
|
+
l = FlowLine.new(line, parser: parser, flow: self)
|
|
99
|
+
self << l if l.valid?
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def inspect # :nodoc:
|
|
104
|
+
"<TestFlow: #{filename}, Lines: #{size}>"
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
class IGXLBasedTester
|
|
3
|
+
class Parser
|
|
4
|
+
class FlowLine
|
|
5
|
+
attr_accessor :parser, :flow, :line
|
|
6
|
+
|
|
7
|
+
TYPES = %w(
|
|
8
|
+
Test characterize defaults enable-flow-word disable-flow-word error-print goto
|
|
9
|
+
goto-on-all-done goto-on-all-lastfail goto-on-all-lastfaildoall logprint modify
|
|
10
|
+
nop print reset set-device set-device-new set-error-bin set-retest-bin skip
|
|
11
|
+
stop assign-integer create-integer delete-integer create-site-var assign-site-var
|
|
12
|
+
flag-clear flag-clear-all flag-false flag-false-all flag-true flag-true-all
|
|
13
|
+
state-clear-all state-false-all state-true-all
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
ATTRS = %w(
|
|
17
|
+
label enable job part env opcode parameter
|
|
18
|
+
tname tnum bin_pass bin_fail sort_pass sort_fail result flag_pass
|
|
19
|
+
flag_fail state group_specifier group_sense group_condition group_name
|
|
20
|
+
device_sense device_condition device_name debug_assume debug_sites
|
|
21
|
+
comment
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
ALIASES = {
|
|
25
|
+
bin: :bin_fail,
|
|
26
|
+
softbin: :sort_fail,
|
|
27
|
+
soft_bin: :sort_fail,
|
|
28
|
+
name: :tname,
|
|
29
|
+
number: :tnum,
|
|
30
|
+
test_number: :tnum,
|
|
31
|
+
test_num: :tnum,
|
|
32
|
+
type: :opcode
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
# Make readers for each low level attribute
|
|
36
|
+
ATTRS.each do |attr|
|
|
37
|
+
attr_reader attr
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# And the aliases
|
|
41
|
+
ALIASES.each do |_alias, attr|
|
|
42
|
+
define_method("#{_alias}") do
|
|
43
|
+
send(attr)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Returns the test instance called by the given line or nil
|
|
48
|
+
def self.extract_test(line)
|
|
49
|
+
l = new(line)
|
|
50
|
+
if l.valid? && l.test?
|
|
51
|
+
l.test_instance_name
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def initialize(line, options = {})
|
|
56
|
+
@parser = options[:parser]
|
|
57
|
+
@flow = options[:flow]
|
|
58
|
+
@line = line
|
|
59
|
+
parse
|
|
60
|
+
if valid?
|
|
61
|
+
ATTRS.each_with_index do |attr, i|
|
|
62
|
+
instance_variable_set("@#{attr}", components[i + 1])
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def inspect # :nodoc:
|
|
68
|
+
"<FlowLine: #{type}, Parameter: #{parameter}>"
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def description
|
|
72
|
+
from_instance = test_instance ? test_instance.description : ''
|
|
73
|
+
from_flow = parser.descriptions.flow_line(name: test_instance_name, flow: flow.file)
|
|
74
|
+
if !from_instance.empty? && !from_flow.empty?
|
|
75
|
+
[from_instance, "\n", from_flow].flatten
|
|
76
|
+
elsif from_instance.empty?
|
|
77
|
+
from_flow
|
|
78
|
+
else
|
|
79
|
+
from_instance
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def parse
|
|
84
|
+
@components = @line.split("\t") unless @line.strip.empty?
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def valid?
|
|
88
|
+
components[6] && TYPES.include?(components[6])
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def components
|
|
92
|
+
@components ||= []
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def test?
|
|
96
|
+
%w(Test characterize).include? opcode
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def executes_under_context?(context)
|
|
100
|
+
enable_conditions_met?(context) &&
|
|
101
|
+
job_conditions_met?(context) &&
|
|
102
|
+
part_conditions_met?(context) &&
|
|
103
|
+
env_conditions_met?(context)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def enable_conditions_met?(context)
|
|
107
|
+
conditions_met?(enable, context[:enable])
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def job_conditions_met?(context)
|
|
111
|
+
conditions_met?(job, context[:job])
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def part_conditions_met?(context)
|
|
115
|
+
conditions_met?(part, context[:part])
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def env_conditions_met?(context)
|
|
119
|
+
conditions_met?(env, context[:env])
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def conditions_met?(conditions, values)
|
|
123
|
+
if conditions.empty?
|
|
124
|
+
true
|
|
125
|
+
else
|
|
126
|
+
values = [values].flatten
|
|
127
|
+
conditions = conditions.split(',').map(&:strip)
|
|
128
|
+
not_conditions = conditions.select { |c| c =~ /^!/ }
|
|
129
|
+
conditions = conditions - not_conditions
|
|
130
|
+
# Make sure all -ve conditions are not met
|
|
131
|
+
if not_conditions.all? do |c|
|
|
132
|
+
c =~ /^!(.*)/
|
|
133
|
+
c = Regexp.last_match[1]
|
|
134
|
+
!values.include?(c)
|
|
135
|
+
end
|
|
136
|
+
# And then any +ve conditions
|
|
137
|
+
if conditions.empty?
|
|
138
|
+
true
|
|
139
|
+
else
|
|
140
|
+
values.any? { |v| conditions.include?(v) }
|
|
141
|
+
end
|
|
142
|
+
else
|
|
143
|
+
false
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def test_instance_name
|
|
149
|
+
parameter
|
|
150
|
+
end
|
|
151
|
+
alias_method :instance_name, :test_instance_name
|
|
152
|
+
|
|
153
|
+
def test_instance
|
|
154
|
+
instances = parser.test_instances.where(name: parameter, exact: true)
|
|
155
|
+
if instances.size > 1
|
|
156
|
+
puts "Warning multiple instances of #{name} found, using the first one"
|
|
157
|
+
end
|
|
158
|
+
if instances.size == 0
|
|
159
|
+
nil
|
|
160
|
+
else
|
|
161
|
+
instances.first
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
alias_method :instance, :test_instance
|
|
165
|
+
|
|
166
|
+
# Returns an array of patterns used by the given test, if there are none
|
|
167
|
+
# an empty array is returned.
|
|
168
|
+
# Optionally supply patterns to exclude if you want to ignore common subroutine
|
|
169
|
+
# patterns for example.
|
|
170
|
+
def patterns(options = {})
|
|
171
|
+
if i = test_instance
|
|
172
|
+
pats = i.patterns
|
|
173
|
+
if options[:ignore] && pats
|
|
174
|
+
pats.reject { |p| [options[:ignore]].flatten.include?(p) }
|
|
175
|
+
else
|
|
176
|
+
[]
|
|
177
|
+
end
|
|
178
|
+
else
|
|
179
|
+
[]
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
alias_method :pattern, :patterns
|
|
183
|
+
|
|
184
|
+
# Returns a string summarizing any conditions (enable words, jobs, etc.) that
|
|
185
|
+
# gate the execution of this line
|
|
186
|
+
def conditions
|
|
187
|
+
c = []
|
|
188
|
+
c << "Enable: #{enable}" unless enable.empty?
|
|
189
|
+
c << "Job: #{job}" unless job.empty?
|
|
190
|
+
c << "Part: #{part}" unless part.empty?
|
|
191
|
+
c << "Env: #{env}" unless env.empty?
|
|
192
|
+
c.join('; ')
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
def vdd
|
|
196
|
+
if i = test_instance
|
|
197
|
+
i.vdd
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
class IGXLBasedTester
|
|
3
|
+
class Parser
|
|
4
|
+
class Flows < ::OrigenTesters::Parser::SearchableArray
|
|
5
|
+
attr_accessor :parser
|
|
6
|
+
|
|
7
|
+
def initialize(options = {})
|
|
8
|
+
@parser = options[:parser]
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def import(file)
|
|
12
|
+
self << Flow.new(file, parser: parser)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def inspect
|
|
16
|
+
"<TestFlows: #{size}>"
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
class IGXLBasedTester
|
|
3
|
+
class Parser
|
|
4
|
+
class PatternSet
|
|
5
|
+
class Pattern
|
|
6
|
+
attr_accessor :parser
|
|
7
|
+
|
|
8
|
+
ATTRS = %w(pattern_set file_name start_label stop_label comment)
|
|
9
|
+
|
|
10
|
+
ALIASES = {
|
|
11
|
+
pattern: :file_name,
|
|
12
|
+
file: :file_name,
|
|
13
|
+
name: :file_name
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
# Generate readers for all attributes and their aliases
|
|
17
|
+
ATTRS.each do |attr|
|
|
18
|
+
attr_reader attr.to_sym
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
ALIASES.each do |_alias, attr|
|
|
22
|
+
define_method("#{_alias}") do
|
|
23
|
+
send(attr)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def initialize(line)
|
|
28
|
+
@line = line
|
|
29
|
+
parse
|
|
30
|
+
if valid?
|
|
31
|
+
ATTRS.each_with_index do |attr, i|
|
|
32
|
+
instance_variable_set("@#{attr}", components[i + 1])
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def parse
|
|
38
|
+
@components = @line.split("\t") unless @line.strip.empty?
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def valid?
|
|
42
|
+
components[1] && !components[1].empty? && components[1] != 'Pattern Set' &&
|
|
43
|
+
components[2] && !components[2].empty?
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def components
|
|
47
|
+
@components ||= []
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def initialize(line, options = {})
|
|
52
|
+
@parser = options[:parser]
|
|
53
|
+
p = add_pattern_line(line)
|
|
54
|
+
@name = p.pattern_set if p.valid?
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def inspect # :nodoc:
|
|
58
|
+
"<PatternSet: #{name}>"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def name
|
|
62
|
+
@name
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def patterns
|
|
66
|
+
@patterns ||= []
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def self.extract_name(line)
|
|
70
|
+
new(line).name
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def add_pattern_line(line)
|
|
74
|
+
p = Pattern.new(line)
|
|
75
|
+
patterns << Pattern.new(line) if p.valid?
|
|
76
|
+
p
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def valid?
|
|
80
|
+
patterns.all?(&:valid?)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Returns an array containing all pattern names contained in this
|
|
84
|
+
# pattern set
|
|
85
|
+
def pattern_names
|
|
86
|
+
# This removes the path and extensions
|
|
87
|
+
patterns.map { |pat| pat.name.gsub(/.*[\\\/]/, '').gsub(/\..*/, '') }
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
class IGXLBasedTester
|
|
3
|
+
class Parser
|
|
4
|
+
class PatternSets < ::OrigenTesters::Parser::SearchableHash
|
|
5
|
+
attr_accessor :parser
|
|
6
|
+
|
|
7
|
+
def initialize(options = {})
|
|
8
|
+
@parser = options[:parser]
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def import(file)
|
|
12
|
+
File.readlines(file).each do |line|
|
|
13
|
+
name = PatternSet.extract_name(line)
|
|
14
|
+
if name
|
|
15
|
+
if self[name]
|
|
16
|
+
self[name].add_pattern_line(line)
|
|
17
|
+
else
|
|
18
|
+
l = PatternSet.new(line, parser: parser)
|
|
19
|
+
self[l.name] = l if l.valid?
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def inspect
|
|
26
|
+
"<Patsets: #{size}>"
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|