origen_testers 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. checksums.yaml +7 -0
  2. data/config/application.rb +140 -0
  3. data/config/commands.rb +73 -0
  4. data/config/development.rb +12 -0
  5. data/config/environment.rb +1 -0
  6. data/config/shared_commands.rb +47 -0
  7. data/config/users.rb +18 -0
  8. data/config/version.rb +8 -0
  9. data/lib/commands/build.rb +69 -0
  10. data/lib/origen_testers.rb +23 -0
  11. data/lib/origen_testers/api.rb +258 -0
  12. data/lib/origen_testers/basic_test_setups.rb +105 -0
  13. data/lib/origen_testers/callback_handlers.rb +58 -0
  14. data/lib/origen_testers/generator.rb +279 -0
  15. data/lib/origen_testers/generator/flow_control_api.rb +611 -0
  16. data/lib/origen_testers/generator/identity_map.rb +23 -0
  17. data/lib/origen_testers/generator/placeholder.rb +11 -0
  18. data/lib/origen_testers/generator/test_numberer.rb +23 -0
  19. data/lib/origen_testers/igxl_based_tester.rb +12 -0
  20. data/lib/origen_testers/igxl_based_tester/base.rb +641 -0
  21. data/lib/origen_testers/igxl_based_tester/base/flow.rb +171 -0
  22. data/lib/origen_testers/igxl_based_tester/base/flow_line.rb +322 -0
  23. data/lib/origen_testers/igxl_based_tester/base/generator.rb +217 -0
  24. data/lib/origen_testers/igxl_based_tester/base/patgroup.rb +109 -0
  25. data/lib/origen_testers/igxl_based_tester/base/patgroups.rb +38 -0
  26. data/lib/origen_testers/igxl_based_tester/base/patset.rb +68 -0
  27. data/lib/origen_testers/igxl_based_tester/base/patset_pattern.rb +56 -0
  28. data/lib/origen_testers/igxl_based_tester/base/patsets.rb +38 -0
  29. data/lib/origen_testers/igxl_based_tester/base/patsubr.rb +68 -0
  30. data/lib/origen_testers/igxl_based_tester/base/patsubr_pattern.rb +56 -0
  31. data/lib/origen_testers/igxl_based_tester/base/patsubrs.rb +38 -0
  32. data/lib/origen_testers/igxl_based_tester/base/test_instance.rb +326 -0
  33. data/lib/origen_testers/igxl_based_tester/base/test_instance_group.rb +58 -0
  34. data/lib/origen_testers/igxl_based_tester/base/test_instances.rb +179 -0
  35. data/lib/origen_testers/igxl_based_tester/files.rb +43 -0
  36. data/lib/origen_testers/igxl_based_tester/j750.rb +248 -0
  37. data/lib/origen_testers/igxl_based_tester/j750/flow.rb +10 -0
  38. data/lib/origen_testers/igxl_based_tester/j750/flow_line.rb +19 -0
  39. data/lib/origen_testers/igxl_based_tester/j750/generator.rb +19 -0
  40. data/lib/origen_testers/igxl_based_tester/j750/patgroup.rb +9 -0
  41. data/lib/origen_testers/igxl_based_tester/j750/patgroups.rb +10 -0
  42. data/lib/origen_testers/igxl_based_tester/j750/patset.rb +9 -0
  43. data/lib/origen_testers/igxl_based_tester/j750/patset_pattern.rb +18 -0
  44. data/lib/origen_testers/igxl_based_tester/j750/patsets.rb +10 -0
  45. data/lib/origen_testers/igxl_based_tester/j750/patsubr.rb +9 -0
  46. data/lib/origen_testers/igxl_based_tester/j750/patsubr_pattern.rb +18 -0
  47. data/lib/origen_testers/igxl_based_tester/j750/patsubrs.rb +10 -0
  48. data/lib/origen_testers/igxl_based_tester/j750/templates/flow.txt.erb +9 -0
  49. data/lib/origen_testers/igxl_based_tester/j750/templates/instances.txt.erb +16 -0
  50. data/lib/origen_testers/igxl_based_tester/j750/templates/patgroups.txt.erb +8 -0
  51. data/lib/origen_testers/igxl_based_tester/j750/templates/patsets.txt.erb +10 -0
  52. data/lib/origen_testers/igxl_based_tester/j750/templates/patsubrs.txt.erb +10 -0
  53. data/lib/origen_testers/igxl_based_tester/j750/test_instance.rb +547 -0
  54. data/lib/origen_testers/igxl_based_tester/j750/test_instance_group.rb +9 -0
  55. data/lib/origen_testers/igxl_based_tester/j750/test_instances.rb +10 -0
  56. data/lib/origen_testers/igxl_based_tester/j750_hpt.rb +34 -0
  57. data/lib/origen_testers/igxl_based_tester/j750_hpt/flow.rb +9 -0
  58. data/lib/origen_testers/igxl_based_tester/j750_hpt/flow_line.rb +9 -0
  59. data/lib/origen_testers/igxl_based_tester/j750_hpt/generator.rb +19 -0
  60. data/lib/origen_testers/igxl_based_tester/j750_hpt/patgroup.rb +9 -0
  61. data/lib/origen_testers/igxl_based_tester/j750_hpt/patgroups.rb +9 -0
  62. data/lib/origen_testers/igxl_based_tester/j750_hpt/patset.rb +9 -0
  63. data/lib/origen_testers/igxl_based_tester/j750_hpt/patset_pattern.rb +9 -0
  64. data/lib/origen_testers/igxl_based_tester/j750_hpt/patsets.rb +9 -0
  65. data/lib/origen_testers/igxl_based_tester/j750_hpt/patsubr.rb +9 -0
  66. data/lib/origen_testers/igxl_based_tester/j750_hpt/patsubr_pattern.rb +9 -0
  67. data/lib/origen_testers/igxl_based_tester/j750_hpt/patsubrs.rb +9 -0
  68. data/lib/origen_testers/igxl_based_tester/j750_hpt/test_instance.rb +515 -0
  69. data/lib/origen_testers/igxl_based_tester/j750_hpt/test_instance_group.rb +9 -0
  70. data/lib/origen_testers/igxl_based_tester/j750_hpt/test_instances.rb +9 -0
  71. data/lib/origen_testers/igxl_based_tester/parser.rb +102 -0
  72. data/lib/origen_testers/igxl_based_tester/parser/ac_spec.rb +9 -0
  73. data/lib/origen_testers/igxl_based_tester/parser/ac_specs.rb +0 -0
  74. data/lib/origen_testers/igxl_based_tester/parser/dc_spec.rb +33 -0
  75. data/lib/origen_testers/igxl_based_tester/parser/dc_specs.rb +48 -0
  76. data/lib/origen_testers/igxl_based_tester/parser/descriptions.rb +339 -0
  77. data/lib/origen_testers/igxl_based_tester/parser/flow.rb +109 -0
  78. data/lib/origen_testers/igxl_based_tester/parser/flow_line.rb +203 -0
  79. data/lib/origen_testers/igxl_based_tester/parser/flows.rb +21 -0
  80. data/lib/origen_testers/igxl_based_tester/parser/pattern_set.rb +92 -0
  81. data/lib/origen_testers/igxl_based_tester/parser/pattern_sets.rb +31 -0
  82. data/lib/origen_testers/igxl_based_tester/parser/test_instance.rb +341 -0
  83. data/lib/origen_testers/igxl_based_tester/parser/test_instances.rb +24 -0
  84. data/lib/origen_testers/igxl_based_tester/parser/timeset.rb +13 -0
  85. data/lib/origen_testers/igxl_based_tester/parser/timesets.rb +0 -0
  86. data/lib/origen_testers/igxl_based_tester/ultraflex.rb +477 -0
  87. data/lib/origen_testers/igxl_based_tester/ultraflex/flow.rb +10 -0
  88. data/lib/origen_testers/igxl_based_tester/ultraflex/flow_line.rb +19 -0
  89. data/lib/origen_testers/igxl_based_tester/ultraflex/generator.rb +19 -0
  90. data/lib/origen_testers/igxl_based_tester/ultraflex/patgroup.rb +9 -0
  91. data/lib/origen_testers/igxl_based_tester/ultraflex/patgroups.rb +10 -0
  92. data/lib/origen_testers/igxl_based_tester/ultraflex/patset.rb +9 -0
  93. data/lib/origen_testers/igxl_based_tester/ultraflex/patset_pattern.rb +18 -0
  94. data/lib/origen_testers/igxl_based_tester/ultraflex/patsets.rb +10 -0
  95. data/lib/origen_testers/igxl_based_tester/ultraflex/patsubr.rb +9 -0
  96. data/lib/origen_testers/igxl_based_tester/ultraflex/patsubr_pattern.rb +18 -0
  97. data/lib/origen_testers/igxl_based_tester/ultraflex/patsubrs.rb +10 -0
  98. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/flow.txt.erb +9 -0
  99. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/instances.txt.erb +16 -0
  100. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/patgroups.txt.erb +9 -0
  101. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/patsets.txt.erb +10 -0
  102. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/patsubrs.txt.erb +10 -0
  103. data/lib/origen_testers/igxl_based_tester/ultraflex/test_instance.rb +270 -0
  104. data/lib/origen_testers/igxl_based_tester/ultraflex/test_instance_group.rb +9 -0
  105. data/lib/origen_testers/igxl_based_tester/ultraflex/test_instances.rb +10 -0
  106. data/lib/origen_testers/interface.rb +183 -0
  107. data/lib/origen_testers/parser.rb +22 -0
  108. data/lib/origen_testers/parser/description_lookup.rb +62 -0
  109. data/lib/origen_testers/parser/searchable_array.rb +30 -0
  110. data/lib/origen_testers/parser/searchable_hash.rb +30 -0
  111. data/lib/origen_testers/pattern_compilers.rb +116 -0
  112. data/lib/origen_testers/pattern_compilers/assembler.rb +88 -0
  113. data/lib/origen_testers/pattern_compilers/job.rb +96 -0
  114. data/lib/origen_testers/pattern_compilers/ultraflex_pattern_compiler.rb +599 -0
  115. data/lib/origen_testers/program_generators.rb +55 -0
  116. data/lib/origen_testers/smartest_based_tester.rb +8 -0
  117. data/lib/origen_testers/smartest_based_tester/base.rb +411 -0
  118. data/lib/origen_testers/smartest_based_tester/base/flow.rb +188 -0
  119. data/lib/origen_testers/smartest_based_tester/base/flow_node.rb +476 -0
  120. data/lib/origen_testers/smartest_based_tester/base/generator.rb +123 -0
  121. data/lib/origen_testers/smartest_based_tester/base/pattern_compiler.rb +23 -0
  122. data/lib/origen_testers/smartest_based_tester/base/pattern_master.rb +47 -0
  123. data/lib/origen_testers/smartest_based_tester/base/test_method.rb +143 -0
  124. data/lib/origen_testers/smartest_based_tester/base/test_methods.rb +73 -0
  125. data/lib/origen_testers/smartest_based_tester/base/test_methods/ac_tml.rb +33 -0
  126. data/lib/origen_testers/smartest_based_tester/base/test_methods/base_tml.rb +38 -0
  127. data/lib/origen_testers/smartest_based_tester/base/test_methods/custom_tml.rb +19 -0
  128. data/lib/origen_testers/smartest_based_tester/base/test_methods/dc_tml.rb +147 -0
  129. data/lib/origen_testers/smartest_based_tester/base/test_methods/limits.rb +43 -0
  130. data/lib/origen_testers/smartest_based_tester/base/test_suite.rb +166 -0
  131. data/lib/origen_testers/smartest_based_tester/base/test_suites.rb +58 -0
  132. data/lib/origen_testers/smartest_based_tester/v93k.rb +8 -0
  133. data/lib/origen_testers/smartest_based_tester/v93k/builder.rb +89 -0
  134. data/lib/origen_testers/smartest_based_tester/v93k/builder/flow.rb +169 -0
  135. data/lib/origen_testers/smartest_based_tester/v93k/builder/pattern_master.rb +54 -0
  136. data/lib/origen_testers/smartest_based_tester/v93k/flow.rb +10 -0
  137. data/lib/origen_testers/smartest_based_tester/v93k/flow_node.rb +9 -0
  138. data/lib/origen_testers/smartest_based_tester/v93k/generator.rb +19 -0
  139. data/lib/origen_testers/smartest_based_tester/v93k/pattern_compiler.rb +10 -0
  140. data/lib/origen_testers/smartest_based_tester/v93k/pattern_master.rb +10 -0
  141. data/lib/origen_testers/smartest_based_tester/v93k/templates/template.aiv.erb +17 -0
  142. data/lib/origen_testers/smartest_based_tester/v93k/templates/template.flow.erb +201 -0
  143. data/lib/origen_testers/smartest_based_tester/v93k/templates/template.pmfl.erb +13 -0
  144. data/lib/origen_testers/smartest_based_tester/v93k/test_method.rb +9 -0
  145. data/lib/origen_testers/smartest_based_tester/v93k/test_methods.rb +9 -0
  146. data/lib/origen_testers/smartest_based_tester/v93k/test_suite.rb +9 -0
  147. data/lib/origen_testers/smartest_based_tester/v93k/test_suites.rb +9 -0
  148. data/lib/origen_testers/test/basic_interface.rb +17 -0
  149. data/lib/origen_testers/test/block.rb +21 -0
  150. data/lib/origen_testers/test/dut.rb +184 -0
  151. data/lib/origen_testers/test/dut2.rb +76 -0
  152. data/lib/origen_testers/test/j750_base_interface.rb +119 -0
  153. data/lib/origen_testers/test/j750_hpt_interface.rb +8 -0
  154. data/lib/origen_testers/test/j750_interface.rb +8 -0
  155. data/lib/origen_testers/test/nvm.rb +94 -0
  156. data/lib/origen_testers/test/ultraflex_interface.rb +110 -0
  157. data/lib/origen_testers/test/v93k_interface.rb +115 -0
  158. data/lib/origen_testers/timing.rb +362 -0
  159. data/lib/origen_testers/vector.rb +203 -0
  160. data/lib/origen_testers/vector_based_tester.rb +42 -0
  161. data/lib/origen_testers/vector_generator.rb +623 -0
  162. data/lib/origen_testers/vector_pipeline.rb +288 -0
  163. data/pattern/dc_instr.rb +7 -0
  164. data/pattern/delay.rb +7 -0
  165. data/pattern/mem_test.rb +8 -0
  166. data/pattern/multi_vector.rb +117 -0
  167. data/pattern/multi_vector_plus1.rb +125 -0
  168. data/pattern/nvm/j750/add_late_pins.rb +3 -0
  169. data/pattern/nvm/j750/iterator_postfix_test_x_bx.rb +8 -0
  170. data/pattern/nvm/j750/iterator_test_x_bx.rb +8 -0
  171. data/pattern/nvm/j750/j750_halt.rb +159 -0
  172. data/pattern/nvm/j750/j750_workout.rb +202 -0
  173. data/pattern/nvm/j750/timing.rb +73 -0
  174. data/pattern/nvm/v93k/v93k_workout.rb +136 -0
  175. data/pattern/read_write_reg.rb +58 -0
  176. data/pattern/reset.rb +4 -0
  177. data/pattern/subroutines.rb +38 -0
  178. data/program/_additional_erase.rb +7 -0
  179. data/program/_efa_resources.rb +7 -0
  180. data/program/_erase.rb +25 -0
  181. data/program/_erase_vfy.rb +5 -0
  182. data/program/_iv_resources.rb +10 -0
  183. data/program/basic_interface.rb +5 -0
  184. data/program/components/_prb2_main.rb +6 -0
  185. data/program/flow_control.rb +164 -0
  186. data/program/prb1.rb +226 -0
  187. data/program/prb1_resources.rb +28 -0
  188. data/program/prb2.rb +40 -0
  189. data/program/test.rb +20 -0
  190. data/templates/example.txt.erb +53 -0
  191. data/templates/j750/_vt_flow.txt.erb +8 -0
  192. data/templates/j750/_vt_instances.txt.erb +4 -0
  193. data/templates/j750/program_sheet.txt.erb +9 -0
  194. data/templates/manifest/v93k.yaml.erb +22 -0
  195. data/templates/web/index.md.erb +51 -0
  196. data/templates/web/layouts/_basic.html.erb +15 -0
  197. data/templates/web/partials/_navbar.html.erb +22 -0
  198. data/templates/web/release_notes.md.erb +5 -0
  199. metadata +332 -0
@@ -0,0 +1,341 @@
1
+ module OrigenTesters
2
+ class IGXLBasedTester
3
+ class Parser
4
+ class TestInstance
5
+ attr_accessor :parser
6
+
7
+ TYPES = %w(
8
+ functional board_pmu empty pin_pmu power_supply mto_memory
9
+ )
10
+
11
+ TYPE_ALIASES = {
12
+ functional_t: :functional,
13
+ boardpmu_t: :board_pmu,
14
+ nvmboardpmucal_t: :board_pmu,
15
+ nvmboardpmumeasure_t: :board_pmu,
16
+ empty_t: :empty,
17
+ pinpmu_t: :pin_pmu,
18
+ nvmpinpmucal_t: :pin_pmu,
19
+ nvmpinpmumeas_t: :pin_pmu,
20
+ powersupply_t: :power_supply,
21
+ mto_memory_t: :mto_memory
22
+ }
23
+
24
+ attributes = %w(
25
+ test_name proc_type proc_name proc_called_as dc_category dc_selector ac_category ac_selector
26
+ time_sets edge_sets pin_levels overlay
27
+ )
28
+ 80.times do |i|
29
+ attributes << "arg#{i}"
30
+ end
31
+ attributes << 'comment'
32
+
33
+ ATTRS = attributes
34
+
35
+ ALIASES = {
36
+ name: :test_name,
37
+
38
+ functional: {
39
+ pattern: :arg0,
40
+ start_func: :arg1,
41
+ pre_pat_func: :arg2,
42
+ pre_test_func: :arg3,
43
+ post_test_func: :arg4,
44
+ post_pat_func: :arg5,
45
+ end_func: :arg6,
46
+ set_pass_fail: :arg7,
47
+ start_func_args: :arg13,
48
+ pre_pat_func_args: :arg14,
49
+ pre_test_func_args: :arg15,
50
+ post_test_func_args: :arg16,
51
+ post_pat_func_args: :arg17,
52
+ end_func_args: :arg18,
53
+ wait_flags: :arg21,
54
+ wait_time: :arg22,
55
+ pat_flag_func: :arg23,
56
+ pat_flag_func_args: :arg24,
57
+ relay_mode: :arg25,
58
+ threading: :arg26,
59
+ match_all_sites: :arg27,
60
+ capture_mode: :arg30,
61
+ capture_what: :arg31,
62
+ capture_memory: :arg32,
63
+ capture_size: :arg33,
64
+ datalog_mode: :arg34,
65
+ data_type: :arg35
66
+ },
67
+
68
+ board_pmu: {
69
+ hsp_start: :arg0,
70
+ start_func: :arg1,
71
+ pre_pat_func: :arg2,
72
+ pre_test_func: :arg3,
73
+ post_test_func: :arg4,
74
+ post_pat_func: :arg5,
75
+ end_func: :arg6,
76
+ precond_pat: :arg7,
77
+ hold_state_pat: :arg8,
78
+ holdstate_pat: :arg8,
79
+ pattern: :arg8,
80
+ pcp_stop: :arg9,
81
+ wait_flags: :arg10,
82
+ start_lo: :arg11,
83
+ init_lo: :arg11,
84
+ start_hi: :arg12,
85
+ init_hi: :arg12,
86
+ start_hiz: :arg13,
87
+ init_hiz: :arg13,
88
+ float_pins: :arg14,
89
+ pinlist: :arg15,
90
+ measure_mode: :arg16,
91
+ irange: :arg17,
92
+ clamp: :arg18,
93
+ vrange: :arg19,
94
+ sampling_time: :arg20,
95
+ samples: :arg21,
96
+ setting_time: :arg22,
97
+ hi_lo_lim_valid: :arg23,
98
+ hi_limit: :arg24,
99
+ lo_limit: :arg25,
100
+ force_cond_1: :arg26,
101
+ force_cond_2: :arg27,
102
+ gang_pins_tested: :arg28,
103
+ relay_mode: :arg29,
104
+ wait_time_out: :arg30,
105
+ start_func_args: :arg31,
106
+ pre_pat_func_args: :arg32,
107
+ pre_test_func_args: :arg33,
108
+ post_test_func_args: :arg34,
109
+ post_pat_func_args: :arg35,
110
+ end_func_args: :arg36,
111
+ pcp_start: :arg37,
112
+ pcp_check_pg: :arg38,
113
+ hsp_stop: :arg39,
114
+ hsp_check_pg: :arg40,
115
+ resume_pat: :arg41,
116
+ utility_pins_1: :arg42,
117
+ utility_pins_0: :arg43,
118
+ pre_charge_enable: :arg44,
119
+ pre_charge: :arg45,
120
+ threading: :arg46
121
+ },
122
+
123
+ pin_pmu: {
124
+ hsp_start: :arg0,
125
+ start_func: :arg1,
126
+ pre_pat_func: :arg2,
127
+ pre_test_func: :arg3,
128
+ post_test_func: :arg4,
129
+ post_pat_func: :arg5,
130
+ end_func: :arg6,
131
+ precond_pat: :arg7,
132
+ hold_state_pat: :arg8,
133
+ holdstate_pat: :arg8,
134
+ pattern: :arg8,
135
+ pcp_stop: :arg9,
136
+ wait_flags: :arg10,
137
+ start_lo: :arg11,
138
+ init_lo: :arg11,
139
+ start_hi: :arg12,
140
+ init_hi: :arg12,
141
+ start_hiz: :arg13,
142
+ init_hiz: :arg13,
143
+ float_pins: :arg14,
144
+ pinlist: :arg15,
145
+ measure_mode: :arg16,
146
+ irange: :arg17,
147
+ setting_time: :arg18,
148
+ hi_lo_lim_valid: :arg19,
149
+ hi_limit: :arg20,
150
+ lo_limit: :arg21,
151
+ force_cond_1: :arg22,
152
+ force_cond_2: :arg23,
153
+ fload: :arg24,
154
+ f_load: :arg24,
155
+ relay_mode: :arg25,
156
+ wait_time_out: :arg26,
157
+ start_func_args: :arg27,
158
+ pre_pat_func_args: :arg28,
159
+ pre_test_func_args: :arg29,
160
+ post_test_func_args: :arg30,
161
+ post_pat_func_args: :arg31,
162
+ end_func_args: :arg32,
163
+ pcp_start: :arg33,
164
+ pcp_check_pg: :arg34,
165
+ hsp_stop: :arg35,
166
+ hsp_check_pg: :arg36,
167
+ sampling_time: :arg37,
168
+ samples: :arg38,
169
+ resume_pat: :arg39,
170
+ vcl: :arg40,
171
+ vch: :arg41,
172
+ utility_pins_1: :arg42,
173
+ utility_pins_0: :arg43,
174
+ pre_charge_enable: :arg44,
175
+ pre_charge: :arg45,
176
+ threading: :arg46
177
+ },
178
+ mto_memory: {
179
+ patterns: :arg0,
180
+ pattern: :arg0,
181
+ start_func: :arg1,
182
+ start_of_body_f: :arg1,
183
+ pre_pat_func: :arg2,
184
+ pre_pat_f: :arg2,
185
+ pre_test_func: :arg3,
186
+ pre_test_f: :arg3,
187
+ post_test_func: :arg4,
188
+ post_test_f: :arg4,
189
+ post_pat_func: :arg5,
190
+ post_pat_f: :arg5,
191
+ end_of_body_func: :arg6,
192
+ end_of_body_f: :arg6,
193
+ set_pass_fail: :arg7,
194
+ init_lo: :arg8,
195
+ start_lo: :arg8,
196
+ init_hi: :arg9,
197
+ start_hi: :arg9,
198
+ init_hiz: :arg10,
199
+ start_hiz: :arg10,
200
+ float_pins: :arg11,
201
+ start_of_body_func_args: :arg12,
202
+ start_of_body_f_args: :arg12,
203
+ pre_pat_func_args: :arg13,
204
+ pre_pat_f_args: :arg13,
205
+ pre_test_func_args: :arg14,
206
+ pre_test_f_args: :arg14,
207
+ post_test_func_args: :arg15,
208
+ post_test_f_args: :arg15,
209
+ post_pat_f_args: :arg16,
210
+ end_of_body_func_args: :arg17,
211
+ end_of_body_f_args: :arg17,
212
+ utility_pins_1: :arg18,
213
+ utility_pins_0: :arg19,
214
+ wait_flags: :arg20,
215
+ wait_time_out: :arg21,
216
+ PatFlagF: :arg22,
217
+ pat_flag_f: :arg22,
218
+ pat_flag_func_args: :arg23,
219
+ pat_flag_f_args: :arg23,
220
+ relay_mode: :arg24,
221
+ x_enable_mask: :arg29,
222
+ x_shift_direction: :arg30,
223
+ x_shift_input: :arg31,
224
+ y_enable_mask: :arg36,
225
+ y_shift_direction: :arg37,
226
+ y_shift_input: :arg38,
227
+ dga: :arg39,
228
+ dgb: :arg40,
229
+ dgc: :arg41,
230
+ dgd: :arg42,
231
+ dg_enable_mask: :arg43,
232
+ dg_shift_direction: :arg44,
233
+ dg_shift_input: :arg45,
234
+ x_coincidence_enable_mask: :arg46,
235
+ y_coincidence_enable_mask: :arg47,
236
+ two_bit_dg_setup: :arg48,
237
+ x_scramble_algorithm: :arg49,
238
+ y_scramble_algorithm: :arg50,
239
+ topo_inversion_algorithm: :arg51,
240
+ utility_counter_a: :arg52,
241
+ utility_counter_b: :arg53,
242
+ utility_counter_c: :arg54,
243
+ dut_data_source: :arg55,
244
+ scramble_addr: :arg56,
245
+ speed_mode: :arg57,
246
+ resource_map: :arg58,
247
+ receive_data: :arg59,
248
+ data_to_capture: :arg60,
249
+ capture_marker: :arg61,
250
+ enable_wrapping: :arg62,
251
+ capture_scrambled_address: :arg63,
252
+ mapmem_0_input_set: :arg64,
253
+ mapmem_1_input_set: :arg65,
254
+ threading: :arg69,
255
+ match_all_sites: :arg70
256
+ }
257
+
258
+ }
259
+
260
+ # Make readers for each low level attribute
261
+ ATTRS.each do |attr|
262
+ attr_reader attr
263
+ end
264
+
265
+ # And the aliases
266
+ ALIASES.each do |_alias, attr|
267
+ define_method("#{_alias}") do
268
+ send(attr)
269
+ end
270
+ end
271
+
272
+ def initialize(line, options = {})
273
+ @parser = options[:parser]
274
+ @line = line
275
+ parse
276
+ if valid?
277
+ ATTRS.each_with_index do |attr, i|
278
+ instance_variable_set("@#{attr}", components[i + 1])
279
+ end
280
+ if ALIASES[type]
281
+ ALIASES[type].each do |_alias, attr|
282
+ define_singleton_method("#{_alias}") do
283
+ send(attr)
284
+ end
285
+ end
286
+ end
287
+ end
288
+ end
289
+
290
+ def inspect # :nodoc:
291
+ "<TestInstance: #{name}, Type: #{type}>"
292
+ end
293
+
294
+ def description
295
+ parser.descriptions.test_instance(name: name)
296
+ end
297
+
298
+ def type
299
+ TYPE_ALIASES[proc_name.downcase.to_sym] || :unsupported
300
+ end
301
+
302
+ def parse
303
+ @components = @line.split("\t") unless @line.strip.empty?
304
+ end
305
+
306
+ def valid?
307
+ components[4] && ['Excel Macro', 'VB DLL'].include?(components[4])
308
+ end
309
+
310
+ def components
311
+ @components ||= []
312
+ end
313
+
314
+ # Returns an array of all pattern names referenced in this test instance
315
+ def patterns
316
+ if self.respond_to?(:pattern)
317
+ pattern.split(',').map do |pat|
318
+ extract_pattern_from_patset(pat)
319
+ end.flatten.map { |pat| pat.gsub(/.*[\\\/]/, '').gsub(/\..*/, '') }
320
+ end
321
+ end
322
+
323
+ def extract_pattern_from_patset(patset)
324
+ pset = parser.pattern_sets.where(name: patset, exact: true)
325
+ if pset.size > 1
326
+ puts "Warning multiple pattern sets called #{patset} found, using the first one"
327
+ end
328
+ if pset.size == 0
329
+ patset
330
+ else
331
+ pset.first.pattern_names
332
+ end
333
+ end
334
+
335
+ def vdd
336
+ parser.dc_specs.where(name: 'VDD', exact: true).first.lookup(dc_category, dc_selector)
337
+ end
338
+ end
339
+ end
340
+ end
341
+ end
@@ -0,0 +1,24 @@
1
+ module OrigenTesters
2
+ class IGXLBasedTester
3
+ class Parser
4
+ class TestInstances < ::OrigenTesters::Parser::SearchableHash
5
+ attr_accessor :parser
6
+
7
+ def initialize(options = {})
8
+ @parser = options[:parser]
9
+ end
10
+
11
+ def import(file)
12
+ File.readlines(file).each do |line|
13
+ l = TestInstance.new(line, parser: parser)
14
+ self[l.name] = l if l.valid?
15
+ end
16
+ end
17
+
18
+ def inspect
19
+ "<TestInstances: #{size}>"
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,13 @@
1
+ module OrigenTesters
2
+ class IGXLBasedTester
3
+ class Parser
4
+ class Timeset
5
+ attr_accessor :parser
6
+
7
+ def initialize(options = {})
8
+ @parser = options[:parser]
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,477 @@
1
+ module OrigenTesters
2
+ module IGXLBasedTester
3
+ class UltraFLEX < Base
4
+ autoload :Generator, 'origen_testers/igxl_based_tester/ultraflex/generator.rb'
5
+
6
+ # Tester model to generate .atp patterns for the Teradyne UltraFLEX
7
+ #
8
+ # == Basic Usage
9
+ # $tester = Testers::UltraFLEX.new
10
+ # $tester.cycle # Generate a vector
11
+ #
12
+ # Many more methods exist to generate UltraFLEX specific micro-code, see below for
13
+ # details.
14
+ #
15
+ # Also note that this class inherits from the base IGXLBasedTester class and so all methods
16
+ # described there are also available.
17
+
18
+ # Returns a new UltraFLEX instance, normally there would only ever be one of these
19
+ # assigned to the global variable such as $tester by your target.
20
+ def initialize
21
+ super
22
+ @pipeline_depth = 255 # for single mode
23
+ @software_version = '8.10.10'
24
+ @name = 'ultraflex'
25
+ @opcode_mode = :single # there is also :dual
26
+ @counter_lsb_bits = 16 # individual counter bit length
27
+ @counter_msb_bits = 12 # temporary register commonly used to extend all counters
28
+
29
+ @flags = %w(cpuA_cond cpuB_cond cpuC_cond cpuD_cond)
30
+ @microcode[:enable] = 'branch_expr ='
31
+ @microcode[:set_flag] = 'set_cpu_cond'
32
+ @microcode[:mask_vector] = 'mask'
33
+
34
+ # Min required for a VM module-- not for SRM modules
35
+ # this handled in pattern_header below
36
+ @min_pattern_vectors = (@opcode_mode == :single) ? 64 : 128
37
+
38
+ @digital_instrument = 'hsdm' # 'hsdm' for HSD1000 and UP800, ok with UP1600 though
39
+
40
+ @capture_state = 'V' # STV requires valid 'V' expect data
41
+ end
42
+
43
+ def freq_count(pin, options = {})
44
+ fail 'Method freq_count not yet supported for UltraFLEX!'
45
+ end
46
+
47
+ def memory_test(options = {})
48
+ options = {
49
+ gen_vector: true, # Default generate vector not just MTO opcode
50
+ init_counter_x: false, # initialize counter X
51
+ inc_counter_x: false, # increment counter X
52
+ init_counter_y: false, # initialize counter X
53
+ inc_counter_y: false, # increment counter X
54
+ capture_vector: false, # capture vector to memory using all mem types
55
+ capture_vector_mem0: false, # capture vector to memory type 0, here for J750 will be stv_m0
56
+ capture_vector_mem1: false, # capture vector to memory type 1, here for J750 will be stv_m1
57
+ capture_vector_mem2: false, # capture vector to memory type 2, here for J750 will be stv_c
58
+ pin: false, # pin on which to drive or expect data, pass pin object here!
59
+ pin_data: false, # pin data (:none, :drive, :expect)
60
+ use_dgen_group: false,
61
+ set_msb: false
62
+ }.merge(options)
63
+
64
+ mto_opcode = ''
65
+
66
+ if options[:init_counter_x]
67
+ mto_opcode += ' xenable_load jam_reg xa jam_reg'
68
+ end
69
+
70
+ if options[:init_counter_y]
71
+ mto_opcode += ' yenable_load jam_reg ya jam_reg'
72
+ end
73
+
74
+ if options[:inc_counter_x]
75
+ mto_opcode += ' xa inc'
76
+ end
77
+
78
+ if options[:inc_counter_y]
79
+ mto_opcode += ' ya inc'
80
+ end
81
+
82
+ if options[:use_dgen_group]
83
+ mto_opcode += ' dgroup 0'
84
+ end
85
+
86
+ if options[:set_msb]
87
+ microcode 'set_msb 1'
88
+ end
89
+
90
+ unless mto_opcode.eql?('')
91
+ mto_opcode = '(mto =' + mto_opcode + ')'
92
+ end
93
+
94
+ if options[:pin_data] == :expect
95
+ mto_opcode = 'stv'
96
+ end
97
+
98
+ if options[:gen_vector]
99
+ if options[:pin]
100
+ case options[:pin_data]
101
+ when :drive
102
+ # store current pin state
103
+ cur_pin_state = options[:pin].state.to_sym
104
+ options[:pin].drive_mem
105
+ when :expect
106
+ # store current pin state
107
+ cur_pin_state = options[:pin].state.to_sym
108
+ options[:pin].expect_mem
109
+ end
110
+ end
111
+ cycle(microcode: "#{mto_opcode}", dont_compress: false)
112
+ if options[:pin]
113
+ # restore previous pin state
114
+ case options[:pin_data]
115
+ when :drive
116
+ options[:pin].state = cur_pin_state
117
+ when :expect
118
+ options[:pin].state = cur_pin_state
119
+ end
120
+ end
121
+ else
122
+ microcode "#{mto_opcode}"
123
+ end
124
+ end
125
+
126
+ def call_match
127
+ fail 'Method call_match not yet supported for UltraFLEX!'
128
+ end
129
+
130
+ def set_code(code)
131
+ Origen.log.warning 'Method set_code not supported for UltraFLEX! Find alternative solution.'
132
+ cc '*** WARNING! *** Method set_code not supported for UltraFLEX! Find alternative solution.'
133
+ end
134
+
135
+ def loop_vectors(name, number_of_loops, global = false, label_first = false)
136
+ if number_of_loops > 1
137
+ @loop_counters ||= {}
138
+ if @loop_counters[name]
139
+ @loop_counters[name] += 1
140
+ else
141
+ @loop_counters[name] = 0
142
+ end
143
+ loop_name = @loop_counters[name] == 0 ? name : "#{name}_#{@loop_counters[name]}"
144
+ if label_first
145
+ global_opt = (global) ? 'global ' : ''
146
+ microcode "#{global_opt}#{loop_name}: "
147
+ end
148
+
149
+ if "#{loop_name}" == 'row_loop'
150
+ cycle(microcode: 'loop c0')
151
+ elsif "#{loop_name}" == 'quad_loop'
152
+ cycle(microcode: 'loop c1')
153
+ elsif "#{loop_name}" == 'page_loop_red'
154
+ cycle(microcode: 'loop c2')
155
+ elsif "#{loop_name}" == 'page_loop_ecc'
156
+ cycle(microcode: 'loop c3')
157
+ elsif "#{loop_name}" == 'page_loop_data'
158
+ cycle(microcode: 'loop c4')
159
+ end
160
+
161
+ unless label_first
162
+ global_opt = (global) ? 'global ' : ''
163
+ cycle(microcode: "#{global_opt}#{loop_name}: ")
164
+ end
165
+ yield
166
+ cycle(microcode: "end_loop #{loop_name}")
167
+ else
168
+ yield
169
+ end
170
+ end
171
+
172
+ alias_method :loop_vector, :loop_vectors
173
+
174
+ def pattern_header(options = {})
175
+ options = {
176
+ instruments: {}
177
+ }.merge(options)
178
+
179
+ case $tester.vector_group_size
180
+ when 1
181
+ @opcode_mode = :single
182
+ when 2
183
+ @opcode_mode = :dual
184
+ when 4
185
+ @opcode_mode = :quad
186
+ end
187
+
188
+ options[:memory_test] = memory_test_en
189
+ options[:dc_pins] = get_dc_instr_pins
190
+
191
+ if options[:dc_pins]
192
+ options[:dc_pins].each do |pin|
193
+ options[:instruments].merge!(pin => 'DCVS')
194
+ end
195
+ end
196
+
197
+ # If memory test, then add to instruments hash
198
+ if options[:memory_test]
199
+ options[:instruments].merge!('mto' => 'nil')
200
+ end
201
+
202
+ super(options.merge(digital_inst: @digital_instrument,
203
+ memory_test: false,
204
+ high_voltage: false,
205
+ svm_only: false
206
+ )) do |pin_list|
207
+ microcode "#{options[:subroutine_pat] ? 'srm_vector' : 'vm_vector'}"
208
+ microcode "#{options[:pattern]} ($tset, #{pin_list})"
209
+ microcode '{'
210
+ # override min vector limit if subroutine pattern
211
+ @min_pattern_vectors = 0 if options[:subroutine_pat]
212
+ unless options[:subroutine_pat]
213
+ microcode "start_label #{options[:pattern]}_st:"
214
+ end
215
+ end
216
+ end
217
+
218
+ def pattern_footer(options = {})
219
+ super(options.merge(end_module: false))
220
+ end
221
+
222
+ # Generates a match loop based on vector condition passed in via block
223
+ #
224
+ # This method is not really intended to be called directly, rather you should call
225
+ # via Tester#wait:
226
+ # e.g. $tester.wait(:match => true) do
227
+ # reg(:status_reg).bit(:done).read(1)! # vector condition that you want to match
228
+ # end
229
+ #
230
+ # The timeout should be provided in cycles, however when called via the wait method the
231
+ # time-based helpers (time_in_us, etc) will be converted to cycles for you.
232
+ #
233
+ # The following options are available to tailor the match loop behavior, defaults in
234
+ # parenthesis:
235
+ # * :force_fail_on_timeout (true) - Force a vector mis-compare if the match loop times out
236
+ # * :on_timeout_goto ("") - Optionally supply a label to branch to on timeout, by default will continue from the end of the match loop
237
+ # * :on_block_match_goto ("") - Optionally supply a label to branch to when block condition is met, by default will continue from the end of the match loop
238
+ # * :multiple_entries (false) - Supply an integer to generate multiple entries into the match (each with a unique readcode), this can be useful when debugging patterns with multiple matches
239
+ # * :force_fail_on_timeout (true) - force pattern to fail if timeout occurs
240
+ # * :global_loops (false) - whether match loop loops should use global labels
241
+ # * :manual_stop (false) - whether to use extra cpuB flag to resolve IG-XL v.3.50.xx bug where VBT clears cpuA immediately
242
+ # at start of PatFlagFunc instead of at end. Use will have to manually clear cpuB to resume this pattern.
243
+ # ==== Examples
244
+ # $tester.wait(:match => true, :time_in_us => 5000, :pin => $top.pin(:done), :state => :high) do
245
+ # <vectors>
246
+ # end
247
+ def match_block(timeout, options = {}, &block)
248
+ options = {
249
+ check_for_fails: false,
250
+ on_timeout_goto: false,
251
+ on_block_match_goto: false,
252
+ multiple_entries: false,
253
+ force_fail_on_timeout: true,
254
+ global_loops: false,
255
+ manual_stop: false,
256
+ clr_fail_post_match: false
257
+ }.merge(options)
258
+
259
+ unless block_given?
260
+ fail 'ERROR: block not passed to match_block!'
261
+ end
262
+
263
+ if options[:check_for_fails]
264
+ cc 'NOTE: check for fails prior to match loop not necessary on UltraFlex'
265
+ end
266
+
267
+ ss 'WARNING: MATCH LOOP FOR ULTRAFLEX STILL UNDER DEVELOPMENT'
268
+
269
+ # Create BlockArgs objects in order to receive multiple blocks
270
+ match_conditions = Origen::Utility::BlockArgs.new
271
+ fail_conditions = Origen::Utility::BlockArgs.new
272
+
273
+ # yield object to calling routine to get populated with blocks
274
+ if block.arity > 0
275
+ yield match_conditions, fail_conditions
276
+ else
277
+ # for backwards compatibility with Origen core call to match_block
278
+ match_conditions.add(&block)
279
+ fail_conditions.add(&block)
280
+ end
281
+
282
+ # Now do the main match loop
283
+ cc 'Start the match loop'
284
+
285
+ cycle # (:microcode => "set_msb #{counter_msb}") # set_msb microcode will be set below after counting match loop cycles
286
+ set_msb_vector = last_vector # remember the vector with set_msb opcode
287
+
288
+ cycle(microcode: 'branch_expr = (fail)')
289
+
290
+ global_opt = (options[:global_loops]) ? 'global ' : ''
291
+ microcode "#{global_opt}match_loop_#{@unique_counter}:"
292
+
293
+ cycle # (:microcode => "set c0 #{counter_lsb}")
294
+ set_c0_vector = last_vector # remember the vector with set_c0 opcode
295
+
296
+ microcode "match_result_loop_#{@unique_counter}:"
297
+ cycle(microcode: 'loop c0')
298
+
299
+ # count cycles in match loop block passed to help with meeting
300
+ # desired timeout value (have to back assign microcodes above)
301
+ prematch_cycle_count = cycle_count
302
+ match_conditions.each_with_index do |condition, i|
303
+ mask_fails(true)
304
+ condition.call # match condition
305
+ mask_fails(false)
306
+
307
+ cc ' Wait for the result to propagate through the pipeline'
308
+ cycle(microcode: 'pipe_minus 1')
309
+ inc_cycle_count(@pipeline_depth - 1) # Account for pipeline depth
310
+ cc "Branch if block condition #{i} not yet met"
311
+ cycle(microcode: "if (branch_expr) jump block_#{i}_notyet_matched_#{@unique_counter}")
312
+ cc 'Match found'
313
+ cycle(microcode: 'pop_loop')
314
+ cycle(microcode: 'return') # DH ONLY IF SUBROUTINE!!
315
+ cc 'Match not yet found'
316
+ cycle(microcode: "block_#{i}_notyet_matched_#{@unique_counter}:")
317
+ end
318
+
319
+ match_conditions_cycle_count = cycle_count - prematch_cycle_count
320
+ cc "Match loop cycle count = #{match_conditions_cycle_count}"
321
+
322
+ # reduce timeout requested by match loop cycle count
323
+ timeout = (timeout.to_f / match_conditions_cycle_count).ceil
324
+
325
+ # Calculate the counter values appropriately hit the timeout requested
326
+ match_delay_cycles = false
327
+
328
+ # Determine full value of counter0
329
+ counter_value = timeout.to_f.floor
330
+
331
+ if counter_value < (2**@counter_lsb_bits)
332
+ # small value, don't need msb temp register
333
+ counter_msb = 1
334
+ counter_lsb = counter_value
335
+ elsif counter_value < (2**(@counter_lsb_bits + @counter_msb_bits))
336
+ # larger value, but smaller than counter maximum
337
+ counter_msb = counter_value # set MSB (lowest LSB bits get ignored)
338
+ counter_lsb = counter_value & (2**@counter_lsb_bits - 1) # set LSB
339
+ elsif counter_value < (2**(@counter_lsb_bits + @counter_msb_bits)) * @max_repeat_loop
340
+ # larger value, greater than counter, so add time delay per instance of loop to avoid using second counter
341
+ match_delay_cycles = (counter_value.to_f / (2**(@counter_lsb_bits + @counter_msb_bits))).ceil
342
+ counter_msb = (counter_value / match_delay_cycles).floor # set MSB (lowest LSB bits get ignored)
343
+ counter_lsb = counter_msb & (2**@counter_lsb_bits - 1) # set LSB
344
+ else
345
+ abort 'ERROR: timeout value too large in tester match method!'
346
+ end
347
+
348
+ # retroactively modify the counters based on cycles in match loop conditions
349
+ set_msb_vector.microcode = "set_msb #{counter_msb}"
350
+ set_c0_vector.microcode = "set c0 #{counter_lsb}"
351
+
352
+ if match_delay_cycles
353
+ cc 'Delay to meet timeout value'
354
+ cycle(repeat: match_delay_cycles) if match_delay_cycles
355
+ end
356
+
357
+ cycle(microcode: "end_loop match_result_loop_#{@unique_counter}")
358
+
359
+ if options[:force_fail_on_timeout]
360
+ cc 'To get here something has gone wrong, check blocks again to force a pattern failure'
361
+ fail_conditions.each do |condition|
362
+ cycle(microcode: 'pipe_minus 1')
363
+ condition.call
364
+ end
365
+ end
366
+
367
+ @unique_counter += 1 # Increment so a different label will be applied if another
368
+ # handshake is called in the same pattern
369
+ end
370
+
371
+ # Handshake with the tester.
372
+ #
373
+ # Will set a cpu flag (A) and wait for it to be cleared by the tester, optionally
374
+ # pass in a read code to pass information to the tester.
375
+ #
376
+ # ==== Examples
377
+ # $tester.handshake # Pass control to the tester for a measurement
378
+ # $tester.handshake(:readcode => 10) # Trigger a specific action by the tester
379
+ def handshake(options = {})
380
+ options = {
381
+ readcode: false,
382
+ manual_stop: false, # set a 2nd CPU flag in case 1st flag is automatically cleared
383
+ }.merge(options)
384
+ if options[:readcode]
385
+ set_code(options[:readcode])
386
+ end
387
+ if options[:manual_stop]
388
+ cycle(microcode: "#{@microcode[:enable]} (#{@flags[1]})")
389
+ cycle(microcode: "#{@microcode[:set_flag]} (#{@flags[0]} #{@flags[1]})")
390
+ else
391
+ cycle(microcode: "#{@microcode[:enable]} (#{@flags[0]})")
392
+ cycle(microcode: "#{@microcode[:set_flag]} (#{@flags[0]})")
393
+ end
394
+ cycle(microcode: "loop_here_#{@unique_counter}: if (branch_expr) jump loop_here_#{@unique_counter}")
395
+
396
+ @unique_counter += 1 # Increment so a different label will be applied if another
397
+ # handshake is called in the same pattern
398
+ end
399
+
400
+ # Capture a vector to the tester HRAM.
401
+ #
402
+ # This method applys a store vector (stv) opcode to the previous vector, note that is does
403
+ # not actually generate a new vector.
404
+ #
405
+ # Sometimes when generating vectors within a loop you may want to apply a stv opcode
406
+ # retrospectively to a previous vector, passing in an offset option will allow you
407
+ # to do this.
408
+ #
409
+ # On J750 the pins argument is ignored since the tester only supports whole vector capture.
410
+ #
411
+ # @example
412
+ # $tester.cycle # This is the vector you want to capture
413
+ # $tester.store # This applys the STV opcode
414
+ #
415
+ # $tester.cycle # This one gets stored
416
+ # $tester.cycle
417
+ # $tester.cycle
418
+ # $tester.store(:offset => -2) # Just realized I need to capture that earlier vector
419
+ def store(*pins)
420
+ options = pins.last.is_a?(Hash) ? pins.pop : {}
421
+ options = { offset: 0
422
+ }.merge(options)
423
+ pins = pins.flatten.compact
424
+ if pins.empty?
425
+ fail 'For the UltraFLEX you must supply the pins to store/capture'
426
+ end
427
+ pins.each do |pin|
428
+ pin.restore_state do
429
+ pin.capture
430
+ update_vector microcode: 'stv', offset: options[:offset]
431
+ update_vector_pin_val pin, microcode: 'stv', offset: options[:offset]
432
+ last_vector(options[:offset]).dont_compress = true
433
+ end
434
+ end
435
+ end
436
+ alias_method :to_hram, :store
437
+ alias_method :capture, :store
438
+
439
+ def reload_counters(name)
440
+ microcode "reload #{name}"
441
+ end
442
+
443
+ def set_msb(name)
444
+ microcode "set_msb #{name}"
445
+ end
446
+
447
+ # Capture the next vector generated to HRAM
448
+ #
449
+ # This method applies a store vector (stv) opcode to the next vector to be generated,
450
+ # note that is does not actually generate a new vector.
451
+ #
452
+ # pin argument must be provided so that 'V' (valid) state can be applied to the pin
453
+ # if not already.
454
+ #
455
+ # @example
456
+ # $tester.store_next_cycle
457
+ # $tester.cycle # This is the vector that will be captured
458
+ def store_next_cycle(*pins)
459
+ options = pins.last.is_a?(Hash) ? pins.pop : {}
460
+ options = {
461
+ }.merge(options)
462
+ pins = pins.flatten.compact
463
+ if pins.empty?
464
+ fail 'For the UltraFLEX you must supply the pins to store/capture'
465
+ end
466
+ pins.each { |pin| pin.save; pin.capture }
467
+ # Register this clean up function to be run after the next vector
468
+ # is generated (SMcG: cool or what! DH: Yes, very cool!)
469
+ preset_next_vector(microcode: 'stv') do
470
+ pins.each(&:restore)
471
+ end
472
+ end
473
+ alias_method :store!, :store_next_cycle
474
+ end
475
+ end
476
+ UltraFLEX = IGXLBasedTester::UltraFLEX
477
+ end