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,37 +1,37 @@
1
- module OrigenTesters
2
- module IGXLBasedTester
3
- class Base
4
- class TestInstances
5
- # Custom Test Instance library
6
- class CustomTil
7
- # Returns the test_instances object for the current flow
8
- attr_reader :test_instances
9
- attr_reader :definitions
10
-
11
- def initialize(test_instances, definitions)
12
- @test_instances = test_instances
13
- @definitions = definitions
14
- end
15
-
16
- def method_missing(method, *args, &block)
17
- if definitions[method]
18
- name = args.shift
19
- ti = platform::CustomTestInstance.new name, methods: definitions[method].dup,
20
- attrs: (args.first || {}),
21
- type: method,
22
- library: self
23
- test_instances.add(nil, ti)
24
- ti
25
- else
26
- super
27
- end
28
- end
29
-
30
- def platform
31
- test_instances.platform
32
- end
33
- end
34
- end
35
- end
36
- end
37
- end
1
+ module OrigenTesters
2
+ module IGXLBasedTester
3
+ class Base
4
+ class TestInstances
5
+ # Custom Test Instance library
6
+ class CustomTil
7
+ # Returns the test_instances object for the current flow
8
+ attr_reader :test_instances
9
+ attr_reader :definitions
10
+
11
+ def initialize(test_instances, definitions)
12
+ @test_instances = test_instances
13
+ @definitions = definitions
14
+ end
15
+
16
+ def method_missing(method, *args, &block)
17
+ if definitions[method]
18
+ name = args.shift
19
+ ti = platform::CustomTestInstance.new name, methods: definitions[method].dup,
20
+ attrs: (args.first || {}),
21
+ type: method,
22
+ library: self
23
+ test_instances.add(nil, ti)
24
+ ti
25
+ else
26
+ super
27
+ end
28
+ end
29
+
30
+ def platform
31
+ test_instances.platform
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -1,37 +1,37 @@
1
- module OrigenTesters
2
- module IGXLBasedTester
3
- class Base
4
- class Timeset
5
- attr_accessor :master_ts, :t_mode # Timeset information
6
- attr_accessor :pins
7
- attr_accessor :name
8
-
9
- # Specify timeset information by providing a pin and its associated edge timing
10
- def initialize(name, pin, edge, attrs = {}) # :nodoc:
11
- attrs = {
12
- master_ts: '', # master timeset name
13
- t_mode: '' # timing mode (possibly ATE-specific)
14
- }.merge(attrs)
15
- @master_ts = attrs[:master_ts]
16
- @t_mode = attrs[:t_mode]
17
- @pins = { pin => edge }
18
- self.name = name
19
- end
20
-
21
- # Assigns a timing edge object to the given pin for this timeset
22
- def add_edge(pin, edge)
23
- if @pins.key?(pin)
24
- Origen.log.error "Pin #{pin} already exists in timeset"
25
- fail
26
- else
27
- @pins[pin] = edge
28
- end
29
- end
30
-
31
- def platform
32
- Origen.interface.platform
33
- end
34
- end
35
- end
36
- end
37
- end
1
+ module OrigenTesters
2
+ module IGXLBasedTester
3
+ class Base
4
+ class Timeset
5
+ attr_accessor :master_ts, :t_mode # Timeset information
6
+ attr_accessor :pins
7
+ attr_accessor :name
8
+
9
+ # Specify timeset information by providing a pin and its associated edge timing
10
+ def initialize(name, pin, edge, attrs = {}) # :nodoc:
11
+ attrs = {
12
+ master_ts: '', # master timeset name
13
+ t_mode: '' # timing mode (possibly ATE-specific)
14
+ }.merge(attrs)
15
+ @master_ts = attrs[:master_ts]
16
+ @t_mode = attrs[:t_mode]
17
+ @pins = { pin => edge }
18
+ self.name = name
19
+ end
20
+
21
+ # Assigns a timing edge object to the given pin for this timeset
22
+ def add_edge(pin, edge)
23
+ if @pins.key?(pin)
24
+ Origen.log.error "Pin #{pin} already exists in timeset"
25
+ fail
26
+ else
27
+ @pins[pin] = edge
28
+ end
29
+ end
30
+
31
+ def platform
32
+ Origen.interface.platform
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -1,49 +1,49 @@
1
- module OrigenTesters
2
- module IGXLBasedTester
3
- class Base
4
- class Timesets
5
- include ::OrigenTesters::Generator
6
-
7
- attr_accessor :ts
8
- attr_accessor :ts_sheet_pins
9
- attr_accessor :ts_basic
10
-
11
- OUTPUT_PREFIX = 'TS'
12
- # OUTPUT_POSTFIX = 'TS'
13
-
14
- def initialize(options = {}) # :nodoc:
15
- @ts = {}
16
- @ts_basic = options[:timeset_basic]
17
- end
18
-
19
- def add(tsname, pin, esname, options = {})
20
- tsname = tsname.to_sym unless tsname.is_a? Symbol
21
- pin = pin.to_sym unless pin.is_a? Symbol
22
- esname = pin.to_sym unless esname.is_a? Symbol
23
- @ts.key?(tsname) ? @ts[tsname].add_edge(pin, esname) : @ts[tsname] = platform::Timeset.new(tsname, pin, esname, options)
24
- @ts_sheet_pins = options[:ts_sheet_pins] unless @ts_sheet_pins
25
- @ts[tsname]
26
- end
27
-
28
- def finalize(options = {})
29
- end
30
-
31
- # Populate an array of pins based on the pin or pingroup
32
- def get_pin_objects(grp)
33
- pins = []
34
- if Origen.top_level.pin(grp).is_a?(Origen::Pins::Pin) ||
35
- Origen.top_level.pin(grp).is_a?(Origen::Pins::FunctionProxy)
36
- pins << Origen.top_level.pin(grp)
37
- elsif Origen.top_level.pin(grp).is_a?(Origen::Pins::PinCollection)
38
- Origen.top_level.pin(grp).each do |pin|
39
- pins << pin
40
- end
41
- else
42
- Origen.log.error "Could not find pin class: #{grp} #{Origen.top_level.pin(grp).class}"
43
- end
44
- pins
45
- end
46
- end
47
- end
48
- end
49
- end
1
+ module OrigenTesters
2
+ module IGXLBasedTester
3
+ class Base
4
+ class Timesets
5
+ include ::OrigenTesters::Generator
6
+
7
+ attr_accessor :ts
8
+ attr_accessor :ts_sheet_pins
9
+ attr_accessor :ts_basic
10
+
11
+ OUTPUT_PREFIX = 'TS'
12
+ # OUTPUT_POSTFIX = 'TS'
13
+
14
+ def initialize(options = {}) # :nodoc:
15
+ @ts = {}
16
+ @ts_basic = options[:timeset_basic]
17
+ end
18
+
19
+ def add(tsname, pin, esname, options = {})
20
+ tsname = tsname.to_sym unless tsname.is_a? Symbol
21
+ pin = pin.to_sym unless pin.is_a? Symbol
22
+ esname = pin.to_sym unless esname.is_a? Symbol
23
+ @ts.key?(tsname) ? @ts[tsname].add_edge(pin, esname) : @ts[tsname] = platform::Timeset.new(tsname, pin, esname, options)
24
+ @ts_sheet_pins = options[:ts_sheet_pins] unless @ts_sheet_pins
25
+ @ts[tsname]
26
+ end
27
+
28
+ def finalize(options = {})
29
+ end
30
+
31
+ # Populate an array of pins based on the pin or pingroup
32
+ def get_pin_objects(grp)
33
+ pins = []
34
+ if Origen.top_level.pin(grp).is_a?(Origen::Pins::Pin) ||
35
+ Origen.top_level.pin(grp).is_a?(Origen::Pins::FunctionProxy)
36
+ pins << Origen.top_level.pin(grp)
37
+ elsif Origen.top_level.pin(grp).is_a?(Origen::Pins::PinCollection)
38
+ Origen.top_level.pin(grp).each do |pin|
39
+ pins << pin
40
+ end
41
+ else
42
+ Origen.log.error "Could not find pin class: #{grp} #{Origen.top_level.pin(grp).class}"
43
+ end
44
+ pins
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -1,49 +1,49 @@
1
- module OrigenTesters
2
- module IGXLBasedTester
3
- class Base
4
- class TimesetsBasic
5
- include ::OrigenTesters::Generator
6
-
7
- attr_accessor :ts
8
- attr_accessor :ts_sheet_pins
9
- attr_accessor :ts_basic
10
-
11
- OUTPUT_PREFIX = 'TSB'
12
- # OUTPUT_POSTFIX = 'TS'
13
-
14
- def initialize(options = {}) # :nodoc:
15
- @ts = {}
16
- @ts_basic = options[:timeset_basic]
17
- end
18
-
19
- def add(tsname, pin, esname, options = {})
20
- tsname = tsname.to_sym unless tsname.is_a? Symbol
21
- pin = pin.to_sym unless pin.is_a? Symbol
22
- esname = pin.to_sym unless esname.is_a? Symbol
23
- @ts.key?(tsname) ? @ts[tsname].add_edge(pin, esname) : @ts[tsname] = platform::Timeset.new(tsname, pin, esname, options)
24
- @ts_sheet_pins = options[:ts_sheet_pins] unless @ts_sheet_pins
25
- @ts[tsname]
26
- end
27
-
28
- def finalize(options = {})
29
- end
30
-
31
- # Populate an array of pins based on the pin or pingroup
32
- def get_pin_objects(grp)
33
- pins = []
34
- if Origen.top_level.pin(grp).is_a?(Origen::Pins::Pin) ||
35
- Origen.top_level.pin(grp).is_a?(Origen::Pins::FunctionProxy)
36
- pins << Origen.top_level.pin(grp)
37
- elsif Origen.top_level.pin(grp).is_a?(Origen::Pins::PinCollection)
38
- Origen.top_level.pin(grp).each do |pin|
39
- pins << pin
40
- end
41
- else
42
- Origen.log.error "Could not find pin class: #{grp} #{Origen.top_level.pin(grp).class}"
43
- end
44
- pins
45
- end
46
- end
47
- end
48
- end
49
- end
1
+ module OrigenTesters
2
+ module IGXLBasedTester
3
+ class Base
4
+ class TimesetsBasic
5
+ include ::OrigenTesters::Generator
6
+
7
+ attr_accessor :ts
8
+ attr_accessor :ts_sheet_pins
9
+ attr_accessor :ts_basic
10
+
11
+ OUTPUT_PREFIX = 'TSB'
12
+ # OUTPUT_POSTFIX = 'TS'
13
+
14
+ def initialize(options = {}) # :nodoc:
15
+ @ts = {}
16
+ @ts_basic = options[:timeset_basic]
17
+ end
18
+
19
+ def add(tsname, pin, esname, options = {})
20
+ tsname = tsname.to_sym unless tsname.is_a? Symbol
21
+ pin = pin.to_sym unless pin.is_a? Symbol
22
+ esname = pin.to_sym unless esname.is_a? Symbol
23
+ @ts.key?(tsname) ? @ts[tsname].add_edge(pin, esname) : @ts[tsname] = platform::Timeset.new(tsname, pin, esname, options)
24
+ @ts_sheet_pins = options[:ts_sheet_pins] unless @ts_sheet_pins
25
+ @ts[tsname]
26
+ end
27
+
28
+ def finalize(options = {})
29
+ end
30
+
31
+ # Populate an array of pins based on the pin or pingroup
32
+ def get_pin_objects(grp)
33
+ pins = []
34
+ if Origen.top_level.pin(grp).is_a?(Origen::Pins::Pin) ||
35
+ Origen.top_level.pin(grp).is_a?(Origen::Pins::FunctionProxy)
36
+ pins << Origen.top_level.pin(grp)
37
+ elsif Origen.top_level.pin(grp).is_a?(Origen::Pins::PinCollection)
38
+ Origen.top_level.pin(grp).each do |pin|
39
+ pins << pin
40
+ end
41
+ else
42
+ Origen.log.error "Could not find pin class: #{grp} #{Origen.top_level.pin(grp).class}"
43
+ end
44
+ pins
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -1,43 +1,43 @@
1
- module OrigenTesters
2
- module IGXLBasedTester
3
- # Methods for handling all J750 file parsing, e.g. datalogs,
4
- # test time profiles, etc.
5
- module Files
6
- # Reads all lines from a J750 detailed execution time file, returning the lines
7
- # as an array like this:
8
- #
9
- # [
10
- # {:name => "power_cycle", :index => 1, :group => 3, :time => 0.00461},
11
- # {:name => "power_cycle", :index => 2, :group => 3, :time => 0.00481},
12
- # {:name => "power_cycle", :index => 3, :group => 3, :time => 0.00438},
13
- # {:name => "nvm_mass_erase", :index => nil, :group => nil, :time => 0.19863},
14
- # ]
15
- def read_test_times(file, options = {})
16
- tests = []
17
- File.readlines(file).each do |line|
18
- unless line.strip.empty? || line =~ /Entire Job/
19
- # http://rubular.com/r/vZOcqovTsf
20
- if line =~ /(\w+) ?(\(.*?\))? \d\d\d\d (\d+\.\d+).*/
21
- t = { name: Regexp.last_match[1], time: Regexp.last_match[3].to_f.round(6) }
22
- # If an indexed test
23
- if Regexp.last_match[2]
24
- str = Regexp.last_match[2].gsub('(', '').gsub(')', '')
25
- fields = str.split('/')
26
- i = fields[0].to_i
27
- g = fields[1].to_i
28
- t[:index] = i
29
- t[:group] = g
30
-
31
- else
32
- t[:index] = nil
33
- t[:group] = nil
34
- end
35
- tests << t
36
- end
37
- end
38
- end
39
- tests
40
- end
41
- end
42
- end
43
- end
1
+ module OrigenTesters
2
+ module IGXLBasedTester
3
+ # Methods for handling all J750 file parsing, e.g. datalogs,
4
+ # test time profiles, etc.
5
+ module Files
6
+ # Reads all lines from a J750 detailed execution time file, returning the lines
7
+ # as an array like this:
8
+ #
9
+ # [
10
+ # {:name => "power_cycle", :index => 1, :group => 3, :time => 0.00461},
11
+ # {:name => "power_cycle", :index => 2, :group => 3, :time => 0.00481},
12
+ # {:name => "power_cycle", :index => 3, :group => 3, :time => 0.00438},
13
+ # {:name => "nvm_mass_erase", :index => nil, :group => nil, :time => 0.19863},
14
+ # ]
15
+ def read_test_times(file, options = {})
16
+ tests = []
17
+ File.readlines(file).each do |line|
18
+ unless line.strip.empty? || line =~ /Entire Job/
19
+ # http://rubular.com/r/vZOcqovTsf
20
+ if line =~ /(\w+) ?(\(.*?\))? \d\d\d\d (\d+\.\d+).*/
21
+ t = { name: Regexp.last_match[1], time: Regexp.last_match[3].to_f.round(6) }
22
+ # If an indexed test
23
+ if Regexp.last_match[2]
24
+ str = Regexp.last_match[2].gsub('(', '').gsub(')', '')
25
+ fields = str.split('/')
26
+ i = fields[0].to_i
27
+ g = fields[1].to_i
28
+ t[:index] = i
29
+ t[:group] = g
30
+
31
+ else
32
+ t[:index] = nil
33
+ t[:group] = nil
34
+ end
35
+ tests << t
36
+ end
37
+ end
38
+ end
39
+ tests
40
+ end
41
+ end
42
+ end
43
+ end
@@ -1,269 +1,269 @@
1
- module OrigenTesters
2
- module IGXLBasedTester
3
- # Tester model to generate .atp patterns for the Teradyne J750
4
- #
5
- # == Basic Usage
6
- # $tester = Testers::J750.new
7
- # $tester.cycle # Generate a vector
8
- #
9
- # Many more methods exist to generate J750 specific micro-code, see below for
10
- # details.
11
- #
12
- # Also note that this class inherits from the base Tester class and so all methods
13
- # described there are also available.
14
- class J750 < Base
15
- require 'origen_testers/igxl_based_tester/j750/generator.rb'
16
-
17
- attr_accessor :use_hv_pin
18
- attr_accessor :software_version
19
-
20
- def self.hpt_mode
21
- @@hpt_mode
22
- end
23
- def self.hpt_mode?
24
- @@hpt_mode
25
- end
26
-
27
- # Returns a new J750 instance, normally there would only ever be one of these
28
- # assigned to the global variable such as $tester by your target.
29
- def initialize
30
- super
31
- @pipeline_depth = 34 # for extended mode is vectors, for normal mode is vector pairs (54 for J750Ex)
32
- @use_hv_pin = false # allows to use high voltage for a pin for all patterns
33
- @software_version = '3.50.40'
34
- @name = 'j750'
35
- @@hpt_mode = false
36
- @opcode_mode = :extended
37
- @loop_bits_max = 16 # maximum loop bit length
38
-
39
- @flags = %w(cpuA cpuB cpuC cpuD)
40
- @microcode[:enable] = 'enable'
41
- @microcode[:set_flag] = 'set_cpu'
42
- @microcode[:mask_vector] = 'ign ifc icc'
43
- @microcode[:keepalive] = 'keep_alive'
44
- end
45
-
46
- def pattern_header(options = {})
47
- super(options) do |pin_list|
48
- microcode "vector ($tset, #{pin_list})"
49
- microcode '{'
50
- unless options[:subroutine_pat]
51
- microcode 'start_label pattern_st:'
52
- end
53
- end
54
- end
55
-
56
- def pattern_footer(options = {})
57
- super(options)
58
- end
59
-
60
- # Generates a match loop based on vector condition passed in via block
61
- #
62
- # This method is not really intended to be called directly, rather you should call
63
- # via Tester#wait:
64
- # e.g. $tester.wait(:match => true) do
65
- # reg(:status_reg).bit(:done).read(1)! # vector condition that you want to match
66
- # end
67
- #
68
- # The timeout should be provided in cycles, however when called via the wait method the
69
- # time-based helpers (time_in_us, etc) will be converted to cycles for you.
70
- #
71
- # The following options are available to tailor the match loop behavior, defaults in
72
- # parenthesis:
73
- # * :check_for_fails (false) - Flushes the pipeline and handshakes with the tester (passing readcode 100) prior to the match (to allow binout of fails encountered before the match)
74
- # * :force_fail_on_timeout (true) - Force a vector mis-compare if the match loop times out
75
- # * :on_timeout_goto ("") - Optionally supply a label to branch to on timeout, by default will continue from the end of the match loop
76
- # * :on_block_match_goto ("") - Optionally supply a label to branch to when block condition is met, by default will continue from the end of the match loop.
77
- # A hash will also be accepted for this argument to supply a specific label (or no label) for each block e.g. {0 => "on_block_0_fail"}
78
- # * :multiple_entries (false) - Supply an integer to generate multiple entries into the match (each with a unique readcode), this can be useful when debugging patterns with multiple matches
79
- # * :force_fail_on_timeout (true) - force pattern to fail if timeout occurs
80
- # * :global_loops (false) - whether match loop loops should use global labels
81
- # * :manual_stop (false) - whether to use extra cpuB flag to resolve IG-XL v.3.50.xx bug where VBT clears cpuA immediately
82
- # at start of PatFlagFunc instead of at end. Use will have to manually clear cpuB to resume this pattern.
83
- # ==== Examples
84
- # $tester.wait(:match => true, :time_in_us => 5000, :pin => $top.pin(:done), :state => :high) do
85
- # <vectors>
86
- # end
87
- def match_block(timeout, options = {}, &block)
88
- options = {
89
- check_for_fails: false,
90
- on_timeout_goto: false,
91
- on_block_match_goto: false,
92
- multiple_entries: false,
93
- force_fail_on_timeout: true,
94
- global_loops: false,
95
- manual_stop: false,
96
- clr_fail_post_match: false
97
- }.merge(options)
98
-
99
- unless block_given?
100
- fail 'ERROR: block not passed to match_block!'
101
- end
102
-
103
- # Create BlockArgs objects in order to receive multiple blocks
104
- match_conditions = Origen::Utility::BlockArgs.new
105
- fail_conditions = Origen::Utility::BlockArgs.new
106
-
107
- # yield object to calling routine to get populated with blocks
108
- if block.arity > 0
109
- yield match_conditions, fail_conditions
110
- else
111
- # for backwards compatibility with Origen core call to match_block
112
- match_conditions.add(&block)
113
- fail_conditions.add(&block)
114
- end
115
-
116
- # Flush the pipeline first and then pass control to the program to bin out any failures
117
- # prior to entering the match loop
118
- if options[:check_for_fails]
119
- if options[:multiple_entries]
120
- @match_entries.times do |i|
121
- microcode "global subr match_done_#{i}:"
122
- set_code(i + 100)
123
- cycle(microcode: 'jump call_tester') unless i == @match_entries - 1
124
- end
125
- microcode 'call_tester:'
126
- else
127
- set_code(100)
128
- end
129
- cc 'Wait for any prior failures to propagate through the pipeline'
130
- cycle(microcode: 'pipe_minus 1')
131
- cc 'Now handshake with the tester to bin out and parts that have failed before they got here'
132
- handshake(manual_stop: options[:manual_stop])
133
- end
134
-
135
- # Now do the main match loop
136
- cc 'Start the match loop'
137
-
138
- global_opt = (options[:global_loops]) ? 'global ' : ''
139
- microcode "#{global_opt}match_outer_loop_#{@unique_counter}:"
140
- cycle # (:microcode => "loopB #{outer_loop_count} ign ifc icc")
141
- set_loopb_vector = last_vector
142
-
143
- microcode "#{global_opt}match_inner_loop_#{@unique_counter}:"
144
- cycle # (:microcode => "loopA #{inner_loop_count} ign ifc icc")
145
- set_loopa_vector = last_vector
146
-
147
- # count cycles in match loop block passed to help with meeting
148
- # desired timeout value (have to back assign microcodes above)
149
- prematch_cycle_count = cycle_count
150
- match_conditions.each_with_index do |condition, i|
151
- mask_fails(true)
152
- condition.call # match condition
153
- mask_fails(false)
154
- cc ' Wait for the result to propagate through the pipeline'
155
- cycle(microcode: 'pipe_minus 1 ign ifc icc')
156
- inc_cycle_count(@pipeline_depth - 1) # Account for pipeline depth
157
- cc "Branch if block condition #{i} met"
158
- cycle(microcode: "if (pass) jump block_#{i}_matched_#{@unique_counter} icc ifc")
159
- cycle(microcode: 'clr_flag (fail) icc')
160
- end
161
- match_conditions_cycle_count = cycle_count - prematch_cycle_count
162
- cc "Match loop cycle count = #{match_conditions_cycle_count}"
163
-
164
- # reduce timeout requested by match loop cycle count
165
- timeout = (timeout.to_f / match_conditions_cycle_count).ceil
166
-
167
- # Calculate the loop counts for the 2 loops to appropriately hit the timeout requested
168
- loop_value = timeout.to_f.floor
169
-
170
- if loop_value < (2**@loop_bits_max)
171
- # small value, only need to use one loop
172
- outer_loop_count = 1
173
- inner_loop_count = loop_value
174
- elsif loop_value < (2**(2 * @loop_bits_max))
175
- # 2 nested loops required
176
- inner_loop_count = 2**@loop_bits_max - 1
177
- outer_loop_count = (loop_value.to_f / inner_loop_count).ceil
178
- else
179
- abort 'ERROR: timeout value too large in tester match method!'
180
- end
181
-
182
- # retroactively set loop counter values for timeout based on cycles in match loop condition
183
- set_loopb_vector.microcode = "loopB #{outer_loop_count} ign ifc icc"
184
- set_loopa_vector.microcode = "loopA #{inner_loop_count} ign ifc icc"
185
-
186
- cc 'Loop back around if time remaining'
187
- cycle(microcode: "end_loopA match_inner_loop_#{@unique_counter} icc")
188
- cycle(microcode: "end_loopB match_outer_loop_#{@unique_counter} icc")
189
-
190
- if options[:force_fail_on_timeout]
191
- cc 'To get here something has gone wrong, check block again to force a pattern failure'
192
- fail_conditions.each(&:call)
193
- end
194
-
195
- if options[:on_timeout_goto]
196
- cycle(microcode: "jump #{options[:on_timeout_goto]} icc")
197
- else
198
- cycle(microcode: "jump match_loop_end_#{@unique_counter} icc")
199
- # cycle(:microcode => 'halt')
200
- end
201
- match_conditions.each_with_index do |condition, i|
202
- microcode "block_#{i}_matched_#{@unique_counter}:"
203
- cycle(microcode: 'pop_loop icc')
204
- cycle(microcode: 'clr_fail')
205
- if options[:on_block_match_goto]
206
- if options[:on_block_match_goto].is_a?(Hash)
207
- if options[:on_block_match_goto][i]
208
- custom_jump = options[:on_block_match_goto][i]
209
- else
210
- custom_jump = nil
211
- end
212
- else
213
- custom_jump = options[:on_block_match_goto]
214
- end
215
- end
216
- if custom_jump
217
- cycle(microcode: "jump #{custom_jump}")
218
- else
219
- # Don't do a jump on the last match block as it will naturally fall through
220
- # TODO: Update origen core to expose the size
221
- unless match_conditions.instance_variable_get(:@block_args).size == i + 1
222
- cycle(microcode: "jump match_loop_end_#{@unique_counter} icc")
223
- end
224
- end
225
- end
226
- microcode "match_loop_end_#{@unique_counter}:"
227
- if options[:clr_fail_post_match]
228
- cycle(microcode: 'clr_fail')
229
- end
230
-
231
- @unique_counter += 1 # Increment so a different label will be applied if another
232
- # handshake is called in the same pattern
233
- end
234
-
235
- # Handshake with the tester.
236
- #
237
- # Will set a cpu flag (A) and wait for it to be cleared by the tester, optionally
238
- # pass in a read code to pass information to the tester.
239
- #
240
- # ==== Examples
241
- # $tester.handshake # Pass control to the tester for a measurement
242
- # $tester.handshake(:readcode => 10) # Trigger a specific action by the tester
243
- def handshake(options = {})
244
- options = {
245
- readcode: false,
246
- manual_stop: false, # set a 2nd CPU flag in case 1st flag is automatically cleared
247
- }.merge(options)
248
- if options[:readcode]
249
- set_code(options[:readcode])
250
- end
251
- if options[:manual_stop]
252
- cycle(microcode: "#{@microcode[:enable]} (#{@flags[1]})")
253
- cycle(microcode: "#{@microcode[:set_flag]} (#{@flags[0]} #{@flags[1]})")
254
- cycle(microcode: "loop_here_#{@unique_counter}: if (flag) jump loop_here_#{@unique_counter}")
255
- else
256
- cycle(microcode: "#{@microcode[:set_flag]} (#{@flags[0]})")
257
- cycle(microcode: "loop_here_#{@unique_counter}: if (#{@flags[0]}) jump loop_here_#{@unique_counter}")
258
- end
259
- @unique_counter += 1 # Increment so a different label will be applied if another
260
- # handshake is called in the same pattern
261
- end
262
-
263
- def keep_alive(options = {})
264
- $tester.cycle microcode: "#{@microcode[:keepalive]}"
265
- end
266
- end
267
- end
268
- J750 = IGXLBasedTester::J750
269
- end
1
+ module OrigenTesters
2
+ module IGXLBasedTester
3
+ # Tester model to generate .atp patterns for the Teradyne J750
4
+ #
5
+ # == Basic Usage
6
+ # $tester = Testers::J750.new
7
+ # $tester.cycle # Generate a vector
8
+ #
9
+ # Many more methods exist to generate J750 specific micro-code, see below for
10
+ # details.
11
+ #
12
+ # Also note that this class inherits from the base Tester class and so all methods
13
+ # described there are also available.
14
+ class J750 < Base
15
+ require 'origen_testers/igxl_based_tester/j750/generator.rb'
16
+
17
+ attr_accessor :use_hv_pin
18
+ attr_accessor :software_version
19
+
20
+ def self.hpt_mode
21
+ @@hpt_mode
22
+ end
23
+ def self.hpt_mode?
24
+ @@hpt_mode
25
+ end
26
+
27
+ # Returns a new J750 instance, normally there would only ever be one of these
28
+ # assigned to the global variable such as $tester by your target.
29
+ def initialize
30
+ super
31
+ @pipeline_depth = 34 # for extended mode is vectors, for normal mode is vector pairs (54 for J750Ex)
32
+ @use_hv_pin = false # allows to use high voltage for a pin for all patterns
33
+ @software_version = '3.50.40'
34
+ @name = 'j750'
35
+ @@hpt_mode = false
36
+ @opcode_mode = :extended
37
+ @loop_bits_max = 16 # maximum loop bit length
38
+
39
+ @flags = %w(cpuA cpuB cpuC cpuD)
40
+ @microcode[:enable] = 'enable'
41
+ @microcode[:set_flag] = 'set_cpu'
42
+ @microcode[:mask_vector] = 'ign ifc icc'
43
+ @microcode[:keepalive] = 'keep_alive'
44
+ end
45
+
46
+ def pattern_header(options = {})
47
+ super(options) do |pin_list|
48
+ microcode "vector ($tset, #{pin_list})"
49
+ microcode '{'
50
+ unless options[:subroutine_pat]
51
+ microcode 'start_label pattern_st:'
52
+ end
53
+ end
54
+ end
55
+
56
+ def pattern_footer(options = {})
57
+ super(options)
58
+ end
59
+
60
+ # Generates a match loop based on vector condition passed in via block
61
+ #
62
+ # This method is not really intended to be called directly, rather you should call
63
+ # via Tester#wait:
64
+ # e.g. $tester.wait(:match => true) do
65
+ # reg(:status_reg).bit(:done).read(1)! # vector condition that you want to match
66
+ # end
67
+ #
68
+ # The timeout should be provided in cycles, however when called via the wait method the
69
+ # time-based helpers (time_in_us, etc) will be converted to cycles for you.
70
+ #
71
+ # The following options are available to tailor the match loop behavior, defaults in
72
+ # parenthesis:
73
+ # * :check_for_fails (false) - Flushes the pipeline and handshakes with the tester (passing readcode 100) prior to the match (to allow binout of fails encountered before the match)
74
+ # * :force_fail_on_timeout (true) - Force a vector mis-compare if the match loop times out
75
+ # * :on_timeout_goto ("") - Optionally supply a label to branch to on timeout, by default will continue from the end of the match loop
76
+ # * :on_block_match_goto ("") - Optionally supply a label to branch to when block condition is met, by default will continue from the end of the match loop.
77
+ # A hash will also be accepted for this argument to supply a specific label (or no label) for each block e.g. {0 => "on_block_0_fail"}
78
+ # * :multiple_entries (false) - Supply an integer to generate multiple entries into the match (each with a unique readcode), this can be useful when debugging patterns with multiple matches
79
+ # * :force_fail_on_timeout (true) - force pattern to fail if timeout occurs
80
+ # * :global_loops (false) - whether match loop loops should use global labels
81
+ # * :manual_stop (false) - whether to use extra cpuB flag to resolve IG-XL v.3.50.xx bug where VBT clears cpuA immediately
82
+ # at start of PatFlagFunc instead of at end. Use will have to manually clear cpuB to resume this pattern.
83
+ # ==== Examples
84
+ # $tester.wait(:match => true, :time_in_us => 5000, :pin => $top.pin(:done), :state => :high) do
85
+ # <vectors>
86
+ # end
87
+ def match_block(timeout, options = {}, &block)
88
+ options = {
89
+ check_for_fails: false,
90
+ on_timeout_goto: false,
91
+ on_block_match_goto: false,
92
+ multiple_entries: false,
93
+ force_fail_on_timeout: true,
94
+ global_loops: false,
95
+ manual_stop: false,
96
+ clr_fail_post_match: false
97
+ }.merge(options)
98
+
99
+ unless block_given?
100
+ fail 'ERROR: block not passed to match_block!'
101
+ end
102
+
103
+ # Create BlockArgs objects in order to receive multiple blocks
104
+ match_conditions = Origen::Utility::BlockArgs.new
105
+ fail_conditions = Origen::Utility::BlockArgs.new
106
+
107
+ # yield object to calling routine to get populated with blocks
108
+ if block.arity > 0
109
+ yield match_conditions, fail_conditions
110
+ else
111
+ # for backwards compatibility with Origen core call to match_block
112
+ match_conditions.add(&block)
113
+ fail_conditions.add(&block)
114
+ end
115
+
116
+ # Flush the pipeline first and then pass control to the program to bin out any failures
117
+ # prior to entering the match loop
118
+ if options[:check_for_fails]
119
+ if options[:multiple_entries]
120
+ @match_entries.times do |i|
121
+ microcode "global subr match_done_#{i}:"
122
+ set_code(i + 100)
123
+ cycle(microcode: 'jump call_tester') unless i == @match_entries - 1
124
+ end
125
+ microcode 'call_tester:'
126
+ else
127
+ set_code(100)
128
+ end
129
+ cc 'Wait for any prior failures to propagate through the pipeline'
130
+ cycle(microcode: 'pipe_minus 1')
131
+ cc 'Now handshake with the tester to bin out and parts that have failed before they got here'
132
+ handshake(manual_stop: options[:manual_stop])
133
+ end
134
+
135
+ # Now do the main match loop
136
+ cc 'Start the match loop'
137
+
138
+ global_opt = (options[:global_loops]) ? 'global ' : ''
139
+ microcode "#{global_opt}match_outer_loop_#{@unique_counter}:"
140
+ cycle # (:microcode => "loopB #{outer_loop_count} ign ifc icc")
141
+ set_loopb_vector = last_vector
142
+
143
+ microcode "#{global_opt}match_inner_loop_#{@unique_counter}:"
144
+ cycle # (:microcode => "loopA #{inner_loop_count} ign ifc icc")
145
+ set_loopa_vector = last_vector
146
+
147
+ # count cycles in match loop block passed to help with meeting
148
+ # desired timeout value (have to back assign microcodes above)
149
+ prematch_cycle_count = cycle_count
150
+ match_conditions.each_with_index do |condition, i|
151
+ mask_fails(true)
152
+ condition.call # match condition
153
+ mask_fails(false)
154
+ cc ' Wait for the result to propagate through the pipeline'
155
+ cycle(microcode: 'pipe_minus 1 ign ifc icc')
156
+ inc_cycle_count(@pipeline_depth - 1) # Account for pipeline depth
157
+ cc "Branch if block condition #{i} met"
158
+ cycle(microcode: "if (pass) jump block_#{i}_matched_#{@unique_counter} icc ifc")
159
+ cycle(microcode: 'clr_flag (fail) icc')
160
+ end
161
+ match_conditions_cycle_count = cycle_count - prematch_cycle_count
162
+ cc "Match loop cycle count = #{match_conditions_cycle_count}"
163
+
164
+ # reduce timeout requested by match loop cycle count
165
+ timeout = (timeout.to_f / match_conditions_cycle_count).ceil
166
+
167
+ # Calculate the loop counts for the 2 loops to appropriately hit the timeout requested
168
+ loop_value = timeout.to_f.floor
169
+
170
+ if loop_value < (2**@loop_bits_max)
171
+ # small value, only need to use one loop
172
+ outer_loop_count = 1
173
+ inner_loop_count = loop_value
174
+ elsif loop_value < (2**(2 * @loop_bits_max))
175
+ # 2 nested loops required
176
+ inner_loop_count = 2**@loop_bits_max - 1
177
+ outer_loop_count = (loop_value.to_f / inner_loop_count).ceil
178
+ else
179
+ abort 'ERROR: timeout value too large in tester match method!'
180
+ end
181
+
182
+ # retroactively set loop counter values for timeout based on cycles in match loop condition
183
+ set_loopb_vector.microcode = "loopB #{outer_loop_count} ign ifc icc"
184
+ set_loopa_vector.microcode = "loopA #{inner_loop_count} ign ifc icc"
185
+
186
+ cc 'Loop back around if time remaining'
187
+ cycle(microcode: "end_loopA match_inner_loop_#{@unique_counter} icc")
188
+ cycle(microcode: "end_loopB match_outer_loop_#{@unique_counter} icc")
189
+
190
+ if options[:force_fail_on_timeout]
191
+ cc 'To get here something has gone wrong, check block again to force a pattern failure'
192
+ fail_conditions.each(&:call)
193
+ end
194
+
195
+ if options[:on_timeout_goto]
196
+ cycle(microcode: "jump #{options[:on_timeout_goto]} icc")
197
+ else
198
+ cycle(microcode: "jump match_loop_end_#{@unique_counter} icc")
199
+ # cycle(:microcode => 'halt')
200
+ end
201
+ match_conditions.each_with_index do |condition, i|
202
+ microcode "block_#{i}_matched_#{@unique_counter}:"
203
+ cycle(microcode: 'pop_loop icc')
204
+ cycle(microcode: 'clr_fail')
205
+ if options[:on_block_match_goto]
206
+ if options[:on_block_match_goto].is_a?(Hash)
207
+ if options[:on_block_match_goto][i]
208
+ custom_jump = options[:on_block_match_goto][i]
209
+ else
210
+ custom_jump = nil
211
+ end
212
+ else
213
+ custom_jump = options[:on_block_match_goto]
214
+ end
215
+ end
216
+ if custom_jump
217
+ cycle(microcode: "jump #{custom_jump}")
218
+ else
219
+ # Don't do a jump on the last match block as it will naturally fall through
220
+ # TODO: Update origen core to expose the size
221
+ unless match_conditions.instance_variable_get(:@block_args).size == i + 1
222
+ cycle(microcode: "jump match_loop_end_#{@unique_counter} icc")
223
+ end
224
+ end
225
+ end
226
+ microcode "match_loop_end_#{@unique_counter}:"
227
+ if options[:clr_fail_post_match]
228
+ cycle(microcode: 'clr_fail')
229
+ end
230
+
231
+ @unique_counter += 1 # Increment so a different label will be applied if another
232
+ # handshake is called in the same pattern
233
+ end
234
+
235
+ # Handshake with the tester.
236
+ #
237
+ # Will set a cpu flag (A) and wait for it to be cleared by the tester, optionally
238
+ # pass in a read code to pass information to the tester.
239
+ #
240
+ # ==== Examples
241
+ # $tester.handshake # Pass control to the tester for a measurement
242
+ # $tester.handshake(:readcode => 10) # Trigger a specific action by the tester
243
+ def handshake(options = {})
244
+ options = {
245
+ readcode: false,
246
+ manual_stop: false, # set a 2nd CPU flag in case 1st flag is automatically cleared
247
+ }.merge(options)
248
+ if options[:readcode]
249
+ set_code(options[:readcode])
250
+ end
251
+ if options[:manual_stop]
252
+ cycle(microcode: "#{@microcode[:enable]} (#{@flags[1]})")
253
+ cycle(microcode: "#{@microcode[:set_flag]} (#{@flags[0]} #{@flags[1]})")
254
+ cycle(microcode: "loop_here_#{@unique_counter}: if (flag) jump loop_here_#{@unique_counter}")
255
+ else
256
+ cycle(microcode: "#{@microcode[:set_flag]} (#{@flags[0]})")
257
+ cycle(microcode: "loop_here_#{@unique_counter}: if (#{@flags[0]}) jump loop_here_#{@unique_counter}")
258
+ end
259
+ @unique_counter += 1 # Increment so a different label will be applied if another
260
+ # handshake is called in the same pattern
261
+ end
262
+
263
+ def keep_alive(options = {})
264
+ $tester.cycle microcode: "#{@microcode[:keepalive]}"
265
+ end
266
+ end
267
+ end
268
+ J750 = IGXLBasedTester::J750
269
+ end