origen_testers 0.13.2 → 0.14.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (262) 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 -85
  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 +48 -47
  10. data/lib/origen_testers/api.rb +385 -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 +189 -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 -1100
  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 +401 -460
  29. data/lib/origen_testers/igxl_based_tester/base/flow_line.rb +279 -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 +357 -345
  147. data/lib/origen_testers/labview_based_tester.rb +7 -0
  148. data/lib/origen_testers/labview_based_tester/pxie6570.rb +190 -0
  149. data/lib/origen_testers/memory_style.rb +77 -77
  150. data/lib/origen_testers/no_interface.rb +7 -7
  151. data/lib/origen_testers/origen_ext/application/runner.rb +25 -25
  152. data/lib/origen_testers/origen_ext/generator.rb +54 -54
  153. data/lib/origen_testers/origen_ext/generator/flow.rb +91 -91
  154. data/lib/origen_testers/origen_ext/generator/resources.rb +21 -21
  155. data/lib/origen_testers/origen_ext/pins/pin.rb +78 -78
  156. data/lib/origen_testers/origen_ext/pins/pin_collection.rb +84 -84
  157. data/lib/origen_testers/parser.rb +22 -22
  158. data/lib/origen_testers/parser/description_lookup.rb +62 -62
  159. data/lib/origen_testers/parser/searchable_array.rb +30 -30
  160. data/lib/origen_testers/parser/searchable_hash.rb +30 -30
  161. data/lib/origen_testers/pattern_compilers.rb +116 -116
  162. data/lib/origen_testers/pattern_compilers/assembler.rb +88 -88
  163. data/lib/origen_testers/pattern_compilers/job.rb +96 -96
  164. data/lib/origen_testers/pattern_compilers/ultraflex_pattern_compiler.rb +599 -599
  165. data/lib/origen_testers/program_generators.rb +62 -62
  166. data/lib/origen_testers/smartest_based_tester.rb +8 -8
  167. data/lib/origen_testers/smartest_based_tester/base.rb +576 -576
  168. data/lib/origen_testers/smartest_based_tester/base/flow.rb +296 -296
  169. data/lib/origen_testers/smartest_based_tester/base/generator.rb +207 -207
  170. data/lib/origen_testers/smartest_based_tester/base/pattern_compiler.rb +32 -32
  171. data/lib/origen_testers/smartest_based_tester/base/pattern_master.rb +69 -69
  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/test_method.rb +178 -178
  174. data/lib/origen_testers/smartest_based_tester/base/test_methods.rb +77 -77
  175. data/lib/origen_testers/smartest_based_tester/base/test_methods/ac_tml.rb +33 -33
  176. data/lib/origen_testers/smartest_based_tester/base/test_methods/base_tml.rb +38 -38
  177. data/lib/origen_testers/smartest_based_tester/base/test_methods/custom_tml.rb +19 -19
  178. data/lib/origen_testers/smartest_based_tester/base/test_methods/dc_tml.rb +147 -147
  179. data/lib/origen_testers/smartest_based_tester/base/test_methods/limits.rb +65 -65
  180. data/lib/origen_testers/smartest_based_tester/base/test_suite.rb +208 -208
  181. data/lib/origen_testers/smartest_based_tester/base/test_suites.rb +58 -58
  182. data/lib/origen_testers/smartest_based_tester/base/variables_file.rb +38 -38
  183. data/lib/origen_testers/smartest_based_tester/v93k.rb +8 -8
  184. data/lib/origen_testers/smartest_based_tester/v93k/builder.rb +89 -89
  185. data/lib/origen_testers/smartest_based_tester/v93k/builder/flow.rb +181 -181
  186. data/lib/origen_testers/smartest_based_tester/v93k/builder/pattern_master.rb +54 -54
  187. data/lib/origen_testers/smartest_based_tester/v93k/flow.rb +10 -10
  188. data/lib/origen_testers/smartest_based_tester/v93k/generator.rb +19 -19
  189. data/lib/origen_testers/smartest_based_tester/v93k/pattern_compiler.rb +10 -10
  190. data/lib/origen_testers/smartest_based_tester/v93k/pattern_master.rb +10 -10
  191. data/lib/origen_testers/smartest_based_tester/v93k/templates/template.aiv.erb +17 -17
  192. data/lib/origen_testers/smartest_based_tester/v93k/templates/template.pmfl.erb +13 -13
  193. data/lib/origen_testers/smartest_based_tester/v93k/templates/template.tf.erb +236 -236
  194. data/lib/origen_testers/smartest_based_tester/v93k/templates/vars.tf.erb +48 -48
  195. data/lib/origen_testers/smartest_based_tester/v93k/test_method.rb +9 -9
  196. data/lib/origen_testers/smartest_based_tester/v93k/test_methods.rb +9 -9
  197. data/lib/origen_testers/smartest_based_tester/v93k/test_suite.rb +9 -9
  198. data/lib/origen_testers/smartest_based_tester/v93k/test_suites.rb +9 -9
  199. data/lib/origen_testers/smartest_based_tester/v93k/variables_file.rb +10 -10
  200. data/lib/origen_testers/test/basic_interface.rb +17 -17
  201. data/lib/origen_testers/test/block.rb +21 -21
  202. data/lib/origen_testers/test/custom_test_interface.rb +111 -111
  203. data/lib/origen_testers/test/dut.rb +295 -295
  204. data/lib/origen_testers/test/dut2.rb +76 -76
  205. data/lib/origen_testers/test/dut3.rb +244 -244
  206. data/lib/origen_testers/test/interface.rb +503 -503
  207. data/lib/origen_testers/test/nvm.rb +94 -94
  208. data/lib/origen_testers/timing.rb +368 -368
  209. data/lib/origen_testers/vector.rb +207 -207
  210. data/lib/origen_testers/vector_based_tester.rb +41 -41
  211. data/lib/origen_testers/vector_generator.rb +655 -655
  212. data/lib/origen_testers/vector_pipeline.rb +302 -302
  213. data/pattern/bitmap.rb +7 -7
  214. data/pattern/dc_instr.rb +7 -7
  215. data/pattern/delay.rb +7 -7
  216. data/pattern/freq_counter.rb +6 -6
  217. data/pattern/mem_test.rb +8 -8
  218. data/pattern/multi_vector.rb +122 -122
  219. data/pattern/multi_vector_plus1.rb +125 -125
  220. data/pattern/nvm/j750/add_late_pins.rb +3 -3
  221. data/pattern/nvm/j750/iterator_postfix_test_x_bx.rb +8 -8
  222. data/pattern/nvm/j750/iterator_test_x_bx.rb +8 -8
  223. data/pattern/nvm/j750/j750_halt.rb +159 -159
  224. data/pattern/nvm/j750/j750_workout.rb +209 -209
  225. data/pattern/nvm/j750/timing.rb +73 -73
  226. data/pattern/read_write_reg.rb +61 -61
  227. data/pattern/reset.rb +4 -4
  228. data/pattern/single_overlay_store.rb +21 -0
  229. data/pattern/subroutines.rb +69 -69
  230. data/pattern/tester_overlay.rb +61 -61
  231. data/pattern/tester_store.rb +28 -28
  232. data/program/_additional_erase.rb +7 -7
  233. data/program/_efa_resources.rb +7 -7
  234. data/program/_erase.rb +25 -25
  235. data/program/_erase_vfy.rb +5 -5
  236. data/program/_iv_resources.rb +10 -10
  237. data/program/basic_interface.rb +5 -5
  238. data/program/components/_prb1_main.rb +222 -222
  239. data/program/components/_small.rb +15 -0
  240. data/program/components/_temp.rb +6 -6
  241. data/program/custom_tests.rb +10 -10
  242. data/program/flow_control.rb +465 -422
  243. data/program/prb1.rb +11 -11
  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 +9 -12
  256. data/lib/origen_testers/smartest_based_tester/base/processors.rb +0 -16
  257. data/lib/origen_testers/smartest_based_tester/base/processors/adjacent_if_combiner.rb +0 -106
  258. data/lib/origen_testers/smartest_based_tester/base/processors/continue_implementer.rb +0 -39
  259. data/lib/origen_testers/smartest_based_tester/base/processors/empty_branch_cleaner.rb +0 -21
  260. data/lib/origen_testers/smartest_based_tester/base/processors/extract_run_flag_table.rb +0 -33
  261. data/lib/origen_testers/smartest_based_tester/base/processors/flag_optimizer.rb +0 -188
  262. data/lib/origen_testers/smartest_based_tester/base/processors/if_ran_cleaner.rb +0 -34
@@ -1,460 +1,401 @@
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 :context
12
+ # Keeps a note of the context under which flags where set
13
+ attr_reader :set_flags
14
+ attr_accessor :current_flag
15
+ attr_accessor :current_enable
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: [] }
66
+ @context = []
67
+ @set_flags = {}
68
+ ast = atp.ast(unique_id: sig, optimization: :igxl)
69
+ process(ast)
70
+ lines
71
+ end
72
+
73
+ def on_flow(node)
74
+ name, *nodes = *node
75
+ process_all(nodes)
76
+ end
77
+
78
+ def on_test(node)
79
+ line = new_line(:test) { |l| process_all(node) }
80
+
81
+ # In IG-XL you can't set the same flag in case of pass or fail, that situation should
82
+ # never occur unless the user has manually set up that condition
83
+ if line.flag_fail && line.flag_fail == line.flag_pass
84
+ fail "You can't set the same flag on test pass and fail in IG-XL!"
85
+ else
86
+ completed_lines << line
87
+ end
88
+ end
89
+
90
+ def on_cz(node)
91
+ setup, test = *node
92
+ completed_lines << new_line(:cz, cz_setup: setup) do |line|
93
+ process_all(test)
94
+ end
95
+ end
96
+
97
+ def on_name(node)
98
+ current_line.tname = node.to_a[0] if current_line
99
+ end
100
+
101
+ def on_number(node)
102
+ if Origen.tester.diff_friendly_output?
103
+ current_line.tnum = 0
104
+ else
105
+ current_line.tnum = node.to_a[0]
106
+ end
107
+ end
108
+
109
+ def on_object(node)
110
+ instance = node.to_a[0]
111
+ if instance.is_a?(String)
112
+ current_line.instance_variable_set('@ignore_missing_instance', true)
113
+ end
114
+ current_line.parameter = instance
115
+ end
116
+
117
+ def on_continue(node)
118
+ current_line.result = 'None' if current_line
119
+ end
120
+
121
+ def on_set_flag(node)
122
+ flag = clean_flag(node.to_a[0])
123
+ set_previously = !!set_flags[flag]
124
+ set_flags[flag] = context.dup
125
+ if current_line
126
+ if branch == :on_fail
127
+ current_line.flag_fail = flag
128
+ else
129
+ current_line.flag_pass = flag
130
+ end
131
+ else
132
+ unless set_previously
133
+ completed_lines << platform::FlowLine.new(:defaults, flag_fail: flag)
134
+ end
135
+ completed_lines << new_line(:flag_true, parameter: flag)
136
+ end
137
+ end
138
+
139
+ def on_set_result(node)
140
+ bin = node.find(:bin).try(:value)
141
+ desc = node.find(:bin).to_a[1]
142
+ sbin = node.find(:softbin).try(:value)
143
+ if current_line
144
+ if branch == :on_fail
145
+ current_line.bin_fail = bin
146
+ current_line.sort_fail = sbin
147
+ current_line.comment = desc
148
+ current_line.result = 'Fail'
149
+ else
150
+ current_line.bin_pass = bin
151
+ current_line.sort_pass = sbin
152
+ current_line.comment = desc
153
+ current_line.result = 'Pass'
154
+ end
155
+ else
156
+ line = new_line(:set_device)
157
+ if node.to_a[0] == 'pass'
158
+ line.bin_pass = bin
159
+ line.sort_pass = sbin
160
+ line.result = 'Pass'
161
+ else
162
+ line.bin_fail = bin
163
+ line.sort_fail = sbin
164
+ line.result = 'Fail'
165
+ end
166
+ line.comment = desc
167
+ completed_lines << line
168
+ end
169
+ end
170
+
171
+ def on_on_fail(node)
172
+ @branch = :on_fail
173
+ process_all(node)
174
+ @branch = nil
175
+ end
176
+
177
+ def on_on_pass(node)
178
+ @branch = :on_pass
179
+ process_all(node)
180
+ @branch = nil
181
+ end
182
+
183
+ def on_if_job(node)
184
+ jobs, *nodes = *node
185
+ jobs = clean_job(jobs)
186
+ state = node.type == :if_job
187
+ unless state
188
+ jobs = jobs.map { |j| "!#{j}" }
189
+ end
190
+ stack[:jobs] << [stack[:jobs].last, jobs].compact.join(',')
191
+ context << stack[:jobs].last
192
+ process_all(node)
193
+ stack[:jobs].pop
194
+ context.pop
195
+ end
196
+ alias_method :on_unless_job, :on_if_job
197
+
198
+ def on_if_flag(node)
199
+ flag, *nodes = *node
200
+ orig = current_flag
201
+ state = node.type == :if_flag
202
+ if flag.is_a?(Array)
203
+ or_flag = flag.join('_OR_')
204
+ or_flag = "NOT_#{flag}" unless state
205
+ flag.each do |f|
206
+ if current_flag
207
+ fail 'Not implemented yet!'
208
+ else
209
+ self.current_flag = [f, state]
210
+ completed_lines << new_line(:flag_true, parameter: or_flag)
211
+ self.current_flag = nil
212
+ end
213
+ end
214
+ flag = or_flag
215
+ end
216
+ flag = clean_flag(flag)
217
+
218
+ # If a flag condition is currently active
219
+ if current_flag
220
+ # If the current flag condition also gated the setting of this node's flag, then we
221
+ # don't need to create an AND flag
222
+ if !set_flags[flag] || (set_flags[flag] && set_flags[flag].hash != context.hash)
223
+ and_flag = clean_flag(flag_to_s(*current_flag) + '_AND_' + flag_to_s(flag, state))
224
+ # If the AND flag has already been created and set in this context (for a previous test),
225
+ # no need to re-create it
226
+ if !set_flags[and_flag] || (set_flags[and_flag].hash != context.hash)
227
+ set_flags[and_flag] = context
228
+ existing_flag = current_flag
229
+ self.current_flag = nil
230
+ completed_lines << new_line(:flag_true, parameter: and_flag)
231
+ self.current_flag = [flag, !state]
232
+ completed_lines << new_line(:flag_false, parameter: and_flag)
233
+ self.current_flag = [existing_flag[0], !existing_flag[1]]
234
+ completed_lines << new_line(:flag_false, parameter: and_flag)
235
+ end
236
+ flag = and_flag
237
+ end
238
+ end
239
+
240
+ # Update the currently active flag condition, this will be added as a condition to all
241
+ # lines created from children of this node
242
+ self.current_flag = [flag, state]
243
+ context << current_flag
244
+ process_all(node)
245
+ context.pop
246
+ self.current_flag = orig
247
+ end
248
+ alias_method :on_unless_flag, :on_if_flag
249
+
250
+ def on_if_enabled(node)
251
+ flag, *nodes = *node
252
+ orig = current_enable
253
+ value = node.type == :if_enabled
254
+ if flag.is_a?(Array)
255
+ flag.map! { |a_flag| clean_enable(a_flag) }
256
+ if flag.size > 1
257
+ or_flag = flag.join('_OR_')
258
+ flag.each do |f|
259
+ completed_lines << new_line(:enable_flow_word, parameter: or_flag, enable: f)
260
+ end
261
+ flag = or_flag
262
+ else
263
+ flag = flag.first
264
+ end
265
+ else
266
+ flag = clean_enable(flag)
267
+ end
268
+ if value
269
+ # IG-XL docs say that enable words are not optimized for test time, so branch around
270
+ # large blocks to minimize enable word evaluation
271
+ if number_of_tests_in(node) > 5
272
+ label = generate_unique_label
273
+ branch_if_enable(flag) do
274
+ completed_lines << new_line(:goto, parameter: label, enable: nil)
275
+ end
276
+ context << flag
277
+ process_all(node)
278
+ context.pop
279
+ completed_lines << new_line(:nop, label: label, enable: nil)
280
+ else
281
+ if current_enable
282
+ and_flag = "#{current_enable}_AND_#{flag}"
283
+ label = generate_unique_label
284
+ branch_if_enable(current_enable) do
285
+ completed_lines << new_line(:goto, parameter: label, enable: nil)
286
+ end
287
+ completed_lines << new_line(:enable_flow_word, parameter: and_flag, enable: flag)
288
+ completed_lines << new_line(:nop, label: label, enable: nil)
289
+ self.current_enable = and_flag
290
+ context << and_flag
291
+ process_all(node)
292
+ context.pop
293
+ self.current_enable = orig
294
+ else
295
+ self.current_enable = flag
296
+ context << flag
297
+ process_all(node)
298
+ context.pop
299
+ self.current_enable = orig
300
+ end
301
+ end
302
+ else
303
+ # IG-XL does not have a !enable option, so generate a branch around the tests
304
+ # to be skipped unless the required flag is enabled
305
+ context << "!#{flag}"
306
+ branch_if_enable(flag) do
307
+ process_all(node)
308
+ end
309
+ context.pop
310
+ end
311
+ end
312
+ alias_method :on_unless_enabled, :on_if_enabled
313
+
314
+ def branch_if_enable(word)
315
+ label = generate_unique_label
316
+ completed_lines << new_line(:goto, parameter: label, enable: word)
317
+ yield
318
+ completed_lines << new_line(:nop, label: label, enable: nil)
319
+ end
320
+
321
+ def on_enable(node)
322
+ completed_lines << new_line(:enable_flow_word, parameter: node.value)
323
+ end
324
+
325
+ def on_disable(node)
326
+ completed_lines << new_line(:disable_flow_word, parameter: node.value)
327
+ end
328
+
329
+ def on_log(node)
330
+ completed_lines << new_line(:logprint, parameter: node.to_a[0].gsub(' ', '_'))
331
+ end
332
+
333
+ def on_render(node)
334
+ completed_lines << node.to_a[0]
335
+ end
336
+
337
+ def new_line(type, attrs = {})
338
+ attrs = {
339
+ job: stack[:jobs].last,
340
+ enable: current_enable
341
+ }.merge(attrs)
342
+ line = platform::FlowLine.new(type, attrs)
343
+ if current_flag
344
+ line.device_sense = 'not' unless current_flag[1]
345
+ line.device_name = clean_flag(current_flag[0])
346
+ line.device_condition = 'flag-true'
347
+ end
348
+ open_lines << line
349
+ yield line if block_given?
350
+ open_lines.pop
351
+ line
352
+ end
353
+
354
+ # Any completed lines should be pushed to the array that this returns
355
+ def completed_lines
356
+ lines
357
+ end
358
+
359
+ def open_lines
360
+ @open_lines ||= []
361
+ end
362
+
363
+ def current_line
364
+ open_lines.last
365
+ end
366
+
367
+ def clean_job(job)
368
+ [job].flatten.map { |j| j.to_s.upcase }
369
+ end
370
+
371
+ def flag_to_s(flag, state)
372
+ if state
373
+ flag
374
+ else
375
+ "NOT_#{flag}"
376
+ end
377
+ end
378
+
379
+ private
380
+
381
+ def clean_enable(flag)
382
+ flag = flag.to_s
383
+ if flag[0] == '$'
384
+ flag[0] = ''
385
+ flag
386
+ else
387
+ flag.downcase
388
+ end
389
+ end
390
+
391
+ def clean_flag(flag)
392
+ flag = flag.to_s
393
+ if flag[0] == '$'
394
+ flag[0] = ''
395
+ end
396
+ flag
397
+ end
398
+ end
399
+ end
400
+ end
401
+ end