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,94 +1,94 @@
1
- module OrigenTesters
2
- module Test
3
- class NVM
4
- attr_accessor :blocks
5
-
6
- include Origen::Pins
7
- include Origen::Registers
8
-
9
- def initialize
10
- add_reg :mclkdiv, 0x03, 16, osch: { pos: 15 },
11
- asel: { pos: 14 },
12
- failctl: { pos: 13 },
13
- parsel: { pos: 12 },
14
- eccen: { pos: 11 },
15
- cmdloc: { pos: 8, bits: 3, res: 0b001 },
16
- clkdiv: { pos: 0, bits: 8, res: 0x18 }
17
-
18
- add_reg :data, 0x4, 16, d: { pos: 0, bits: 16 }
19
-
20
- @blocks = [Block.new(0, self), Block.new(1, self), Block.new(2, self)]
21
- end
22
-
23
- def find_block_by_id(id)
24
- @blocks.find { |block| block.id == id }
25
- end
26
-
27
- def reg_owner_alias
28
- %w(flash fmu)
29
- end
30
-
31
- def override_method
32
- :overridden
33
- end
34
-
35
- def added_method
36
- :added
37
- end
38
-
39
- def add_proth_reg
40
- reg :proth, 0x0024, size: 32 do
41
- bits 31..24, :fprot7, reset: 0xFF
42
- bits 23..16, :fprot6, reset: 0xEE
43
- bits 15..8, :fprot5, reset: 0xDD
44
- bits 7..0, :fprot4, reset: 0x11
45
- end
46
- end
47
- end
48
-
49
- class NVMSub < NVM
50
- def redefine_data_reg
51
- add_reg :data, 0x40, 16, d: { pos: 0, bits: 16 }
52
- end
53
-
54
- # Tests that the block format for defining registers works
55
- def add_reg_with_block_format
56
- # ** Data Register 3 **
57
- # This is dreg
58
- add_reg :dreg, 0x1000, size: 16 do
59
- # This is dreg bit 15
60
- bit 15, :bit15, reset: 1
61
- # **Bit 14** - This does something cool
62
- #
63
- # 0 | Coolness is disabled
64
- # 1 | Coolness is enabled
65
- bits 14, :bit14
66
- # This is dreg bit upper
67
- bits 13..8, :upper
68
- # This is dreg bit lower
69
- # This is dreg bit lower line 2
70
- bit 7..0, :lower, writable: false, reset: 0x55
71
- end
72
-
73
- # This is dreg2
74
- reg :dreg2, 0x1000, size: 16 do
75
- # This is dreg2 bit 15
76
- bit 15, :bit15, reset: 1
77
- # This is dreg2 bit upper
78
- bits 14..8, :upper
79
- # This is dreg2 bit lower
80
- # This is dreg2 bit lower line 2
81
- bit 7..0, :lower, writable: false, reset: 0x55
82
- end
83
-
84
- # Finally a test that descriptions can be supplied via the API
85
- reg :dreg3, 0x1000, size: 16, description: "** Data Register 3 **\nThis is dreg3" do
86
- bit 15, :bit15, reset: 1, description: 'This is dreg3 bit 15'
87
- bit 14, :bit14, description: "**Bit 14** - This does something cool\n\n0 | Coolness is disabled\n1 | Coolness is enabled"
88
- bits 13..8, :upper, description: 'This is dreg3 bit upper'
89
- bit 7..0, :lower, writable: false, reset: 0x55, description: "This is dreg3 bit lower\nThis is dreg3 bit lower line 2"
90
- end
91
- end
92
- end
93
- end
94
- end
1
+ module OrigenTesters
2
+ module Test
3
+ class NVM
4
+ attr_accessor :blocks
5
+
6
+ include Origen::Pins
7
+ include Origen::Registers
8
+
9
+ def initialize
10
+ add_reg :mclkdiv, 0x03, 16, osch: { pos: 15 },
11
+ asel: { pos: 14 },
12
+ failctl: { pos: 13 },
13
+ parsel: { pos: 12 },
14
+ eccen: { pos: 11 },
15
+ cmdloc: { pos: 8, bits: 3, res: 0b001 },
16
+ clkdiv: { pos: 0, bits: 8, res: 0x18 }
17
+
18
+ add_reg :data, 0x4, 16, d: { pos: 0, bits: 16 }
19
+
20
+ @blocks = [Block.new(0, self), Block.new(1, self), Block.new(2, self)]
21
+ end
22
+
23
+ def find_block_by_id(id)
24
+ @blocks.find { |block| block.id == id }
25
+ end
26
+
27
+ def reg_owner_alias
28
+ %w(flash fmu)
29
+ end
30
+
31
+ def override_method
32
+ :overridden
33
+ end
34
+
35
+ def added_method
36
+ :added
37
+ end
38
+
39
+ def add_proth_reg
40
+ reg :proth, 0x0024, size: 32 do
41
+ bits 31..24, :fprot7, reset: 0xFF
42
+ bits 23..16, :fprot6, reset: 0xEE
43
+ bits 15..8, :fprot5, reset: 0xDD
44
+ bits 7..0, :fprot4, reset: 0x11
45
+ end
46
+ end
47
+ end
48
+
49
+ class NVMSub < NVM
50
+ def redefine_data_reg
51
+ add_reg :data, 0x40, 16, d: { pos: 0, bits: 16 }
52
+ end
53
+
54
+ # Tests that the block format for defining registers works
55
+ def add_reg_with_block_format
56
+ # ** Data Register 3 **
57
+ # This is dreg
58
+ add_reg :dreg, 0x1000, size: 16 do
59
+ # This is dreg bit 15
60
+ bit 15, :bit15, reset: 1
61
+ # **Bit 14** - This does something cool
62
+ #
63
+ # 0 | Coolness is disabled
64
+ # 1 | Coolness is enabled
65
+ bits 14, :bit14
66
+ # This is dreg bit upper
67
+ bits 13..8, :upper
68
+ # This is dreg bit lower
69
+ # This is dreg bit lower line 2
70
+ bit 7..0, :lower, writable: false, reset: 0x55
71
+ end
72
+
73
+ # This is dreg2
74
+ reg :dreg2, 0x1000, size: 16 do
75
+ # This is dreg2 bit 15
76
+ bit 15, :bit15, reset: 1
77
+ # This is dreg2 bit upper
78
+ bits 14..8, :upper
79
+ # This is dreg2 bit lower
80
+ # This is dreg2 bit lower line 2
81
+ bit 7..0, :lower, writable: false, reset: 0x55
82
+ end
83
+
84
+ # Finally a test that descriptions can be supplied via the API
85
+ reg :dreg3, 0x1000, size: 16, description: "** Data Register 3 **\nThis is dreg3" do
86
+ bit 15, :bit15, reset: 1, description: 'This is dreg3 bit 15'
87
+ bit 14, :bit14, description: "**Bit 14** - This does something cool\n\n0 | Coolness is disabled\n1 | Coolness is enabled"
88
+ bits 13..8, :upper, description: 'This is dreg3 bit upper'
89
+ bit 7..0, :lower, writable: false, reset: 0x55, description: "This is dreg3 bit lower\nThis is dreg3 bit lower line 2"
90
+ end
91
+ end
92
+ end
93
+ end
94
+ end
@@ -1,368 +1,368 @@
1
- module OrigenTesters
2
- module Timing
3
- extend ActiveSupport::Concern
4
-
5
- included do
6
- # When set to true all pattern vectors will be converted to use the same period (the
7
- # shortest period used in the pattern).
8
- #
9
- # @example
10
- # $tester.set_timeset("fast", 40)
11
- # 2.cycles # fast 1 0 0 1 0
12
- # # fast 1 0 0 1 0
13
- #
14
- # $tester.level_period = false # Without levelling enabled
15
- # $tester.set_timeset("slow", 80)
16
- # 2.cycles # slow 1 0 0 1 0
17
- # # slow 1 0 0 1 0
18
- #
19
- # $tester.level_period = true # With levelling enabled
20
- # $tester.set_timeset("slow", 80)
21
- # 2.cycles # fast 1 0 0 1 0
22
- # # fast 1 0 0 1 0
23
- # # fast 1 0 0 1 0
24
- # # fast 1 0 0 1 0
25
- #
26
- # @see Timing#timing_toggled_pins
27
- attr_accessor :level_period
28
- alias_method :level_period?, :level_period
29
- attr_writer :timing_toggled_pins
30
- end
31
-
32
- class Timeset
33
- attr_accessor :name, :period_in_ns
34
-
35
- def initialize(attrs = {})
36
- attrs.each do |name, value|
37
- send("#{name}=", value)
38
- end
39
- end
40
-
41
- # Returns true if the timeset has a shorter period than the supplied timeset
42
- def shorter_period_than?(timeset)
43
- period_in_ns < timeset.period_in_ns
44
- end
45
- end
46
-
47
- # @see Timing#level_period
48
- #
49
- # When period levelling is enabled, vectors will be expanded like this:
50
- # $tester.set_timeset("fast", 40)
51
- # 2.cycles # fast 1 0 0 1 0
52
- # # fast 1 0 0 1 0
53
- # # Without levelling enabled
54
- # $tester.set_timeset("slow", 80)
55
- # 2.cycles # slow 1 0 0 1 0
56
- # # slow 1 0 0 1 0
57
- # # With levelling enabled
58
- # $tester.set_timeset("slow", 80)
59
- # 2.cycles # fast 1 0 0 1 0
60
- # # fast 1 0 0 1 0
61
- # # fast 1 0 0 1 0
62
- # # fast 1 0 0 1 0
63
- #
64
- # The overall time of the levelled/expanded vectors matches that of the unlevelled
65
- # case. i.e. 4 cycles at fast speed (4 * 40ns = 160ns) is equivalent to 2 cycles
66
- # at slow speed (2 * 80ns = 160ns).
67
- #
68
- # However, what if pin 1 in the example above was a clk pin where the 1 -> 0 transition
69
- # was handled by the timing setup for that pin.
70
- # In that case the levelled code is no longer functionally correct since it contains
71
- # 4 clock pulses while the unlevelled code only has 2.
72
- #
73
- # Such pins can be specified via this attribute and the levelling logic will then
74
- # automatically adjust the drive state to keep the number of pulses correct.
75
- # It would automatically adjust to the alternative logic state where 0 means 'on'
76
- # and 1 means 'off' if applicable.
77
- #
78
- # $tester.timing_toggled_pins << $dut.pin(:tclk) # This is pin 1
79
- #
80
- # $tester.set_timeset("fast", 40)
81
- # 2.cycles # fast 1 0 0 1 0
82
- # # fast 1 0 0 1 0
83
- # # Without levelling enabled
84
- # $tester.set_timeset("slow", 80)
85
- # 2.cycles # slow 1 0 0 1 0
86
- # # slow 1 0 0 1 0
87
- # # With levelling enabled
88
- # $tester.set_timeset("slow", 80)
89
- # 2.cycles # fast 1 0 0 1 0
90
- # # fast 0 0 0 1 0
91
- # # fast 1 0 0 1 0
92
- # # fast 0 0 0 1 0
93
- #
94
- # Multiple pins an be specified like this:
95
- # $tester.timing_toggled_pins = [$dut.pin(:tclk), $dut.pin(:clk)] # Overrides any pins added elsewhere
96
- # $tester.timing_toggled_pins << [$dut.pin(:tclk), $dut.pin(:clk)] # In addition to any pins added elsewhere
97
- def timing_toggled_pins
98
- @timing_toggled_pins ||= []
99
- @timing_toggled_pins.flatten!
100
- @timing_toggled_pins
101
- end
102
-
103
- # Set the timeset for the next vectors, this will remain in place until the next
104
- # time this is called.
105
- #
106
- # $tester.set_timeset("bist_25mhz", 40)
107
- #
108
- # This method also accepts a block in which case the contained vectors will generate
109
- # with the supplied timeset and subsequent vectors will return to the previous timeset
110
- # automatically.
111
- #
112
- # $tester.set_timeset("bist_25mhz", 40) do
113
- # $tester.cycle
114
- # end
115
- #
116
- # The arguments can also be supplied as a single array, or not at all. In the latter case
117
- # the existing timeset will simply be preserved. This is useful if you have timesets that
118
- # can be conditionally set based on the target.
119
- #
120
- # # Target 1
121
- # $soc.readout_timeset = ["readout", 120]
122
- # # Target 2
123
- # $soc.readout_timeset = false
124
- #
125
- # # This code is compatible with both targets, in the first case the timeset will switch
126
- # # over, in the second case the existing timeset will be preserved.
127
- # $tester.set_timeset($soc.readout_timeset) do
128
- # $tester.cycle
129
- # end
130
- def set_timeset(timeset, period_in_ns = nil)
131
- if timeset.is_a?(Array)
132
- timeset, period_in_ns = timeset[0], timeset[1]
133
- end
134
- timeset ||= @timeset
135
- unless timeset.is_a?(Timeset)
136
- fail 'You must supply a period_in_ns argument to set_timeset' unless period_in_ns
137
- timeset = Timeset.new(name: timeset.to_s.chomp, period_in_ns: period_in_ns)
138
- end
139
- called_timesets << timeset unless called_timesets.map(&:name).include?(timeset.name)
140
- if @min_period_timeset
141
- @min_period_timeset = timeset if timeset.shorter_period_than?(@min_period_timeset)
142
- else
143
- @min_period_timeset = timeset
144
- end
145
- if block_given?
146
- original = @timeset
147
- timeset_changed(timeset)
148
- @timeset = timeset
149
- dut.timeset = timeset.name if dut.timesets[timeset.name]
150
- dut.current_timeset_period = timeset.period_in_ns
151
- yield
152
- timeset_changed(original)
153
- @timeset = original
154
- dut.timeset = original.name if dut.timesets[original.name]
155
- dut.current_timeset_period = original.period_in_ns
156
- else
157
- timeset_changed(timeset)
158
- @timeset = timeset
159
- dut.timeset = timeset.name if dut.timesets[timeset.name]
160
- dut.current_timeset_period = timeset.period_in_ns
161
- end
162
- end
163
-
164
- # Returns the timeset (a Timeset object) with the shortest period that has been
165
- # encountered so far in the course of generating the current pattern.
166
- #
167
- # A tester object is re-instantiated at the start of every pattern which will reset
168
- # this variable.
169
- def min_period_timeset
170
- @min_period_timeset
171
- end
172
-
173
- def timeset_changed(timeset)
174
- if last_vector && last_vector.timeset != timeset
175
- change = { old: last_vector.timeset, new: timeset }
176
- # Suppress any duplicate calls
177
- if !@_last_timeset_change ||
178
- (@_last_timeset_change[:new] != change[:new] &&
179
- @_last_timeset_change[:old] != change[:old])
180
- before_timeset_change(change)
181
- end
182
- @_last_timeset_change = change
183
- end
184
- end
185
-
186
- def before_timeset_change(options = {})
187
- end
188
-
189
- # Cause the pattern to wait.
190
- # The following options are available to help you specify the time to wait:
191
- # * :cycles - delays specified in raw cycles, the test model is responsible for translating this into a sequence of valid repeat statements
192
- # * :time_in_ns - time specified in nano-seconds
193
- # * :time_in_us - time specified in micro-seconds
194
- # * :time_in_ms - time specified in milli-seconds
195
- # * :time_in_s - time specified in seconds
196
- # If more than one option is supplied they will get added together to give a final
197
- # delay time expressed in cycles.
198
- # ==== Examples
199
- # $tester.wait(cycles: 100, time_in_ns: 200) # Wait for 100 cycles + 200ns
200
- # This method can also be used to trigger a match loop in which case the supplied time
201
- # becomes the time out for the match. See the J750#match method for full details of the
202
- # available options.
203
- # $tester.wait(match: true, state: :high, pin: $dut.pin(:done), time_in_ms: 500)
204
- def wait(options = {})
205
- options = {
206
- cycles: 0,
207
- time_in_cycles: 0,
208
- time_in_us: 0,
209
- time_in_ns: 0,
210
- time_in_ms: 0,
211
- time_in_s: 0,
212
- match: false, # Set to true to invoke a match loop where the supplied delay
213
- # will become the timeout duration
214
- }.merge(options)
215
-
216
- cycles = 0
217
- cycles += options[:cycles] + options[:time_in_cycles]
218
- cycles += s_to_cycles(options[:time_in_s])
219
- cycles += ms_to_cycles(options[:time_in_ms])
220
- cycles += us_to_cycles(options[:time_in_us])
221
- cycles += ns_to_cycles(options[:time_in_ns])
222
-
223
- time = cycles * current_period_in_ns # Total delay in ns
224
- case
225
- when time < 1000 # When less than 1us
226
- cc "Wait for #{'a maximum of ' if options[:match]}#{time}ns"
227
- when time < 1_000_000 # When less than 1ms
228
- cc "Wait for #{'a maximum of ' if options[:match]}#{(time.to_f / 1000).round(1)}us" # Display delay in us
229
- when time < 1_000_000_000 # When less than 1s
230
- cc "Wait for #{'a maximum of ' if options[:match]}#{(time.to_f / 1_000_000).round(1)}ms"
231
- else
232
- cc "Wait for #{'a maximum of ' if options[:match]}%.2fs" % (time.to_f / 1_000_000_000)
233
- end
234
-
235
- if cycles > 0 # Allow this function to be called with 0 in which case it will just return
236
- if options[:match]
237
- if block_given?
238
- match_block(cycles, options) { yield }
239
- else
240
- match(options[:pin], options[:state], cycles, options)
241
- end
242
- else
243
- delay(cycles)
244
- end
245
- end
246
- end
247
-
248
- # @see Timing#wait
249
- # @api private
250
- # This should not be called directly, call via tester#wait
251
- def delay(cycles, options = {})
252
- (cycles / max_repeat_loop).times do
253
- if block_given?
254
- yield options.merge(repeat: max_repeat_loop)
255
- else
256
- cycle(options.merge(repeat: max_repeat_loop))
257
- end
258
- end
259
- if block_given?
260
- yield options.merge(repeat: (cycles % max_repeat_loop))
261
- else
262
- cycle(options.merge(repeat: (cycles % max_repeat_loop)))
263
- end
264
- end
265
-
266
- def max_repeat_loop
267
- @max_repeat_loop || 65_535
268
- end
269
-
270
- def min_repeat_loop
271
- @min_repeat_loop
272
- end
273
-
274
- def called_timesets
275
- @called_timesets ||= []
276
- end
277
-
278
- def current_period_in_ns
279
- if @timeset
280
- @timeset.period_in_ns
281
- else
282
- fail 'No timeset has been specified yet!'
283
- end
284
- end
285
- alias_method :current_period, :current_period_in_ns
286
- alias_method :period, :current_period_in_ns
287
-
288
- def current_timeset
289
- @timeset
290
- end
291
- alias_method :timeset, :current_timeset
292
-
293
- # Convert the supplied number of cycles to a time, based on the SoC defined cycle period
294
- def cycles_to_time(cycles) # :nodoc:
295
- (cycles * current_period_in_ns).to_f / 1_000_000_000
296
- end
297
-
298
- # This function can be used to generate a clock or some other repeating function
299
- # that spans accross a range of vectors.
300
- # The period of each cycle and the duration of the sequence are supplied via the following
301
- # options:
302
- # * :period_in_cycles
303
- # * :period_in_ns
304
- # * :period_in_us
305
- # * :period_in_ms
306
- # * :duration_in_cycles
307
- # * :duration_in_ns
308
- # * :duration_in_us
309
- # * :duration_in_ms
310
- # If multiple definitions for either option are supplied then they will be added
311
- # together.
312
- # ==== Example
313
- # # Supply a clock pulse on :pinA for 100ms
314
- # $tester.count(:period_in_cycles => 10, :duration_in_ms => 100) do
315
- # $top.pin(:pinA).drive!(1)
316
- # $top.pin(:pinA).drive!(0)
317
- # end
318
- def count(options = {})
319
- options = { period_in_cycles: 0, period_in_ms: 0, period_in_us: 0, period_in_ns: 0,
320
- duration_in_cycles: 0, duration_in_ms: 0, duration_in_us: 0, duration_in_ns: 0
321
- }.merge(options)
322
-
323
- period_cycles = options[:period_in_cycles] + ms_to_cycles(options[:period_in_ms]) +
324
- us_to_cycles(options[:period_in_us]) + ns_to_cycles(options[:period_in_ns])
325
-
326
- duration_cycles = options[:duration_in_cycles] + ms_to_cycles(options[:duration_in_ms]) +
327
- us_to_cycles(options[:duration_in_us]) + ns_to_cycles(options[:duration_in_ns])
328
-
329
- total = 0
330
- while total < duration_cycles
331
- wait(time_in_cycles: period_cycles)
332
- yield # Return control back to caller
333
- total += period_cycles
334
- end
335
- end
336
-
337
- private
338
-
339
- def s_to_cycles(time) # :nodoc:
340
- ((time.to_f) * 1000 * 1000 * 1000 / current_period_in_ns).to_int
341
- end
342
-
343
- def ms_to_cycles(time) # :nodoc:
344
- ((time.to_f) * 1000 * 1000 / current_period_in_ns).to_int
345
- end
346
-
347
- def us_to_cycles(time) # :nodoc:
348
- ((time.to_f * 1000) / current_period_in_ns).to_int
349
- end
350
-
351
- def ns_to_cycles(time) # :nodoc:
352
- (time.to_f / current_period_in_ns).to_int
353
- end
354
-
355
- def cycles_to_us(cycles) # :nodoc:
356
- ((cycles.to_f * current_period_in_ns) / (1000)).ceil
357
- end
358
-
359
- def cycles_to_ms(cycles) # :nodoc:
360
- ((cycles.to_f * current_period_in_ns) / (1000 * 1000)).ceil
361
- end
362
-
363
- # Cycles to tenths of a second
364
- def cycles_to_ts(cycles) # :nodoc:
365
- ((cycles.to_f * current_period_in_ns) / (1000 * 1000 * 100)).ceil
366
- end
367
- end
368
- end
1
+ module OrigenTesters
2
+ module Timing
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ # When set to true all pattern vectors will be converted to use the same period (the
7
+ # shortest period used in the pattern).
8
+ #
9
+ # @example
10
+ # $tester.set_timeset("fast", 40)
11
+ # 2.cycles # fast 1 0 0 1 0
12
+ # # fast 1 0 0 1 0
13
+ #
14
+ # $tester.level_period = false # Without levelling enabled
15
+ # $tester.set_timeset("slow", 80)
16
+ # 2.cycles # slow 1 0 0 1 0
17
+ # # slow 1 0 0 1 0
18
+ #
19
+ # $tester.level_period = true # With levelling enabled
20
+ # $tester.set_timeset("slow", 80)
21
+ # 2.cycles # fast 1 0 0 1 0
22
+ # # fast 1 0 0 1 0
23
+ # # fast 1 0 0 1 0
24
+ # # fast 1 0 0 1 0
25
+ #
26
+ # @see Timing#timing_toggled_pins
27
+ attr_accessor :level_period
28
+ alias_method :level_period?, :level_period
29
+ attr_writer :timing_toggled_pins
30
+ end
31
+
32
+ class Timeset
33
+ attr_accessor :name, :period_in_ns
34
+
35
+ def initialize(attrs = {})
36
+ attrs.each do |name, value|
37
+ send("#{name}=", value)
38
+ end
39
+ end
40
+
41
+ # Returns true if the timeset has a shorter period than the supplied timeset
42
+ def shorter_period_than?(timeset)
43
+ period_in_ns < timeset.period_in_ns
44
+ end
45
+ end
46
+
47
+ # @see Timing#level_period
48
+ #
49
+ # When period levelling is enabled, vectors will be expanded like this:
50
+ # $tester.set_timeset("fast", 40)
51
+ # 2.cycles # fast 1 0 0 1 0
52
+ # # fast 1 0 0 1 0
53
+ # # Without levelling enabled
54
+ # $tester.set_timeset("slow", 80)
55
+ # 2.cycles # slow 1 0 0 1 0
56
+ # # slow 1 0 0 1 0
57
+ # # With levelling enabled
58
+ # $tester.set_timeset("slow", 80)
59
+ # 2.cycles # fast 1 0 0 1 0
60
+ # # fast 1 0 0 1 0
61
+ # # fast 1 0 0 1 0
62
+ # # fast 1 0 0 1 0
63
+ #
64
+ # The overall time of the levelled/expanded vectors matches that of the unlevelled
65
+ # case. i.e. 4 cycles at fast speed (4 * 40ns = 160ns) is equivalent to 2 cycles
66
+ # at slow speed (2 * 80ns = 160ns).
67
+ #
68
+ # However, what if pin 1 in the example above was a clk pin where the 1 -> 0 transition
69
+ # was handled by the timing setup for that pin.
70
+ # In that case the levelled code is no longer functionally correct since it contains
71
+ # 4 clock pulses while the unlevelled code only has 2.
72
+ #
73
+ # Such pins can be specified via this attribute and the levelling logic will then
74
+ # automatically adjust the drive state to keep the number of pulses correct.
75
+ # It would automatically adjust to the alternative logic state where 0 means 'on'
76
+ # and 1 means 'off' if applicable.
77
+ #
78
+ # $tester.timing_toggled_pins << $dut.pin(:tclk) # This is pin 1
79
+ #
80
+ # $tester.set_timeset("fast", 40)
81
+ # 2.cycles # fast 1 0 0 1 0
82
+ # # fast 1 0 0 1 0
83
+ # # Without levelling enabled
84
+ # $tester.set_timeset("slow", 80)
85
+ # 2.cycles # slow 1 0 0 1 0
86
+ # # slow 1 0 0 1 0
87
+ # # With levelling enabled
88
+ # $tester.set_timeset("slow", 80)
89
+ # 2.cycles # fast 1 0 0 1 0
90
+ # # fast 0 0 0 1 0
91
+ # # fast 1 0 0 1 0
92
+ # # fast 0 0 0 1 0
93
+ #
94
+ # Multiple pins an be specified like this:
95
+ # $tester.timing_toggled_pins = [$dut.pin(:tclk), $dut.pin(:clk)] # Overrides any pins added elsewhere
96
+ # $tester.timing_toggled_pins << [$dut.pin(:tclk), $dut.pin(:clk)] # In addition to any pins added elsewhere
97
+ def timing_toggled_pins
98
+ @timing_toggled_pins ||= []
99
+ @timing_toggled_pins.flatten!
100
+ @timing_toggled_pins
101
+ end
102
+
103
+ # Set the timeset for the next vectors, this will remain in place until the next
104
+ # time this is called.
105
+ #
106
+ # $tester.set_timeset("bist_25mhz", 40)
107
+ #
108
+ # This method also accepts a block in which case the contained vectors will generate
109
+ # with the supplied timeset and subsequent vectors will return to the previous timeset
110
+ # automatically.
111
+ #
112
+ # $tester.set_timeset("bist_25mhz", 40) do
113
+ # $tester.cycle
114
+ # end
115
+ #
116
+ # The arguments can also be supplied as a single array, or not at all. In the latter case
117
+ # the existing timeset will simply be preserved. This is useful if you have timesets that
118
+ # can be conditionally set based on the target.
119
+ #
120
+ # # Target 1
121
+ # $soc.readout_timeset = ["readout", 120]
122
+ # # Target 2
123
+ # $soc.readout_timeset = false
124
+ #
125
+ # # This code is compatible with both targets, in the first case the timeset will switch
126
+ # # over, in the second case the existing timeset will be preserved.
127
+ # $tester.set_timeset($soc.readout_timeset) do
128
+ # $tester.cycle
129
+ # end
130
+ def set_timeset(timeset, period_in_ns = nil)
131
+ if timeset.is_a?(Array)
132
+ timeset, period_in_ns = timeset[0], timeset[1]
133
+ end
134
+ timeset ||= @timeset
135
+ unless timeset.is_a?(Timeset)
136
+ fail 'You must supply a period_in_ns argument to set_timeset' unless period_in_ns
137
+ timeset = Timeset.new(name: timeset.to_s.chomp, period_in_ns: period_in_ns)
138
+ end
139
+ called_timesets << timeset unless called_timesets.map(&:name).include?(timeset.name)
140
+ if @min_period_timeset
141
+ @min_period_timeset = timeset if timeset.shorter_period_than?(@min_period_timeset)
142
+ else
143
+ @min_period_timeset = timeset
144
+ end
145
+ if block_given?
146
+ original = @timeset
147
+ timeset_changed(timeset)
148
+ @timeset = timeset
149
+ dut.timeset = timeset.name if dut.timesets[timeset.name]
150
+ dut.current_timeset_period = timeset.period_in_ns
151
+ yield
152
+ timeset_changed(original)
153
+ @timeset = original
154
+ dut.timeset = original.name if dut.timesets[original.name]
155
+ dut.current_timeset_period = original.period_in_ns
156
+ else
157
+ timeset_changed(timeset)
158
+ @timeset = timeset
159
+ dut.timeset = timeset.name if dut.timesets[timeset.name]
160
+ dut.current_timeset_period = timeset.period_in_ns
161
+ end
162
+ end
163
+
164
+ # Returns the timeset (a Timeset object) with the shortest period that has been
165
+ # encountered so far in the course of generating the current pattern.
166
+ #
167
+ # A tester object is re-instantiated at the start of every pattern which will reset
168
+ # this variable.
169
+ def min_period_timeset
170
+ @min_period_timeset
171
+ end
172
+
173
+ def timeset_changed(timeset)
174
+ if last_vector && last_vector.timeset != timeset
175
+ change = { old: last_vector.timeset, new: timeset }
176
+ # Suppress any duplicate calls
177
+ if !@_last_timeset_change ||
178
+ (@_last_timeset_change[:new] != change[:new] &&
179
+ @_last_timeset_change[:old] != change[:old])
180
+ before_timeset_change(change)
181
+ end
182
+ @_last_timeset_change = change
183
+ end
184
+ end
185
+
186
+ def before_timeset_change(options = {})
187
+ end
188
+
189
+ # Cause the pattern to wait.
190
+ # The following options are available to help you specify the time to wait:
191
+ # * :cycles - delays specified in raw cycles, the test model is responsible for translating this into a sequence of valid repeat statements
192
+ # * :time_in_ns - time specified in nano-seconds
193
+ # * :time_in_us - time specified in micro-seconds
194
+ # * :time_in_ms - time specified in milli-seconds
195
+ # * :time_in_s - time specified in seconds
196
+ # If more than one option is supplied they will get added together to give a final
197
+ # delay time expressed in cycles.
198
+ # ==== Examples
199
+ # $tester.wait(cycles: 100, time_in_ns: 200) # Wait for 100 cycles + 200ns
200
+ # This method can also be used to trigger a match loop in which case the supplied time
201
+ # becomes the time out for the match. See the J750#match method for full details of the
202
+ # available options.
203
+ # $tester.wait(match: true, state: :high, pin: $dut.pin(:done), time_in_ms: 500)
204
+ def wait(options = {})
205
+ options = {
206
+ cycles: 0,
207
+ time_in_cycles: 0,
208
+ time_in_us: 0,
209
+ time_in_ns: 0,
210
+ time_in_ms: 0,
211
+ time_in_s: 0,
212
+ match: false, # Set to true to invoke a match loop where the supplied delay
213
+ # will become the timeout duration
214
+ }.merge(options)
215
+
216
+ cycles = 0
217
+ cycles += options[:cycles] + options[:time_in_cycles]
218
+ cycles += s_to_cycles(options[:time_in_s])
219
+ cycles += ms_to_cycles(options[:time_in_ms])
220
+ cycles += us_to_cycles(options[:time_in_us])
221
+ cycles += ns_to_cycles(options[:time_in_ns])
222
+
223
+ time = cycles * current_period_in_ns # Total delay in ns
224
+ case
225
+ when time < 1000 # When less than 1us
226
+ cc "Wait for #{'a maximum of ' if options[:match]}#{time}ns"
227
+ when time < 1_000_000 # When less than 1ms
228
+ cc "Wait for #{'a maximum of ' if options[:match]}#{(time.to_f / 1000).round(1)}us" # Display delay in us
229
+ when time < 1_000_000_000 # When less than 1s
230
+ cc "Wait for #{'a maximum of ' if options[:match]}#{(time.to_f / 1_000_000).round(1)}ms"
231
+ else
232
+ cc "Wait for #{'a maximum of ' if options[:match]}%.2fs" % (time.to_f / 1_000_000_000)
233
+ end
234
+
235
+ if cycles > 0 # Allow this function to be called with 0 in which case it will just return
236
+ if options[:match]
237
+ if block_given?
238
+ match_block(cycles, options) { yield }
239
+ else
240
+ match(options[:pin], options[:state], cycles, options)
241
+ end
242
+ else
243
+ delay(cycles)
244
+ end
245
+ end
246
+ end
247
+
248
+ # @see Timing#wait
249
+ # @api private
250
+ # This should not be called directly, call via tester#wait
251
+ def delay(cycles, options = {})
252
+ (cycles / max_repeat_loop).times do
253
+ if block_given?
254
+ yield options.merge(repeat: max_repeat_loop)
255
+ else
256
+ cycle(options.merge(repeat: max_repeat_loop))
257
+ end
258
+ end
259
+ if block_given?
260
+ yield options.merge(repeat: (cycles % max_repeat_loop))
261
+ else
262
+ cycle(options.merge(repeat: (cycles % max_repeat_loop)))
263
+ end
264
+ end
265
+
266
+ def max_repeat_loop
267
+ @max_repeat_loop || 65_535
268
+ end
269
+
270
+ def min_repeat_loop
271
+ @min_repeat_loop
272
+ end
273
+
274
+ def called_timesets
275
+ @called_timesets ||= []
276
+ end
277
+
278
+ def current_period_in_ns
279
+ if @timeset
280
+ @timeset.period_in_ns
281
+ else
282
+ fail 'No timeset has been specified yet!'
283
+ end
284
+ end
285
+ alias_method :current_period, :current_period_in_ns
286
+ alias_method :period, :current_period_in_ns
287
+
288
+ def current_timeset
289
+ @timeset
290
+ end
291
+ alias_method :timeset, :current_timeset
292
+
293
+ # Convert the supplied number of cycles to a time, based on the SoC defined cycle period
294
+ def cycles_to_time(cycles) # :nodoc:
295
+ (cycles * current_period_in_ns).to_f / 1_000_000_000
296
+ end
297
+
298
+ # This function can be used to generate a clock or some other repeating function
299
+ # that spans accross a range of vectors.
300
+ # The period of each cycle and the duration of the sequence are supplied via the following
301
+ # options:
302
+ # * :period_in_cycles
303
+ # * :period_in_ns
304
+ # * :period_in_us
305
+ # * :period_in_ms
306
+ # * :duration_in_cycles
307
+ # * :duration_in_ns
308
+ # * :duration_in_us
309
+ # * :duration_in_ms
310
+ # If multiple definitions for either option are supplied then they will be added
311
+ # together.
312
+ # ==== Example
313
+ # # Supply a clock pulse on :pinA for 100ms
314
+ # $tester.count(:period_in_cycles => 10, :duration_in_ms => 100) do
315
+ # $top.pin(:pinA).drive!(1)
316
+ # $top.pin(:pinA).drive!(0)
317
+ # end
318
+ def count(options = {})
319
+ options = { period_in_cycles: 0, period_in_ms: 0, period_in_us: 0, period_in_ns: 0,
320
+ duration_in_cycles: 0, duration_in_ms: 0, duration_in_us: 0, duration_in_ns: 0
321
+ }.merge(options)
322
+
323
+ period_cycles = options[:period_in_cycles] + ms_to_cycles(options[:period_in_ms]) +
324
+ us_to_cycles(options[:period_in_us]) + ns_to_cycles(options[:period_in_ns])
325
+
326
+ duration_cycles = options[:duration_in_cycles] + ms_to_cycles(options[:duration_in_ms]) +
327
+ us_to_cycles(options[:duration_in_us]) + ns_to_cycles(options[:duration_in_ns])
328
+
329
+ total = 0
330
+ while total < duration_cycles
331
+ wait(time_in_cycles: period_cycles)
332
+ yield # Return control back to caller
333
+ total += period_cycles
334
+ end
335
+ end
336
+
337
+ private
338
+
339
+ def s_to_cycles(time) # :nodoc:
340
+ ((time.to_f) * 1000 * 1000 * 1000 / current_period_in_ns).to_int
341
+ end
342
+
343
+ def ms_to_cycles(time) # :nodoc:
344
+ ((time.to_f) * 1000 * 1000 / current_period_in_ns).to_int
345
+ end
346
+
347
+ def us_to_cycles(time) # :nodoc:
348
+ ((time.to_f * 1000) / current_period_in_ns).to_int
349
+ end
350
+
351
+ def ns_to_cycles(time) # :nodoc:
352
+ (time.to_f / current_period_in_ns).to_int
353
+ end
354
+
355
+ def cycles_to_us(cycles) # :nodoc:
356
+ ((cycles.to_f * current_period_in_ns) / (1000)).ceil
357
+ end
358
+
359
+ def cycles_to_ms(cycles) # :nodoc:
360
+ ((cycles.to_f * current_period_in_ns) / (1000 * 1000)).ceil
361
+ end
362
+
363
+ # Cycles to tenths of a second
364
+ def cycles_to_ts(cycles) # :nodoc:
365
+ ((cycles.to_f * current_period_in_ns) / (1000 * 1000 * 100)).ceil
366
+ end
367
+ end
368
+ end