origen_testers 0.13.1 → 0.13.2

Sign up to get free protection for your applications and to get access to all the features.
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