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,89 @@
|
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module SmartestBasedTester
|
|
3
|
+
class V93K
|
|
4
|
+
# Responsible for building V93K test programs from a collection of sub-programs
|
|
5
|
+
class Builder
|
|
6
|
+
require 'yaml'
|
|
7
|
+
|
|
8
|
+
autoload :Flow, 'origen_testers/smartest_based_tester/v93k/builder/flow'
|
|
9
|
+
autoload :PatternMaster, 'origen_testers/smartest_based_tester/v93k/builder/pattern_master'
|
|
10
|
+
|
|
11
|
+
attr_reader :manifest
|
|
12
|
+
|
|
13
|
+
def build(manifest, options = {})
|
|
14
|
+
@manifest_dir = Pathname.new(manifest).dirname.to_s
|
|
15
|
+
@manifest = YAML.load_file(manifest).with_indifferent_access
|
|
16
|
+
parse_sub_programs
|
|
17
|
+
render(options)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
private
|
|
21
|
+
|
|
22
|
+
def render(options)
|
|
23
|
+
manifest[:flows].each do |name, flow|
|
|
24
|
+
flow_file = nil
|
|
25
|
+
pm_file = nil
|
|
26
|
+
|
|
27
|
+
flow.each do |sub_program|
|
|
28
|
+
unless flows[sub_program]
|
|
29
|
+
puts "Flow #{name} includes sub-program #{sub_program}, but it has not been defined!"
|
|
30
|
+
exit 1
|
|
31
|
+
end
|
|
32
|
+
flow_file ||= Flow.new
|
|
33
|
+
flow_file.add_sub_flow(flows[sub_program])
|
|
34
|
+
if pattern_masters[sub_program]
|
|
35
|
+
pm_file ||= PatternMaster.new
|
|
36
|
+
pm_file.add_sub_file(pattern_masters[sub_program])
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
compile_options = {
|
|
41
|
+
action: :compile,
|
|
42
|
+
files: "#{Origen.root!}/lib/origen_testers/smartest_based_tester/v93k/templates/template.flow.erb",
|
|
43
|
+
output_file_name: "#{name}.flow",
|
|
44
|
+
output_sub_dir: 'testflow',
|
|
45
|
+
options: { program: flow_file }
|
|
46
|
+
}.merge(options)
|
|
47
|
+
|
|
48
|
+
Origen.app.runner.launch(compile_options)
|
|
49
|
+
|
|
50
|
+
if pm_file
|
|
51
|
+
compile_options = {
|
|
52
|
+
action: :compile,
|
|
53
|
+
files: "#{Origen.root!}/lib/origen_testers/smartest_based_tester/v93k/templates/template.pmfl.erb",
|
|
54
|
+
output_file_name: "#{name}.pmfl",
|
|
55
|
+
output_sub_dir: 'vectors',
|
|
56
|
+
options: { program: pm_file }
|
|
57
|
+
}.merge(options)
|
|
58
|
+
end
|
|
59
|
+
Origen.app.runner.launch(compile_options)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def parse_sub_programs
|
|
64
|
+
manifest[:sub_programs].each do |sub_program|
|
|
65
|
+
name = sub_program[:name]
|
|
66
|
+
if sub_program[:flow]
|
|
67
|
+
flows[name] = Flow.new(find_file(sub_program[:flow]))
|
|
68
|
+
end
|
|
69
|
+
if sub_program[:pattern_master]
|
|
70
|
+
pattern_masters[name] = PatternMaster.new(find_file(sub_program[:pattern_master]))
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def find_file(file)
|
|
76
|
+
Origen.file_handler.clean_path_to(file, default_dir: @manifest_dir)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def flows
|
|
80
|
+
@flows ||= {}
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def pattern_masters
|
|
84
|
+
@pattern_masters ||= {}
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module SmartestBasedTester
|
|
3
|
+
class V93K
|
|
4
|
+
class Builder
|
|
5
|
+
# Responsible for modelling/building the contents of a V93K flow file
|
|
6
|
+
class Flow
|
|
7
|
+
attr_reader :information, :declarations, :flags, :testmethodparameters,
|
|
8
|
+
:testmethodlimits, :testmethods, :test_suites, :test_flow, :binning,
|
|
9
|
+
:hardware_bin_descriptions, :file
|
|
10
|
+
|
|
11
|
+
def initialize(file = nil)
|
|
12
|
+
@information = {}
|
|
13
|
+
@declarations = {}
|
|
14
|
+
@flags = {}
|
|
15
|
+
@testmethodparameters = {}
|
|
16
|
+
@testmethodlimits = {}
|
|
17
|
+
@testmethods = {}
|
|
18
|
+
@test_suites = {}
|
|
19
|
+
@test_flow = []
|
|
20
|
+
@binning = []
|
|
21
|
+
@hardware_bin_descriptions = {}
|
|
22
|
+
@groups = {}
|
|
23
|
+
@file = file
|
|
24
|
+
parse_file if file
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def add_sub_flow(flow)
|
|
28
|
+
combine(flow, :information, exclude: 'test_revision')
|
|
29
|
+
combine(flow, :declarations)
|
|
30
|
+
combine(flow, :flags)
|
|
31
|
+
add_test_methods(flow)
|
|
32
|
+
add_test_suites(flow)
|
|
33
|
+
add_flow(flow)
|
|
34
|
+
(binning << flow.binning).flatten!.uniq!
|
|
35
|
+
combine(flow, :hardware_bin_descriptions)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
private
|
|
39
|
+
|
|
40
|
+
def parse_file
|
|
41
|
+
current_section = nil
|
|
42
|
+
current = nil
|
|
43
|
+
File.open(file) do |f|
|
|
44
|
+
f.each_line do |line|
|
|
45
|
+
if current_section
|
|
46
|
+
if line =~ /^\s*end\s*$/
|
|
47
|
+
current_section = nil
|
|
48
|
+
current = nil
|
|
49
|
+
else
|
|
50
|
+
case current_section
|
|
51
|
+
when :information, :declarations, :flags, :hardware_bin_descriptions
|
|
52
|
+
if line =~ /^\s*(.*)\s*=\s*(.*)\s*$/
|
|
53
|
+
send(current_section)[Regexp.last_match(1).strip] = Regexp.last_match(2).strip
|
|
54
|
+
end
|
|
55
|
+
when :testmethodparameters, :testmethodlimits, :testmethods, :test_suites
|
|
56
|
+
if line =~ /^\s*(.*):\s*$/
|
|
57
|
+
current = Regexp.last_match(1)
|
|
58
|
+
send(current_section)[current] = {}
|
|
59
|
+
elsif current
|
|
60
|
+
if line =~ /^\s*(.*)\s*=\s*(.*)\s*$/
|
|
61
|
+
send(current_section)[current][Regexp.last_match(1).strip] = Regexp.last_match(2).strip
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
when :binning
|
|
65
|
+
binning << line.strip
|
|
66
|
+
when :test_flow
|
|
67
|
+
add_flow_line(line)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
else
|
|
71
|
+
if line =~ /^\s*(information|declarations|flags|testmethodparameters|testmethodlimits|testmethods|test_suites|test_flow|binning|hardware_bin_descriptions)\s*$/
|
|
72
|
+
current_section = Regexp.last_match(1).to_sym
|
|
73
|
+
current = nil
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def groups
|
|
81
|
+
@groups
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def add_flow(flow)
|
|
85
|
+
flow.test_flow.each { |l| add_flow_line(l) }
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def add_flow_line(line)
|
|
89
|
+
line.strip!
|
|
90
|
+
# Make group names unique as required
|
|
91
|
+
if line =~ /\s*},\s*open\s*,\s*("|')(.*)("|'),.*/
|
|
92
|
+
group = Regexp.last_match(2).strip
|
|
93
|
+
if groups[group]
|
|
94
|
+
line = line.sub(group, "#{group} #{groups[group]}")
|
|
95
|
+
groups[group] += 1
|
|
96
|
+
else
|
|
97
|
+
groups[group] = 1
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
test_flow << line
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def combine(flow, attribute, options = {})
|
|
104
|
+
exclude = [options[:exclude]].flatten.compact
|
|
105
|
+
flow.send(attribute).each do |key, val|
|
|
106
|
+
unless exclude.include?(key)
|
|
107
|
+
if send(attribute)[key]
|
|
108
|
+
if send(attribute)[key] != val
|
|
109
|
+
puts "#{flow} assigns #{attribute} attribute #{key} to #{val}, however it is already assigned to #{send(attribute)[key]}"
|
|
110
|
+
exit 1
|
|
111
|
+
end
|
|
112
|
+
else
|
|
113
|
+
send(attribute)[key] = val
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def add_test_methods(flow)
|
|
120
|
+
flow.testmethods.each do |id, tm|
|
|
121
|
+
if testmethods[id]
|
|
122
|
+
nid = "tm_#{tm_ix}"
|
|
123
|
+
testmethods[nid] = tm
|
|
124
|
+
testmethodparameters[nid] = flow.testmethodparameters[id]
|
|
125
|
+
testmethodlimits[nid] = flow.testmethodlimits[id]
|
|
126
|
+
flow.test_suites.each do |tsid, ts|
|
|
127
|
+
if ts['override_testf'] == "#{id};"
|
|
128
|
+
ts['override_testf'] = "#{nid};"
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
else
|
|
132
|
+
testmethods[id] = tm
|
|
133
|
+
testmethodparameters[id] = flow.testmethodparameters[id]
|
|
134
|
+
testmethodlimits[id] = flow.testmethodlimits[id]
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def add_test_suites(flow)
|
|
140
|
+
flow.test_suites.each do |id, ts|
|
|
141
|
+
if test_suites[id]
|
|
142
|
+
i = 1
|
|
143
|
+
nid = id
|
|
144
|
+
while test_suites[nid]
|
|
145
|
+
nid = "#{id}_#{i}"
|
|
146
|
+
i += 1
|
|
147
|
+
end
|
|
148
|
+
test_suites[nid] = ts
|
|
149
|
+
flow.test_flow.map! do |line|
|
|
150
|
+
if line =~ /(run|run_and_branch)\(#{id}\)/
|
|
151
|
+
line.sub(id, nid)
|
|
152
|
+
else
|
|
153
|
+
line
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
else
|
|
157
|
+
test_suites[id] = ts
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def tm_ix
|
|
163
|
+
testmethods.size + 1
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module SmartestBasedTester
|
|
3
|
+
class V93K
|
|
4
|
+
class Builder
|
|
5
|
+
# Responsible for modelling/building the contents of a V93K pattern master file
|
|
6
|
+
class PatternMaster
|
|
7
|
+
attr_reader :file, :paths
|
|
8
|
+
|
|
9
|
+
def initialize(file = nil)
|
|
10
|
+
@file = file
|
|
11
|
+
@paths = {}
|
|
12
|
+
parse_file if file
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def add_sub_file(pm)
|
|
16
|
+
pm.paths.each do |path, files|
|
|
17
|
+
if paths[path]
|
|
18
|
+
paths[path] += files
|
|
19
|
+
paths[path].uniq!
|
|
20
|
+
else
|
|
21
|
+
paths[path] = files
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
def parse_file
|
|
29
|
+
File.open(file) do |f|
|
|
30
|
+
capture = nil
|
|
31
|
+
current_path = nil
|
|
32
|
+
f.each_line do |line|
|
|
33
|
+
line = line.strip
|
|
34
|
+
if line =~ /^\s*path:\s*$/
|
|
35
|
+
capture = :path
|
|
36
|
+
elsif capture == :path
|
|
37
|
+
paths[line] ||= []
|
|
38
|
+
current_path = paths[line]
|
|
39
|
+
capture = nil
|
|
40
|
+
elsif line =~ /^\s*files:\s*$/
|
|
41
|
+
capture = :file
|
|
42
|
+
elsif capture == :file
|
|
43
|
+
unless line.empty?
|
|
44
|
+
current_path << line
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module SmartestBasedTester
|
|
3
|
+
class V93K
|
|
4
|
+
require 'origen_testers/smartest_based_tester/base/flow'
|
|
5
|
+
class Flow < Base::Flow
|
|
6
|
+
TEMPLATE = "#{Origen.root!}/lib/origen_testers/smartest_based_tester/v93k/templates/template.flow.erb"
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module SmartestBasedTester
|
|
3
|
+
class V93K
|
|
4
|
+
# Include this module in an interface class to make it a V93K interface and to give
|
|
5
|
+
# access to the V93K program generator API
|
|
6
|
+
module Generator
|
|
7
|
+
extend ActiveSupport::Concern
|
|
8
|
+
|
|
9
|
+
require_all "#{Origen.root!}/lib/origen_testers/smartest_based_tester/v93k"
|
|
10
|
+
require 'origen_testers/smartest_based_tester/base/generator'
|
|
11
|
+
|
|
12
|
+
included do
|
|
13
|
+
include Base::Generator
|
|
14
|
+
PLATFORM = V93K
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module SmartestBasedTester
|
|
3
|
+
class V93K
|
|
4
|
+
require 'origen_testers/smartest_based_tester/base/pattern_compiler'
|
|
5
|
+
class PatternCompiler < Base::PatternCompiler
|
|
6
|
+
TEMPLATE = "#{Origen.root!}/lib/origen_testers/smartest_based_tester/v93k/templates/template.aiv.erb"
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module SmartestBasedTester
|
|
3
|
+
class V93K
|
|
4
|
+
require 'origen_testers/smartest_based_tester/base/pattern_master'
|
|
5
|
+
class PatternMaster < Base::PatternMaster
|
|
6
|
+
TEMPLATE = "#{Origen.root!}/lib/origen_testers/smartest_based_tester/v93k/templates/template.pmfl.erb"
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
AI_DIR_FILE
|
|
2
|
+
tmp_dir ./tmp
|
|
3
|
+
tmf_dir ./
|
|
4
|
+
vbc_dir ./
|
|
5
|
+
avc_dir ./AVC/
|
|
6
|
+
pinconfig_file ./<%= $dut.name.to_s.upcase %>.cfg
|
|
7
|
+
single_binary_pattern_dir ./BINL/
|
|
8
|
+
|
|
9
|
+
AI_V2B_OPTIONS -ALT -c <%= $dut.name.to_s.upcase %>.vbc -k -z PS800
|
|
10
|
+
|
|
11
|
+
PATTERNS name tmf_file v2b_options
|
|
12
|
+
% subroutines.uniq.sort.each do |pattern|
|
|
13
|
+
<%= pattern.sub(/\..*/, '') %> <%= $dut.name.to_s.upcase %>.tmf -s
|
|
14
|
+
% end
|
|
15
|
+
% patterns.uniq.sort.each do |pattern|
|
|
16
|
+
<%= pattern.sub(/\..*/, '') %> <%= $dut.name.to_s.upcase %>.tmf
|
|
17
|
+
% end
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
hp93000,testflow,0.1
|
|
2
|
+
language_revision = 1;
|
|
3
|
+
|
|
4
|
+
information
|
|
5
|
+
|
|
6
|
+
% program = options[:program]
|
|
7
|
+
% if program
|
|
8
|
+
% program.information.each do |key, val|
|
|
9
|
+
% unless key == "test_revision"
|
|
10
|
+
<%= key %> = <%= val %>
|
|
11
|
+
% end
|
|
12
|
+
% end
|
|
13
|
+
% else
|
|
14
|
+
-- STOPDIFF
|
|
15
|
+
test_revision = "<%= Origen.app.version %>";
|
|
16
|
+
-- STARTDIFF
|
|
17
|
+
% end
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
--------------------------------------------------
|
|
21
|
+
declarations
|
|
22
|
+
|
|
23
|
+
% if program
|
|
24
|
+
% program.declarations.each do |key, val|
|
|
25
|
+
<%= key %> = <%= val %>
|
|
26
|
+
% end
|
|
27
|
+
% else
|
|
28
|
+
% flow_control_variables.each do |var|
|
|
29
|
+
@<%= var.to_s.upcase %> = -1;
|
|
30
|
+
% end
|
|
31
|
+
% end
|
|
32
|
+
end
|
|
33
|
+
--------------------------------------------------
|
|
34
|
+
implicit_declarations
|
|
35
|
+
|
|
36
|
+
end
|
|
37
|
+
-----------------------------------------------------------------
|
|
38
|
+
flags
|
|
39
|
+
|
|
40
|
+
% if program
|
|
41
|
+
% program.flags.each do |key, val|
|
|
42
|
+
<%= key %> = <%= val %>
|
|
43
|
+
% end
|
|
44
|
+
% else
|
|
45
|
+
datalog_formatter = 0;
|
|
46
|
+
datalog_sample_size = 1;
|
|
47
|
+
graphic_result_displa = 1;
|
|
48
|
+
state_display = 0;
|
|
49
|
+
print_wafermap = 0;
|
|
50
|
+
ink_wafer = 0;
|
|
51
|
+
max_reprobes = 1;
|
|
52
|
+
temp_monitor = 1;
|
|
53
|
+
calib_age_monitor = 1;
|
|
54
|
+
diag_monitor = 1;
|
|
55
|
+
current_monitor = 1;
|
|
56
|
+
log_events_enable = 1;
|
|
57
|
+
set_pass_level = 0;
|
|
58
|
+
set_fail_level = 0;
|
|
59
|
+
set_bypass_level = 0;
|
|
60
|
+
hold_on_fail = 0;
|
|
61
|
+
global_hold = 0;
|
|
62
|
+
debug_mode = 0;
|
|
63
|
+
debug_analog = 0;
|
|
64
|
+
parallel_mode = 1;
|
|
65
|
+
site_match_mode = 2;
|
|
66
|
+
global_overon = 0;
|
|
67
|
+
limits_enable = 0;
|
|
68
|
+
test_number_enable = 1;
|
|
69
|
+
test_number_inc = 1;
|
|
70
|
+
log_cycles_before = 0;
|
|
71
|
+
log_cycles_after = 0;
|
|
72
|
+
unburst_mode = 0;
|
|
73
|
+
sqst_mode = 0;
|
|
74
|
+
warn_as_fail = 1;
|
|
75
|
+
use_hw_dsp = 0;
|
|
76
|
+
dsp_file_enable = 0;
|
|
77
|
+
buffer_testflow_log = 0;
|
|
78
|
+
check_testmethod_api = 0;
|
|
79
|
+
stdf_generation = 1;
|
|
80
|
+
tm_crash_as_fatal = 1;
|
|
81
|
+
hidden_datalog_mode = 0;
|
|
82
|
+
multibin_mode = 0;
|
|
83
|
+
% end
|
|
84
|
+
end
|
|
85
|
+
-----------------------------------------------------------------
|
|
86
|
+
testmethodparameters
|
|
87
|
+
% if program
|
|
88
|
+
% program.testmethodparameters.each do |id, parameters|
|
|
89
|
+
<%= id %>:
|
|
90
|
+
% parameters.each do |key, val|
|
|
91
|
+
<%= key %> = <%= val %>
|
|
92
|
+
% end
|
|
93
|
+
% end
|
|
94
|
+
% else
|
|
95
|
+
% test_methods.collection.each do |method|
|
|
96
|
+
<%= method.id %>:
|
|
97
|
+
% method.parameters.each do |name, type|
|
|
98
|
+
"<%= name.is_a?(String) ? name : name.to_s.camelize(:lower) %>" = "<%= method.format(name) %>";
|
|
99
|
+
% end
|
|
100
|
+
% end
|
|
101
|
+
% end
|
|
102
|
+
end
|
|
103
|
+
--------------------------------------------------
|
|
104
|
+
testmethodlimits
|
|
105
|
+
% if program
|
|
106
|
+
% program.testmethodlimits.each do |id, parameters|
|
|
107
|
+
<%= id %>:
|
|
108
|
+
% parameters.each do |key, val|
|
|
109
|
+
<%= key %> = <%= val %>
|
|
110
|
+
% end
|
|
111
|
+
% end
|
|
112
|
+
% else
|
|
113
|
+
% test_methods.collection.each do |method|
|
|
114
|
+
% if method.respond_to?(:limits) && method.limits
|
|
115
|
+
<%= method.id %>:
|
|
116
|
+
<%= method.limits %>;
|
|
117
|
+
% end
|
|
118
|
+
% end
|
|
119
|
+
% end
|
|
120
|
+
end
|
|
121
|
+
--------------------------------------------------
|
|
122
|
+
testmethods
|
|
123
|
+
% if program
|
|
124
|
+
% program.testmethods.each do |id, parameters|
|
|
125
|
+
<%= id %>:
|
|
126
|
+
% parameters.each do |key, val|
|
|
127
|
+
<%= key %> = <%= val %>
|
|
128
|
+
% end
|
|
129
|
+
% end
|
|
130
|
+
% else
|
|
131
|
+
% test_methods.collection.each do |method|
|
|
132
|
+
<%= method.id %>:
|
|
133
|
+
testmethod_class = "<%= method.klass %>";
|
|
134
|
+
% end
|
|
135
|
+
% end
|
|
136
|
+
end
|
|
137
|
+
--------------------------------------------------
|
|
138
|
+
test_suites
|
|
139
|
+
% if program
|
|
140
|
+
% program.test_suites.each do |id, parameters|
|
|
141
|
+
<%= id %>:
|
|
142
|
+
% parameters.each do |key, val|
|
|
143
|
+
<%= key %> = <%= val %>
|
|
144
|
+
% end
|
|
145
|
+
% end
|
|
146
|
+
% else
|
|
147
|
+
% test_suites.collection.each do |suite|
|
|
148
|
+
<%= suite.name %>:
|
|
149
|
+
% suite.lines.each do |line|
|
|
150
|
+
<%= line %>
|
|
151
|
+
% end
|
|
152
|
+
% end
|
|
153
|
+
% end
|
|
154
|
+
end
|
|
155
|
+
--------------------------------------------------
|
|
156
|
+
test_flow
|
|
157
|
+
% if program
|
|
158
|
+
% program.test_flow.each do |line|
|
|
159
|
+
<%= line %>
|
|
160
|
+
% end
|
|
161
|
+
% else
|
|
162
|
+
{
|
|
163
|
+
% flow_control_variables.each do |var|
|
|
164
|
+
@<%= var.to_s.upcase %> = -1;
|
|
165
|
+
% end
|
|
166
|
+
}, open,"Init Flow Control Vars", ""
|
|
167
|
+
% collection.each do |node|
|
|
168
|
+
% unless node.rendered? || node.deleted? || node.empty?
|
|
169
|
+
% node.lines.each do |line|
|
|
170
|
+
<%= line %>
|
|
171
|
+
% end
|
|
172
|
+
% end
|
|
173
|
+
% end
|
|
174
|
+
% end
|
|
175
|
+
end
|
|
176
|
+
-------------------------------------------------
|
|
177
|
+
binning
|
|
178
|
+
% if program
|
|
179
|
+
% program.binning.each do |line|
|
|
180
|
+
<%= line %>
|
|
181
|
+
% end
|
|
182
|
+
% else
|
|
183
|
+
otherwise bin = "db", "", , bad, noreprobe, red, , not_over_on;
|
|
184
|
+
% end
|
|
185
|
+
end
|
|
186
|
+
-------------------------------------------------
|
|
187
|
+
context
|
|
188
|
+
|
|
189
|
+
end
|
|
190
|
+
--------------------------------------------------
|
|
191
|
+
hardware_bin_descriptions
|
|
192
|
+
% if program
|
|
193
|
+
% program.hardware_bin_descriptions.each do |key, val|
|
|
194
|
+
<%= key %> = <%= val %>
|
|
195
|
+
% end
|
|
196
|
+
% else
|
|
197
|
+
% hardware_bin_descriptions.each do |bin, desc|
|
|
198
|
+
<%= bin %> = "<%= desc %>";
|
|
199
|
+
% end
|
|
200
|
+
% end
|
|
201
|
+
end
|