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,460 +1,460 @@
1
- module OrigenTesters
2
- module IGXLBasedTester
3
- class Base
4
- class Flow < ATP::Formatter
5
- include OrigenTesters::Flow
6
-
7
- OUTPUT_POSTFIX = 'flow'
8
-
9
- attr_reader :branch
10
- attr_reader :stack
11
- attr_reader :current_group
12
- attr_reader :context
13
- attr_reader :set_run_flags
14
- attr_accessor :run_flag
15
- attr_accessor :flow_flag
16
-
17
- class FlowLineAPI
18
- def initialize(flow)
19
- @flow = flow
20
- end
21
-
22
- def method_missing(method, *args, &block)
23
- if Base::FlowLine::DEFAULTS.key?(method.to_sym)
24
- line = @flow.platform::FlowLine.new(method, *args)
25
- @flow.render(line)
26
- line
27
- else
28
- super
29
- end
30
- end
31
-
32
- def respond_to?(method)
33
- !!Base::FlowLine::DEFAULTS.key?(method.to_sym)
34
- end
35
- end
36
-
37
- class TestCounter < ATP::Processor
38
- def run(node)
39
- @tests = 0
40
- process(node)
41
- @tests
42
- end
43
-
44
- def on_test(node)
45
- @tests += 1
46
- end
47
- end
48
-
49
- # Returns the API to manually generate an IG-XL flow line
50
- def ultraflex
51
- @flow_line_api ||= FlowLineAPI.new(self)
52
- end
53
- alias_method :uflex, :ultraflex
54
- alias_method :j750, :ultraflex
55
-
56
- def number_of_tests_in(node)
57
- @test_counter ||= TestCounter.new
58
- @test_counter.run(node)
59
- end
60
-
61
- # Will be called at the end to transform the final flow model into an array
62
- # of lines to be rendered to the IG-XL flow sheet
63
- def format
64
- @lines = []
65
- @stack = { jobs: [], groups: [] }
66
- @set_run_flags = {}
67
- @context = []
68
- process(model.ast)
69
- lines
70
- end
71
-
72
- def on_flow(node)
73
- name, *nodes = *node
74
- process_all(nodes)
75
- end
76
-
77
- def on_test(node)
78
- line = new_line(:test) { |l| process_all(node) }
79
-
80
- # In IG-XL you can't set the same flag in case of pass or fail, if that situation has
81
- # occurred then rectify it now
82
- if line.flag_fail && line.flag_fail == line.flag_pass
83
- # If the test will bin, don't need to resolve the situation, the flag only matters
84
- # in the pass case
85
- if line.result = 'Fail'
86
- line.flag_fail = nil
87
- completed_lines << line
88
- else
89
- flag = line.flag_fail
90
- line.flag_fail = "#{flag}_FAILED"
91
- line.flag_pass = "#{flag}_PASSED"
92
- completed_lines << line
93
- existing_flag = run_flag
94
- self.run_flag = [line.flag_fail, true]
95
- completed_lines << new_line(:flag_true, parameter: flag)
96
- self.run_flag = [line.flag_pass, true]
97
- completed_lines << new_line(:flag_true, parameter: flag)
98
- self.run_flag = existing_flag
99
- end
100
- else
101
- completed_lines << line
102
- end
103
- end
104
-
105
- def on_cz(node)
106
- setup, test = *node
107
- completed_lines << new_line(:cz, cz_setup: setup) do |line|
108
- process_all(test)
109
- end
110
- end
111
-
112
- def on_group(node)
113
- stack[:groups] << []
114
- post_group = node.children.select { |n| [:on_fail, :on_pass, :name].include?(n.try(:type)) }
115
- process_all(node.children - post_group)
116
- # Now process any on_fail and similar conditional logic attached to the group
117
- @current_group = stack[:groups].last
118
- process_all(post_group)
119
- @current_group = nil
120
- flags = { on_pass: [], on_fail: [] }
121
- stack[:groups].pop.each do |test|
122
- unless test.is_a?(String)
123
- flags[:on_pass] << test.flag_pass
124
- flags[:on_fail] << test.flag_fail
125
- end
126
- completed_lines << test
127
- end
128
- if @group_on_fail_flag
129
- flags[:on_fail].each do |flag|
130
- self.run_flag = [flag, true]
131
- completed_lines << new_line(:flag_true, parameter: @group_on_fail_flag)
132
- end
133
- self.run_flag = nil
134
- end
135
- if @group_on_pass_flag && @group_on_pass_flag != @group_on_fail_flag
136
- flags[:on_pass].each do |flag|
137
- self.run_flag = [flag, true]
138
- completed_lines << new_line(:flag_true, parameter: @group_on_pass_flag)
139
- end
140
- self.run_flag = nil
141
- end
142
- @group_on_fail_flag = nil
143
- @group_on_pass_flag = nil
144
- end
145
-
146
- def on_name(node)
147
- if current_group
148
- # No action, groups will not actually appear in the flow sheet
149
- else
150
- current_line.tname = node.to_a[0]
151
- end
152
- end
153
-
154
- def on_number(node)
155
- if Origen.tester.diff_friendly_output?
156
- current_line.tnum = 0
157
- else
158
- current_line.tnum = node.to_a[0]
159
- end
160
- end
161
-
162
- def on_object(node)
163
- instance = node.to_a[0]
164
- if instance.is_a?(String)
165
- current_line.instance_variable_set('@ignore_missing_instance', true)
166
- end
167
- current_line.parameter = instance
168
- end
169
-
170
- def on_continue(node)
171
- if current_group
172
- current_group.each { |line| line.result = 'None' }
173
- else
174
- current_line.result = 'None'
175
- end
176
- end
177
-
178
- def on_set_run_flag(node)
179
- flag = remove_symbols_from_flag(node.to_a[0])
180
- set_run_flags[flag] = context.dup
181
- if current_group
182
- if branch == :on_fail
183
- @group_on_fail_flag = flag
184
- current_group.each_with_index do |line, i|
185
- line.flag_fail = "#{flag}_#{i}" unless line.flag_fail
186
- end
187
- else
188
- @group_on_pass_flag = flag
189
- current_group.each_with_index do |line, i|
190
- line.flag_pass = "#{flag}_#{i}" unless line.flag_pass
191
- end
192
- end
193
- else
194
- if branch == :on_fail
195
- current_line.flag_fail = flag
196
- else
197
- current_line.flag_pass = flag
198
- end
199
- end
200
- end
201
-
202
- def on_set_result(node)
203
- bin = node.find(:bin).try(:value)
204
- desc = node.find(:bin).to_a[1]
205
- sbin = node.find(:softbin).try(:value)
206
- if current_line
207
- if branch == :on_fail
208
- current_line.bin_fail = bin
209
- current_line.sort_fail = sbin
210
- current_line.comment = desc
211
- current_line.result = 'Fail'
212
- else
213
- current_line.bin_pass = bin
214
- current_line.sort_pass = sbin
215
- current_line.comment = desc
216
- current_line.result = 'Pass'
217
- end
218
- else
219
- line = new_line(:set_device)
220
- if node.to_a[0] == 'pass'
221
- line.bin_pass = bin
222
- line.sort_pass = sbin
223
- line.result = 'Pass'
224
- else
225
- line.bin_fail = bin
226
- line.sort_fail = sbin
227
- line.result = 'Fail'
228
- end
229
- line.comment = desc
230
- completed_lines << line
231
- end
232
- end
233
-
234
- def on_on_fail(node)
235
- @branch = :on_fail
236
- process_all(node)
237
- @branch = nil
238
- end
239
-
240
- def on_on_pass(node)
241
- @branch = :on_pass
242
- process_all(node)
243
- @branch = nil
244
- end
245
-
246
- def on_job(node)
247
- jobs, state, *nodes = *node
248
- jobs = clean_job(jobs)
249
- unless state
250
- jobs = jobs.map { |j| "!#{j}" }
251
- end
252
- stack[:jobs] << [stack[:jobs].last, jobs].compact.join(',')
253
- context << stack[:jobs].last
254
- process_all(node)
255
- stack[:jobs].pop
256
- context.pop
257
- end
258
-
259
- def on_run_flag(node)
260
- flag, state, *nodes = *node
261
- orig = run_flag
262
- if flag.is_a?(Array)
263
- or_flag = flag.join('_OR_')
264
- or_flag = "NOT_#{flag}" unless state
265
- flag.each do |f|
266
- if run_flag
267
- fail 'Not implemented yet!'
268
- else
269
- self.run_flag = [f, state]
270
- completed_lines << new_line(:flag_true, parameter: or_flag)
271
- self.run_flag = nil
272
- end
273
- end
274
- # Don't need to create an AND flag if the flag on which this test is dependent was also
275
- # set under the same context.
276
- if run_flag && set_run_flags[flag] && set_run_flags[flag].hash != context.hash
277
- and_flag = flag_to_s(or_flag, state) + '_AND_' + flag_to_s(*run_flag)
278
- # If the AND flag has already been created and set in this context (for a previous test),
279
- # no need to re-create it
280
- if !set_run_flags[and_flag] || (set_run_flags[and_flag].hash != context.hash)
281
- set_run_flags[and_flag] = context
282
- existing_flag = run_flag
283
- self.run_flag = nil
284
- completed_lines << new_line(:flag_true, parameter: and_flag)
285
- self.run_flag = [existing_flag[0], !existing_flag[1]]
286
- completed_lines << new_line(:flag_false, parameter: and_flag)
287
- self.run_flag = [flag, !state]
288
- completed_lines << new_line(:flag_false, parameter: and_flag)
289
- end
290
- self.run_flag = [and_flag, true]
291
- else
292
- self.run_flag = [or_flag, true]
293
- end
294
- else
295
- # Don't need to create an AND flag if the flag on which this test is dependent was also
296
- # set under the same context.
297
- if run_flag && set_run_flags[flag] && set_run_flags[flag].hash != context.hash
298
- and_flag = flag_to_s(flag, state) + '_AND_' + flag_to_s(*run_flag)
299
- # If the AND flag has already been created and set in this context (for a previous test),
300
- # no need to re-create it
301
- if !set_run_flags[and_flag] || (set_run_flags[and_flag].hash != context.hash)
302
- set_run_flags[and_flag] = context
303
- existing_flag = run_flag
304
- self.run_flag = nil
305
- completed_lines << new_line(:flag_true, parameter: and_flag)
306
- self.run_flag = [existing_flag[0], !existing_flag[1]]
307
- completed_lines << new_line(:flag_false, parameter: and_flag)
308
- self.run_flag = [flag, !state]
309
- completed_lines << new_line(:flag_false, parameter: and_flag)
310
- end
311
- self.run_flag = [and_flag, true]
312
- else
313
- self.run_flag = [flag, state]
314
- end
315
- end
316
- context << run_flag
317
- process_all(node)
318
- context.pop
319
- self.run_flag = orig
320
- end
321
-
322
- def on_flow_flag(node)
323
- flag, value = *node.to_a.take(2)
324
- orig = flow_flag
325
- if flag.is_a?(Array)
326
- flag.map! { |a_flag| remove_symbols_from_flag(a_flag) }
327
- if flag.size > 1
328
- or_flag = flag.join('_OR_')
329
- flag.each do |f|
330
- completed_lines << new_line(:enable_flow_word, parameter: or_flag, enable: f)
331
- end
332
- flag = or_flag
333
- else
334
- flag = flag.first
335
- end
336
- else
337
- flag = remove_symbols_from_flag(flag)
338
- end
339
- if value
340
- # IG-XL docs say that enable words are not optimized for test time, so branch around
341
- # large blocks to minimize enable word evaluation
342
- if number_of_tests_in(node) > 5
343
- label = generate_unique_label
344
- branch_if_enable(flag) do
345
- completed_lines << new_line(:goto, parameter: label, enable: nil)
346
- end
347
- context << flag
348
- process_all(node)
349
- context.pop
350
- completed_lines << new_line(:nop, label: label, enable: nil)
351
- else
352
- if flow_flag
353
- and_flag = "#{flow_flag}_AND_#{flag}"
354
- label = generate_unique_label
355
- branch_if_enable(flow_flag) do
356
- completed_lines << new_line(:goto, parameter: label, enable: nil)
357
- end
358
- completed_lines << new_line(:enable_flow_word, parameter: and_flag, enable: flag)
359
- completed_lines << new_line(:nop, label: label, enable: nil)
360
- self.flow_flag = and_flag
361
- context << and_flag
362
- process_all(node)
363
- context.pop
364
- self.flow_flag = orig
365
- else
366
- self.flow_flag = flag
367
- context << flag
368
- process_all(node)
369
- context.pop
370
- self.flow_flag = orig
371
- end
372
- end
373
- else
374
- # IG-XL does not have a !enable option, so generate a branch around the tests
375
- # to be skipped unless the required flag is enabled
376
- context << "!#{flag}"
377
- branch_if_enable(flag) do
378
- process_all(node)
379
- end
380
- context.pop
381
- end
382
- end
383
-
384
- def branch_if_enable(word)
385
- label = generate_unique_label
386
- completed_lines << new_line(:goto, parameter: label, enable: word)
387
- yield
388
- completed_lines << new_line(:nop, label: label, enable: nil)
389
- end
390
-
391
- def on_enable_flow_flag(node)
392
- completed_lines << new_line(:enable_flow_word, parameter: node.value)
393
- end
394
-
395
- def on_disable_flow_flag(node)
396
- completed_lines << new_line(:disable_flow_word, parameter: node.value)
397
- end
398
-
399
- def on_log(node)
400
- completed_lines << new_line(:logprint, parameter: node.to_a[0].gsub(' ', '_'))
401
- end
402
-
403
- def on_render(node)
404
- completed_lines << node.to_a[0]
405
- end
406
-
407
- def new_line(type, attrs = {})
408
- attrs = {
409
- job: stack[:jobs].last,
410
- enable: flow_flag
411
- }.merge(attrs)
412
- line = platform::FlowLine.new(type, attrs)
413
- if run_flag
414
- line.device_sense = 'not' unless run_flag[1]
415
- line.device_name = remove_symbols_from_flag(run_flag[0])
416
- line.device_condition = 'flag-true'
417
- end
418
- open_lines << line
419
- yield line if block_given?
420
- open_lines.pop
421
- line
422
- end
423
-
424
- # Any completed lines should be pushed to the array that this returns
425
- def completed_lines
426
- stack[:groups].last || lines
427
- end
428
-
429
- def open_lines
430
- @open_lines ||= []
431
- end
432
-
433
- def current_line
434
- open_lines.last
435
- end
436
-
437
- def clean_job(job)
438
- [job].flatten.map { |j| j.to_s.upcase }
439
- end
440
-
441
- def flag_to_s(flag, state)
442
- if state
443
- flag
444
- else
445
- "NOT_#{flag}"
446
- end
447
- end
448
-
449
- private
450
-
451
- def remove_symbols_from_flag(flag)
452
- if flag[0] == '$'
453
- flag[0] = ''
454
- end
455
- flag
456
- end
457
- end
458
- end
459
- end
460
- end
1
+ module OrigenTesters
2
+ module IGXLBasedTester
3
+ class Base
4
+ class Flow < ATP::Formatter
5
+ include OrigenTesters::Flow
6
+
7
+ OUTPUT_POSTFIX = 'flow'
8
+
9
+ attr_reader :branch
10
+ attr_reader :stack
11
+ attr_reader :current_group
12
+ attr_reader :context
13
+ attr_reader :set_run_flags
14
+ attr_accessor :run_flag
15
+ attr_accessor :flow_flag
16
+
17
+ class FlowLineAPI
18
+ def initialize(flow)
19
+ @flow = flow
20
+ end
21
+
22
+ def method_missing(method, *args, &block)
23
+ if Base::FlowLine::DEFAULTS.key?(method.to_sym)
24
+ line = @flow.platform::FlowLine.new(method, *args)
25
+ @flow.render(line)
26
+ line
27
+ else
28
+ super
29
+ end
30
+ end
31
+
32
+ def respond_to?(method)
33
+ !!Base::FlowLine::DEFAULTS.key?(method.to_sym)
34
+ end
35
+ end
36
+
37
+ class TestCounter < ATP::Processor
38
+ def run(node)
39
+ @tests = 0
40
+ process(node)
41
+ @tests
42
+ end
43
+
44
+ def on_test(node)
45
+ @tests += 1
46
+ end
47
+ end
48
+
49
+ # Returns the API to manually generate an IG-XL flow line
50
+ def ultraflex
51
+ @flow_line_api ||= FlowLineAPI.new(self)
52
+ end
53
+ alias_method :uflex, :ultraflex
54
+ alias_method :j750, :ultraflex
55
+
56
+ def number_of_tests_in(node)
57
+ @test_counter ||= TestCounter.new
58
+ @test_counter.run(node)
59
+ end
60
+
61
+ # Will be called at the end to transform the final flow model into an array
62
+ # of lines to be rendered to the IG-XL flow sheet
63
+ def format
64
+ @lines = []
65
+ @stack = { jobs: [], groups: [] }
66
+ @set_run_flags = {}
67
+ @context = []
68
+ process(model.ast)
69
+ lines
70
+ end
71
+
72
+ def on_flow(node)
73
+ name, *nodes = *node
74
+ process_all(nodes)
75
+ end
76
+
77
+ def on_test(node)
78
+ line = new_line(:test) { |l| process_all(node) }
79
+
80
+ # In IG-XL you can't set the same flag in case of pass or fail, if that situation has
81
+ # occurred then rectify it now
82
+ if line.flag_fail && line.flag_fail == line.flag_pass
83
+ # If the test will bin, don't need to resolve the situation, the flag only matters
84
+ # in the pass case
85
+ if line.result = 'Fail'
86
+ line.flag_fail = nil
87
+ completed_lines << line
88
+ else
89
+ flag = line.flag_fail
90
+ line.flag_fail = "#{flag}_FAILED"
91
+ line.flag_pass = "#{flag}_PASSED"
92
+ completed_lines << line
93
+ existing_flag = run_flag
94
+ self.run_flag = [line.flag_fail, true]
95
+ completed_lines << new_line(:flag_true, parameter: flag)
96
+ self.run_flag = [line.flag_pass, true]
97
+ completed_lines << new_line(:flag_true, parameter: flag)
98
+ self.run_flag = existing_flag
99
+ end
100
+ else
101
+ completed_lines << line
102
+ end
103
+ end
104
+
105
+ def on_cz(node)
106
+ setup, test = *node
107
+ completed_lines << new_line(:cz, cz_setup: setup) do |line|
108
+ process_all(test)
109
+ end
110
+ end
111
+
112
+ def on_group(node)
113
+ stack[:groups] << []
114
+ post_group = node.children.select { |n| [:on_fail, :on_pass, :name].include?(n.try(:type)) }
115
+ process_all(node.children - post_group)
116
+ # Now process any on_fail and similar conditional logic attached to the group
117
+ @current_group = stack[:groups].last
118
+ process_all(post_group)
119
+ @current_group = nil
120
+ flags = { on_pass: [], on_fail: [] }
121
+ stack[:groups].pop.each do |test|
122
+ unless test.is_a?(String)
123
+ flags[:on_pass] << test.flag_pass
124
+ flags[:on_fail] << test.flag_fail
125
+ end
126
+ completed_lines << test
127
+ end
128
+ if @group_on_fail_flag
129
+ flags[:on_fail].each do |flag|
130
+ self.run_flag = [flag, true]
131
+ completed_lines << new_line(:flag_true, parameter: @group_on_fail_flag)
132
+ end
133
+ self.run_flag = nil
134
+ end
135
+ if @group_on_pass_flag && @group_on_pass_flag != @group_on_fail_flag
136
+ flags[:on_pass].each do |flag|
137
+ self.run_flag = [flag, true]
138
+ completed_lines << new_line(:flag_true, parameter: @group_on_pass_flag)
139
+ end
140
+ self.run_flag = nil
141
+ end
142
+ @group_on_fail_flag = nil
143
+ @group_on_pass_flag = nil
144
+ end
145
+
146
+ def on_name(node)
147
+ if current_group
148
+ # No action, groups will not actually appear in the flow sheet
149
+ else
150
+ current_line.tname = node.to_a[0]
151
+ end
152
+ end
153
+
154
+ def on_number(node)
155
+ if Origen.tester.diff_friendly_output?
156
+ current_line.tnum = 0
157
+ else
158
+ current_line.tnum = node.to_a[0]
159
+ end
160
+ end
161
+
162
+ def on_object(node)
163
+ instance = node.to_a[0]
164
+ if instance.is_a?(String)
165
+ current_line.instance_variable_set('@ignore_missing_instance', true)
166
+ end
167
+ current_line.parameter = instance
168
+ end
169
+
170
+ def on_continue(node)
171
+ if current_group
172
+ current_group.each { |line| line.result = 'None' }
173
+ else
174
+ current_line.result = 'None'
175
+ end
176
+ end
177
+
178
+ def on_set_run_flag(node)
179
+ flag = remove_symbols_from_flag(node.to_a[0])
180
+ set_run_flags[flag] = context.dup
181
+ if current_group
182
+ if branch == :on_fail
183
+ @group_on_fail_flag = flag
184
+ current_group.each_with_index do |line, i|
185
+ line.flag_fail = "#{flag}_#{i}" unless line.flag_fail
186
+ end
187
+ else
188
+ @group_on_pass_flag = flag
189
+ current_group.each_with_index do |line, i|
190
+ line.flag_pass = "#{flag}_#{i}" unless line.flag_pass
191
+ end
192
+ end
193
+ else
194
+ if branch == :on_fail
195
+ current_line.flag_fail = flag
196
+ else
197
+ current_line.flag_pass = flag
198
+ end
199
+ end
200
+ end
201
+
202
+ def on_set_result(node)
203
+ bin = node.find(:bin).try(:value)
204
+ desc = node.find(:bin).to_a[1]
205
+ sbin = node.find(:softbin).try(:value)
206
+ if current_line
207
+ if branch == :on_fail
208
+ current_line.bin_fail = bin
209
+ current_line.sort_fail = sbin
210
+ current_line.comment = desc
211
+ current_line.result = 'Fail'
212
+ else
213
+ current_line.bin_pass = bin
214
+ current_line.sort_pass = sbin
215
+ current_line.comment = desc
216
+ current_line.result = 'Pass'
217
+ end
218
+ else
219
+ line = new_line(:set_device)
220
+ if node.to_a[0] == 'pass'
221
+ line.bin_pass = bin
222
+ line.sort_pass = sbin
223
+ line.result = 'Pass'
224
+ else
225
+ line.bin_fail = bin
226
+ line.sort_fail = sbin
227
+ line.result = 'Fail'
228
+ end
229
+ line.comment = desc
230
+ completed_lines << line
231
+ end
232
+ end
233
+
234
+ def on_on_fail(node)
235
+ @branch = :on_fail
236
+ process_all(node)
237
+ @branch = nil
238
+ end
239
+
240
+ def on_on_pass(node)
241
+ @branch = :on_pass
242
+ process_all(node)
243
+ @branch = nil
244
+ end
245
+
246
+ def on_job(node)
247
+ jobs, state, *nodes = *node
248
+ jobs = clean_job(jobs)
249
+ unless state
250
+ jobs = jobs.map { |j| "!#{j}" }
251
+ end
252
+ stack[:jobs] << [stack[:jobs].last, jobs].compact.join(',')
253
+ context << stack[:jobs].last
254
+ process_all(node)
255
+ stack[:jobs].pop
256
+ context.pop
257
+ end
258
+
259
+ def on_run_flag(node)
260
+ flag, state, *nodes = *node
261
+ orig = run_flag
262
+ if flag.is_a?(Array)
263
+ or_flag = flag.join('_OR_')
264
+ or_flag = "NOT_#{flag}" unless state
265
+ flag.each do |f|
266
+ if run_flag
267
+ fail 'Not implemented yet!'
268
+ else
269
+ self.run_flag = [f, state]
270
+ completed_lines << new_line(:flag_true, parameter: or_flag)
271
+ self.run_flag = nil
272
+ end
273
+ end
274
+ # Don't need to create an AND flag if the flag on which this test is dependent was also
275
+ # set under the same context.
276
+ if run_flag && set_run_flags[flag] && set_run_flags[flag].hash != context.hash
277
+ and_flag = flag_to_s(or_flag, state) + '_AND_' + flag_to_s(*run_flag)
278
+ # If the AND flag has already been created and set in this context (for a previous test),
279
+ # no need to re-create it
280
+ if !set_run_flags[and_flag] || (set_run_flags[and_flag].hash != context.hash)
281
+ set_run_flags[and_flag] = context
282
+ existing_flag = run_flag
283
+ self.run_flag = nil
284
+ completed_lines << new_line(:flag_true, parameter: and_flag)
285
+ self.run_flag = [existing_flag[0], !existing_flag[1]]
286
+ completed_lines << new_line(:flag_false, parameter: and_flag)
287
+ self.run_flag = [flag, !state]
288
+ completed_lines << new_line(:flag_false, parameter: and_flag)
289
+ end
290
+ self.run_flag = [and_flag, true]
291
+ else
292
+ self.run_flag = [or_flag, true]
293
+ end
294
+ else
295
+ # Don't need to create an AND flag if the flag on which this test is dependent was also
296
+ # set under the same context.
297
+ if run_flag && set_run_flags[flag] && set_run_flags[flag].hash != context.hash
298
+ and_flag = flag_to_s(flag, state) + '_AND_' + flag_to_s(*run_flag)
299
+ # If the AND flag has already been created and set in this context (for a previous test),
300
+ # no need to re-create it
301
+ if !set_run_flags[and_flag] || (set_run_flags[and_flag].hash != context.hash)
302
+ set_run_flags[and_flag] = context
303
+ existing_flag = run_flag
304
+ self.run_flag = nil
305
+ completed_lines << new_line(:flag_true, parameter: and_flag)
306
+ self.run_flag = [existing_flag[0], !existing_flag[1]]
307
+ completed_lines << new_line(:flag_false, parameter: and_flag)
308
+ self.run_flag = [flag, !state]
309
+ completed_lines << new_line(:flag_false, parameter: and_flag)
310
+ end
311
+ self.run_flag = [and_flag, true]
312
+ else
313
+ self.run_flag = [flag, state]
314
+ end
315
+ end
316
+ context << run_flag
317
+ process_all(node)
318
+ context.pop
319
+ self.run_flag = orig
320
+ end
321
+
322
+ def on_flow_flag(node)
323
+ flag, value = *node.to_a.take(2)
324
+ orig = flow_flag
325
+ if flag.is_a?(Array)
326
+ flag.map! { |a_flag| remove_symbols_from_flag(a_flag) }
327
+ if flag.size > 1
328
+ or_flag = flag.join('_OR_')
329
+ flag.each do |f|
330
+ completed_lines << new_line(:enable_flow_word, parameter: or_flag, enable: f)
331
+ end
332
+ flag = or_flag
333
+ else
334
+ flag = flag.first
335
+ end
336
+ else
337
+ flag = remove_symbols_from_flag(flag)
338
+ end
339
+ if value
340
+ # IG-XL docs say that enable words are not optimized for test time, so branch around
341
+ # large blocks to minimize enable word evaluation
342
+ if number_of_tests_in(node) > 5
343
+ label = generate_unique_label
344
+ branch_if_enable(flag) do
345
+ completed_lines << new_line(:goto, parameter: label, enable: nil)
346
+ end
347
+ context << flag
348
+ process_all(node)
349
+ context.pop
350
+ completed_lines << new_line(:nop, label: label, enable: nil)
351
+ else
352
+ if flow_flag
353
+ and_flag = "#{flow_flag}_AND_#{flag}"
354
+ label = generate_unique_label
355
+ branch_if_enable(flow_flag) do
356
+ completed_lines << new_line(:goto, parameter: label, enable: nil)
357
+ end
358
+ completed_lines << new_line(:enable_flow_word, parameter: and_flag, enable: flag)
359
+ completed_lines << new_line(:nop, label: label, enable: nil)
360
+ self.flow_flag = and_flag
361
+ context << and_flag
362
+ process_all(node)
363
+ context.pop
364
+ self.flow_flag = orig
365
+ else
366
+ self.flow_flag = flag
367
+ context << flag
368
+ process_all(node)
369
+ context.pop
370
+ self.flow_flag = orig
371
+ end
372
+ end
373
+ else
374
+ # IG-XL does not have a !enable option, so generate a branch around the tests
375
+ # to be skipped unless the required flag is enabled
376
+ context << "!#{flag}"
377
+ branch_if_enable(flag) do
378
+ process_all(node)
379
+ end
380
+ context.pop
381
+ end
382
+ end
383
+
384
+ def branch_if_enable(word)
385
+ label = generate_unique_label
386
+ completed_lines << new_line(:goto, parameter: label, enable: word)
387
+ yield
388
+ completed_lines << new_line(:nop, label: label, enable: nil)
389
+ end
390
+
391
+ def on_enable_flow_flag(node)
392
+ completed_lines << new_line(:enable_flow_word, parameter: node.value)
393
+ end
394
+
395
+ def on_disable_flow_flag(node)
396
+ completed_lines << new_line(:disable_flow_word, parameter: node.value)
397
+ end
398
+
399
+ def on_log(node)
400
+ completed_lines << new_line(:logprint, parameter: node.to_a[0].gsub(' ', '_'))
401
+ end
402
+
403
+ def on_render(node)
404
+ completed_lines << node.to_a[0]
405
+ end
406
+
407
+ def new_line(type, attrs = {})
408
+ attrs = {
409
+ job: stack[:jobs].last,
410
+ enable: flow_flag
411
+ }.merge(attrs)
412
+ line = platform::FlowLine.new(type, attrs)
413
+ if run_flag
414
+ line.device_sense = 'not' unless run_flag[1]
415
+ line.device_name = remove_symbols_from_flag(run_flag[0])
416
+ line.device_condition = 'flag-true'
417
+ end
418
+ open_lines << line
419
+ yield line if block_given?
420
+ open_lines.pop
421
+ line
422
+ end
423
+
424
+ # Any completed lines should be pushed to the array that this returns
425
+ def completed_lines
426
+ stack[:groups].last || lines
427
+ end
428
+
429
+ def open_lines
430
+ @open_lines ||= []
431
+ end
432
+
433
+ def current_line
434
+ open_lines.last
435
+ end
436
+
437
+ def clean_job(job)
438
+ [job].flatten.map { |j| j.to_s.upcase }
439
+ end
440
+
441
+ def flag_to_s(flag, state)
442
+ if state
443
+ flag
444
+ else
445
+ "NOT_#{flag}"
446
+ end
447
+ end
448
+
449
+ private
450
+
451
+ def remove_symbols_from_flag(flag)
452
+ if flag[0] == '$'
453
+ flag[0] = ''
454
+ end
455
+ flag
456
+ end
457
+ end
458
+ end
459
+ end
460
+ end