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.
Files changed (199) hide show
  1. checksums.yaml +7 -0
  2. data/config/application.rb +140 -0
  3. data/config/commands.rb +73 -0
  4. data/config/development.rb +12 -0
  5. data/config/environment.rb +1 -0
  6. data/config/shared_commands.rb +47 -0
  7. data/config/users.rb +18 -0
  8. data/config/version.rb +8 -0
  9. data/lib/commands/build.rb +69 -0
  10. data/lib/origen_testers.rb +23 -0
  11. data/lib/origen_testers/api.rb +258 -0
  12. data/lib/origen_testers/basic_test_setups.rb +105 -0
  13. data/lib/origen_testers/callback_handlers.rb +58 -0
  14. data/lib/origen_testers/generator.rb +279 -0
  15. data/lib/origen_testers/generator/flow_control_api.rb +611 -0
  16. data/lib/origen_testers/generator/identity_map.rb +23 -0
  17. data/lib/origen_testers/generator/placeholder.rb +11 -0
  18. data/lib/origen_testers/generator/test_numberer.rb +23 -0
  19. data/lib/origen_testers/igxl_based_tester.rb +12 -0
  20. data/lib/origen_testers/igxl_based_tester/base.rb +641 -0
  21. data/lib/origen_testers/igxl_based_tester/base/flow.rb +171 -0
  22. data/lib/origen_testers/igxl_based_tester/base/flow_line.rb +322 -0
  23. data/lib/origen_testers/igxl_based_tester/base/generator.rb +217 -0
  24. data/lib/origen_testers/igxl_based_tester/base/patgroup.rb +109 -0
  25. data/lib/origen_testers/igxl_based_tester/base/patgroups.rb +38 -0
  26. data/lib/origen_testers/igxl_based_tester/base/patset.rb +68 -0
  27. data/lib/origen_testers/igxl_based_tester/base/patset_pattern.rb +56 -0
  28. data/lib/origen_testers/igxl_based_tester/base/patsets.rb +38 -0
  29. data/lib/origen_testers/igxl_based_tester/base/patsubr.rb +68 -0
  30. data/lib/origen_testers/igxl_based_tester/base/patsubr_pattern.rb +56 -0
  31. data/lib/origen_testers/igxl_based_tester/base/patsubrs.rb +38 -0
  32. data/lib/origen_testers/igxl_based_tester/base/test_instance.rb +326 -0
  33. data/lib/origen_testers/igxl_based_tester/base/test_instance_group.rb +58 -0
  34. data/lib/origen_testers/igxl_based_tester/base/test_instances.rb +179 -0
  35. data/lib/origen_testers/igxl_based_tester/files.rb +43 -0
  36. data/lib/origen_testers/igxl_based_tester/j750.rb +248 -0
  37. data/lib/origen_testers/igxl_based_tester/j750/flow.rb +10 -0
  38. data/lib/origen_testers/igxl_based_tester/j750/flow_line.rb +19 -0
  39. data/lib/origen_testers/igxl_based_tester/j750/generator.rb +19 -0
  40. data/lib/origen_testers/igxl_based_tester/j750/patgroup.rb +9 -0
  41. data/lib/origen_testers/igxl_based_tester/j750/patgroups.rb +10 -0
  42. data/lib/origen_testers/igxl_based_tester/j750/patset.rb +9 -0
  43. data/lib/origen_testers/igxl_based_tester/j750/patset_pattern.rb +18 -0
  44. data/lib/origen_testers/igxl_based_tester/j750/patsets.rb +10 -0
  45. data/lib/origen_testers/igxl_based_tester/j750/patsubr.rb +9 -0
  46. data/lib/origen_testers/igxl_based_tester/j750/patsubr_pattern.rb +18 -0
  47. data/lib/origen_testers/igxl_based_tester/j750/patsubrs.rb +10 -0
  48. data/lib/origen_testers/igxl_based_tester/j750/templates/flow.txt.erb +9 -0
  49. data/lib/origen_testers/igxl_based_tester/j750/templates/instances.txt.erb +16 -0
  50. data/lib/origen_testers/igxl_based_tester/j750/templates/patgroups.txt.erb +8 -0
  51. data/lib/origen_testers/igxl_based_tester/j750/templates/patsets.txt.erb +10 -0
  52. data/lib/origen_testers/igxl_based_tester/j750/templates/patsubrs.txt.erb +10 -0
  53. data/lib/origen_testers/igxl_based_tester/j750/test_instance.rb +547 -0
  54. data/lib/origen_testers/igxl_based_tester/j750/test_instance_group.rb +9 -0
  55. data/lib/origen_testers/igxl_based_tester/j750/test_instances.rb +10 -0
  56. data/lib/origen_testers/igxl_based_tester/j750_hpt.rb +34 -0
  57. data/lib/origen_testers/igxl_based_tester/j750_hpt/flow.rb +9 -0
  58. data/lib/origen_testers/igxl_based_tester/j750_hpt/flow_line.rb +9 -0
  59. data/lib/origen_testers/igxl_based_tester/j750_hpt/generator.rb +19 -0
  60. data/lib/origen_testers/igxl_based_tester/j750_hpt/patgroup.rb +9 -0
  61. data/lib/origen_testers/igxl_based_tester/j750_hpt/patgroups.rb +9 -0
  62. data/lib/origen_testers/igxl_based_tester/j750_hpt/patset.rb +9 -0
  63. data/lib/origen_testers/igxl_based_tester/j750_hpt/patset_pattern.rb +9 -0
  64. data/lib/origen_testers/igxl_based_tester/j750_hpt/patsets.rb +9 -0
  65. data/lib/origen_testers/igxl_based_tester/j750_hpt/patsubr.rb +9 -0
  66. data/lib/origen_testers/igxl_based_tester/j750_hpt/patsubr_pattern.rb +9 -0
  67. data/lib/origen_testers/igxl_based_tester/j750_hpt/patsubrs.rb +9 -0
  68. data/lib/origen_testers/igxl_based_tester/j750_hpt/test_instance.rb +515 -0
  69. data/lib/origen_testers/igxl_based_tester/j750_hpt/test_instance_group.rb +9 -0
  70. data/lib/origen_testers/igxl_based_tester/j750_hpt/test_instances.rb +9 -0
  71. data/lib/origen_testers/igxl_based_tester/parser.rb +102 -0
  72. data/lib/origen_testers/igxl_based_tester/parser/ac_spec.rb +9 -0
  73. data/lib/origen_testers/igxl_based_tester/parser/ac_specs.rb +0 -0
  74. data/lib/origen_testers/igxl_based_tester/parser/dc_spec.rb +33 -0
  75. data/lib/origen_testers/igxl_based_tester/parser/dc_specs.rb +48 -0
  76. data/lib/origen_testers/igxl_based_tester/parser/descriptions.rb +339 -0
  77. data/lib/origen_testers/igxl_based_tester/parser/flow.rb +109 -0
  78. data/lib/origen_testers/igxl_based_tester/parser/flow_line.rb +203 -0
  79. data/lib/origen_testers/igxl_based_tester/parser/flows.rb +21 -0
  80. data/lib/origen_testers/igxl_based_tester/parser/pattern_set.rb +92 -0
  81. data/lib/origen_testers/igxl_based_tester/parser/pattern_sets.rb +31 -0
  82. data/lib/origen_testers/igxl_based_tester/parser/test_instance.rb +341 -0
  83. data/lib/origen_testers/igxl_based_tester/parser/test_instances.rb +24 -0
  84. data/lib/origen_testers/igxl_based_tester/parser/timeset.rb +13 -0
  85. data/lib/origen_testers/igxl_based_tester/parser/timesets.rb +0 -0
  86. data/lib/origen_testers/igxl_based_tester/ultraflex.rb +477 -0
  87. data/lib/origen_testers/igxl_based_tester/ultraflex/flow.rb +10 -0
  88. data/lib/origen_testers/igxl_based_tester/ultraflex/flow_line.rb +19 -0
  89. data/lib/origen_testers/igxl_based_tester/ultraflex/generator.rb +19 -0
  90. data/lib/origen_testers/igxl_based_tester/ultraflex/patgroup.rb +9 -0
  91. data/lib/origen_testers/igxl_based_tester/ultraflex/patgroups.rb +10 -0
  92. data/lib/origen_testers/igxl_based_tester/ultraflex/patset.rb +9 -0
  93. data/lib/origen_testers/igxl_based_tester/ultraflex/patset_pattern.rb +18 -0
  94. data/lib/origen_testers/igxl_based_tester/ultraflex/patsets.rb +10 -0
  95. data/lib/origen_testers/igxl_based_tester/ultraflex/patsubr.rb +9 -0
  96. data/lib/origen_testers/igxl_based_tester/ultraflex/patsubr_pattern.rb +18 -0
  97. data/lib/origen_testers/igxl_based_tester/ultraflex/patsubrs.rb +10 -0
  98. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/flow.txt.erb +9 -0
  99. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/instances.txt.erb +16 -0
  100. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/patgroups.txt.erb +9 -0
  101. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/patsets.txt.erb +10 -0
  102. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/patsubrs.txt.erb +10 -0
  103. data/lib/origen_testers/igxl_based_tester/ultraflex/test_instance.rb +270 -0
  104. data/lib/origen_testers/igxl_based_tester/ultraflex/test_instance_group.rb +9 -0
  105. data/lib/origen_testers/igxl_based_tester/ultraflex/test_instances.rb +10 -0
  106. data/lib/origen_testers/interface.rb +183 -0
  107. data/lib/origen_testers/parser.rb +22 -0
  108. data/lib/origen_testers/parser/description_lookup.rb +62 -0
  109. data/lib/origen_testers/parser/searchable_array.rb +30 -0
  110. data/lib/origen_testers/parser/searchable_hash.rb +30 -0
  111. data/lib/origen_testers/pattern_compilers.rb +116 -0
  112. data/lib/origen_testers/pattern_compilers/assembler.rb +88 -0
  113. data/lib/origen_testers/pattern_compilers/job.rb +96 -0
  114. data/lib/origen_testers/pattern_compilers/ultraflex_pattern_compiler.rb +599 -0
  115. data/lib/origen_testers/program_generators.rb +55 -0
  116. data/lib/origen_testers/smartest_based_tester.rb +8 -0
  117. data/lib/origen_testers/smartest_based_tester/base.rb +411 -0
  118. data/lib/origen_testers/smartest_based_tester/base/flow.rb +188 -0
  119. data/lib/origen_testers/smartest_based_tester/base/flow_node.rb +476 -0
  120. data/lib/origen_testers/smartest_based_tester/base/generator.rb +123 -0
  121. data/lib/origen_testers/smartest_based_tester/base/pattern_compiler.rb +23 -0
  122. data/lib/origen_testers/smartest_based_tester/base/pattern_master.rb +47 -0
  123. data/lib/origen_testers/smartest_based_tester/base/test_method.rb +143 -0
  124. data/lib/origen_testers/smartest_based_tester/base/test_methods.rb +73 -0
  125. data/lib/origen_testers/smartest_based_tester/base/test_methods/ac_tml.rb +33 -0
  126. data/lib/origen_testers/smartest_based_tester/base/test_methods/base_tml.rb +38 -0
  127. data/lib/origen_testers/smartest_based_tester/base/test_methods/custom_tml.rb +19 -0
  128. data/lib/origen_testers/smartest_based_tester/base/test_methods/dc_tml.rb +147 -0
  129. data/lib/origen_testers/smartest_based_tester/base/test_methods/limits.rb +43 -0
  130. data/lib/origen_testers/smartest_based_tester/base/test_suite.rb +166 -0
  131. data/lib/origen_testers/smartest_based_tester/base/test_suites.rb +58 -0
  132. data/lib/origen_testers/smartest_based_tester/v93k.rb +8 -0
  133. data/lib/origen_testers/smartest_based_tester/v93k/builder.rb +89 -0
  134. data/lib/origen_testers/smartest_based_tester/v93k/builder/flow.rb +169 -0
  135. data/lib/origen_testers/smartest_based_tester/v93k/builder/pattern_master.rb +54 -0
  136. data/lib/origen_testers/smartest_based_tester/v93k/flow.rb +10 -0
  137. data/lib/origen_testers/smartest_based_tester/v93k/flow_node.rb +9 -0
  138. data/lib/origen_testers/smartest_based_tester/v93k/generator.rb +19 -0
  139. data/lib/origen_testers/smartest_based_tester/v93k/pattern_compiler.rb +10 -0
  140. data/lib/origen_testers/smartest_based_tester/v93k/pattern_master.rb +10 -0
  141. data/lib/origen_testers/smartest_based_tester/v93k/templates/template.aiv.erb +17 -0
  142. data/lib/origen_testers/smartest_based_tester/v93k/templates/template.flow.erb +201 -0
  143. data/lib/origen_testers/smartest_based_tester/v93k/templates/template.pmfl.erb +13 -0
  144. data/lib/origen_testers/smartest_based_tester/v93k/test_method.rb +9 -0
  145. data/lib/origen_testers/smartest_based_tester/v93k/test_methods.rb +9 -0
  146. data/lib/origen_testers/smartest_based_tester/v93k/test_suite.rb +9 -0
  147. data/lib/origen_testers/smartest_based_tester/v93k/test_suites.rb +9 -0
  148. data/lib/origen_testers/test/basic_interface.rb +17 -0
  149. data/lib/origen_testers/test/block.rb +21 -0
  150. data/lib/origen_testers/test/dut.rb +184 -0
  151. data/lib/origen_testers/test/dut2.rb +76 -0
  152. data/lib/origen_testers/test/j750_base_interface.rb +119 -0
  153. data/lib/origen_testers/test/j750_hpt_interface.rb +8 -0
  154. data/lib/origen_testers/test/j750_interface.rb +8 -0
  155. data/lib/origen_testers/test/nvm.rb +94 -0
  156. data/lib/origen_testers/test/ultraflex_interface.rb +110 -0
  157. data/lib/origen_testers/test/v93k_interface.rb +115 -0
  158. data/lib/origen_testers/timing.rb +362 -0
  159. data/lib/origen_testers/vector.rb +203 -0
  160. data/lib/origen_testers/vector_based_tester.rb +42 -0
  161. data/lib/origen_testers/vector_generator.rb +623 -0
  162. data/lib/origen_testers/vector_pipeline.rb +288 -0
  163. data/pattern/dc_instr.rb +7 -0
  164. data/pattern/delay.rb +7 -0
  165. data/pattern/mem_test.rb +8 -0
  166. data/pattern/multi_vector.rb +117 -0
  167. data/pattern/multi_vector_plus1.rb +125 -0
  168. data/pattern/nvm/j750/add_late_pins.rb +3 -0
  169. data/pattern/nvm/j750/iterator_postfix_test_x_bx.rb +8 -0
  170. data/pattern/nvm/j750/iterator_test_x_bx.rb +8 -0
  171. data/pattern/nvm/j750/j750_halt.rb +159 -0
  172. data/pattern/nvm/j750/j750_workout.rb +202 -0
  173. data/pattern/nvm/j750/timing.rb +73 -0
  174. data/pattern/nvm/v93k/v93k_workout.rb +136 -0
  175. data/pattern/read_write_reg.rb +58 -0
  176. data/pattern/reset.rb +4 -0
  177. data/pattern/subroutines.rb +38 -0
  178. data/program/_additional_erase.rb +7 -0
  179. data/program/_efa_resources.rb +7 -0
  180. data/program/_erase.rb +25 -0
  181. data/program/_erase_vfy.rb +5 -0
  182. data/program/_iv_resources.rb +10 -0
  183. data/program/basic_interface.rb +5 -0
  184. data/program/components/_prb2_main.rb +6 -0
  185. data/program/flow_control.rb +164 -0
  186. data/program/prb1.rb +226 -0
  187. data/program/prb1_resources.rb +28 -0
  188. data/program/prb2.rb +40 -0
  189. data/program/test.rb +20 -0
  190. data/templates/example.txt.erb +53 -0
  191. data/templates/j750/_vt_flow.txt.erb +8 -0
  192. data/templates/j750/_vt_instances.txt.erb +4 -0
  193. data/templates/j750/program_sheet.txt.erb +9 -0
  194. data/templates/manifest/v93k.yaml.erb +22 -0
  195. data/templates/web/index.md.erb +51 -0
  196. data/templates/web/layouts/_basic.html.erb +15 -0
  197. data/templates/web/partials/_navbar.html.erb +22 -0
  198. data/templates/web/release_notes.md.erb +5 -0
  199. 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
@@ -0,0 +1,7 @@
1
+ # Pattern to exercise the DC instrument test feature of tester
2
+
3
+ Pattern.create() do
4
+
5
+ # Execute standard soc method -- pins should magically get set with Pset if needed here
6
+
7
+ end
data/pattern/delay.rb ADDED
@@ -0,0 +1,7 @@
1
+ # Pattern to exercise a simple time delay
2
+
3
+ Pattern.create() do
4
+
5
+ $tester.wait(:time_in_ms => 40)
6
+
7
+ end
@@ -0,0 +1,8 @@
1
+ unless $tester.v93k?
2
+ # Pattern to exercise the memory test feature of tester
3
+ Pattern.create(:memory_test => true) do
4
+
5
+ $dut.memory_test
6
+
7
+ end
8
+ end
@@ -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