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,503 +1,503 @@
1
- module OrigenTesters
2
- module Test
3
- class Interface
4
- include OrigenTesters::ProgramGenerators
5
-
6
- # Options passed to Flow.create and Library.create will be passed in here, use as
7
- # desired to configure your interface
8
- def initialize(options = {})
9
- end
10
-
11
- # Test that the block form of flow control methods like this can
12
- # be overridden by an interface
13
- def if_job(*jobs)
14
- jobs = jobs.flatten
15
- jobs.delete(:prb9)
16
- super
17
- end
18
- alias_method :if_jobs, :if_job
19
-
20
- def log(msg)
21
- if tester.j750? || tester.uflex?
22
- flow.logprint(msg)
23
- else
24
- flow.log(msg)
25
- end
26
- end
27
-
28
- def func(name, options = {})
29
- options = {
30
- duration: :static
31
- }.merge(options)
32
-
33
- if tester.j750? || tester.uflex?
34
- block_loop(name, options) do |block, i, group|
35
- ins = test_instances.functional(name)
36
- ins.set_wait_flags(:a) if options[:duration] == :dynamic
37
- ins.pin_levels = options.delete(:pin_levels) if options[:pin_levels]
38
- if group
39
- pname = "#{name}_b#{i}_pset"
40
- patsets.add(pname, [{ pattern: "#{name}_b#{i}.PAT" },
41
- { pattern: 'nvm_global_subs.PAT', start_label: 'subr' }])
42
- ins.pattern = pname
43
- flow.test(group, options) if i == 0
44
- else
45
- pname = "#{name}_pset"
46
- patsets.add(pname, [{ pattern: "#{name}.PAT" },
47
- { pattern: 'nvm_global_subs.PAT', start_label: 'subr' }])
48
- ins.pattern = pname
49
- if options[:cz_setup]
50
- flow.cz(ins, options[:cz_setup], options)
51
- else
52
- flow.test(ins, options)
53
- end
54
- end
55
- end
56
-
57
- elsif tester.v93k?
58
- block_loop(name, options) do |block, i|
59
- tm = test_methods.ac_tml.ac_test.functional_test
60
- ts = test_suites.run(name, options)
61
- ts.test_method = tm
62
- ts.levels = options.delete(:pin_levels) if options[:pin_levels]
63
- if block
64
- ts.pattern = "#{name}_b#{i}"
65
- else
66
- ts.pattern = name.to_s
67
- # if options[:cz_setup]
68
- # flow.cz(ins, options[:cz_setup], options)
69
- # else
70
- # end
71
- end
72
- flow.test ts, options
73
- end
74
- end
75
- end
76
-
77
- def block_loop(name, options)
78
- if options[:by_block]
79
- if tester.j750? || tester.uflex?
80
- test_instances.group do |group|
81
- group.name = name
82
- $dut.blocks.each_with_index do |block, i|
83
- yield block, i, group
84
- end
85
- end
86
- elsif tester.v93k?
87
- flow.group name, options do
88
- $dut.blocks.each_with_index do |block, i|
89
- yield block, i
90
- end
91
- end
92
- end
93
- else
94
- yield
95
- end
96
- end
97
-
98
- def por(options = {})
99
- options = {
100
- instance_not_available: true
101
- }.merge(options)
102
- if tester.j750? || tester.uflex?
103
- flow.test('por_ins', options)
104
- else
105
- func('por_ins', options)
106
- end
107
- end
108
-
109
- def para(name, options = {})
110
- options = {
111
- high_voltage: false
112
- }.merge(options)
113
-
114
- if tester.j750?
115
- if options.delete(:high_voltage)
116
- ins = test_instances.bpmu(name)
117
- else
118
- ins = test_instances.ppmu(name)
119
- end
120
- ins.dc_category = 'NVM_PARA'
121
- flow.test(ins, options)
122
- patsets.add("#{name}_pset", pattern: "#{name}.PAT")
123
- end
124
- end
125
-
126
- # OR 2 IDS together into 1 flag
127
- def or_ids(options = {})
128
- flow.or_flags(options[:id1], options[:id2], options)
129
- end
130
-
131
- def nop(options = {})
132
- flow.nop options
133
- end
134
-
135
- def mto_memory(name, options = {})
136
- options = {
137
- duration: :static
138
- }.merge(options)
139
-
140
- if tester.j750?
141
- block_loop(name, options) do |block, i, group|
142
- ins = test_instances.mto_memory(name)
143
- ins.set_wait_flags(:a) if options[:duration] == :dynamic
144
- ins.pin_levels = options.delete(:pin_levels) if options[:pin_levels]
145
- if group
146
- pname = "#{name}_b#{i}_pset"
147
- patsets.add(pname, [{ pattern: "#{name}_b#{i}.PAT" },
148
- { pattern: 'nvm_global_subs.PAT', start_label: 'subr' }])
149
- ins.pattern = pname
150
- flow.test(group, options) if i == 0
151
- else
152
- pname = "#{name}_pset"
153
- patsets.add(pname, [{ pattern: "#{name}.PAT" },
154
- { pattern: 'nvm_global_subs.PAT', start_label: 'subr' }])
155
- ins.pattern = pname
156
- if options[:cz_setup]
157
- flow.cz(ins, options[:cz_setup], options)
158
- else
159
- flow.test(ins, options)
160
- end
161
- end
162
- end
163
- end
164
- end
165
-
166
- def meas(name, options = {})
167
- options = {
168
- duration: :static
169
- }.merge(options)
170
-
171
- name = "meas_#{name}" unless name.to_s =~ /meas/
172
-
173
- if tester.j750? || tester.uflex?
174
- if tester.uflex?
175
- ins = test_instances.functional(name)
176
- ins.set_wait_flags(:a) if options[:duration] == :dynamic
177
- ins.pin_levels = options.delete(:pin_levels) if options[:pin_levels]
178
- ins.lo_limit = options[:lo_limit]
179
- ins.hi_limit = options[:hi_limit]
180
- ins.scale = options[:scale]
181
- ins.units = options[:units]
182
- ins.defer_limits = options[:defer_limits]
183
- else
184
- if options[:pins] == :hi_v
185
- ins = test_instances.board_pmu(name)
186
- elsif options[:pins] == :power
187
- ins = test_instances.powersupply(name)
188
- else
189
- ins = test_instances.pin_pmu(name)
190
- end
191
- ins.set_wait_flags(:a) if options[:duration] == :dynamic
192
- ins.pin_levels = options.delete(:pin_levels) if options[:pin_levels]
193
- ins.lo_limit = options[:lo_limit]
194
- ins.hi_limit = options[:hi_limit]
195
- end
196
-
197
- pname = "#{name}_pset"
198
- patsets.add(pname, [{ pattern: "#{name}.PAT" },
199
- { pattern: 'nvm_global_subs.PAT', start_label: 'subr' }])
200
- ins.pattern = pname
201
- if options[:cz_setup]
202
- flow.cz(ins, options[:cz_setup], options)
203
- else
204
- flow.test(ins, options)
205
- end
206
-
207
- elsif tester.v93k?
208
- tm = test_methods.dc_tml.dc_test.general_pmu
209
- ts = test_suites.run(name, options)
210
- ts.test_method = tm
211
- ts.levels = options.delete(:pin_levels) if options[:pin_levels]
212
- ts.lo_limit = options[:lo_limit] if options[:lo_limit]
213
- ts.hi_limit = options[:hi_limit] if options[:hi_limit]
214
- ts.pattern = name.to_s
215
- # if options[:cz_setup]
216
- # flow.cz(ins, options[:cz_setup], options)
217
- # else
218
- # use_limit_params = [:lo_limit, :hi_limit, :scale, :units] # define options to strip for flow.test
219
- # options_use_limit = options.dup # duplicate, as modifying options directly, even an assigned copy modifies original
220
- # flow.test(ins, options.reject! { |k, _| use_limit_params.include? k }) # set up test skipping use-limit options
221
- # flow.use_limit(name, options_use_limit) if options_use_limit[:hi_limit] || options_use_limit[:lo_limit] # Only use use-limit if limits present in flow
222
- # end
223
- flow.test ts, options
224
- end
225
-
226
- def group(name, options = {})
227
- flow.group name, options do |group|
228
- yield group
229
- end
230
- end
231
-
232
- ####################################################
233
- ####### UltraFLEX Pinmap Stuff ####################
234
- ####################################################
235
-
236
- # Assign relevant pins for pinmap sheet generation
237
- def pinmap(name, options = {})
238
- pinmap = pinmaps("#{name}")
239
- Origen.top_level.add_pin_group :JTAG, :tdi, :tdo, :tms
240
- Origen.top_level.power_pin_groups.keys.each do |grp_key|
241
- pinmap.add_power_pin(grp_key, type: 'Power', comment: "# #{grp_key}")
242
- end
243
- Origen.top_level.virtual_pins.keys.each do |util_pin|
244
- upin = Origen.top_level.virtual_pins(util_pin)
245
- case upin.type
246
- when :virtual_pin
247
- pinmap.add_utility_pin(upin.name, type: 'Utility', comment: "# #{util_pin}")
248
- when :ate_ch
249
- pinmap.add_utility_pin(upin.name, type: 'I/O', comment: "# #{util_pin}")
250
- end
251
- end
252
- Origen.top_level.pin.keys.each do |pkey|
253
- pinmap.add_pin(Origen.top_level.pin(pkey).name, type: 'I/O', comment: "# #{pkey}")
254
- end
255
- Origen.top_level.pin_groups.keys.sort.each do |gkey|
256
- # Do not include pins that are aliased to themselves
257
- Origen.top_level.pin(gkey).each do |pin|
258
- pinmap.add_group_pin(gkey, Origen.top_level.pin(pin.id).name, type: 'I/O', comment: "# #{gkey}")
259
- end
260
- end
261
- end
262
-
263
- # Assign relevant edges in preparation for edgeset/timeset sheet generation
264
- def edge(category, pin, options = {})
265
- options = {
266
- d_src: 'PAT', # source of the channel drive data (e.g. pattern, drive_hi, drive_lo, etc.)
267
- d_fmt: 'NR', # drive data format (NR, RL, RH, etc.)
268
- d0_edge: '', # time at which the input drive is turned on
269
- d1_edge: '', # time of the initial data drive edge
270
- d2_edge: '', # time of the return format data drive edge
271
- d3_edge: '', # time at which the input drive is turned off
272
- c_mode: 'Edge', # output compare mode
273
- c1_edge: '', # time of the initial output compare edge
274
- c2_edge: '', # time of the final output compare edge (window compare)
275
- t_res: 'Machine', # timing resolution (possibly ATE-specific)
276
- clk_per: '' # clock period equation - for use with MCG
277
- }.merge(options)
278
-
279
- @edge_collection = edges
280
- @edge_collection.add(category, pin, options)
281
- end
282
-
283
- def edge_collection
284
- @edge_collection
285
- end
286
-
287
- def edgeset(sheet_name, options = {})
288
- options = {
289
- edgeset: :es_default,
290
- period: 'cycle', # tester cycle period
291
- t_mode: 'Machine' # edgeset timing mode (possibly ATE-specific)
292
- }.merge(options)
293
- edgeset = options.delete(:edgeset)
294
- pin = options.delete(:pin)
295
- edge = options.delete(:edge)
296
-
297
- @edgeset = edgesets(sheet_name, options)
298
- @edgeset.add(edgeset, pin, edge, options)
299
- collect_ac_specs(@edgeset.es[edgeset].spec_sheet, edge)
300
- end
301
-
302
- def timeset(sheet_name, options = {})
303
- options = {
304
- timeset: :default,
305
- master_ts: :default
306
- }.merge(options)
307
- timeset = options.delete(:timeset)
308
- pin = options.delete(:pin)
309
- eset = options.delete(:eset)
310
-
311
- @timeset = timesets(sheet_name, options)
312
- @timeset.add(timeset, pin, eset, options)
313
- end
314
-
315
- def ac_specset(sheet_name, expression, options = {})
316
- options = {
317
- specset: :default,
318
- nom: { typ: nil }
319
- }.merge(options)
320
-
321
- ss = ac_specsets(sheet_name)
322
- add_ac_specs(ss, expression, options)
323
- end
324
-
325
- # Collects AC Spec object(s) from the given expression and adds them to the given Specset
326
- def collect_ac_specs(ssname, edge, options = {})
327
- options = {
328
- nom: { typ: nil }
329
- }.merge(options)
330
-
331
- # Create a Specsets object from the UFlex program generator API
332
- ss = ac_specsets(ssname.to_sym)
333
- add_ac_specs(ss, edge.clk_per, options)
334
- add_ac_specs(ss, edge.d0_edge, options)
335
- add_ac_specs(ss, edge.d1_edge, options)
336
- add_ac_specs(ss, edge.d2_edge, options)
337
- add_ac_specs(ss, edge.d3_edge, options)
338
- add_ac_specs(ss, edge.c1_edge, options)
339
- add_ac_specs(ss, edge.c2_edge, options)
340
- end
341
-
342
- # Adds new AC Spec object(s) to the given Specset
343
- def add_ac_specs(ss, expression, options = {})
344
- options = {
345
- specset: :default
346
- }.merge(options)
347
-
348
- return unless expression.is_a? String
349
- # collect all variable names within the expression
350
- vars = expression.scan(/[a-zA-Z][\w]+/).map(&:to_sym)
351
- vars.each do |var|
352
- next if var =~ /^(d0_edge|d1_edge|d2_edge|d3_edge|c1_edge|c2_edge)$/
353
- # The substitutions below are used for backward compatibility
354
- next if var =~ /^(d_on|d_data|d_ret|d_off|c_open|c_close)$/
355
- next if var =~ /^(nS|uS|mS|S)$/i
356
- next if ss.ac_specsets.key?(options[:specset]) && ss.ac_specsets[options[:specset]].include?(var)
357
-
358
- ss.add(var, options)
359
- end
360
- end
361
-
362
- # Assign relevant power supply levels in preparation for levelset sheet generation
363
- def pwr_level(category, options = {})
364
- options = {
365
- vmain: 1.8, # Main supply voltage
366
- valt: 1.8, # Alternate supply voltage
367
- ifold: 1, # Supply clamp current
368
- delay: 0 # Supply power-up delay
369
- }.merge(options)
370
-
371
- @level_collection = levels
372
- @level_collection.add_power_level(category, options)
373
- end
374
-
375
- # Assign relevant single-ended pin levels in preparation for levelset sheet generation
376
- def pin_level_se(category, options = {})
377
- options = {
378
- vil: 0, # Input drive low
379
- vih: 1.8, # Input drive high
380
- vol: 1.0, # Output compare low
381
- voh: 0.8, # Output compare high
382
- vcl: -1, # Voltage clamp low
383
- vch: 2.5, # Voltage clamp high
384
- vt: 0.9, # Termination voltage
385
- voutlotyp: 0, #
386
- vouthityp: 0, #
387
- dmode: 'Largeswing-VT' # Driver mode
388
- }.merge(options)
389
-
390
- @level_collection = levels
391
- @level_collection.add_se_pin_level(category, options)
392
- end
393
-
394
- def level_collection
395
- @level_collection
396
- end
397
-
398
- def levelset(sheet_name, options = {})
399
- pin = options.delete(:pin)
400
- level = options.delete(:level)
401
-
402
- @levelset = levelsets(sheet_name)
403
- @levelset.add(sheet_name, pin, level, options)
404
- collect_dc_specs(@levelset.spec_sheet, level)
405
- end
406
-
407
- def dc_specset(sheet_name, expression, options = {})
408
- options = {
409
- min: { min: nil },
410
- nom: { typ: nil },
411
- max: { max: nil }
412
- }.merge(options)
413
-
414
- ss = dc_specsets(sheet_name.to_sym)
415
- add_dc_specs(ss, expression, options)
416
- end
417
-
418
- # Collects DC Spec object(s) from the given expression and adds them to the given Specset
419
- def collect_dc_specs(ssname, level, options = {})
420
- options = {
421
- nom: { typ: nil },
422
- min: { min: nil },
423
- max: { max: nil }
424
- }.merge(options)
425
-
426
- # Create a Specsets object from the UFlex program generator API
427
- ss = dc_specsets(ssname.to_sym)
428
- if level.respond_to?(:vmain)
429
- add_dc_specs(ss, level.vmain, options)
430
- add_dc_specs(ss, level.valt, options)
431
- add_dc_specs(ss, level.ifold, options)
432
- elsif level.respond_to?(:vil)
433
- add_dc_specs(ss, level.vil, options)
434
- add_dc_specs(ss, level.vih, options)
435
- add_dc_specs(ss, level.vol, options)
436
- add_dc_specs(ss, level.voh, options)
437
- add_dc_specs(ss, level.vcl, options)
438
- add_dc_specs(ss, level.vch, options)
439
- add_dc_specs(ss, level.vt, options)
440
- add_dc_specs(ss, level.voutlotyp, options)
441
- add_dc_specs(ss, level.vouthityp, options)
442
- end
443
- end
444
-
445
- # Adds new DC Spec object(s) to the given Specset
446
- def add_dc_specs(ss, expression, options = {})
447
- options = {
448
- specset: :default
449
- }.merge(options)
450
-
451
- return unless expression.is_a? String
452
- vars = expression.scan(/[a-zA-Z][\w]+/).map(&:to_sym)
453
- vars.each do |var|
454
- next if var =~ /^(nA|uA|mA|A|nV|uV|mV|V)$/i
455
-
456
- ss.add(var, options)
457
- end
458
- end
459
-
460
- def global_spec(var, options = {})
461
- options = {
462
- job: nil,
463
- value: nil,
464
- comment: nil
465
- }.merge(options)
466
-
467
- global_specs('SpecsGlobal').add(var, job: options[:job], value: options[:value], comment: options[:comment])
468
- end
469
-
470
- def job_def(jname, options = {})
471
- options = {
472
- pinmap: pinmap_sheets.map { |k, v| v.filename.gsub(/\.txt$/, '') },
473
- instances: test_instance_sheets.map { |k, v| v.filename.gsub(/\.txt$/, '') },
474
- flows: flow_sheets.map { |k, v| v.filename.gsub(/\.txt$/, '') },
475
- ac_specs: ac_specset_sheets.map { |k, v| v.filename.gsub(/\.txt$/, '') },
476
- dc_specs: dc_specset_sheets.map { |k, v| v.filename.gsub(/\.txt$/, '') },
477
- patsets: patset_sheets.map { |k, v| v.filename.gsub(/\.txt$/, '') },
478
- patgroups: patgroup_sheets.map { |k, v| v.filename.gsub(/\.txt$/, '') },
479
- bintables: [],
480
- cz: [],
481
- test_procs: [],
482
- mix_sig_timing: [],
483
- wave_defs: [],
484
- psets: [],
485
- sigs_port_map: [],
486
- fract_bus: [],
487
- comment: nil
488
- }.merge(options)
489
-
490
- program_jobs('Jobs').add(jname, options)
491
- end
492
-
493
- def reference(reference, options = {})
494
- options = {
495
- comment: nil
496
- }.merge(options)
497
-
498
- references('Refs').add(reference, options)
499
- end
500
- end
501
- end
502
- end
503
- end
1
+ module OrigenTesters
2
+ module Test
3
+ class Interface
4
+ include OrigenTesters::ProgramGenerators
5
+
6
+ # Options passed to Flow.create and Library.create will be passed in here, use as
7
+ # desired to configure your interface
8
+ def initialize(options = {})
9
+ end
10
+
11
+ # Test that the block form of flow control methods like this can
12
+ # be overridden by an interface
13
+ def if_job(*jobs)
14
+ jobs = jobs.flatten
15
+ jobs.delete(:prb9)
16
+ super
17
+ end
18
+ alias_method :if_jobs, :if_job
19
+
20
+ def log(msg)
21
+ if tester.j750? || tester.uflex?
22
+ flow.logprint(msg)
23
+ else
24
+ flow.log(msg)
25
+ end
26
+ end
27
+
28
+ def func(name, options = {})
29
+ options = {
30
+ duration: :static
31
+ }.merge(options)
32
+
33
+ if tester.j750? || tester.uflex?
34
+ block_loop(name, options) do |block, i, group|
35
+ ins = test_instances.functional(name)
36
+ ins.set_wait_flags(:a) if options[:duration] == :dynamic
37
+ ins.pin_levels = options.delete(:pin_levels) if options[:pin_levels]
38
+ if group
39
+ pname = "#{name}_b#{i}_pset"
40
+ patsets.add(pname, [{ pattern: "#{name}_b#{i}.PAT" },
41
+ { pattern: 'nvm_global_subs.PAT', start_label: 'subr' }])
42
+ ins.pattern = pname
43
+ flow.test(group, options) if i == 0
44
+ else
45
+ pname = "#{name}_pset"
46
+ patsets.add(pname, [{ pattern: "#{name}.PAT" },
47
+ { pattern: 'nvm_global_subs.PAT', start_label: 'subr' }])
48
+ ins.pattern = pname
49
+ if options[:cz_setup]
50
+ flow.cz(ins, options[:cz_setup], options)
51
+ else
52
+ flow.test(ins, options)
53
+ end
54
+ end
55
+ end
56
+
57
+ elsif tester.v93k?
58
+ block_loop(name, options) do |block, i|
59
+ tm = test_methods.ac_tml.ac_test.functional_test
60
+ ts = test_suites.run(name, options)
61
+ ts.test_method = tm
62
+ ts.levels = options.delete(:pin_levels) if options[:pin_levels]
63
+ if block
64
+ ts.pattern = "#{name}_b#{i}"
65
+ else
66
+ ts.pattern = name.to_s
67
+ # if options[:cz_setup]
68
+ # flow.cz(ins, options[:cz_setup], options)
69
+ # else
70
+ # end
71
+ end
72
+ flow.test ts, options
73
+ end
74
+ end
75
+ end
76
+
77
+ def block_loop(name, options)
78
+ if options[:by_block]
79
+ if tester.j750? || tester.uflex?
80
+ test_instances.group do |group|
81
+ group.name = name
82
+ $dut.blocks.each_with_index do |block, i|
83
+ yield block, i, group
84
+ end
85
+ end
86
+ elsif tester.v93k?
87
+ flow.group name, options do
88
+ $dut.blocks.each_with_index do |block, i|
89
+ yield block, i
90
+ end
91
+ end
92
+ end
93
+ else
94
+ yield
95
+ end
96
+ end
97
+
98
+ def por(options = {})
99
+ options = {
100
+ instance_not_available: true
101
+ }.merge(options)
102
+ if tester.j750? || tester.uflex?
103
+ flow.test('por_ins', options)
104
+ else
105
+ func('por_ins', options)
106
+ end
107
+ end
108
+
109
+ def para(name, options = {})
110
+ options = {
111
+ high_voltage: false
112
+ }.merge(options)
113
+
114
+ if tester.j750?
115
+ if options.delete(:high_voltage)
116
+ ins = test_instances.bpmu(name)
117
+ else
118
+ ins = test_instances.ppmu(name)
119
+ end
120
+ ins.dc_category = 'NVM_PARA'
121
+ flow.test(ins, options)
122
+ patsets.add("#{name}_pset", pattern: "#{name}.PAT")
123
+ end
124
+ end
125
+
126
+ # OR 2 IDS together into 1 flag
127
+ def or_ids(options = {})
128
+ flow.or_flags(options[:id1], options[:id2], options)
129
+ end
130
+
131
+ def nop(options = {})
132
+ flow.nop options
133
+ end
134
+
135
+ def mto_memory(name, options = {})
136
+ options = {
137
+ duration: :static
138
+ }.merge(options)
139
+
140
+ if tester.j750?
141
+ block_loop(name, options) do |block, i, group|
142
+ ins = test_instances.mto_memory(name)
143
+ ins.set_wait_flags(:a) if options[:duration] == :dynamic
144
+ ins.pin_levels = options.delete(:pin_levels) if options[:pin_levels]
145
+ if group
146
+ pname = "#{name}_b#{i}_pset"
147
+ patsets.add(pname, [{ pattern: "#{name}_b#{i}.PAT" },
148
+ { pattern: 'nvm_global_subs.PAT', start_label: 'subr' }])
149
+ ins.pattern = pname
150
+ flow.test(group, options) if i == 0
151
+ else
152
+ pname = "#{name}_pset"
153
+ patsets.add(pname, [{ pattern: "#{name}.PAT" },
154
+ { pattern: 'nvm_global_subs.PAT', start_label: 'subr' }])
155
+ ins.pattern = pname
156
+ if options[:cz_setup]
157
+ flow.cz(ins, options[:cz_setup], options)
158
+ else
159
+ flow.test(ins, options)
160
+ end
161
+ end
162
+ end
163
+ end
164
+ end
165
+
166
+ def meas(name, options = {})
167
+ options = {
168
+ duration: :static
169
+ }.merge(options)
170
+
171
+ name = "meas_#{name}" unless name.to_s =~ /meas/
172
+
173
+ if tester.j750? || tester.uflex?
174
+ if tester.uflex?
175
+ ins = test_instances.functional(name)
176
+ ins.set_wait_flags(:a) if options[:duration] == :dynamic
177
+ ins.pin_levels = options.delete(:pin_levels) if options[:pin_levels]
178
+ ins.lo_limit = options[:lo_limit]
179
+ ins.hi_limit = options[:hi_limit]
180
+ ins.scale = options[:scale]
181
+ ins.units = options[:units]
182
+ ins.defer_limits = options[:defer_limits]
183
+ else
184
+ if options[:pins] == :hi_v
185
+ ins = test_instances.board_pmu(name)
186
+ elsif options[:pins] == :power
187
+ ins = test_instances.powersupply(name)
188
+ else
189
+ ins = test_instances.pin_pmu(name)
190
+ end
191
+ ins.set_wait_flags(:a) if options[:duration] == :dynamic
192
+ ins.pin_levels = options.delete(:pin_levels) if options[:pin_levels]
193
+ ins.lo_limit = options[:lo_limit]
194
+ ins.hi_limit = options[:hi_limit]
195
+ end
196
+
197
+ pname = "#{name}_pset"
198
+ patsets.add(pname, [{ pattern: "#{name}.PAT" },
199
+ { pattern: 'nvm_global_subs.PAT', start_label: 'subr' }])
200
+ ins.pattern = pname
201
+ if options[:cz_setup]
202
+ flow.cz(ins, options[:cz_setup], options)
203
+ else
204
+ flow.test(ins, options)
205
+ end
206
+
207
+ elsif tester.v93k?
208
+ tm = test_methods.dc_tml.dc_test.general_pmu
209
+ ts = test_suites.run(name, options)
210
+ ts.test_method = tm
211
+ ts.levels = options.delete(:pin_levels) if options[:pin_levels]
212
+ ts.lo_limit = options[:lo_limit] if options[:lo_limit]
213
+ ts.hi_limit = options[:hi_limit] if options[:hi_limit]
214
+ ts.pattern = name.to_s
215
+ # if options[:cz_setup]
216
+ # flow.cz(ins, options[:cz_setup], options)
217
+ # else
218
+ # use_limit_params = [:lo_limit, :hi_limit, :scale, :units] # define options to strip for flow.test
219
+ # options_use_limit = options.dup # duplicate, as modifying options directly, even an assigned copy modifies original
220
+ # flow.test(ins, options.reject! { |k, _| use_limit_params.include? k }) # set up test skipping use-limit options
221
+ # flow.use_limit(name, options_use_limit) if options_use_limit[:hi_limit] || options_use_limit[:lo_limit] # Only use use-limit if limits present in flow
222
+ # end
223
+ flow.test ts, options
224
+ end
225
+
226
+ def group(name, options = {})
227
+ flow.group name, options do |group|
228
+ yield group
229
+ end
230
+ end
231
+
232
+ ####################################################
233
+ ####### UltraFLEX Pinmap Stuff ####################
234
+ ####################################################
235
+
236
+ # Assign relevant pins for pinmap sheet generation
237
+ def pinmap(name, options = {})
238
+ pinmap = pinmaps("#{name}")
239
+ Origen.top_level.add_pin_group :JTAG, :tdi, :tdo, :tms
240
+ Origen.top_level.power_pin_groups.keys.each do |grp_key|
241
+ pinmap.add_power_pin(grp_key, type: 'Power', comment: "# #{grp_key}")
242
+ end
243
+ Origen.top_level.virtual_pins.keys.each do |util_pin|
244
+ upin = Origen.top_level.virtual_pins(util_pin)
245
+ case upin.type
246
+ when :virtual_pin
247
+ pinmap.add_utility_pin(upin.name, type: 'Utility', comment: "# #{util_pin}")
248
+ when :ate_ch
249
+ pinmap.add_utility_pin(upin.name, type: 'I/O', comment: "# #{util_pin}")
250
+ end
251
+ end
252
+ Origen.top_level.pin.keys.each do |pkey|
253
+ pinmap.add_pin(Origen.top_level.pin(pkey).name, type: 'I/O', comment: "# #{pkey}")
254
+ end
255
+ Origen.top_level.pin_groups.keys.sort.each do |gkey|
256
+ # Do not include pins that are aliased to themselves
257
+ Origen.top_level.pin(gkey).each do |pin|
258
+ pinmap.add_group_pin(gkey, Origen.top_level.pin(pin.id).name, type: 'I/O', comment: "# #{gkey}")
259
+ end
260
+ end
261
+ end
262
+
263
+ # Assign relevant edges in preparation for edgeset/timeset sheet generation
264
+ def edge(category, pin, options = {})
265
+ options = {
266
+ d_src: 'PAT', # source of the channel drive data (e.g. pattern, drive_hi, drive_lo, etc.)
267
+ d_fmt: 'NR', # drive data format (NR, RL, RH, etc.)
268
+ d0_edge: '', # time at which the input drive is turned on
269
+ d1_edge: '', # time of the initial data drive edge
270
+ d2_edge: '', # time of the return format data drive edge
271
+ d3_edge: '', # time at which the input drive is turned off
272
+ c_mode: 'Edge', # output compare mode
273
+ c1_edge: '', # time of the initial output compare edge
274
+ c2_edge: '', # time of the final output compare edge (window compare)
275
+ t_res: 'Machine', # timing resolution (possibly ATE-specific)
276
+ clk_per: '' # clock period equation - for use with MCG
277
+ }.merge(options)
278
+
279
+ @edge_collection = edges
280
+ @edge_collection.add(category, pin, options)
281
+ end
282
+
283
+ def edge_collection
284
+ @edge_collection
285
+ end
286
+
287
+ def edgeset(sheet_name, options = {})
288
+ options = {
289
+ edgeset: :es_default,
290
+ period: 'cycle', # tester cycle period
291
+ t_mode: 'Machine' # edgeset timing mode (possibly ATE-specific)
292
+ }.merge(options)
293
+ edgeset = options.delete(:edgeset)
294
+ pin = options.delete(:pin)
295
+ edge = options.delete(:edge)
296
+
297
+ @edgeset = edgesets(sheet_name, options)
298
+ @edgeset.add(edgeset, pin, edge, options)
299
+ collect_ac_specs(@edgeset.es[edgeset].spec_sheet, edge)
300
+ end
301
+
302
+ def timeset(sheet_name, options = {})
303
+ options = {
304
+ timeset: :default,
305
+ master_ts: :default
306
+ }.merge(options)
307
+ timeset = options.delete(:timeset)
308
+ pin = options.delete(:pin)
309
+ eset = options.delete(:eset)
310
+
311
+ @timeset = timesets(sheet_name, options)
312
+ @timeset.add(timeset, pin, eset, options)
313
+ end
314
+
315
+ def ac_specset(sheet_name, expression, options = {})
316
+ options = {
317
+ specset: :default,
318
+ nom: { typ: nil }
319
+ }.merge(options)
320
+
321
+ ss = ac_specsets(sheet_name)
322
+ add_ac_specs(ss, expression, options)
323
+ end
324
+
325
+ # Collects AC Spec object(s) from the given expression and adds them to the given Specset
326
+ def collect_ac_specs(ssname, edge, options = {})
327
+ options = {
328
+ nom: { typ: nil }
329
+ }.merge(options)
330
+
331
+ # Create a Specsets object from the UFlex program generator API
332
+ ss = ac_specsets(ssname.to_sym)
333
+ add_ac_specs(ss, edge.clk_per, options)
334
+ add_ac_specs(ss, edge.d0_edge, options)
335
+ add_ac_specs(ss, edge.d1_edge, options)
336
+ add_ac_specs(ss, edge.d2_edge, options)
337
+ add_ac_specs(ss, edge.d3_edge, options)
338
+ add_ac_specs(ss, edge.c1_edge, options)
339
+ add_ac_specs(ss, edge.c2_edge, options)
340
+ end
341
+
342
+ # Adds new AC Spec object(s) to the given Specset
343
+ def add_ac_specs(ss, expression, options = {})
344
+ options = {
345
+ specset: :default
346
+ }.merge(options)
347
+
348
+ return unless expression.is_a? String
349
+ # collect all variable names within the expression
350
+ vars = expression.scan(/[a-zA-Z][\w]+/).map(&:to_sym)
351
+ vars.each do |var|
352
+ next if var =~ /^(d0_edge|d1_edge|d2_edge|d3_edge|c1_edge|c2_edge)$/
353
+ # The substitutions below are used for backward compatibility
354
+ next if var =~ /^(d_on|d_data|d_ret|d_off|c_open|c_close)$/
355
+ next if var =~ /^(nS|uS|mS|S)$/i
356
+ next if ss.ac_specsets.key?(options[:specset]) && ss.ac_specsets[options[:specset]].include?(var)
357
+
358
+ ss.add(var, options)
359
+ end
360
+ end
361
+
362
+ # Assign relevant power supply levels in preparation for levelset sheet generation
363
+ def pwr_level(category, options = {})
364
+ options = {
365
+ vmain: 1.8, # Main supply voltage
366
+ valt: 1.8, # Alternate supply voltage
367
+ ifold: 1, # Supply clamp current
368
+ delay: 0 # Supply power-up delay
369
+ }.merge(options)
370
+
371
+ @level_collection = levels
372
+ @level_collection.add_power_level(category, options)
373
+ end
374
+
375
+ # Assign relevant single-ended pin levels in preparation for levelset sheet generation
376
+ def pin_level_se(category, options = {})
377
+ options = {
378
+ vil: 0, # Input drive low
379
+ vih: 1.8, # Input drive high
380
+ vol: 1.0, # Output compare low
381
+ voh: 0.8, # Output compare high
382
+ vcl: -1, # Voltage clamp low
383
+ vch: 2.5, # Voltage clamp high
384
+ vt: 0.9, # Termination voltage
385
+ voutlotyp: 0, #
386
+ vouthityp: 0, #
387
+ dmode: 'Largeswing-VT' # Driver mode
388
+ }.merge(options)
389
+
390
+ @level_collection = levels
391
+ @level_collection.add_se_pin_level(category, options)
392
+ end
393
+
394
+ def level_collection
395
+ @level_collection
396
+ end
397
+
398
+ def levelset(sheet_name, options = {})
399
+ pin = options.delete(:pin)
400
+ level = options.delete(:level)
401
+
402
+ @levelset = levelsets(sheet_name)
403
+ @levelset.add(sheet_name, pin, level, options)
404
+ collect_dc_specs(@levelset.spec_sheet, level)
405
+ end
406
+
407
+ def dc_specset(sheet_name, expression, options = {})
408
+ options = {
409
+ min: { min: nil },
410
+ nom: { typ: nil },
411
+ max: { max: nil }
412
+ }.merge(options)
413
+
414
+ ss = dc_specsets(sheet_name.to_sym)
415
+ add_dc_specs(ss, expression, options)
416
+ end
417
+
418
+ # Collects DC Spec object(s) from the given expression and adds them to the given Specset
419
+ def collect_dc_specs(ssname, level, options = {})
420
+ options = {
421
+ nom: { typ: nil },
422
+ min: { min: nil },
423
+ max: { max: nil }
424
+ }.merge(options)
425
+
426
+ # Create a Specsets object from the UFlex program generator API
427
+ ss = dc_specsets(ssname.to_sym)
428
+ if level.respond_to?(:vmain)
429
+ add_dc_specs(ss, level.vmain, options)
430
+ add_dc_specs(ss, level.valt, options)
431
+ add_dc_specs(ss, level.ifold, options)
432
+ elsif level.respond_to?(:vil)
433
+ add_dc_specs(ss, level.vil, options)
434
+ add_dc_specs(ss, level.vih, options)
435
+ add_dc_specs(ss, level.vol, options)
436
+ add_dc_specs(ss, level.voh, options)
437
+ add_dc_specs(ss, level.vcl, options)
438
+ add_dc_specs(ss, level.vch, options)
439
+ add_dc_specs(ss, level.vt, options)
440
+ add_dc_specs(ss, level.voutlotyp, options)
441
+ add_dc_specs(ss, level.vouthityp, options)
442
+ end
443
+ end
444
+
445
+ # Adds new DC Spec object(s) to the given Specset
446
+ def add_dc_specs(ss, expression, options = {})
447
+ options = {
448
+ specset: :default
449
+ }.merge(options)
450
+
451
+ return unless expression.is_a? String
452
+ vars = expression.scan(/[a-zA-Z][\w]+/).map(&:to_sym)
453
+ vars.each do |var|
454
+ next if var =~ /^(nA|uA|mA|A|nV|uV|mV|V)$/i
455
+
456
+ ss.add(var, options)
457
+ end
458
+ end
459
+
460
+ def global_spec(var, options = {})
461
+ options = {
462
+ job: nil,
463
+ value: nil,
464
+ comment: nil
465
+ }.merge(options)
466
+
467
+ global_specs('SpecsGlobal').add(var, job: options[:job], value: options[:value], comment: options[:comment])
468
+ end
469
+
470
+ def job_def(jname, options = {})
471
+ options = {
472
+ pinmap: pinmap_sheets.map { |k, v| v.filename.gsub(/\.txt$/, '') },
473
+ instances: test_instance_sheets.map { |k, v| v.filename.gsub(/\.txt$/, '') },
474
+ flows: flow_sheets.map { |k, v| v.filename.gsub(/\.txt$/, '') },
475
+ ac_specs: ac_specset_sheets.map { |k, v| v.filename.gsub(/\.txt$/, '') },
476
+ dc_specs: dc_specset_sheets.map { |k, v| v.filename.gsub(/\.txt$/, '') },
477
+ patsets: patset_sheets.map { |k, v| v.filename.gsub(/\.txt$/, '') },
478
+ patgroups: patgroup_sheets.map { |k, v| v.filename.gsub(/\.txt$/, '') },
479
+ bintables: [],
480
+ cz: [],
481
+ test_procs: [],
482
+ mix_sig_timing: [],
483
+ wave_defs: [],
484
+ psets: [],
485
+ sigs_port_map: [],
486
+ fract_bus: [],
487
+ comment: nil
488
+ }.merge(options)
489
+
490
+ program_jobs('Jobs').add(jname, options)
491
+ end
492
+
493
+ def reference(reference, options = {})
494
+ options = {
495
+ comment: nil
496
+ }.merge(options)
497
+
498
+ references('Refs').add(reference, options)
499
+ end
500
+ end
501
+ end
502
+ end
503
+ end