origen_testers 0.13.1 → 0.13.2

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 (258) hide show
  1. checksums.yaml +4 -4
  2. data/config/application.rb +151 -151
  3. data/config/boot.rb +13 -13
  4. data/config/commands.rb +85 -86
  5. data/config/users.rb +18 -18
  6. data/config/version.rb +8 -8
  7. data/lib/commands/build.rb +69 -69
  8. data/lib/commands/run.rb +48 -48
  9. data/lib/origen_testers.rb +47 -47
  10. data/lib/origen_testers/api.rb +381 -381
  11. data/lib/origen_testers/basic_test_setups.rb +105 -105
  12. data/lib/origen_testers/callback_handlers.rb +59 -59
  13. data/lib/origen_testers/command_based_tester.rb +45 -45
  14. data/lib/origen_testers/flow.rb +382 -382
  15. data/lib/origen_testers/generator.rb +283 -283
  16. data/lib/origen_testers/generator/identity_map.rb +23 -23
  17. data/lib/origen_testers/generator/placeholder.rb +11 -11
  18. data/lib/origen_testers/generator/test_numberer.rb +23 -23
  19. data/lib/origen_testers/igxl_based_tester.rb +12 -12
  20. data/lib/origen_testers/igxl_based_tester/base.rb +1100 -1099
  21. data/lib/origen_testers/igxl_based_tester/base/ac_specsets.rb +79 -79
  22. data/lib/origen_testers/igxl_based_tester/base/custom_test_instance.rb +169 -169
  23. data/lib/origen_testers/igxl_based_tester/base/dc_specsets.rb +98 -98
  24. data/lib/origen_testers/igxl_based_tester/base/edge.rb +60 -60
  25. data/lib/origen_testers/igxl_based_tester/base/edges.rb +24 -24
  26. data/lib/origen_testers/igxl_based_tester/base/edgeset.rb +39 -39
  27. data/lib/origen_testers/igxl_based_tester/base/edgesets.rb +130 -130
  28. data/lib/origen_testers/igxl_based_tester/base/flow.rb +460 -460
  29. data/lib/origen_testers/igxl_based_tester/base/flow_line.rb +276 -276
  30. data/lib/origen_testers/igxl_based_tester/base/generator.rb +607 -607
  31. data/lib/origen_testers/igxl_based_tester/base/global_specs.rb +83 -83
  32. data/lib/origen_testers/igxl_based_tester/base/job.rb +75 -75
  33. data/lib/origen_testers/igxl_based_tester/base/jobs.rb +44 -44
  34. data/lib/origen_testers/igxl_based_tester/base/level_io_se.rb +59 -59
  35. data/lib/origen_testers/igxl_based_tester/base/level_supply.rb +39 -39
  36. data/lib/origen_testers/igxl_based_tester/base/levels.rb +31 -31
  37. data/lib/origen_testers/igxl_based_tester/base/levelset.rb +110 -110
  38. data/lib/origen_testers/igxl_based_tester/base/patgroup.rb +109 -109
  39. data/lib/origen_testers/igxl_based_tester/base/patgroups.rb +38 -38
  40. data/lib/origen_testers/igxl_based_tester/base/patset.rb +68 -68
  41. data/lib/origen_testers/igxl_based_tester/base/patset_pattern.rb +56 -56
  42. data/lib/origen_testers/igxl_based_tester/base/patsets.rb +38 -38
  43. data/lib/origen_testers/igxl_based_tester/base/patsubr.rb +68 -68
  44. data/lib/origen_testers/igxl_based_tester/base/patsubr_pattern.rb +56 -56
  45. data/lib/origen_testers/igxl_based_tester/base/patsubrs.rb +38 -38
  46. data/lib/origen_testers/igxl_based_tester/base/pinmap.rb +93 -93
  47. data/lib/origen_testers/igxl_based_tester/base/references.rb +25 -25
  48. data/lib/origen_testers/igxl_based_tester/base/test_instance.rb +322 -322
  49. data/lib/origen_testers/igxl_based_tester/base/test_instance_group.rb +66 -66
  50. data/lib/origen_testers/igxl_based_tester/base/test_instances.rb +212 -212
  51. data/lib/origen_testers/igxl_based_tester/base/test_instances/custom_til.rb +37 -37
  52. data/lib/origen_testers/igxl_based_tester/base/timeset.rb +37 -37
  53. data/lib/origen_testers/igxl_based_tester/base/timesets.rb +49 -49
  54. data/lib/origen_testers/igxl_based_tester/base/timesets_basic.rb +49 -49
  55. data/lib/origen_testers/igxl_based_tester/files.rb +43 -43
  56. data/lib/origen_testers/igxl_based_tester/j750.rb +269 -269
  57. data/lib/origen_testers/igxl_based_tester/j750/custom_test_instance.rb +32 -32
  58. data/lib/origen_testers/igxl_based_tester/j750/flow.rb +10 -10
  59. data/lib/origen_testers/igxl_based_tester/j750/flow_line.rb +19 -19
  60. data/lib/origen_testers/igxl_based_tester/j750/generator.rb +19 -19
  61. data/lib/origen_testers/igxl_based_tester/j750/patgroup.rb +9 -9
  62. data/lib/origen_testers/igxl_based_tester/j750/patgroups.rb +10 -10
  63. data/lib/origen_testers/igxl_based_tester/j750/patset.rb +9 -9
  64. data/lib/origen_testers/igxl_based_tester/j750/patset_pattern.rb +18 -18
  65. data/lib/origen_testers/igxl_based_tester/j750/patsets.rb +10 -10
  66. data/lib/origen_testers/igxl_based_tester/j750/patsubr.rb +9 -9
  67. data/lib/origen_testers/igxl_based_tester/j750/patsubr_pattern.rb +18 -18
  68. data/lib/origen_testers/igxl_based_tester/j750/patsubrs.rb +10 -10
  69. data/lib/origen_testers/igxl_based_tester/j750/test_instance.rb +746 -746
  70. data/lib/origen_testers/igxl_based_tester/j750/test_instance_group.rb +9 -9
  71. data/lib/origen_testers/igxl_based_tester/j750/test_instances.rb +10 -10
  72. data/lib/origen_testers/igxl_based_tester/j750_hpt.rb +34 -34
  73. data/lib/origen_testers/igxl_based_tester/j750_hpt/custom_test_instance.rb +32 -32
  74. data/lib/origen_testers/igxl_based_tester/j750_hpt/flow.rb +9 -9
  75. data/lib/origen_testers/igxl_based_tester/j750_hpt/flow_line.rb +9 -9
  76. data/lib/origen_testers/igxl_based_tester/j750_hpt/generator.rb +19 -19
  77. data/lib/origen_testers/igxl_based_tester/j750_hpt/patgroup.rb +9 -9
  78. data/lib/origen_testers/igxl_based_tester/j750_hpt/patgroups.rb +9 -9
  79. data/lib/origen_testers/igxl_based_tester/j750_hpt/patset.rb +9 -9
  80. data/lib/origen_testers/igxl_based_tester/j750_hpt/patset_pattern.rb +9 -9
  81. data/lib/origen_testers/igxl_based_tester/j750_hpt/patsets.rb +9 -9
  82. data/lib/origen_testers/igxl_based_tester/j750_hpt/patsubr.rb +9 -9
  83. data/lib/origen_testers/igxl_based_tester/j750_hpt/patsubr_pattern.rb +9 -9
  84. data/lib/origen_testers/igxl_based_tester/j750_hpt/patsubrs.rb +9 -9
  85. data/lib/origen_testers/igxl_based_tester/j750_hpt/test_instance.rb +599 -599
  86. data/lib/origen_testers/igxl_based_tester/j750_hpt/test_instance_group.rb +9 -9
  87. data/lib/origen_testers/igxl_based_tester/j750_hpt/test_instances.rb +9 -9
  88. data/lib/origen_testers/igxl_based_tester/parser.rb +102 -102
  89. data/lib/origen_testers/igxl_based_tester/parser/ac_spec.rb +9 -9
  90. data/lib/origen_testers/igxl_based_tester/parser/dc_spec.rb +33 -33
  91. data/lib/origen_testers/igxl_based_tester/parser/dc_specs.rb +48 -48
  92. data/lib/origen_testers/igxl_based_tester/parser/descriptions.rb +339 -339
  93. data/lib/origen_testers/igxl_based_tester/parser/flow.rb +109 -109
  94. data/lib/origen_testers/igxl_based_tester/parser/flow_line.rb +203 -203
  95. data/lib/origen_testers/igxl_based_tester/parser/flows.rb +21 -21
  96. data/lib/origen_testers/igxl_based_tester/parser/pattern_set.rb +92 -92
  97. data/lib/origen_testers/igxl_based_tester/parser/pattern_sets.rb +31 -31
  98. data/lib/origen_testers/igxl_based_tester/parser/test_instance.rb +420 -420
  99. data/lib/origen_testers/igxl_based_tester/parser/test_instances.rb +24 -24
  100. data/lib/origen_testers/igxl_based_tester/parser/timeset.rb +13 -13
  101. data/lib/origen_testers/igxl_based_tester/ultraflex.rb +798 -798
  102. data/lib/origen_testers/igxl_based_tester/ultraflex/ac_specsets.rb +10 -10
  103. data/lib/origen_testers/igxl_based_tester/ultraflex/ate_hardware.rb +949 -949
  104. data/lib/origen_testers/igxl_based_tester/ultraflex/custom_test_instance.rb +36 -36
  105. data/lib/origen_testers/igxl_based_tester/ultraflex/dc_specsets.rb +10 -10
  106. data/lib/origen_testers/igxl_based_tester/ultraflex/edge.rb +9 -9
  107. data/lib/origen_testers/igxl_based_tester/ultraflex/edges.rb +9 -9
  108. data/lib/origen_testers/igxl_based_tester/ultraflex/edgeset.rb +9 -9
  109. data/lib/origen_testers/igxl_based_tester/ultraflex/edgesets.rb +10 -10
  110. data/lib/origen_testers/igxl_based_tester/ultraflex/flow.rb +158 -158
  111. data/lib/origen_testers/igxl_based_tester/ultraflex/flow_line.rb +19 -19
  112. data/lib/origen_testers/igxl_based_tester/ultraflex/generator.rb +19 -19
  113. data/lib/origen_testers/igxl_based_tester/ultraflex/global_specs.rb +10 -10
  114. data/lib/origen_testers/igxl_based_tester/ultraflex/job.rb +9 -9
  115. data/lib/origen_testers/igxl_based_tester/ultraflex/jobs.rb +10 -10
  116. data/lib/origen_testers/igxl_based_tester/ultraflex/level_io_se.rb +9 -9
  117. data/lib/origen_testers/igxl_based_tester/ultraflex/level_supply.rb +9 -9
  118. data/lib/origen_testers/igxl_based_tester/ultraflex/levels.rb +9 -9
  119. data/lib/origen_testers/igxl_based_tester/ultraflex/levelset.rb +10 -10
  120. data/lib/origen_testers/igxl_based_tester/ultraflex/patgroup.rb +9 -9
  121. data/lib/origen_testers/igxl_based_tester/ultraflex/patgroups.rb +10 -10
  122. data/lib/origen_testers/igxl_based_tester/ultraflex/patset.rb +9 -9
  123. data/lib/origen_testers/igxl_based_tester/ultraflex/patset_pattern.rb +18 -18
  124. data/lib/origen_testers/igxl_based_tester/ultraflex/patsets.rb +10 -10
  125. data/lib/origen_testers/igxl_based_tester/ultraflex/patsubr.rb +9 -9
  126. data/lib/origen_testers/igxl_based_tester/ultraflex/patsubr_pattern.rb +18 -18
  127. data/lib/origen_testers/igxl_based_tester/ultraflex/patsubrs.rb +10 -10
  128. data/lib/origen_testers/igxl_based_tester/ultraflex/pinmap.rb +10 -10
  129. data/lib/origen_testers/igxl_based_tester/ultraflex/references.rb +10 -10
  130. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/ac_specsets.txt.erb +0 -0
  131. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/dc_specsets.txt.erb +0 -0
  132. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/edgesets.txt.erb +0 -0
  133. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/global_specs.txt.erb +0 -0
  134. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/jobs.txt.erb +0 -0
  135. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/levelset.txt.erb +0 -0
  136. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/pinmap.txt.erb +0 -0
  137. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/references.txt.erb +0 -0
  138. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/timesets.txt.erb +0 -0
  139. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/timesets_basic.txt.erb +0 -0
  140. data/lib/origen_testers/igxl_based_tester/ultraflex/test_instance.rb +315 -315
  141. data/lib/origen_testers/igxl_based_tester/ultraflex/test_instance_group.rb +9 -9
  142. data/lib/origen_testers/igxl_based_tester/ultraflex/test_instances.rb +10 -10
  143. data/lib/origen_testers/igxl_based_tester/ultraflex/timeset.rb +9 -9
  144. data/lib/origen_testers/igxl_based_tester/ultraflex/timesets.rb +10 -10
  145. data/lib/origen_testers/igxl_based_tester/ultraflex/timesets_basic.rb +10 -10
  146. data/lib/origen_testers/interface.rb +345 -324
  147. data/lib/origen_testers/memory_style.rb +77 -77
  148. data/lib/origen_testers/no_interface.rb +7 -7
  149. data/lib/origen_testers/origen_ext/application/runner.rb +25 -25
  150. data/lib/origen_testers/origen_ext/generator.rb +54 -54
  151. data/lib/origen_testers/origen_ext/generator/flow.rb +91 -77
  152. data/lib/origen_testers/origen_ext/generator/resources.rb +21 -21
  153. data/lib/origen_testers/origen_ext/pins/pin.rb +78 -78
  154. data/lib/origen_testers/origen_ext/pins/pin_collection.rb +84 -84
  155. data/lib/origen_testers/parser.rb +22 -22
  156. data/lib/origen_testers/parser/description_lookup.rb +62 -62
  157. data/lib/origen_testers/parser/searchable_array.rb +30 -30
  158. data/lib/origen_testers/parser/searchable_hash.rb +30 -30
  159. data/lib/origen_testers/pattern_compilers.rb +116 -116
  160. data/lib/origen_testers/pattern_compilers/assembler.rb +88 -88
  161. data/lib/origen_testers/pattern_compilers/job.rb +96 -96
  162. data/lib/origen_testers/pattern_compilers/ultraflex_pattern_compiler.rb +599 -599
  163. data/lib/origen_testers/program_generators.rb +62 -62
  164. data/lib/origen_testers/smartest_based_tester.rb +8 -8
  165. data/lib/origen_testers/smartest_based_tester/base.rb +576 -567
  166. data/lib/origen_testers/smartest_based_tester/base/flow.rb +296 -291
  167. data/lib/origen_testers/smartest_based_tester/base/generator.rb +207 -194
  168. data/lib/origen_testers/smartest_based_tester/base/pattern_compiler.rb +32 -32
  169. data/lib/origen_testers/smartest_based_tester/base/pattern_master.rb +69 -69
  170. data/lib/origen_testers/smartest_based_tester/base/processors.rb +16 -16
  171. data/lib/origen_testers/smartest_based_tester/base/processors/adjacent_if_combiner.rb +106 -106
  172. data/lib/origen_testers/smartest_based_tester/base/processors/continue_implementer.rb +39 -39
  173. data/lib/origen_testers/smartest_based_tester/base/processors/empty_branch_cleaner.rb +21 -21
  174. data/lib/origen_testers/smartest_based_tester/base/processors/extract_run_flag_table.rb +33 -33
  175. data/lib/origen_testers/smartest_based_tester/base/processors/extract_set_variables.rb +22 -22
  176. data/lib/origen_testers/smartest_based_tester/base/processors/flag_optimizer.rb +188 -188
  177. data/lib/origen_testers/smartest_based_tester/base/processors/if_ran_cleaner.rb +34 -34
  178. data/lib/origen_testers/smartest_based_tester/base/test_method.rb +178 -164
  179. data/lib/origen_testers/smartest_based_tester/base/test_methods.rb +77 -73
  180. data/lib/origen_testers/smartest_based_tester/base/test_methods/ac_tml.rb +33 -33
  181. data/lib/origen_testers/smartest_based_tester/base/test_methods/base_tml.rb +38 -38
  182. data/lib/origen_testers/smartest_based_tester/base/test_methods/custom_tml.rb +19 -19
  183. data/lib/origen_testers/smartest_based_tester/base/test_methods/dc_tml.rb +147 -147
  184. data/lib/origen_testers/smartest_based_tester/base/test_methods/limits.rb +65 -65
  185. data/lib/origen_testers/smartest_based_tester/base/test_suite.rb +208 -193
  186. data/lib/origen_testers/smartest_based_tester/base/test_suites.rb +58 -54
  187. data/lib/origen_testers/smartest_based_tester/base/variables_file.rb +38 -38
  188. data/lib/origen_testers/smartest_based_tester/v93k.rb +8 -8
  189. data/lib/origen_testers/smartest_based_tester/v93k/builder.rb +89 -89
  190. data/lib/origen_testers/smartest_based_tester/v93k/builder/flow.rb +181 -181
  191. data/lib/origen_testers/smartest_based_tester/v93k/builder/pattern_master.rb +54 -54
  192. data/lib/origen_testers/smartest_based_tester/v93k/flow.rb +10 -10
  193. data/lib/origen_testers/smartest_based_tester/v93k/generator.rb +19 -19
  194. data/lib/origen_testers/smartest_based_tester/v93k/pattern_compiler.rb +10 -10
  195. data/lib/origen_testers/smartest_based_tester/v93k/pattern_master.rb +10 -10
  196. data/lib/origen_testers/smartest_based_tester/v93k/templates/template.aiv.erb +17 -17
  197. data/lib/origen_testers/smartest_based_tester/v93k/templates/template.pmfl.erb +13 -13
  198. data/lib/origen_testers/smartest_based_tester/v93k/templates/template.tf.erb +236 -214
  199. data/lib/origen_testers/smartest_based_tester/v93k/templates/vars.tf.erb +48 -48
  200. data/lib/origen_testers/smartest_based_tester/v93k/test_method.rb +9 -9
  201. data/lib/origen_testers/smartest_based_tester/v93k/test_methods.rb +9 -9
  202. data/lib/origen_testers/smartest_based_tester/v93k/test_suite.rb +9 -9
  203. data/lib/origen_testers/smartest_based_tester/v93k/test_suites.rb +9 -9
  204. data/lib/origen_testers/smartest_based_tester/v93k/variables_file.rb +10 -10
  205. data/lib/origen_testers/test/basic_interface.rb +17 -17
  206. data/lib/origen_testers/test/block.rb +21 -21
  207. data/lib/origen_testers/test/custom_test_interface.rb +111 -111
  208. data/lib/origen_testers/test/dut.rb +295 -295
  209. data/lib/origen_testers/test/dut2.rb +76 -76
  210. data/lib/origen_testers/test/dut3.rb +244 -244
  211. data/lib/origen_testers/test/interface.rb +503 -503
  212. data/lib/origen_testers/test/nvm.rb +94 -94
  213. data/lib/origen_testers/timing.rb +368 -368
  214. data/lib/origen_testers/vector.rb +207 -207
  215. data/lib/origen_testers/vector_based_tester.rb +41 -41
  216. data/lib/origen_testers/vector_generator.rb +655 -655
  217. data/lib/origen_testers/vector_pipeline.rb +302 -302
  218. data/pattern/bitmap.rb +7 -7
  219. data/pattern/dc_instr.rb +7 -7
  220. data/pattern/delay.rb +7 -7
  221. data/pattern/freq_counter.rb +6 -6
  222. data/pattern/mem_test.rb +8 -8
  223. data/pattern/multi_vector.rb +122 -122
  224. data/pattern/multi_vector_plus1.rb +125 -125
  225. data/pattern/nvm/j750/add_late_pins.rb +3 -3
  226. data/pattern/nvm/j750/iterator_postfix_test_x_bx.rb +8 -8
  227. data/pattern/nvm/j750/iterator_test_x_bx.rb +8 -8
  228. data/pattern/nvm/j750/j750_halt.rb +159 -159
  229. data/pattern/nvm/j750/j750_workout.rb +209 -209
  230. data/pattern/nvm/j750/timing.rb +73 -73
  231. data/pattern/read_write_reg.rb +61 -61
  232. data/pattern/reset.rb +4 -4
  233. data/pattern/subroutines.rb +69 -69
  234. data/pattern/tester_overlay.rb +61 -52
  235. data/pattern/tester_store.rb +28 -28
  236. data/program/_additional_erase.rb +7 -7
  237. data/program/_efa_resources.rb +7 -7
  238. data/program/_erase.rb +25 -25
  239. data/program/_erase_vfy.rb +5 -5
  240. data/program/_iv_resources.rb +10 -10
  241. data/program/basic_interface.rb +5 -5
  242. data/program/components/_prb1_main.rb +222 -222
  243. data/program/components/_temp.rb +6 -6
  244. data/program/custom_tests.rb +10 -10
  245. data/program/flow_control.rb +422 -422
  246. data/program/prb1.rb +11 -11
  247. data/program/prb1_resources.rb +28 -28
  248. data/program/prb2.rb +27 -27
  249. data/program/test.rb +29 -29
  250. data/program/uflex_resources.rb +199 -199
  251. data/templates/example.txt.erb +53 -53
  252. data/templates/j750/program_sheet.txt.erb +9 -9
  253. data/templates/manifest/v93k.yaml.erb +22 -22
  254. data/templates/web/index.md.erb +51 -51
  255. data/templates/web/layouts/_basic.html.erb +15 -15
  256. data/templates/web/partials/_navbar.html.erb +22 -22
  257. data/templates/web/release_notes.md.erb +5 -5
  258. metadata +2 -2
@@ -1,302 +1,302 @@
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
- if r > 1
113
- vector.comments << '#R' + r.to_s
114
- end
115
- yield vector
116
- (r - 1).times do |index|
117
- vector.comments = ['#R' + (r - 1 - index).to_s]
118
- vector.number += 1
119
- vector.cycle += 1
120
- yield vector
121
- end
122
- @vector_count += r
123
- @cycle_count += r
124
- else
125
- yield vector
126
- @vector_count += 1
127
- @cycle_count += r
128
- end
129
- end
130
-
131
- def level_period(vector)
132
- if $tester.level_period?
133
- vector.convert_to_timeset($tester.min_period_timeset) do |vector|
134
- yield vector
135
- end
136
- else
137
- yield vector
138
- end
139
- end
140
-
141
- # Pushes a duplicate of the given vector with its repeat set to 1
142
- #
143
- # Also clears any comments associated with the vector with the rationale that we only
144
- # want to see them the first time.
145
- #
146
- # Any microcode is cleared with the rationale that the caller is responsible for aligning
147
- # this to the correct vector if required.
148
- def push_duplicate(vector, options = {})
149
- v = vector.dup
150
- v.microcode = nil
151
- v.repeat = 1
152
- pipeline << v
153
- if options[:existing_vector]
154
- v.comments = []
155
- else
156
- vector.comments = []
157
- end
158
- end
159
-
160
- def duplicate_last_vector
161
- v = @last_vector.dup
162
- v.comments = []
163
- v.timeset = $tester.timeset
164
- v.repeat = 1
165
- v.microcode = nil
166
- pipeline << v
167
- end
168
-
169
- def add_repeat_vector(vector)
170
- count = vector.repeat
171
- # Align to the start of a new group by splitting off single vectors
172
- # to complete the current group
173
- while !aligned? && count > 0
174
- push_duplicate(vector)
175
- count -= 1
176
- end
177
- if count > group_size
178
- remainder = count % group_size
179
- # Create a group with the required repeat
180
- group_size.times do
181
- push_duplicate(vector)
182
- end
183
- pipeline.last.repeat = (count - remainder) / group_size
184
- # Then expand out any leftover
185
- remainder.times do
186
- push_duplicate(vector)
187
- end
188
- # For small repeats that fit within the group just expand them
189
- else
190
- while count > 0
191
- push_duplicate(vector)
192
- count -= 1
193
- end
194
- end
195
- end
196
-
197
- # Returns true of the next vector to be added to the pipeline will
198
- # be at the start of a new group
199
- def aligned?
200
- (pipeline.size % group_size) == 0
201
- end
202
-
203
- # Returns true if the next vector to be added to the pipeline will
204
- # complete the current group
205
- def aligned_to_last?
206
- (pipeline.size % group_size) == (group_size - 1)
207
- end
208
-
209
- def consume_comments(vector)
210
- vector.comments = comments
211
- @comments = []
212
- end
213
-
214
- def comments
215
- @comments ||= []
216
- end
217
-
218
- # When true the lead group is complete and a further repeat of it is not possible
219
- # Calling this will compress the 2nd group into the 1st if possible
220
- def lead_group_finalized?
221
- if first_group_present? && second_group_present?
222
- if second_group_is_duplicate_of_first_group? && first_group_repeat != $tester.max_repeat_loop &&
223
- first_group_can_be_compressed?
224
- # Consume the second group by incrementing the first group repeat counter
225
- self.first_group_repeat = first_group_repeat + second_group_repeat
226
- # Delete the second group
227
- group_size.times { pipeline.delete_at(group_size) }
228
-
229
- # Now deal with any overflow of the first group repeat counter
230
- if first_group_repeat > $tester.max_repeat_loop
231
- r = first_group_repeat - $tester.max_repeat_loop
232
- self.first_group_repeat = $tester.max_repeat_loop
233
- group_size.times { |i| push_duplicate(pipeline[i], existing_vector: true) }
234
- self.second_group_repeat = r
235
- true
236
- elsif first_group_repeat == $tester.max_repeat_loop
237
- true
238
- else
239
- false
240
- end
241
- else
242
- # Second group has started and is already different from the first group
243
- true
244
- end
245
- end
246
- end
247
-
248
- def first_group_repeat
249
- # This is currently hardcoded to the Teradyne concept of the repeat being applied
250
- # to the last vector in the group. May need an abstraction here if other ATEs don't
251
- # adhere to that approach.
252
- first_group.last.repeat || 1
253
- end
254
-
255
- def first_group_repeat=(val)
256
- first_group.last.repeat = val
257
- end
258
-
259
- def second_group_repeat
260
- second_group.last.repeat || 1
261
- end
262
-
263
- def second_group_repeat=(val)
264
- second_group.last.repeat = val
265
- end
266
-
267
- def first_group_can_be_compressed?
268
- first_group.all? do |vector|
269
- !vector.dont_compress
270
- end
271
- end
272
-
273
- def second_group_is_duplicate_of_first_group?
274
- i = -1
275
- second_group.all? do |vector|
276
- i += 1
277
- (pipeline[i] == vector) && (vector.comments.size == 0) &&
278
- # Don't consider vectors with matching microcode duplicates, caller is
279
- # responsible for laying out microcode with the correct alignment
280
- !pipeline[i].has_microcode? && !vector.has_microcode? &&
281
- !vector.dont_compress
282
- end
283
- end
284
-
285
- def first_group_present?
286
- lead_group.size == group_size
287
- end
288
-
289
- def second_group_present?
290
- second_group.size == group_size
291
- end
292
-
293
- def lead_group
294
- pipeline[0..group_size - 1]
295
- end
296
- alias_method :first_group, :lead_group
297
-
298
- def second_group
299
- pipeline[group_size..(group_size * 2) - 1]
300
- end
301
- end
302
- end
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
+ if r > 1
113
+ vector.comments << '#R' + r.to_s
114
+ end
115
+ yield vector
116
+ (r - 1).times do |index|
117
+ vector.comments = ['#R' + (r - 1 - index).to_s]
118
+ vector.number += 1
119
+ vector.cycle += 1
120
+ yield vector
121
+ end
122
+ @vector_count += r
123
+ @cycle_count += r
124
+ else
125
+ yield vector
126
+ @vector_count += 1
127
+ @cycle_count += r
128
+ end
129
+ end
130
+
131
+ def level_period(vector)
132
+ if $tester.level_period?
133
+ vector.convert_to_timeset($tester.min_period_timeset) do |vector|
134
+ yield vector
135
+ end
136
+ else
137
+ yield vector
138
+ end
139
+ end
140
+
141
+ # Pushes a duplicate of the given vector with its repeat set to 1
142
+ #
143
+ # Also clears any comments associated with the vector with the rationale that we only
144
+ # want to see them the first time.
145
+ #
146
+ # Any microcode is cleared with the rationale that the caller is responsible for aligning
147
+ # this to the correct vector if required.
148
+ def push_duplicate(vector, options = {})
149
+ v = vector.dup
150
+ v.microcode = nil
151
+ v.repeat = 1
152
+ pipeline << v
153
+ if options[:existing_vector]
154
+ v.comments = []
155
+ else
156
+ vector.comments = []
157
+ end
158
+ end
159
+
160
+ def duplicate_last_vector
161
+ v = @last_vector.dup
162
+ v.comments = []
163
+ v.timeset = $tester.timeset
164
+ v.repeat = 1
165
+ v.microcode = nil
166
+ pipeline << v
167
+ end
168
+
169
+ def add_repeat_vector(vector)
170
+ count = vector.repeat
171
+ # Align to the start of a new group by splitting off single vectors
172
+ # to complete the current group
173
+ while !aligned? && count > 0
174
+ push_duplicate(vector)
175
+ count -= 1
176
+ end
177
+ if count > group_size
178
+ remainder = count % group_size
179
+ # Create a group with the required repeat
180
+ group_size.times do
181
+ push_duplicate(vector)
182
+ end
183
+ pipeline.last.repeat = (count - remainder) / group_size
184
+ # Then expand out any leftover
185
+ remainder.times do
186
+ push_duplicate(vector)
187
+ end
188
+ # For small repeats that fit within the group just expand them
189
+ else
190
+ while count > 0
191
+ push_duplicate(vector)
192
+ count -= 1
193
+ end
194
+ end
195
+ end
196
+
197
+ # Returns true of the next vector to be added to the pipeline will
198
+ # be at the start of a new group
199
+ def aligned?
200
+ (pipeline.size % group_size) == 0
201
+ end
202
+
203
+ # Returns true if the next vector to be added to the pipeline will
204
+ # complete the current group
205
+ def aligned_to_last?
206
+ (pipeline.size % group_size) == (group_size - 1)
207
+ end
208
+
209
+ def consume_comments(vector)
210
+ vector.comments = comments
211
+ @comments = []
212
+ end
213
+
214
+ def comments
215
+ @comments ||= []
216
+ end
217
+
218
+ # When true the lead group is complete and a further repeat of it is not possible
219
+ # Calling this will compress the 2nd group into the 1st if possible
220
+ def lead_group_finalized?
221
+ if first_group_present? && second_group_present?
222
+ if second_group_is_duplicate_of_first_group? && first_group_repeat != $tester.max_repeat_loop &&
223
+ first_group_can_be_compressed?
224
+ # Consume the second group by incrementing the first group repeat counter
225
+ self.first_group_repeat = first_group_repeat + second_group_repeat
226
+ # Delete the second group
227
+ group_size.times { pipeline.delete_at(group_size) }
228
+
229
+ # Now deal with any overflow of the first group repeat counter
230
+ if first_group_repeat > $tester.max_repeat_loop
231
+ r = first_group_repeat - $tester.max_repeat_loop
232
+ self.first_group_repeat = $tester.max_repeat_loop
233
+ group_size.times { |i| push_duplicate(pipeline[i], existing_vector: true) }
234
+ self.second_group_repeat = r
235
+ true
236
+ elsif first_group_repeat == $tester.max_repeat_loop
237
+ true
238
+ else
239
+ false
240
+ end
241
+ else
242
+ # Second group has started and is already different from the first group
243
+ true
244
+ end
245
+ end
246
+ end
247
+
248
+ def first_group_repeat
249
+ # This is currently hardcoded to the Teradyne concept of the repeat being applied
250
+ # to the last vector in the group. May need an abstraction here if other ATEs don't
251
+ # adhere to that approach.
252
+ first_group.last.repeat || 1
253
+ end
254
+
255
+ def first_group_repeat=(val)
256
+ first_group.last.repeat = val
257
+ end
258
+
259
+ def second_group_repeat
260
+ second_group.last.repeat || 1
261
+ end
262
+
263
+ def second_group_repeat=(val)
264
+ second_group.last.repeat = val
265
+ end
266
+
267
+ def first_group_can_be_compressed?
268
+ first_group.all? do |vector|
269
+ !vector.dont_compress
270
+ end
271
+ end
272
+
273
+ def second_group_is_duplicate_of_first_group?
274
+ i = -1
275
+ second_group.all? do |vector|
276
+ i += 1
277
+ (pipeline[i] == vector) && (vector.comments.size == 0) &&
278
+ # Don't consider vectors with matching microcode duplicates, caller is
279
+ # responsible for laying out microcode with the correct alignment
280
+ !pipeline[i].has_microcode? && !vector.has_microcode? &&
281
+ !vector.dont_compress
282
+ end
283
+ end
284
+
285
+ def first_group_present?
286
+ lead_group.size == group_size
287
+ end
288
+
289
+ def second_group_present?
290
+ second_group.size == group_size
291
+ end
292
+
293
+ def lead_group
294
+ pipeline[0..group_size - 1]
295
+ end
296
+ alias_method :first_group, :lead_group
297
+
298
+ def second_group
299
+ pipeline[group_size..(group_size * 2) - 1]
300
+ end
301
+ end
302
+ end