origen_testers 0.13.1 → 0.13.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (258) hide show
  1. checksums.yaml +4 -4
  2. data/config/application.rb +151 -151
  3. data/config/boot.rb +13 -13
  4. data/config/commands.rb +85 -86
  5. data/config/users.rb +18 -18
  6. data/config/version.rb +8 -8
  7. data/lib/commands/build.rb +69 -69
  8. data/lib/commands/run.rb +48 -48
  9. data/lib/origen_testers.rb +47 -47
  10. data/lib/origen_testers/api.rb +381 -381
  11. data/lib/origen_testers/basic_test_setups.rb +105 -105
  12. data/lib/origen_testers/callback_handlers.rb +59 -59
  13. data/lib/origen_testers/command_based_tester.rb +45 -45
  14. data/lib/origen_testers/flow.rb +382 -382
  15. data/lib/origen_testers/generator.rb +283 -283
  16. data/lib/origen_testers/generator/identity_map.rb +23 -23
  17. data/lib/origen_testers/generator/placeholder.rb +11 -11
  18. data/lib/origen_testers/generator/test_numberer.rb +23 -23
  19. data/lib/origen_testers/igxl_based_tester.rb +12 -12
  20. data/lib/origen_testers/igxl_based_tester/base.rb +1100 -1099
  21. data/lib/origen_testers/igxl_based_tester/base/ac_specsets.rb +79 -79
  22. data/lib/origen_testers/igxl_based_tester/base/custom_test_instance.rb +169 -169
  23. data/lib/origen_testers/igxl_based_tester/base/dc_specsets.rb +98 -98
  24. data/lib/origen_testers/igxl_based_tester/base/edge.rb +60 -60
  25. data/lib/origen_testers/igxl_based_tester/base/edges.rb +24 -24
  26. data/lib/origen_testers/igxl_based_tester/base/edgeset.rb +39 -39
  27. data/lib/origen_testers/igxl_based_tester/base/edgesets.rb +130 -130
  28. data/lib/origen_testers/igxl_based_tester/base/flow.rb +460 -460
  29. data/lib/origen_testers/igxl_based_tester/base/flow_line.rb +276 -276
  30. data/lib/origen_testers/igxl_based_tester/base/generator.rb +607 -607
  31. data/lib/origen_testers/igxl_based_tester/base/global_specs.rb +83 -83
  32. data/lib/origen_testers/igxl_based_tester/base/job.rb +75 -75
  33. data/lib/origen_testers/igxl_based_tester/base/jobs.rb +44 -44
  34. data/lib/origen_testers/igxl_based_tester/base/level_io_se.rb +59 -59
  35. data/lib/origen_testers/igxl_based_tester/base/level_supply.rb +39 -39
  36. data/lib/origen_testers/igxl_based_tester/base/levels.rb +31 -31
  37. data/lib/origen_testers/igxl_based_tester/base/levelset.rb +110 -110
  38. data/lib/origen_testers/igxl_based_tester/base/patgroup.rb +109 -109
  39. data/lib/origen_testers/igxl_based_tester/base/patgroups.rb +38 -38
  40. data/lib/origen_testers/igxl_based_tester/base/patset.rb +68 -68
  41. data/lib/origen_testers/igxl_based_tester/base/patset_pattern.rb +56 -56
  42. data/lib/origen_testers/igxl_based_tester/base/patsets.rb +38 -38
  43. data/lib/origen_testers/igxl_based_tester/base/patsubr.rb +68 -68
  44. data/lib/origen_testers/igxl_based_tester/base/patsubr_pattern.rb +56 -56
  45. data/lib/origen_testers/igxl_based_tester/base/patsubrs.rb +38 -38
  46. data/lib/origen_testers/igxl_based_tester/base/pinmap.rb +93 -93
  47. data/lib/origen_testers/igxl_based_tester/base/references.rb +25 -25
  48. data/lib/origen_testers/igxl_based_tester/base/test_instance.rb +322 -322
  49. data/lib/origen_testers/igxl_based_tester/base/test_instance_group.rb +66 -66
  50. data/lib/origen_testers/igxl_based_tester/base/test_instances.rb +212 -212
  51. data/lib/origen_testers/igxl_based_tester/base/test_instances/custom_til.rb +37 -37
  52. data/lib/origen_testers/igxl_based_tester/base/timeset.rb +37 -37
  53. data/lib/origen_testers/igxl_based_tester/base/timesets.rb +49 -49
  54. data/lib/origen_testers/igxl_based_tester/base/timesets_basic.rb +49 -49
  55. data/lib/origen_testers/igxl_based_tester/files.rb +43 -43
  56. data/lib/origen_testers/igxl_based_tester/j750.rb +269 -269
  57. data/lib/origen_testers/igxl_based_tester/j750/custom_test_instance.rb +32 -32
  58. data/lib/origen_testers/igxl_based_tester/j750/flow.rb +10 -10
  59. data/lib/origen_testers/igxl_based_tester/j750/flow_line.rb +19 -19
  60. data/lib/origen_testers/igxl_based_tester/j750/generator.rb +19 -19
  61. data/lib/origen_testers/igxl_based_tester/j750/patgroup.rb +9 -9
  62. data/lib/origen_testers/igxl_based_tester/j750/patgroups.rb +10 -10
  63. data/lib/origen_testers/igxl_based_tester/j750/patset.rb +9 -9
  64. data/lib/origen_testers/igxl_based_tester/j750/patset_pattern.rb +18 -18
  65. data/lib/origen_testers/igxl_based_tester/j750/patsets.rb +10 -10
  66. data/lib/origen_testers/igxl_based_tester/j750/patsubr.rb +9 -9
  67. data/lib/origen_testers/igxl_based_tester/j750/patsubr_pattern.rb +18 -18
  68. data/lib/origen_testers/igxl_based_tester/j750/patsubrs.rb +10 -10
  69. data/lib/origen_testers/igxl_based_tester/j750/test_instance.rb +746 -746
  70. data/lib/origen_testers/igxl_based_tester/j750/test_instance_group.rb +9 -9
  71. data/lib/origen_testers/igxl_based_tester/j750/test_instances.rb +10 -10
  72. data/lib/origen_testers/igxl_based_tester/j750_hpt.rb +34 -34
  73. data/lib/origen_testers/igxl_based_tester/j750_hpt/custom_test_instance.rb +32 -32
  74. data/lib/origen_testers/igxl_based_tester/j750_hpt/flow.rb +9 -9
  75. data/lib/origen_testers/igxl_based_tester/j750_hpt/flow_line.rb +9 -9
  76. data/lib/origen_testers/igxl_based_tester/j750_hpt/generator.rb +19 -19
  77. data/lib/origen_testers/igxl_based_tester/j750_hpt/patgroup.rb +9 -9
  78. data/lib/origen_testers/igxl_based_tester/j750_hpt/patgroups.rb +9 -9
  79. data/lib/origen_testers/igxl_based_tester/j750_hpt/patset.rb +9 -9
  80. data/lib/origen_testers/igxl_based_tester/j750_hpt/patset_pattern.rb +9 -9
  81. data/lib/origen_testers/igxl_based_tester/j750_hpt/patsets.rb +9 -9
  82. data/lib/origen_testers/igxl_based_tester/j750_hpt/patsubr.rb +9 -9
  83. data/lib/origen_testers/igxl_based_tester/j750_hpt/patsubr_pattern.rb +9 -9
  84. data/lib/origen_testers/igxl_based_tester/j750_hpt/patsubrs.rb +9 -9
  85. data/lib/origen_testers/igxl_based_tester/j750_hpt/test_instance.rb +599 -599
  86. data/lib/origen_testers/igxl_based_tester/j750_hpt/test_instance_group.rb +9 -9
  87. data/lib/origen_testers/igxl_based_tester/j750_hpt/test_instances.rb +9 -9
  88. data/lib/origen_testers/igxl_based_tester/parser.rb +102 -102
  89. data/lib/origen_testers/igxl_based_tester/parser/ac_spec.rb +9 -9
  90. data/lib/origen_testers/igxl_based_tester/parser/dc_spec.rb +33 -33
  91. data/lib/origen_testers/igxl_based_tester/parser/dc_specs.rb +48 -48
  92. data/lib/origen_testers/igxl_based_tester/parser/descriptions.rb +339 -339
  93. data/lib/origen_testers/igxl_based_tester/parser/flow.rb +109 -109
  94. data/lib/origen_testers/igxl_based_tester/parser/flow_line.rb +203 -203
  95. data/lib/origen_testers/igxl_based_tester/parser/flows.rb +21 -21
  96. data/lib/origen_testers/igxl_based_tester/parser/pattern_set.rb +92 -92
  97. data/lib/origen_testers/igxl_based_tester/parser/pattern_sets.rb +31 -31
  98. data/lib/origen_testers/igxl_based_tester/parser/test_instance.rb +420 -420
  99. data/lib/origen_testers/igxl_based_tester/parser/test_instances.rb +24 -24
  100. data/lib/origen_testers/igxl_based_tester/parser/timeset.rb +13 -13
  101. data/lib/origen_testers/igxl_based_tester/ultraflex.rb +798 -798
  102. data/lib/origen_testers/igxl_based_tester/ultraflex/ac_specsets.rb +10 -10
  103. data/lib/origen_testers/igxl_based_tester/ultraflex/ate_hardware.rb +949 -949
  104. data/lib/origen_testers/igxl_based_tester/ultraflex/custom_test_instance.rb +36 -36
  105. data/lib/origen_testers/igxl_based_tester/ultraflex/dc_specsets.rb +10 -10
  106. data/lib/origen_testers/igxl_based_tester/ultraflex/edge.rb +9 -9
  107. data/lib/origen_testers/igxl_based_tester/ultraflex/edges.rb +9 -9
  108. data/lib/origen_testers/igxl_based_tester/ultraflex/edgeset.rb +9 -9
  109. data/lib/origen_testers/igxl_based_tester/ultraflex/edgesets.rb +10 -10
  110. data/lib/origen_testers/igxl_based_tester/ultraflex/flow.rb +158 -158
  111. data/lib/origen_testers/igxl_based_tester/ultraflex/flow_line.rb +19 -19
  112. data/lib/origen_testers/igxl_based_tester/ultraflex/generator.rb +19 -19
  113. data/lib/origen_testers/igxl_based_tester/ultraflex/global_specs.rb +10 -10
  114. data/lib/origen_testers/igxl_based_tester/ultraflex/job.rb +9 -9
  115. data/lib/origen_testers/igxl_based_tester/ultraflex/jobs.rb +10 -10
  116. data/lib/origen_testers/igxl_based_tester/ultraflex/level_io_se.rb +9 -9
  117. data/lib/origen_testers/igxl_based_tester/ultraflex/level_supply.rb +9 -9
  118. data/lib/origen_testers/igxl_based_tester/ultraflex/levels.rb +9 -9
  119. data/lib/origen_testers/igxl_based_tester/ultraflex/levelset.rb +10 -10
  120. data/lib/origen_testers/igxl_based_tester/ultraflex/patgroup.rb +9 -9
  121. data/lib/origen_testers/igxl_based_tester/ultraflex/patgroups.rb +10 -10
  122. data/lib/origen_testers/igxl_based_tester/ultraflex/patset.rb +9 -9
  123. data/lib/origen_testers/igxl_based_tester/ultraflex/patset_pattern.rb +18 -18
  124. data/lib/origen_testers/igxl_based_tester/ultraflex/patsets.rb +10 -10
  125. data/lib/origen_testers/igxl_based_tester/ultraflex/patsubr.rb +9 -9
  126. data/lib/origen_testers/igxl_based_tester/ultraflex/patsubr_pattern.rb +18 -18
  127. data/lib/origen_testers/igxl_based_tester/ultraflex/patsubrs.rb +10 -10
  128. data/lib/origen_testers/igxl_based_tester/ultraflex/pinmap.rb +10 -10
  129. data/lib/origen_testers/igxl_based_tester/ultraflex/references.rb +10 -10
  130. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/ac_specsets.txt.erb +0 -0
  131. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/dc_specsets.txt.erb +0 -0
  132. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/edgesets.txt.erb +0 -0
  133. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/global_specs.txt.erb +0 -0
  134. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/jobs.txt.erb +0 -0
  135. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/levelset.txt.erb +0 -0
  136. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/pinmap.txt.erb +0 -0
  137. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/references.txt.erb +0 -0
  138. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/timesets.txt.erb +0 -0
  139. data/lib/origen_testers/igxl_based_tester/ultraflex/templates/timesets_basic.txt.erb +0 -0
  140. data/lib/origen_testers/igxl_based_tester/ultraflex/test_instance.rb +315 -315
  141. data/lib/origen_testers/igxl_based_tester/ultraflex/test_instance_group.rb +9 -9
  142. data/lib/origen_testers/igxl_based_tester/ultraflex/test_instances.rb +10 -10
  143. data/lib/origen_testers/igxl_based_tester/ultraflex/timeset.rb +9 -9
  144. data/lib/origen_testers/igxl_based_tester/ultraflex/timesets.rb +10 -10
  145. data/lib/origen_testers/igxl_based_tester/ultraflex/timesets_basic.rb +10 -10
  146. data/lib/origen_testers/interface.rb +345 -324
  147. data/lib/origen_testers/memory_style.rb +77 -77
  148. data/lib/origen_testers/no_interface.rb +7 -7
  149. data/lib/origen_testers/origen_ext/application/runner.rb +25 -25
  150. data/lib/origen_testers/origen_ext/generator.rb +54 -54
  151. data/lib/origen_testers/origen_ext/generator/flow.rb +91 -77
  152. data/lib/origen_testers/origen_ext/generator/resources.rb +21 -21
  153. data/lib/origen_testers/origen_ext/pins/pin.rb +78 -78
  154. data/lib/origen_testers/origen_ext/pins/pin_collection.rb +84 -84
  155. data/lib/origen_testers/parser.rb +22 -22
  156. data/lib/origen_testers/parser/description_lookup.rb +62 -62
  157. data/lib/origen_testers/parser/searchable_array.rb +30 -30
  158. data/lib/origen_testers/parser/searchable_hash.rb +30 -30
  159. data/lib/origen_testers/pattern_compilers.rb +116 -116
  160. data/lib/origen_testers/pattern_compilers/assembler.rb +88 -88
  161. data/lib/origen_testers/pattern_compilers/job.rb +96 -96
  162. data/lib/origen_testers/pattern_compilers/ultraflex_pattern_compiler.rb +599 -599
  163. data/lib/origen_testers/program_generators.rb +62 -62
  164. data/lib/origen_testers/smartest_based_tester.rb +8 -8
  165. data/lib/origen_testers/smartest_based_tester/base.rb +576 -567
  166. data/lib/origen_testers/smartest_based_tester/base/flow.rb +296 -291
  167. data/lib/origen_testers/smartest_based_tester/base/generator.rb +207 -194
  168. data/lib/origen_testers/smartest_based_tester/base/pattern_compiler.rb +32 -32
  169. data/lib/origen_testers/smartest_based_tester/base/pattern_master.rb +69 -69
  170. data/lib/origen_testers/smartest_based_tester/base/processors.rb +16 -16
  171. data/lib/origen_testers/smartest_based_tester/base/processors/adjacent_if_combiner.rb +106 -106
  172. data/lib/origen_testers/smartest_based_tester/base/processors/continue_implementer.rb +39 -39
  173. data/lib/origen_testers/smartest_based_tester/base/processors/empty_branch_cleaner.rb +21 -21
  174. data/lib/origen_testers/smartest_based_tester/base/processors/extract_run_flag_table.rb +33 -33
  175. data/lib/origen_testers/smartest_based_tester/base/processors/extract_set_variables.rb +22 -22
  176. data/lib/origen_testers/smartest_based_tester/base/processors/flag_optimizer.rb +188 -188
  177. data/lib/origen_testers/smartest_based_tester/base/processors/if_ran_cleaner.rb +34 -34
  178. data/lib/origen_testers/smartest_based_tester/base/test_method.rb +178 -164
  179. data/lib/origen_testers/smartest_based_tester/base/test_methods.rb +77 -73
  180. data/lib/origen_testers/smartest_based_tester/base/test_methods/ac_tml.rb +33 -33
  181. data/lib/origen_testers/smartest_based_tester/base/test_methods/base_tml.rb +38 -38
  182. data/lib/origen_testers/smartest_based_tester/base/test_methods/custom_tml.rb +19 -19
  183. data/lib/origen_testers/smartest_based_tester/base/test_methods/dc_tml.rb +147 -147
  184. data/lib/origen_testers/smartest_based_tester/base/test_methods/limits.rb +65 -65
  185. data/lib/origen_testers/smartest_based_tester/base/test_suite.rb +208 -193
  186. data/lib/origen_testers/smartest_based_tester/base/test_suites.rb +58 -54
  187. data/lib/origen_testers/smartest_based_tester/base/variables_file.rb +38 -38
  188. data/lib/origen_testers/smartest_based_tester/v93k.rb +8 -8
  189. data/lib/origen_testers/smartest_based_tester/v93k/builder.rb +89 -89
  190. data/lib/origen_testers/smartest_based_tester/v93k/builder/flow.rb +181 -181
  191. data/lib/origen_testers/smartest_based_tester/v93k/builder/pattern_master.rb +54 -54
  192. data/lib/origen_testers/smartest_based_tester/v93k/flow.rb +10 -10
  193. data/lib/origen_testers/smartest_based_tester/v93k/generator.rb +19 -19
  194. data/lib/origen_testers/smartest_based_tester/v93k/pattern_compiler.rb +10 -10
  195. data/lib/origen_testers/smartest_based_tester/v93k/pattern_master.rb +10 -10
  196. data/lib/origen_testers/smartest_based_tester/v93k/templates/template.aiv.erb +17 -17
  197. data/lib/origen_testers/smartest_based_tester/v93k/templates/template.pmfl.erb +13 -13
  198. data/lib/origen_testers/smartest_based_tester/v93k/templates/template.tf.erb +236 -214
  199. data/lib/origen_testers/smartest_based_tester/v93k/templates/vars.tf.erb +48 -48
  200. data/lib/origen_testers/smartest_based_tester/v93k/test_method.rb +9 -9
  201. data/lib/origen_testers/smartest_based_tester/v93k/test_methods.rb +9 -9
  202. data/lib/origen_testers/smartest_based_tester/v93k/test_suite.rb +9 -9
  203. data/lib/origen_testers/smartest_based_tester/v93k/test_suites.rb +9 -9
  204. data/lib/origen_testers/smartest_based_tester/v93k/variables_file.rb +10 -10
  205. data/lib/origen_testers/test/basic_interface.rb +17 -17
  206. data/lib/origen_testers/test/block.rb +21 -21
  207. data/lib/origen_testers/test/custom_test_interface.rb +111 -111
  208. data/lib/origen_testers/test/dut.rb +295 -295
  209. data/lib/origen_testers/test/dut2.rb +76 -76
  210. data/lib/origen_testers/test/dut3.rb +244 -244
  211. data/lib/origen_testers/test/interface.rb +503 -503
  212. data/lib/origen_testers/test/nvm.rb +94 -94
  213. data/lib/origen_testers/timing.rb +368 -368
  214. data/lib/origen_testers/vector.rb +207 -207
  215. data/lib/origen_testers/vector_based_tester.rb +41 -41
  216. data/lib/origen_testers/vector_generator.rb +655 -655
  217. data/lib/origen_testers/vector_pipeline.rb +302 -302
  218. data/pattern/bitmap.rb +7 -7
  219. data/pattern/dc_instr.rb +7 -7
  220. data/pattern/delay.rb +7 -7
  221. data/pattern/freq_counter.rb +6 -6
  222. data/pattern/mem_test.rb +8 -8
  223. data/pattern/multi_vector.rb +122 -122
  224. data/pattern/multi_vector_plus1.rb +125 -125
  225. data/pattern/nvm/j750/add_late_pins.rb +3 -3
  226. data/pattern/nvm/j750/iterator_postfix_test_x_bx.rb +8 -8
  227. data/pattern/nvm/j750/iterator_test_x_bx.rb +8 -8
  228. data/pattern/nvm/j750/j750_halt.rb +159 -159
  229. data/pattern/nvm/j750/j750_workout.rb +209 -209
  230. data/pattern/nvm/j750/timing.rb +73 -73
  231. data/pattern/read_write_reg.rb +61 -61
  232. data/pattern/reset.rb +4 -4
  233. data/pattern/subroutines.rb +69 -69
  234. data/pattern/tester_overlay.rb +61 -52
  235. data/pattern/tester_store.rb +28 -28
  236. data/program/_additional_erase.rb +7 -7
  237. data/program/_efa_resources.rb +7 -7
  238. data/program/_erase.rb +25 -25
  239. data/program/_erase_vfy.rb +5 -5
  240. data/program/_iv_resources.rb +10 -10
  241. data/program/basic_interface.rb +5 -5
  242. data/program/components/_prb1_main.rb +222 -222
  243. data/program/components/_temp.rb +6 -6
  244. data/program/custom_tests.rb +10 -10
  245. data/program/flow_control.rb +422 -422
  246. data/program/prb1.rb +11 -11
  247. data/program/prb1_resources.rb +28 -28
  248. data/program/prb2.rb +27 -27
  249. data/program/test.rb +29 -29
  250. data/program/uflex_resources.rb +199 -199
  251. data/templates/example.txt.erb +53 -53
  252. data/templates/j750/program_sheet.txt.erb +9 -9
  253. data/templates/manifest/v93k.yaml.erb +22 -22
  254. data/templates/web/index.md.erb +51 -51
  255. data/templates/web/layouts/_basic.html.erb +15 -15
  256. data/templates/web/partials/_navbar.html.erb +22 -22
  257. data/templates/web/release_notes.md.erb +5 -5
  258. metadata +2 -2
@@ -1,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