origen_testers 0.9.9 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (254) hide show
  1. checksums.yaml +4 -4
  2. data/config/application.rb +151 -151
  3. data/config/boot.rb +13 -12
  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 -46
  10. data/lib/origen_testers/api.rb +381 -292
  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 -929
  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 +446 -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 -691
  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 +328 -328
  147. data/lib/origen_testers/memory_style.rb +77 -0
  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 -492
  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 -0
  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 +53 -0
  232. data/pattern/tester_store.rb +29 -0
  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/_temp.rb +6 -6
  240. data/program/custom_tests.rb +10 -10
  241. data/program/flow_control.rb +321 -321
  242. data/program/prb1.rb +219 -219
  243. data/program/prb1_resources.rb +28 -28
  244. data/program/prb2.rb +27 -27
  245. data/program/test.rb +29 -29
  246. data/program/uflex_resources.rb +199 -199
  247. data/templates/example.txt.erb +53 -53
  248. data/templates/j750/program_sheet.txt.erb +9 -9
  249. data/templates/manifest/v93k.yaml.erb +22 -22
  250. data/templates/web/index.md.erb +51 -51
  251. data/templates/web/layouts/_basic.html.erb +15 -15
  252. data/templates/web/partials/_navbar.html.erb +22 -22
  253. data/templates/web/release_notes.md.erb +5 -5
  254. metadata +7 -3
@@ -1,446 +1,446 @@
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
+ 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