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,288 @@
|
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
class VectorPipeline
|
|
3
|
+
attr_reader :group_size, :pipeline
|
|
4
|
+
# Used to keep track of how many vectors since the last reset of the pipeline (i.e.
|
|
5
|
+
# since pattern start). This is used to implement padding if there is a minimum
|
|
6
|
+
# vector requirement.
|
|
7
|
+
attr_reader :vector_count
|
|
8
|
+
attr_reader :cycle_count
|
|
9
|
+
|
|
10
|
+
def initialize(group_size)
|
|
11
|
+
@group_size = group_size
|
|
12
|
+
@pipeline = []
|
|
13
|
+
# A new pipeline is instantiated per-pattern, so don't need to worry about
|
|
14
|
+
# clearing this
|
|
15
|
+
@vector_count = 0
|
|
16
|
+
@cycle_count = 0
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def push_comment(comment)
|
|
20
|
+
comments << comment
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def push_microcode(code)
|
|
24
|
+
if $tester.v93k? && code =~ /JSUB/
|
|
25
|
+
@vector_count += 1
|
|
26
|
+
end
|
|
27
|
+
comments << code
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Add a vector/comment to the pipeline
|
|
31
|
+
def <<(vector)
|
|
32
|
+
if vector.is_a?(Vector)
|
|
33
|
+
level_period(vector) do |vector|
|
|
34
|
+
consume_comments(vector)
|
|
35
|
+
if vector.repeat > 1
|
|
36
|
+
add_repeat_vector(vector)
|
|
37
|
+
else
|
|
38
|
+
pipeline << vector
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
# Keep a persistent record of the last vector so that we know what it
|
|
42
|
+
# was after the pipeline has been flushed
|
|
43
|
+
@last_vector = pipeline.last
|
|
44
|
+
elsif vector.is_a?(Symbol)
|
|
45
|
+
case vector
|
|
46
|
+
when :align
|
|
47
|
+
duplicate_last_vector until aligned?
|
|
48
|
+
when :align_last
|
|
49
|
+
duplicate_last_vector until aligned_to_last?
|
|
50
|
+
else
|
|
51
|
+
fail "Uknown vector generator instruction: #{vector}"
|
|
52
|
+
end
|
|
53
|
+
else
|
|
54
|
+
comments << vector
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# If there are complete groups sitting at the top of the pipeline
|
|
59
|
+
# then this will yield them back line by line, stopping after the last
|
|
60
|
+
# complete group and leaving any remaining single vectors in the pipeline
|
|
61
|
+
#
|
|
62
|
+
# If there are no complete groups present then it will just return
|
|
63
|
+
def flush(&block)
|
|
64
|
+
while lead_group_finalized?
|
|
65
|
+
lead_group.each do |vector|
|
|
66
|
+
vector.comments.each do |comment|
|
|
67
|
+
yield comment
|
|
68
|
+
end
|
|
69
|
+
yield_vector(vector, &block)
|
|
70
|
+
end
|
|
71
|
+
pipeline.shift(group_size)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Call at the end to force a flush out of any remaining vectors
|
|
76
|
+
def empty(options = {}, &block)
|
|
77
|
+
if !pipeline.empty? || !comments.empty?
|
|
78
|
+
if options[:min_vectors]
|
|
79
|
+
comment_written = false
|
|
80
|
+
while @vector_count < options[:min_vectors] - pipeline.size
|
|
81
|
+
unless comment_written
|
|
82
|
+
yield "#{$tester.comment_char} PADDING VECTORS ADDED TO MEET MIN #{options[:min_vectors]} FOR PATTERN"
|
|
83
|
+
comment_written = true
|
|
84
|
+
end
|
|
85
|
+
yield_vector(@last_vector, &block)
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
duplicate_last_vector until aligned?
|
|
89
|
+
pipeline.each do |vector|
|
|
90
|
+
vector.comments.each do |comment|
|
|
91
|
+
yield comment
|
|
92
|
+
end
|
|
93
|
+
yield_vector(vector, &block)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
comments.each do |comment|
|
|
97
|
+
yield comment
|
|
98
|
+
end
|
|
99
|
+
@pipeline = []
|
|
100
|
+
@comments = []
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
private
|
|
105
|
+
|
|
106
|
+
def yield_vector(vector, &block)
|
|
107
|
+
vector.cycle = @cycle_count
|
|
108
|
+
vector.number = @vector_count
|
|
109
|
+
r = vector.repeat || 1
|
|
110
|
+
if $tester.min_repeat_loop && r < $tester.min_repeat_loop
|
|
111
|
+
vector.repeat = 1
|
|
112
|
+
r.times do
|
|
113
|
+
yield vector
|
|
114
|
+
end
|
|
115
|
+
@vector_count += r
|
|
116
|
+
@cycle_count += r
|
|
117
|
+
else
|
|
118
|
+
yield vector
|
|
119
|
+
@vector_count += 1
|
|
120
|
+
@cycle_count += r
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def level_period(vector)
|
|
125
|
+
if $tester.level_period?
|
|
126
|
+
vector.convert_to_timeset($tester.min_period_timeset) do |vector|
|
|
127
|
+
yield vector
|
|
128
|
+
end
|
|
129
|
+
else
|
|
130
|
+
yield vector
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# Pushes a duplicate of the given vector with its repeat set to 1
|
|
135
|
+
#
|
|
136
|
+
# Also clears any comments associated with the vector with the rationale that we only
|
|
137
|
+
# want to see them the first time.
|
|
138
|
+
#
|
|
139
|
+
# Any microcode is cleared with the rationale that the caller is responsible for aligning
|
|
140
|
+
# this to the correct vector if required.
|
|
141
|
+
def push_duplicate(vector, options = {})
|
|
142
|
+
v = vector.dup
|
|
143
|
+
v.microcode = nil
|
|
144
|
+
v.repeat = 1
|
|
145
|
+
pipeline << v
|
|
146
|
+
if options[:existing_vector]
|
|
147
|
+
v.comments = []
|
|
148
|
+
else
|
|
149
|
+
vector.comments = []
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
def duplicate_last_vector
|
|
154
|
+
v = @last_vector.dup
|
|
155
|
+
v.comments = []
|
|
156
|
+
v.timeset = $tester.timeset
|
|
157
|
+
v.repeat = 1
|
|
158
|
+
v.microcode = nil
|
|
159
|
+
pipeline << v
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def add_repeat_vector(vector)
|
|
163
|
+
count = vector.repeat
|
|
164
|
+
# Align to the start of a new group by splitting off single vectors
|
|
165
|
+
# to complete the current group
|
|
166
|
+
while !aligned? && count > 0
|
|
167
|
+
push_duplicate(vector)
|
|
168
|
+
count -= 1
|
|
169
|
+
end
|
|
170
|
+
if count > group_size
|
|
171
|
+
remainder = count % group_size
|
|
172
|
+
# Create a group with the required repeat
|
|
173
|
+
group_size.times do
|
|
174
|
+
push_duplicate(vector)
|
|
175
|
+
end
|
|
176
|
+
pipeline.last.repeat = (count - remainder) / group_size
|
|
177
|
+
# Then expand out any leftover
|
|
178
|
+
remainder.times do
|
|
179
|
+
push_duplicate(vector)
|
|
180
|
+
end
|
|
181
|
+
# For small repeats that fit within the group just expand them
|
|
182
|
+
else
|
|
183
|
+
while count > 0
|
|
184
|
+
push_duplicate(vector)
|
|
185
|
+
count -= 1
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
# Returns true of the next vector to be added to the pipeline will
|
|
191
|
+
# be at the start of a new group
|
|
192
|
+
def aligned?
|
|
193
|
+
(pipeline.size % group_size) == 0
|
|
194
|
+
end
|
|
195
|
+
|
|
196
|
+
# Returns true if the next vector to be added to the pipeline will
|
|
197
|
+
# complete the current group
|
|
198
|
+
def aligned_to_last?
|
|
199
|
+
(pipeline.size % group_size) == (group_size - 1)
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
def consume_comments(vector)
|
|
203
|
+
vector.comments = comments
|
|
204
|
+
@comments = []
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
def comments
|
|
208
|
+
@comments ||= []
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
# When true the lead group is complete and a further repeat of it is not possible
|
|
212
|
+
# Calling this will compress the 2nd group into the 1st if possible
|
|
213
|
+
def lead_group_finalized?
|
|
214
|
+
if first_group_present? && second_group_present?
|
|
215
|
+
if second_group_is_duplicate_of_first_group? && first_group_repeat != $tester.max_repeat_loop
|
|
216
|
+
# Consume the second group by incrementing the first group repeat counter
|
|
217
|
+
self.first_group_repeat = first_group_repeat + second_group_repeat
|
|
218
|
+
# Delete the second group
|
|
219
|
+
group_size.times { pipeline.delete_at(group_size) }
|
|
220
|
+
|
|
221
|
+
# Now deal with any overflow of the first group repeat counter
|
|
222
|
+
if first_group_repeat > $tester.max_repeat_loop
|
|
223
|
+
r = first_group_repeat - $tester.max_repeat_loop
|
|
224
|
+
self.first_group_repeat = $tester.max_repeat_loop
|
|
225
|
+
group_size.times { |i| push_duplicate(pipeline[i], existing_vector: true) }
|
|
226
|
+
self.second_group_repeat = r
|
|
227
|
+
true
|
|
228
|
+
elsif first_group_repeat == $tester.max_repeat_loop
|
|
229
|
+
true
|
|
230
|
+
else
|
|
231
|
+
false
|
|
232
|
+
end
|
|
233
|
+
else
|
|
234
|
+
# Second group has started and is already different from the first group
|
|
235
|
+
true
|
|
236
|
+
end
|
|
237
|
+
end
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
def first_group_repeat
|
|
241
|
+
# This is currently hardcoded to the Teradyne concept of the repeat being applied
|
|
242
|
+
# to the last vector in the group. May need an abstraction here if other ATEs don't
|
|
243
|
+
# adhere to that approach.
|
|
244
|
+
first_group.last.repeat || 1
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
def first_group_repeat=(val)
|
|
248
|
+
first_group.last.repeat = val
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
def second_group_repeat
|
|
252
|
+
second_group.last.repeat || 1
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
def second_group_repeat=(val)
|
|
256
|
+
second_group.last.repeat = val
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
def second_group_is_duplicate_of_first_group?
|
|
260
|
+
i = -1
|
|
261
|
+
second_group.all? do |vector|
|
|
262
|
+
i += 1
|
|
263
|
+
(pipeline[i] == vector) && (vector.comments.size == 0) &&
|
|
264
|
+
# Don't consider vectors with matching microcode duplicates, caller is
|
|
265
|
+
# responsible for laying out microcode with the correct alignment
|
|
266
|
+
!pipeline[i].has_microcode? && !vector.has_microcode? &&
|
|
267
|
+
!vector.dont_compress
|
|
268
|
+
end
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
def first_group_present?
|
|
272
|
+
lead_group.size == group_size
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
def second_group_present?
|
|
276
|
+
second_group.size == group_size
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
def lead_group
|
|
280
|
+
pipeline[0..group_size - 1]
|
|
281
|
+
end
|
|
282
|
+
alias_method :first_group, :lead_group
|
|
283
|
+
|
|
284
|
+
def second_group
|
|
285
|
+
pipeline[group_size..(group_size * 2) - 1]
|
|
286
|
+
end
|
|
287
|
+
end
|
|
288
|
+
end
|
data/pattern/dc_instr.rb
ADDED
data/pattern/delay.rb
ADDED
data/pattern/mem_test.rb
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
class SetupTester
|
|
2
|
+
include Origen::PersistentCallbacks
|
|
3
|
+
|
|
4
|
+
def before_pattern(pattern_name)
|
|
5
|
+
case
|
|
6
|
+
when pattern_name =~ /^mm_single\./
|
|
7
|
+
$tester.vector_group_size = 1
|
|
8
|
+
when pattern_name =~ /^mm_dual\./
|
|
9
|
+
$tester.vector_group_size = 2
|
|
10
|
+
when pattern_name =~ /^mm_quad\./
|
|
11
|
+
$tester.vector_group_size = 4
|
|
12
|
+
else
|
|
13
|
+
# To avoid breaking later tests
|
|
14
|
+
$tester.vector_group_size = 1
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
SetupTester.new
|
|
19
|
+
|
|
20
|
+
[:single, :dual, :quad].each do |size|
|
|
21
|
+
# Startup is being skipped here since it is currently a test of the ability
|
|
22
|
+
# to render (i.e. paste) vectors, therefore they are not compressible by
|
|
23
|
+
# Origen and which makes debugging this confusing!
|
|
24
|
+
Pattern.create(name: "mm_#{size}", skip_startup: true) do
|
|
25
|
+
$tester.set_timeset("nvmbist", 40)
|
|
26
|
+
|
|
27
|
+
ss "$tester.cycle(repeat: 128)"
|
|
28
|
+
$tester.cycle(repeat: 128)
|
|
29
|
+
|
|
30
|
+
ss do
|
|
31
|
+
cc "64.times do"
|
|
32
|
+
cc " $dut.pin(:tclk).drive!(0)"
|
|
33
|
+
cc " $dut.pin(:tclk).drive!(1)"
|
|
34
|
+
cc "end"
|
|
35
|
+
end
|
|
36
|
+
64.times do
|
|
37
|
+
$dut.pin(:tclk).drive!(0)
|
|
38
|
+
$dut.pin(:tclk).drive!(1)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
ss do
|
|
42
|
+
cc "64.times do"
|
|
43
|
+
cc " $dut.pin(:tclk).drive!(0)"
|
|
44
|
+
cc " $dut.pin(:tclk).drive!(0)"
|
|
45
|
+
cc " $dut.pin(:tclk).drive!(1)"
|
|
46
|
+
cc " $dut.pin(:tclk).drive!(1)"
|
|
47
|
+
cc "end"
|
|
48
|
+
end
|
|
49
|
+
64.times do
|
|
50
|
+
$dut.pin(:tclk).drive!(0)
|
|
51
|
+
$dut.pin(:tclk).drive!(0)
|
|
52
|
+
$dut.pin(:tclk).drive!(1)
|
|
53
|
+
$dut.pin(:tclk).drive!(1)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
ss do
|
|
57
|
+
cc "64.times do"
|
|
58
|
+
cc " $dut.pin(:tclk).drive!(0)"
|
|
59
|
+
cc " $dut.pin(:tclk).drive!(0)"
|
|
60
|
+
cc " $dut.pin(:tclk).drive!(0)"
|
|
61
|
+
cc " $dut.pin(:tclk).drive!(0)"
|
|
62
|
+
cc " $dut.pin(:tclk).drive!(1)"
|
|
63
|
+
cc " $dut.pin(:tclk).drive!(1)"
|
|
64
|
+
cc " $dut.pin(:tclk).drive!(1)"
|
|
65
|
+
cc " $dut.pin(:tclk).drive!(1)"
|
|
66
|
+
cc "end"
|
|
67
|
+
end
|
|
68
|
+
64.times do
|
|
69
|
+
$dut.pin(:tclk).drive!(0)
|
|
70
|
+
$dut.pin(:tclk).drive!(0)
|
|
71
|
+
$dut.pin(:tclk).drive!(0)
|
|
72
|
+
$dut.pin(:tclk).drive!(0)
|
|
73
|
+
$dut.pin(:tclk).drive!(1)
|
|
74
|
+
$dut.pin(:tclk).drive!(1)
|
|
75
|
+
$dut.pin(:tclk).drive!(1)
|
|
76
|
+
$dut.pin(:tclk).drive!(1)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
ss do
|
|
80
|
+
cc "Test of period levelling"
|
|
81
|
+
end
|
|
82
|
+
$tester.timing_toggled_pins << $dut.pin(:tclk)
|
|
83
|
+
$dut.pin(:tdo).assert(0)
|
|
84
|
+
8.cycles
|
|
85
|
+
$tester.set_timeset("nvmbist_readout", 160)
|
|
86
|
+
8.cycles
|
|
87
|
+
$dut.pin(:tdo).dont_care
|
|
88
|
+
$tester.set_timeset("nvmbist", 40)
|
|
89
|
+
|
|
90
|
+
if $tester.vector_group_size == 1
|
|
91
|
+
ss do
|
|
92
|
+
cc "Test that these collapse to a single repeat in the single vector case"
|
|
93
|
+
end
|
|
94
|
+
$dut.pin(:tdi).drive(1)
|
|
95
|
+
$tester.wait cycles: 60000
|
|
96
|
+
$tester.cycle
|
|
97
|
+
$dut.pin(:tdi).dont_care
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
ss do
|
|
101
|
+
cc "Test that these collapse to correct multiple repeats"
|
|
102
|
+
end
|
|
103
|
+
$dut.pin(:tdi).drive(1)
|
|
104
|
+
$tester.wait cycles: 300000
|
|
105
|
+
$dut.pin(:tdi).dont_care
|
|
106
|
+
|
|
107
|
+
ss do
|
|
108
|
+
cc "Verify that comments at the end of the pattern work OK"
|
|
109
|
+
end
|
|
110
|
+
$dut.pin(:tdi).drive(0)
|
|
111
|
+
$tester.wait cycles: 1200
|
|
112
|
+
cc "This comment should appear after the delay 1200"
|
|
113
|
+
|
|
114
|
+
# Don't add anything new here, the above test should be last in this pattern
|
|
115
|
+
|
|
116
|
+
end
|
|
117
|
+
end
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# This pattern is to test that patterns pad correctly when they end on an
|
|
2
|
+
# odd number of vectors.
|
|
3
|
+
# Don't add things to the main body, modify multi_vector.rb instead.
|
|
4
|
+
|
|
5
|
+
class SetupTester
|
|
6
|
+
include Origen::PersistentCallbacks
|
|
7
|
+
|
|
8
|
+
def before_pattern(pattern_name)
|
|
9
|
+
case
|
|
10
|
+
when pattern_name =~ /^mm_single_plus1\./
|
|
11
|
+
$tester.vector_group_size = 1
|
|
12
|
+
when pattern_name =~ /^mm_dual_plus1\./
|
|
13
|
+
$tester.vector_group_size = 2
|
|
14
|
+
when pattern_name =~ /^mm_quad_plus1\./
|
|
15
|
+
$tester.vector_group_size = 4
|
|
16
|
+
else
|
|
17
|
+
# To avoid breaking later tests
|
|
18
|
+
$tester.vector_group_size = 1
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
SetupTester.new
|
|
23
|
+
|
|
24
|
+
[:single, :dual, :quad].each do |size|
|
|
25
|
+
# Startup is being skipped here since it is currently a test of the ability
|
|
26
|
+
# to render (i.e. paste) vectors, therefore they are not compressible by
|
|
27
|
+
# Origen and which makes debugging this confusing!
|
|
28
|
+
Pattern.create(name: "mm_#{size}_plus1", skip_startup: true) do
|
|
29
|
+
$tester.set_timeset("nvmbist", 40)
|
|
30
|
+
|
|
31
|
+
ss "$tester.cycle(repeat: 128)"
|
|
32
|
+
$tester.cycle(repeat: 128)
|
|
33
|
+
|
|
34
|
+
ss do
|
|
35
|
+
cc "64.times do"
|
|
36
|
+
cc " $dut.pin(:tclk).drive!(0)"
|
|
37
|
+
cc " $dut.pin(:tclk).drive!(1)"
|
|
38
|
+
cc "end"
|
|
39
|
+
end
|
|
40
|
+
64.times do
|
|
41
|
+
$dut.pin(:tclk).drive!(0)
|
|
42
|
+
$dut.pin(:tclk).drive!(1)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
ss do
|
|
46
|
+
cc "64.times do"
|
|
47
|
+
cc " $dut.pin(:tclk).drive!(0)"
|
|
48
|
+
cc " $dut.pin(:tclk).drive!(0)"
|
|
49
|
+
cc " $dut.pin(:tclk).drive!(1)"
|
|
50
|
+
cc " $dut.pin(:tclk).drive!(1)"
|
|
51
|
+
cc "end"
|
|
52
|
+
end
|
|
53
|
+
64.times do
|
|
54
|
+
$dut.pin(:tclk).drive!(0)
|
|
55
|
+
$dut.pin(:tclk).drive!(0)
|
|
56
|
+
$dut.pin(:tclk).drive!(1)
|
|
57
|
+
$dut.pin(:tclk).drive!(1)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
ss do
|
|
61
|
+
cc "64.times do"
|
|
62
|
+
cc " $dut.pin(:tclk).drive!(0)"
|
|
63
|
+
cc " $dut.pin(:tclk).drive!(0)"
|
|
64
|
+
cc " $dut.pin(:tclk).drive!(0)"
|
|
65
|
+
cc " $dut.pin(:tclk).drive!(0)"
|
|
66
|
+
cc " $dut.pin(:tclk).drive!(1)"
|
|
67
|
+
cc " $dut.pin(:tclk).drive!(1)"
|
|
68
|
+
cc " $dut.pin(:tclk).drive!(1)"
|
|
69
|
+
cc " $dut.pin(:tclk).drive!(1)"
|
|
70
|
+
cc "end"
|
|
71
|
+
end
|
|
72
|
+
64.times do
|
|
73
|
+
$dut.pin(:tclk).drive!(0)
|
|
74
|
+
$dut.pin(:tclk).drive!(0)
|
|
75
|
+
$dut.pin(:tclk).drive!(0)
|
|
76
|
+
$dut.pin(:tclk).drive!(0)
|
|
77
|
+
$dut.pin(:tclk).drive!(1)
|
|
78
|
+
$dut.pin(:tclk).drive!(1)
|
|
79
|
+
$dut.pin(:tclk).drive!(1)
|
|
80
|
+
$dut.pin(:tclk).drive!(1)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
ss do
|
|
84
|
+
cc "Test of period levelling"
|
|
85
|
+
end
|
|
86
|
+
8.times do
|
|
87
|
+
$dut.pin(:tclk).drive!(0)
|
|
88
|
+
$dut.pin(:tclk).drive!(1)
|
|
89
|
+
end
|
|
90
|
+
$tester.set_timeset("nvmbist_readout", 80)
|
|
91
|
+
8.times do
|
|
92
|
+
$dut.pin(:tclk).drive!(0)
|
|
93
|
+
$dut.pin(:tclk).drive!(1)
|
|
94
|
+
end
|
|
95
|
+
$tester.set_timeset("nvmbist", 40)
|
|
96
|
+
|
|
97
|
+
if $tester.vector_group_size == 1
|
|
98
|
+
ss do
|
|
99
|
+
cc "Test that these collapse to a single repeat in the single vector case"
|
|
100
|
+
end
|
|
101
|
+
$dut.pin(:tdi).drive(1)
|
|
102
|
+
$tester.wait cycles: 60000
|
|
103
|
+
$tester.cycle
|
|
104
|
+
$dut.pin(:tdi).dont_care
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
ss do
|
|
108
|
+
cc "Test that these collapse to correct multiple repeats"
|
|
109
|
+
end
|
|
110
|
+
$dut.pin(:tdi).drive(1)
|
|
111
|
+
$tester.wait cycles: 300000
|
|
112
|
+
$dut.pin(:tdi).dont_care
|
|
113
|
+
|
|
114
|
+
ss do
|
|
115
|
+
cc "Verify that comments at the end of the pattern work OK"
|
|
116
|
+
end
|
|
117
|
+
$dut.pin(:tdi).drive(0)
|
|
118
|
+
$tester.wait cycles: 1200
|
|
119
|
+
cc "This comment should appear after the delay 1200"
|
|
120
|
+
$tester.cycle
|
|
121
|
+
|
|
122
|
+
# Don't add anything new here, the above test should be last in this pattern
|
|
123
|
+
|
|
124
|
+
end
|
|
125
|
+
end
|