origen_testers 0.10.0 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (255) 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 +86 -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 +1095 -1095
  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 +448 -446
  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 +324 -328
  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 +77 -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 +562 -562
  166. data/lib/origen_testers/smartest_based_tester/base/flow.rb +279 -279
  167. data/lib/origen_testers/smartest_based_tester/base/generator.rb +193 -193
  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 +13 -13
  171. data/lib/origen_testers/smartest_based_tester/base/processors/empty_branch_cleaner.rb +49 -49
  172. data/lib/origen_testers/smartest_based_tester/base/processors/extract_set_variables.rb +22 -22
  173. data/lib/origen_testers/smartest_based_tester/base/processors/flag_optimizer.rb +143 -143
  174. data/lib/origen_testers/smartest_based_tester/base/processors/if_ran_cleaner.rb +34 -34
  175. data/lib/origen_testers/smartest_based_tester/base/test_method.rb +164 -164
  176. data/lib/origen_testers/smartest_based_tester/base/test_methods.rb +73 -73
  177. data/lib/origen_testers/smartest_based_tester/base/test_methods/ac_tml.rb +33 -33
  178. data/lib/origen_testers/smartest_based_tester/base/test_methods/base_tml.rb +38 -38
  179. data/lib/origen_testers/smartest_based_tester/base/test_methods/custom_tml.rb +19 -19
  180. data/lib/origen_testers/smartest_based_tester/base/test_methods/dc_tml.rb +147 -147
  181. data/lib/origen_testers/smartest_based_tester/base/test_methods/limits.rb +65 -65
  182. data/lib/origen_testers/smartest_based_tester/base/test_suite.rb +193 -193
  183. data/lib/origen_testers/smartest_based_tester/base/test_suites.rb +54 -54
  184. data/lib/origen_testers/smartest_based_tester/base/variables_file.rb +38 -38
  185. data/lib/origen_testers/smartest_based_tester/v93k.rb +8 -8
  186. data/lib/origen_testers/smartest_based_tester/v93k/builder.rb +89 -89
  187. data/lib/origen_testers/smartest_based_tester/v93k/builder/flow.rb +181 -181
  188. data/lib/origen_testers/smartest_based_tester/v93k/builder/pattern_master.rb +54 -54
  189. data/lib/origen_testers/smartest_based_tester/v93k/flow.rb +10 -10
  190. data/lib/origen_testers/smartest_based_tester/v93k/generator.rb +19 -19
  191. data/lib/origen_testers/smartest_based_tester/v93k/pattern_compiler.rb +10 -10
  192. data/lib/origen_testers/smartest_based_tester/v93k/pattern_master.rb +10 -10
  193. data/lib/origen_testers/smartest_based_tester/v93k/templates/template.aiv.erb +17 -17
  194. data/lib/origen_testers/smartest_based_tester/v93k/templates/template.pmfl.erb +13 -13
  195. data/lib/origen_testers/smartest_based_tester/v93k/templates/template.tf.erb +214 -214
  196. data/lib/origen_testers/smartest_based_tester/v93k/templates/vars.tf.erb +48 -48
  197. data/lib/origen_testers/smartest_based_tester/v93k/test_method.rb +9 -9
  198. data/lib/origen_testers/smartest_based_tester/v93k/test_methods.rb +9 -9
  199. data/lib/origen_testers/smartest_based_tester/v93k/test_suite.rb +9 -9
  200. data/lib/origen_testers/smartest_based_tester/v93k/test_suites.rb +9 -9
  201. data/lib/origen_testers/smartest_based_tester/v93k/variables_file.rb +10 -10
  202. data/lib/origen_testers/test/basic_interface.rb +17 -17
  203. data/lib/origen_testers/test/block.rb +21 -21
  204. data/lib/origen_testers/test/custom_test_interface.rb +111 -111
  205. data/lib/origen_testers/test/dut.rb +295 -295
  206. data/lib/origen_testers/test/dut2.rb +76 -76
  207. data/lib/origen_testers/test/dut3.rb +244 -244
  208. data/lib/origen_testers/test/interface.rb +503 -503
  209. data/lib/origen_testers/test/nvm.rb +94 -94
  210. data/lib/origen_testers/timing.rb +362 -362
  211. data/lib/origen_testers/vector.rb +207 -207
  212. data/lib/origen_testers/vector_based_tester.rb +41 -41
  213. data/lib/origen_testers/vector_generator.rb +655 -655
  214. data/lib/origen_testers/vector_pipeline.rb +302 -302
  215. data/pattern/bitmap.rb +7 -7
  216. data/pattern/dc_instr.rb +7 -7
  217. data/pattern/delay.rb +7 -7
  218. data/pattern/freq_counter.rb +6 -6
  219. data/pattern/mem_test.rb +8 -8
  220. data/pattern/multi_vector.rb +122 -122
  221. data/pattern/multi_vector_plus1.rb +125 -125
  222. data/pattern/nvm/j750/add_late_pins.rb +3 -3
  223. data/pattern/nvm/j750/iterator_postfix_test_x_bx.rb +8 -8
  224. data/pattern/nvm/j750/iterator_test_x_bx.rb +8 -8
  225. data/pattern/nvm/j750/j750_halt.rb +159 -159
  226. data/pattern/nvm/j750/j750_workout.rb +209 -209
  227. data/pattern/nvm/j750/timing.rb +73 -73
  228. data/pattern/read_write_reg.rb +61 -61
  229. data/pattern/reset.rb +4 -4
  230. data/pattern/subroutines.rb +69 -69
  231. data/pattern/tester_overlay.rb +52 -52
  232. data/pattern/tester_store.rb +28 -28
  233. data/program/_additional_erase.rb +7 -7
  234. data/program/_efa_resources.rb +7 -7
  235. data/program/_erase.rb +25 -25
  236. data/program/_erase_vfy.rb +5 -5
  237. data/program/_iv_resources.rb +10 -10
  238. data/program/basic_interface.rb +5 -5
  239. data/program/components/_prb1_main.rb +212 -0
  240. data/program/components/_temp.rb +6 -6
  241. data/program/custom_tests.rb +10 -10
  242. data/program/flow_control.rb +329 -321
  243. data/program/prb1.rb +11 -219
  244. data/program/prb1_resources.rb +28 -28
  245. data/program/prb2.rb +27 -27
  246. data/program/test.rb +29 -29
  247. data/program/uflex_resources.rb +199 -199
  248. data/templates/example.txt.erb +53 -53
  249. data/templates/j750/program_sheet.txt.erb +9 -9
  250. data/templates/manifest/v93k.yaml.erb +22 -22
  251. data/templates/web/index.md.erb +51 -51
  252. data/templates/web/layouts/_basic.html.erb +15 -15
  253. data/templates/web/partials/_navbar.html.erb +22 -22
  254. data/templates/web/release_notes.md.erb +5 -5
  255. metadata +6 -5
@@ -1,446 +1,448 @@
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
- flags[:on_pass] << test.flag_pass
123
- flags[:on_fail] << test.flag_fail
124
- completed_lines << test
125
- end
126
- if @group_on_fail_flag
127
- flags[:on_fail].each do |flag|
128
- self.run_flag = [flag, true]
129
- completed_lines << new_line(:flag_true, parameter: @group_on_fail_flag)
130
- end
131
- self.run_flag = nil
132
- end
133
- if @group_on_pass_flag && @group_on_pass_flag != @group_on_fail_flag
134
- flags[:on_pass].each do |flag|
135
- self.run_flag = [flag, true]
136
- completed_lines << new_line(:flag_true, parameter: @group_on_pass_flag)
137
- end
138
- self.run_flag = nil
139
- end
140
- @group_on_fail_flag = nil
141
- @group_on_pass_flag = nil
142
- end
143
-
144
- def on_name(node)
145
- if current_group
146
- # No action, groups will not actually appear in the flow sheet
147
- else
148
- current_line.tname = node.to_a[0]
149
- end
150
- end
151
-
152
- def on_number(node)
153
- if Origen.tester.diff_friendly_output?
154
- current_line.tnum = 0
155
- else
156
- current_line.tnum = node.to_a[0]
157
- end
158
- end
159
-
160
- def on_object(node)
161
- instance = node.to_a[0]
162
- if instance.is_a?(String)
163
- current_line.instance_variable_set('@ignore_missing_instance', true)
164
- end
165
- current_line.parameter = instance
166
- end
167
-
168
- def on_continue(node)
169
- if current_group
170
- current_group.each { |line| line.result = 'None' }
171
- else
172
- current_line.result = 'None'
173
- end
174
- end
175
-
176
- def on_set_run_flag(node)
177
- flag = node.to_a[0]
178
- set_run_flags[flag] = context.dup
179
- if current_group
180
- if branch == :on_fail
181
- @group_on_fail_flag = flag
182
- current_group.each_with_index do |line, i|
183
- line.flag_fail = "#{flag}_#{i}" unless line.flag_fail
184
- end
185
- else
186
- @group_on_pass_flag = flag
187
- current_group.each_with_index do |line, i|
188
- line.flag_pass = "#{flag}_#{i}" unless line.flag_pass
189
- end
190
- end
191
- else
192
- if branch == :on_fail
193
- current_line.flag_fail = flag
194
- else
195
- current_line.flag_pass = flag
196
- end
197
- end
198
- end
199
-
200
- def on_set_result(node)
201
- bin = node.find(:bin).try(:value)
202
- desc = node.find(:bin).to_a[1]
203
- sbin = node.find(:softbin).try(:value)
204
- if current_line
205
- if branch == :on_fail
206
- current_line.bin_fail = bin
207
- current_line.sort_fail = sbin
208
- current_line.comment = desc
209
- current_line.result = 'Fail'
210
- else
211
- current_line.bin_pass = bin
212
- current_line.sort_pass = sbin
213
- current_line.comment = desc
214
- current_line.result = 'Pass'
215
- end
216
- else
217
- line = new_line(:set_device)
218
- if node.to_a[0] == 'pass'
219
- line.bin_pass = bin
220
- line.sort_pass = sbin
221
- line.result = 'Pass'
222
- else
223
- line.bin_fail = bin
224
- line.sort_fail = sbin
225
- line.result = 'Fail'
226
- end
227
- line.comment = desc
228
- completed_lines << line
229
- end
230
- end
231
-
232
- def on_on_fail(node)
233
- @branch = :on_fail
234
- process_all(node)
235
- @branch = nil
236
- end
237
-
238
- def on_on_pass(node)
239
- @branch = :on_pass
240
- process_all(node)
241
- @branch = nil
242
- end
243
-
244
- def on_job(node)
245
- jobs, state, *nodes = *node
246
- jobs = clean_job(jobs)
247
- unless state
248
- jobs = jobs.map { |j| "!#{j}" }
249
- end
250
- stack[:jobs] << [stack[:jobs].last, jobs].compact.join(',')
251
- context << stack[:jobs].last
252
- process_all(node)
253
- stack[:jobs].pop
254
- context.pop
255
- end
256
-
257
- def on_run_flag(node)
258
- flag, state, *nodes = *node
259
- orig = run_flag
260
- if flag.is_a?(Array)
261
- or_flag = flag.join('_OR_')
262
- or_flag = "NOT_#{flag}" unless state
263
- flag.each do |f|
264
- if run_flag
265
- fail 'Not implemented yet!'
266
- else
267
- self.run_flag = [f, state]
268
- completed_lines << new_line(:flag_true, parameter: or_flag)
269
- self.run_flag = nil
270
- end
271
- end
272
- # Don't need to create an AND flag if the flag on which this test is dependent was also
273
- # set under the same context.
274
- if run_flag && set_run_flags[flag] && set_run_flags[flag].hash != context.hash
275
- and_flag = flag_to_s(or_flag, state) + '_AND_' + flag_to_s(*run_flag)
276
- # If the AND flag has already been created and set in this context (for a previous test),
277
- # no need to re-create it
278
- if !set_run_flags[and_flag] || (set_run_flags[and_flag].hash != context.hash)
279
- set_run_flags[and_flag] = context
280
- existing_flag = run_flag
281
- self.run_flag = nil
282
- completed_lines << new_line(:flag_true, parameter: and_flag)
283
- self.run_flag = [existing_flag[0], !existing_flag[1]]
284
- completed_lines << new_line(:flag_false, parameter: and_flag)
285
- self.run_flag = [flag, !state]
286
- completed_lines << new_line(:flag_false, parameter: and_flag)
287
- end
288
- self.run_flag = [and_flag, true]
289
- else
290
- self.run_flag = [or_flag, true]
291
- end
292
- else
293
- # Don't need to create an AND flag if the flag on which this test is dependent was also
294
- # set under the same context.
295
- if run_flag && set_run_flags[flag] && set_run_flags[flag].hash != context.hash
296
- and_flag = flag_to_s(flag, state) + '_AND_' + flag_to_s(*run_flag)
297
- # If the AND flag has already been created and set in this context (for a previous test),
298
- # no need to re-create it
299
- if !set_run_flags[and_flag] || (set_run_flags[and_flag].hash != context.hash)
300
- set_run_flags[and_flag] = context
301
- existing_flag = run_flag
302
- self.run_flag = nil
303
- completed_lines << new_line(:flag_true, parameter: and_flag)
304
- self.run_flag = [existing_flag[0], !existing_flag[1]]
305
- completed_lines << new_line(:flag_false, parameter: and_flag)
306
- self.run_flag = [flag, !state]
307
- completed_lines << new_line(:flag_false, parameter: and_flag)
308
- end
309
- self.run_flag = [and_flag, true]
310
- else
311
- self.run_flag = [flag, state]
312
- end
313
- end
314
- context << run_flag
315
- process_all(node)
316
- context.pop
317
- self.run_flag = orig
318
- end
319
-
320
- def on_flow_flag(node)
321
- flag, value = *node.to_a.take(2)
322
- orig = flow_flag
323
- if flag.is_a?(Array)
324
- if flag.size > 1
325
- or_flag = flag.join('_OR_')
326
- flag.each do |f|
327
- completed_lines << new_line(:enable_flow_word, parameter: or_flag, enable: f)
328
- end
329
- flag = or_flag
330
- else
331
- flag = flag.first
332
- end
333
- end
334
- if value
335
- # IG-XL docs say that enable words are not optimized for test time, so branch around
336
- # large blocks to minimize enable word evaluation
337
- if number_of_tests_in(node) > 5
338
- label = generate_unique_label
339
- branch_if_enable(flag) do
340
- completed_lines << new_line(:goto, parameter: label, enable: nil)
341
- end
342
- context << flag
343
- process_all(node)
344
- context.pop
345
- completed_lines << new_line(:nop, label: label, enable: nil)
346
- else
347
- if flow_flag
348
- and_flag = "#{flow_flag}_AND_#{flag}"
349
- label = generate_unique_label
350
- branch_if_enable(flow_flag) do
351
- completed_lines << new_line(:goto, parameter: label, enable: nil)
352
- end
353
- completed_lines << new_line(:enable_flow_word, parameter: and_flag, enable: flag)
354
- completed_lines << new_line(:nop, label: label, enable: nil)
355
- self.flow_flag = and_flag
356
- context << and_flag
357
- process_all(node)
358
- context.pop
359
- self.flow_flag = orig
360
- else
361
- self.flow_flag = flag
362
- context << flag
363
- process_all(node)
364
- context.pop
365
- self.flow_flag = orig
366
- end
367
- end
368
- else
369
- # IG-XL does not have a !enable option, so generate a branch around the tests
370
- # to be skipped unless the required flag is enabled
371
- context << "!#{flag}"
372
- branch_if_enable(flag) do
373
- process_all(node)
374
- end
375
- context.pop
376
- end
377
- end
378
-
379
- def branch_if_enable(word)
380
- label = generate_unique_label
381
- completed_lines << new_line(:goto, parameter: label, enable: word)
382
- yield
383
- completed_lines << new_line(:nop, label: label, enable: nil)
384
- end
385
-
386
- def on_enable_flow_flag(node)
387
- completed_lines << new_line(:enable_flow_word, parameter: node.value)
388
- end
389
-
390
- def on_disable_flow_flag(node)
391
- completed_lines << new_line(:disable_flow_word, parameter: node.value)
392
- end
393
-
394
- def on_log(node)
395
- completed_lines << new_line(:logprint, parameter: node.to_a[0].gsub(' ', '_'))
396
- end
397
-
398
- def on_render(node)
399
- completed_lines << node.to_a[0]
400
- end
401
-
402
- def new_line(type, attrs = {})
403
- attrs = {
404
- job: stack[:jobs].last,
405
- enable: flow_flag
406
- }.merge(attrs)
407
- line = platform::FlowLine.new(type, attrs)
408
- if run_flag
409
- line.device_sense = 'not' unless run_flag[1]
410
- line.device_name = run_flag[0]
411
- line.device_condition = 'flag-true'
412
- end
413
- open_lines << line
414
- yield line if block_given?
415
- open_lines.pop
416
- line
417
- end
418
-
419
- # Any completed lines should be pushed to the array that this returns
420
- def completed_lines
421
- stack[:groups].last || lines
422
- end
423
-
424
- def open_lines
425
- @open_lines ||= []
426
- end
427
-
428
- def current_line
429
- open_lines.last
430
- end
431
-
432
- def clean_job(job)
433
- [job].flatten.map { |j| j.to_s.upcase }
434
- end
435
-
436
- def flag_to_s(flag, state)
437
- if state
438
- flag
439
- else
440
- "NOT_#{flag}"
441
- end
442
- end
443
- end
444
- end
445
- end
446
- 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 = 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
+ if flag.size > 1
327
+ or_flag = flag.join('_OR_')
328
+ flag.each do |f|
329
+ completed_lines << new_line(:enable_flow_word, parameter: or_flag, enable: f)
330
+ end
331
+ flag = or_flag
332
+ else
333
+ flag = flag.first
334
+ end
335
+ end
336
+ if value
337
+ # IG-XL docs say that enable words are not optimized for test time, so branch around
338
+ # large blocks to minimize enable word evaluation
339
+ if number_of_tests_in(node) > 5
340
+ label = generate_unique_label
341
+ branch_if_enable(flag) do
342
+ completed_lines << new_line(:goto, parameter: label, enable: nil)
343
+ end
344
+ context << flag
345
+ process_all(node)
346
+ context.pop
347
+ completed_lines << new_line(:nop, label: label, enable: nil)
348
+ else
349
+ if flow_flag
350
+ and_flag = "#{flow_flag}_AND_#{flag}"
351
+ label = generate_unique_label
352
+ branch_if_enable(flow_flag) do
353
+ completed_lines << new_line(:goto, parameter: label, enable: nil)
354
+ end
355
+ completed_lines << new_line(:enable_flow_word, parameter: and_flag, enable: flag)
356
+ completed_lines << new_line(:nop, label: label, enable: nil)
357
+ self.flow_flag = and_flag
358
+ context << and_flag
359
+ process_all(node)
360
+ context.pop
361
+ self.flow_flag = orig
362
+ else
363
+ self.flow_flag = flag
364
+ context << flag
365
+ process_all(node)
366
+ context.pop
367
+ self.flow_flag = orig
368
+ end
369
+ end
370
+ else
371
+ # IG-XL does not have a !enable option, so generate a branch around the tests
372
+ # to be skipped unless the required flag is enabled
373
+ context << "!#{flag}"
374
+ branch_if_enable(flag) do
375
+ process_all(node)
376
+ end
377
+ context.pop
378
+ end
379
+ end
380
+
381
+ def branch_if_enable(word)
382
+ label = generate_unique_label
383
+ completed_lines << new_line(:goto, parameter: label, enable: word)
384
+ yield
385
+ completed_lines << new_line(:nop, label: label, enable: nil)
386
+ end
387
+
388
+ def on_enable_flow_flag(node)
389
+ completed_lines << new_line(:enable_flow_word, parameter: node.value)
390
+ end
391
+
392
+ def on_disable_flow_flag(node)
393
+ completed_lines << new_line(:disable_flow_word, parameter: node.value)
394
+ end
395
+
396
+ def on_log(node)
397
+ completed_lines << new_line(:logprint, parameter: node.to_a[0].gsub(' ', '_'))
398
+ end
399
+
400
+ def on_render(node)
401
+ completed_lines << node.to_a[0]
402
+ end
403
+
404
+ def new_line(type, attrs = {})
405
+ attrs = {
406
+ job: stack[:jobs].last,
407
+ enable: flow_flag
408
+ }.merge(attrs)
409
+ line = platform::FlowLine.new(type, attrs)
410
+ if run_flag
411
+ line.device_sense = 'not' unless run_flag[1]
412
+ line.device_name = run_flag[0]
413
+ line.device_condition = 'flag-true'
414
+ end
415
+ open_lines << line
416
+ yield line if block_given?
417
+ open_lines.pop
418
+ line
419
+ end
420
+
421
+ # Any completed lines should be pushed to the array that this returns
422
+ def completed_lines
423
+ stack[:groups].last || lines
424
+ end
425
+
426
+ def open_lines
427
+ @open_lines ||= []
428
+ end
429
+
430
+ def current_line
431
+ open_lines.last
432
+ end
433
+
434
+ def clean_job(job)
435
+ [job].flatten.map { |j| j.to_s.upcase }
436
+ end
437
+
438
+ def flag_to_s(flag, state)
439
+ if state
440
+ flag
441
+ else
442
+ "NOT_#{flag}"
443
+ end
444
+ end
445
+ end
446
+ end
447
+ end
448
+ end