origen_testers 0.13.1 → 0.13.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/config/application.rb +151 -151
- data/config/boot.rb +13 -13
- data/config/commands.rb +85 -86
- data/config/users.rb +18 -18
- data/config/version.rb +8 -8
- data/lib/commands/build.rb +69 -69
- data/lib/commands/run.rb +48 -48
- data/lib/origen_testers.rb +47 -47
- data/lib/origen_testers/api.rb +381 -381
- data/lib/origen_testers/basic_test_setups.rb +105 -105
- data/lib/origen_testers/callback_handlers.rb +59 -59
- data/lib/origen_testers/command_based_tester.rb +45 -45
- data/lib/origen_testers/flow.rb +382 -382
- data/lib/origen_testers/generator.rb +283 -283
- data/lib/origen_testers/generator/identity_map.rb +23 -23
- data/lib/origen_testers/generator/placeholder.rb +11 -11
- data/lib/origen_testers/generator/test_numberer.rb +23 -23
- data/lib/origen_testers/igxl_based_tester.rb +12 -12
- data/lib/origen_testers/igxl_based_tester/base.rb +1100 -1099
- data/lib/origen_testers/igxl_based_tester/base/ac_specsets.rb +79 -79
- data/lib/origen_testers/igxl_based_tester/base/custom_test_instance.rb +169 -169
- data/lib/origen_testers/igxl_based_tester/base/dc_specsets.rb +98 -98
- data/lib/origen_testers/igxl_based_tester/base/edge.rb +60 -60
- data/lib/origen_testers/igxl_based_tester/base/edges.rb +24 -24
- data/lib/origen_testers/igxl_based_tester/base/edgeset.rb +39 -39
- data/lib/origen_testers/igxl_based_tester/base/edgesets.rb +130 -130
- data/lib/origen_testers/igxl_based_tester/base/flow.rb +460 -460
- data/lib/origen_testers/igxl_based_tester/base/flow_line.rb +276 -276
- data/lib/origen_testers/igxl_based_tester/base/generator.rb +607 -607
- data/lib/origen_testers/igxl_based_tester/base/global_specs.rb +83 -83
- data/lib/origen_testers/igxl_based_tester/base/job.rb +75 -75
- data/lib/origen_testers/igxl_based_tester/base/jobs.rb +44 -44
- data/lib/origen_testers/igxl_based_tester/base/level_io_se.rb +59 -59
- data/lib/origen_testers/igxl_based_tester/base/level_supply.rb +39 -39
- data/lib/origen_testers/igxl_based_tester/base/levels.rb +31 -31
- data/lib/origen_testers/igxl_based_tester/base/levelset.rb +110 -110
- data/lib/origen_testers/igxl_based_tester/base/patgroup.rb +109 -109
- data/lib/origen_testers/igxl_based_tester/base/patgroups.rb +38 -38
- data/lib/origen_testers/igxl_based_tester/base/patset.rb +68 -68
- data/lib/origen_testers/igxl_based_tester/base/patset_pattern.rb +56 -56
- data/lib/origen_testers/igxl_based_tester/base/patsets.rb +38 -38
- data/lib/origen_testers/igxl_based_tester/base/patsubr.rb +68 -68
- data/lib/origen_testers/igxl_based_tester/base/patsubr_pattern.rb +56 -56
- data/lib/origen_testers/igxl_based_tester/base/patsubrs.rb +38 -38
- data/lib/origen_testers/igxl_based_tester/base/pinmap.rb +93 -93
- data/lib/origen_testers/igxl_based_tester/base/references.rb +25 -25
- data/lib/origen_testers/igxl_based_tester/base/test_instance.rb +322 -322
- data/lib/origen_testers/igxl_based_tester/base/test_instance_group.rb +66 -66
- data/lib/origen_testers/igxl_based_tester/base/test_instances.rb +212 -212
- data/lib/origen_testers/igxl_based_tester/base/test_instances/custom_til.rb +37 -37
- data/lib/origen_testers/igxl_based_tester/base/timeset.rb +37 -37
- data/lib/origen_testers/igxl_based_tester/base/timesets.rb +49 -49
- data/lib/origen_testers/igxl_based_tester/base/timesets_basic.rb +49 -49
- data/lib/origen_testers/igxl_based_tester/files.rb +43 -43
- data/lib/origen_testers/igxl_based_tester/j750.rb +269 -269
- data/lib/origen_testers/igxl_based_tester/j750/custom_test_instance.rb +32 -32
- data/lib/origen_testers/igxl_based_tester/j750/flow.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/j750/flow_line.rb +19 -19
- data/lib/origen_testers/igxl_based_tester/j750/generator.rb +19 -19
- data/lib/origen_testers/igxl_based_tester/j750/patgroup.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/j750/patgroups.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/j750/patset.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/j750/patset_pattern.rb +18 -18
- data/lib/origen_testers/igxl_based_tester/j750/patsets.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/j750/patsubr.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/j750/patsubr_pattern.rb +18 -18
- data/lib/origen_testers/igxl_based_tester/j750/patsubrs.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/j750/test_instance.rb +746 -746
- data/lib/origen_testers/igxl_based_tester/j750/test_instance_group.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/j750/test_instances.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/j750_hpt.rb +34 -34
- data/lib/origen_testers/igxl_based_tester/j750_hpt/custom_test_instance.rb +32 -32
- data/lib/origen_testers/igxl_based_tester/j750_hpt/flow.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/j750_hpt/flow_line.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/j750_hpt/generator.rb +19 -19
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patgroup.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patgroups.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patset.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patset_pattern.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patsets.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patsubr.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patsubr_pattern.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/j750_hpt/patsubrs.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/j750_hpt/test_instance.rb +599 -599
- data/lib/origen_testers/igxl_based_tester/j750_hpt/test_instance_group.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/j750_hpt/test_instances.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/parser.rb +102 -102
- data/lib/origen_testers/igxl_based_tester/parser/ac_spec.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/parser/dc_spec.rb +33 -33
- data/lib/origen_testers/igxl_based_tester/parser/dc_specs.rb +48 -48
- data/lib/origen_testers/igxl_based_tester/parser/descriptions.rb +339 -339
- data/lib/origen_testers/igxl_based_tester/parser/flow.rb +109 -109
- data/lib/origen_testers/igxl_based_tester/parser/flow_line.rb +203 -203
- data/lib/origen_testers/igxl_based_tester/parser/flows.rb +21 -21
- data/lib/origen_testers/igxl_based_tester/parser/pattern_set.rb +92 -92
- data/lib/origen_testers/igxl_based_tester/parser/pattern_sets.rb +31 -31
- data/lib/origen_testers/igxl_based_tester/parser/test_instance.rb +420 -420
- data/lib/origen_testers/igxl_based_tester/parser/test_instances.rb +24 -24
- data/lib/origen_testers/igxl_based_tester/parser/timeset.rb +13 -13
- data/lib/origen_testers/igxl_based_tester/ultraflex.rb +798 -798
- data/lib/origen_testers/igxl_based_tester/ultraflex/ac_specsets.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/ultraflex/ate_hardware.rb +949 -949
- data/lib/origen_testers/igxl_based_tester/ultraflex/custom_test_instance.rb +36 -36
- data/lib/origen_testers/igxl_based_tester/ultraflex/dc_specsets.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/ultraflex/edge.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/ultraflex/edges.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/ultraflex/edgeset.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/ultraflex/edgesets.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/ultraflex/flow.rb +158 -158
- data/lib/origen_testers/igxl_based_tester/ultraflex/flow_line.rb +19 -19
- data/lib/origen_testers/igxl_based_tester/ultraflex/generator.rb +19 -19
- data/lib/origen_testers/igxl_based_tester/ultraflex/global_specs.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/ultraflex/job.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/ultraflex/jobs.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/ultraflex/level_io_se.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/ultraflex/level_supply.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/ultraflex/levels.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/ultraflex/levelset.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/ultraflex/patgroup.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/ultraflex/patgroups.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/ultraflex/patset.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/ultraflex/patset_pattern.rb +18 -18
- data/lib/origen_testers/igxl_based_tester/ultraflex/patsets.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/ultraflex/patsubr.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/ultraflex/patsubr_pattern.rb +18 -18
- data/lib/origen_testers/igxl_based_tester/ultraflex/patsubrs.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/ultraflex/pinmap.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/ultraflex/references.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/ac_specsets.txt.erb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/dc_specsets.txt.erb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/edgesets.txt.erb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/global_specs.txt.erb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/jobs.txt.erb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/levelset.txt.erb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/pinmap.txt.erb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/references.txt.erb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/timesets.txt.erb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/templates/timesets_basic.txt.erb +0 -0
- data/lib/origen_testers/igxl_based_tester/ultraflex/test_instance.rb +315 -315
- data/lib/origen_testers/igxl_based_tester/ultraflex/test_instance_group.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/ultraflex/test_instances.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/ultraflex/timeset.rb +9 -9
- data/lib/origen_testers/igxl_based_tester/ultraflex/timesets.rb +10 -10
- data/lib/origen_testers/igxl_based_tester/ultraflex/timesets_basic.rb +10 -10
- data/lib/origen_testers/interface.rb +345 -324
- data/lib/origen_testers/memory_style.rb +77 -77
- data/lib/origen_testers/no_interface.rb +7 -7
- data/lib/origen_testers/origen_ext/application/runner.rb +25 -25
- data/lib/origen_testers/origen_ext/generator.rb +54 -54
- data/lib/origen_testers/origen_ext/generator/flow.rb +91 -77
- data/lib/origen_testers/origen_ext/generator/resources.rb +21 -21
- data/lib/origen_testers/origen_ext/pins/pin.rb +78 -78
- data/lib/origen_testers/origen_ext/pins/pin_collection.rb +84 -84
- data/lib/origen_testers/parser.rb +22 -22
- data/lib/origen_testers/parser/description_lookup.rb +62 -62
- data/lib/origen_testers/parser/searchable_array.rb +30 -30
- data/lib/origen_testers/parser/searchable_hash.rb +30 -30
- data/lib/origen_testers/pattern_compilers.rb +116 -116
- data/lib/origen_testers/pattern_compilers/assembler.rb +88 -88
- data/lib/origen_testers/pattern_compilers/job.rb +96 -96
- data/lib/origen_testers/pattern_compilers/ultraflex_pattern_compiler.rb +599 -599
- data/lib/origen_testers/program_generators.rb +62 -62
- data/lib/origen_testers/smartest_based_tester.rb +8 -8
- data/lib/origen_testers/smartest_based_tester/base.rb +576 -567
- data/lib/origen_testers/smartest_based_tester/base/flow.rb +296 -291
- data/lib/origen_testers/smartest_based_tester/base/generator.rb +207 -194
- data/lib/origen_testers/smartest_based_tester/base/pattern_compiler.rb +32 -32
- data/lib/origen_testers/smartest_based_tester/base/pattern_master.rb +69 -69
- data/lib/origen_testers/smartest_based_tester/base/processors.rb +16 -16
- data/lib/origen_testers/smartest_based_tester/base/processors/adjacent_if_combiner.rb +106 -106
- data/lib/origen_testers/smartest_based_tester/base/processors/continue_implementer.rb +39 -39
- data/lib/origen_testers/smartest_based_tester/base/processors/empty_branch_cleaner.rb +21 -21
- data/lib/origen_testers/smartest_based_tester/base/processors/extract_run_flag_table.rb +33 -33
- data/lib/origen_testers/smartest_based_tester/base/processors/extract_set_variables.rb +22 -22
- data/lib/origen_testers/smartest_based_tester/base/processors/flag_optimizer.rb +188 -188
- data/lib/origen_testers/smartest_based_tester/base/processors/if_ran_cleaner.rb +34 -34
- data/lib/origen_testers/smartest_based_tester/base/test_method.rb +178 -164
- data/lib/origen_testers/smartest_based_tester/base/test_methods.rb +77 -73
- data/lib/origen_testers/smartest_based_tester/base/test_methods/ac_tml.rb +33 -33
- data/lib/origen_testers/smartest_based_tester/base/test_methods/base_tml.rb +38 -38
- data/lib/origen_testers/smartest_based_tester/base/test_methods/custom_tml.rb +19 -19
- data/lib/origen_testers/smartest_based_tester/base/test_methods/dc_tml.rb +147 -147
- data/lib/origen_testers/smartest_based_tester/base/test_methods/limits.rb +65 -65
- data/lib/origen_testers/smartest_based_tester/base/test_suite.rb +208 -193
- data/lib/origen_testers/smartest_based_tester/base/test_suites.rb +58 -54
- data/lib/origen_testers/smartest_based_tester/base/variables_file.rb +38 -38
- data/lib/origen_testers/smartest_based_tester/v93k.rb +8 -8
- data/lib/origen_testers/smartest_based_tester/v93k/builder.rb +89 -89
- data/lib/origen_testers/smartest_based_tester/v93k/builder/flow.rb +181 -181
- data/lib/origen_testers/smartest_based_tester/v93k/builder/pattern_master.rb +54 -54
- data/lib/origen_testers/smartest_based_tester/v93k/flow.rb +10 -10
- data/lib/origen_testers/smartest_based_tester/v93k/generator.rb +19 -19
- data/lib/origen_testers/smartest_based_tester/v93k/pattern_compiler.rb +10 -10
- data/lib/origen_testers/smartest_based_tester/v93k/pattern_master.rb +10 -10
- data/lib/origen_testers/smartest_based_tester/v93k/templates/template.aiv.erb +17 -17
- data/lib/origen_testers/smartest_based_tester/v93k/templates/template.pmfl.erb +13 -13
- data/lib/origen_testers/smartest_based_tester/v93k/templates/template.tf.erb +236 -214
- data/lib/origen_testers/smartest_based_tester/v93k/templates/vars.tf.erb +48 -48
- data/lib/origen_testers/smartest_based_tester/v93k/test_method.rb +9 -9
- data/lib/origen_testers/smartest_based_tester/v93k/test_methods.rb +9 -9
- data/lib/origen_testers/smartest_based_tester/v93k/test_suite.rb +9 -9
- data/lib/origen_testers/smartest_based_tester/v93k/test_suites.rb +9 -9
- data/lib/origen_testers/smartest_based_tester/v93k/variables_file.rb +10 -10
- data/lib/origen_testers/test/basic_interface.rb +17 -17
- data/lib/origen_testers/test/block.rb +21 -21
- data/lib/origen_testers/test/custom_test_interface.rb +111 -111
- data/lib/origen_testers/test/dut.rb +295 -295
- data/lib/origen_testers/test/dut2.rb +76 -76
- data/lib/origen_testers/test/dut3.rb +244 -244
- data/lib/origen_testers/test/interface.rb +503 -503
- data/lib/origen_testers/test/nvm.rb +94 -94
- data/lib/origen_testers/timing.rb +368 -368
- data/lib/origen_testers/vector.rb +207 -207
- data/lib/origen_testers/vector_based_tester.rb +41 -41
- data/lib/origen_testers/vector_generator.rb +655 -655
- data/lib/origen_testers/vector_pipeline.rb +302 -302
- data/pattern/bitmap.rb +7 -7
- data/pattern/dc_instr.rb +7 -7
- data/pattern/delay.rb +7 -7
- data/pattern/freq_counter.rb +6 -6
- data/pattern/mem_test.rb +8 -8
- data/pattern/multi_vector.rb +122 -122
- data/pattern/multi_vector_plus1.rb +125 -125
- data/pattern/nvm/j750/add_late_pins.rb +3 -3
- data/pattern/nvm/j750/iterator_postfix_test_x_bx.rb +8 -8
- data/pattern/nvm/j750/iterator_test_x_bx.rb +8 -8
- data/pattern/nvm/j750/j750_halt.rb +159 -159
- data/pattern/nvm/j750/j750_workout.rb +209 -209
- data/pattern/nvm/j750/timing.rb +73 -73
- data/pattern/read_write_reg.rb +61 -61
- data/pattern/reset.rb +4 -4
- data/pattern/subroutines.rb +69 -69
- data/pattern/tester_overlay.rb +61 -52
- data/pattern/tester_store.rb +28 -28
- data/program/_additional_erase.rb +7 -7
- data/program/_efa_resources.rb +7 -7
- data/program/_erase.rb +25 -25
- data/program/_erase_vfy.rb +5 -5
- data/program/_iv_resources.rb +10 -10
- data/program/basic_interface.rb +5 -5
- data/program/components/_prb1_main.rb +222 -222
- data/program/components/_temp.rb +6 -6
- data/program/custom_tests.rb +10 -10
- data/program/flow_control.rb +422 -422
- data/program/prb1.rb +11 -11
- data/program/prb1_resources.rb +28 -28
- data/program/prb2.rb +27 -27
- data/program/test.rb +29 -29
- data/program/uflex_resources.rb +199 -199
- data/templates/example.txt.erb +53 -53
- data/templates/j750/program_sheet.txt.erb +9 -9
- data/templates/manifest/v93k.yaml.erb +22 -22
- data/templates/web/index.md.erb +51 -51
- data/templates/web/layouts/_basic.html.erb +15 -15
- data/templates/web/partials/_navbar.html.erb +22 -22
- data/templates/web/release_notes.md.erb +5 -5
- metadata +2 -2
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
module OrigenTesters
|
|
2
|
-
module SmartestBasedTester
|
|
3
|
-
class Base
|
|
4
|
-
module Processors
|
|
5
|
-
# Removes any empty on_pass and on_fail branches
|
|
6
|
-
class EmptyBranchCleaner < ATP::Processor
|
|
7
|
-
# Delete any on-fail child if it's 'empty'
|
|
8
|
-
def on_test(node)
|
|
9
|
-
if on_pass = node.find(:on_pass)
|
|
10
|
-
node = node.remove(on_pass) if on_pass.children.empty?
|
|
11
|
-
end
|
|
12
|
-
if on_fail = node.find(:on_fail)
|
|
13
|
-
node = node.remove(on_fail) if on_fail.children.empty?
|
|
14
|
-
end
|
|
15
|
-
node = node.updated(nil, process_all(node.children))
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
end
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module SmartestBasedTester
|
|
3
|
+
class Base
|
|
4
|
+
module Processors
|
|
5
|
+
# Removes any empty on_pass and on_fail branches
|
|
6
|
+
class EmptyBranchCleaner < ATP::Processor
|
|
7
|
+
# Delete any on-fail child if it's 'empty'
|
|
8
|
+
def on_test(node)
|
|
9
|
+
if on_pass = node.find(:on_pass)
|
|
10
|
+
node = node.remove(on_pass) if on_pass.children.empty?
|
|
11
|
+
end
|
|
12
|
+
if on_fail = node.find(:on_fail)
|
|
13
|
+
node = node.remove(on_fail) if on_fail.children.empty?
|
|
14
|
+
end
|
|
15
|
+
node = node.updated(nil, process_all(node.children))
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
module OrigenTesters
|
|
2
|
-
module SmartestBasedTester
|
|
3
|
-
class Base
|
|
4
|
-
module Processors
|
|
5
|
-
# Processes the AST and tabulates occurrences of unique set_run_flag nodes
|
|
6
|
-
class ExtractRunFlagTable < ATP::Processor
|
|
7
|
-
# Hash table of run_flag name with number of times used
|
|
8
|
-
attr_reader :run_flag_table
|
|
9
|
-
|
|
10
|
-
# Reset hash table
|
|
11
|
-
def initialize
|
|
12
|
-
@run_flag_table = {}.with_indifferent_access
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
# For run_flag nodes, increment # of occurrences for specified flag
|
|
16
|
-
def on_run_flag(node)
|
|
17
|
-
children = node.children.dup
|
|
18
|
-
names = children.shift
|
|
19
|
-
state = children.shift
|
|
20
|
-
Array(names).each do |name|
|
|
21
|
-
if @run_flag_table[name.to_sym].nil?
|
|
22
|
-
@run_flag_table[name.to_sym] = 1
|
|
23
|
-
else
|
|
24
|
-
@run_flag_table[name.to_sym] += 1
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
process_all(node.children)
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
end
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module SmartestBasedTester
|
|
3
|
+
class Base
|
|
4
|
+
module Processors
|
|
5
|
+
# Processes the AST and tabulates occurrences of unique set_run_flag nodes
|
|
6
|
+
class ExtractRunFlagTable < ATP::Processor
|
|
7
|
+
# Hash table of run_flag name with number of times used
|
|
8
|
+
attr_reader :run_flag_table
|
|
9
|
+
|
|
10
|
+
# Reset hash table
|
|
11
|
+
def initialize
|
|
12
|
+
@run_flag_table = {}.with_indifferent_access
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# For run_flag nodes, increment # of occurrences for specified flag
|
|
16
|
+
def on_run_flag(node)
|
|
17
|
+
children = node.children.dup
|
|
18
|
+
names = children.shift
|
|
19
|
+
state = children.shift
|
|
20
|
+
Array(names).each do |name|
|
|
21
|
+
if @run_flag_table[name.to_sym].nil?
|
|
22
|
+
@run_flag_table[name.to_sym] = 1
|
|
23
|
+
else
|
|
24
|
+
@run_flag_table[name.to_sym] += 1
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
process_all(node.children)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
module OrigenTesters
|
|
2
|
-
module SmartestBasedTester
|
|
3
|
-
class Base
|
|
4
|
-
module Processors
|
|
5
|
-
# Extracts all runtime variables which are set within the given flow, returning
|
|
6
|
-
# them in an array
|
|
7
|
-
class ExtractSetVariables < ATP::Processor
|
|
8
|
-
def run(nodes)
|
|
9
|
-
@results = []
|
|
10
|
-
process_all(nodes)
|
|
11
|
-
@results.uniq
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def on_set_run_flag(node)
|
|
15
|
-
flag = node.value
|
|
16
|
-
@results << flag
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
end
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module SmartestBasedTester
|
|
3
|
+
class Base
|
|
4
|
+
module Processors
|
|
5
|
+
# Extracts all runtime variables which are set within the given flow, returning
|
|
6
|
+
# them in an array
|
|
7
|
+
class ExtractSetVariables < ATP::Processor
|
|
8
|
+
def run(nodes)
|
|
9
|
+
@results = []
|
|
10
|
+
process_all(nodes)
|
|
11
|
+
@results.uniq
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def on_set_run_flag(node)
|
|
15
|
+
flag = node.value
|
|
16
|
+
@results << flag
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -1,188 +1,188 @@
|
|
|
1
|
-
module OrigenTesters
|
|
2
|
-
module SmartestBasedTester
|
|
3
|
-
class Base
|
|
4
|
-
module Processors
|
|
5
|
-
# This processor eliminates the use of run flags between adjacent tests:
|
|
6
|
-
#
|
|
7
|
-
# s(:flow,
|
|
8
|
-
# s(:name, "prb1"),
|
|
9
|
-
# s(:test,
|
|
10
|
-
# s(:name, "test1"),
|
|
11
|
-
# s(:id, "t1"),
|
|
12
|
-
# s(:on_fail,
|
|
13
|
-
# s(:set_run_flag, "t1_FAILED", "auto_generated"),
|
|
14
|
-
# s(:continue))),
|
|
15
|
-
# s(:run_flag, "t1_FAILED", true,
|
|
16
|
-
# s(:test,
|
|
17
|
-
# s(:name, "test2"))))
|
|
18
|
-
#
|
|
19
|
-
#
|
|
20
|
-
# s(:flow,
|
|
21
|
-
# s(:name, "prb1"),
|
|
22
|
-
# s(:test,
|
|
23
|
-
# s(:name, "test1"),
|
|
24
|
-
# s(:id, "t1"),
|
|
25
|
-
# s(:on_fail,
|
|
26
|
-
# s(:test,
|
|
27
|
-
# s(:name, "test2")))))
|
|
28
|
-
#
|
|
29
|
-
class FlagOptimizer < ATP::Processor
|
|
30
|
-
attr_reader :run_flag_table
|
|
31
|
-
|
|
32
|
-
def run(node)
|
|
33
|
-
# Pre-process the AST for # of occurrences of each run-flag used
|
|
34
|
-
t = ExtractRunFlagTable.new
|
|
35
|
-
t.process(node)
|
|
36
|
-
@run_flag_table = t.run_flag_table
|
|
37
|
-
process(node)
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
def on_named_collection(node)
|
|
41
|
-
name, *nodes = *node
|
|
42
|
-
node.updated(nil, [name] + optimize(process_all(nodes)))
|
|
43
|
-
end
|
|
44
|
-
alias_method :on_flow, :on_named_collection
|
|
45
|
-
alias_method :on_group, :on_named_collection
|
|
46
|
-
|
|
47
|
-
def on_run_flag(node)
|
|
48
|
-
name, state, *nodes = *node
|
|
49
|
-
if run_flag_to_remove.last && run_flag_to_remove.last == node.to_a[0..1]
|
|
50
|
-
node.to_a.last
|
|
51
|
-
else
|
|
52
|
-
node.updated(nil, [name, state] + optimize(process_all(nodes)))
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
def on_on_fail(node)
|
|
57
|
-
if to_inline = nodes_to_inline_on_pass_or_fail.last
|
|
58
|
-
# If this node sets the flag that gates the node to be inlined
|
|
59
|
-
set_run_flag = node.find(:set_run_flag)
|
|
60
|
-
if set_run_flag && gated_by_set?(set_run_flag.to_a[0], to_inline)
|
|
61
|
-
# Remove the sub-node that sets the flag if there are no further references to it
|
|
62
|
-
|
|
63
|
-
if @run_flag_table[set_run_flag.to_a[0]] == 1 || !@run_flag_table[set_run_flag.to_a[0]]
|
|
64
|
-
node = node.updated(nil, node.children - [set_run_flag])
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
# And append the content of the node to be in_lined at the end of this on pass/fail node
|
|
68
|
-
append = reorder_nested_run_flags(set_run_flag.to_a[0], to_inline).to_a[2..-1]
|
|
69
|
-
|
|
70
|
-
# Belt and braces approach to make sure this node to be inlined does
|
|
71
|
-
# not get picked up anywhere else
|
|
72
|
-
nodes_to_inline_on_pass_or_fail.pop
|
|
73
|
-
nodes_to_inline_on_pass_or_fail << nil
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
node.updated(nil, optimize(process_all(node.children + Array(append))))
|
|
77
|
-
end
|
|
78
|
-
alias_method :on_on_pass, :on_on_fail
|
|
79
|
-
|
|
80
|
-
def optimize(nodes)
|
|
81
|
-
results = []
|
|
82
|
-
node1 = nil
|
|
83
|
-
nodes.each do |node2|
|
|
84
|
-
if node1
|
|
85
|
-
if can_be_combined?(node1, node2)
|
|
86
|
-
node1 = combine(node1, node2)
|
|
87
|
-
else
|
|
88
|
-
results << node1
|
|
89
|
-
node1 = node2
|
|
90
|
-
end
|
|
91
|
-
else
|
|
92
|
-
node1 = node2
|
|
93
|
-
end
|
|
94
|
-
end
|
|
95
|
-
results << node1 if node1
|
|
96
|
-
results
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
def can_be_combined?(node1, node2)
|
|
100
|
-
if node1.type == :test && node2.type == :run_flag
|
|
101
|
-
if node1.find_all(:on_fail, :on_pass).any? do |node|
|
|
102
|
-
if n = node.find(:set_run_flag)
|
|
103
|
-
# Inline instead of setting a flag if...
|
|
104
|
-
gated_by_set?(n.to_a[0], node2) && # The flag set by node1 is gating node2
|
|
105
|
-
n.to_a[1] == 'auto_generated' && # The flag has been generated and not specified by the user
|
|
106
|
-
n.to_a[0] !~ /_RAN$/ # And don't compress RAN flags because they can be set by both on_fail and on_pass
|
|
107
|
-
end
|
|
108
|
-
end
|
|
109
|
-
return true
|
|
110
|
-
end
|
|
111
|
-
end
|
|
112
|
-
false
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
def combine(node1, node2)
|
|
116
|
-
nodes_to_inline_on_pass_or_fail << node2
|
|
117
|
-
node1 = node1.updated(nil, process_all(node1.children))
|
|
118
|
-
nodes_to_inline_on_pass_or_fail.pop
|
|
119
|
-
node1
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
# node will always be a run_flag type node, guaranteed by the caller
|
|
123
|
-
#
|
|
124
|
-
# Returns true if flag matches the one supplied and it is required to be set(true), like this:
|
|
125
|
-
#
|
|
126
|
-
# s(:run_flag, flag, true,
|
|
127
|
-
# s(:test, ...
|
|
128
|
-
#
|
|
129
|
-
# Also returns true if flag matches the one supplied, but it is nested within other flag conditions:
|
|
130
|
-
#
|
|
131
|
-
# s(:run_flag, other_flag, false,
|
|
132
|
-
# s(:run_flag, other_flag2, true,
|
|
133
|
-
# s(:run_flag, flag, true,
|
|
134
|
-
# s(:test, ...
|
|
135
|
-
def gated_by_set?(flag, node)
|
|
136
|
-
(flag == node.to_a[0] && node.to_a[1]) ||
|
|
137
|
-
(node.to_a.size == 3 && node.to_a.last.type == :run_flag && gated_by_set?(flag, node.to_a.last))
|
|
138
|
-
end
|
|
139
|
-
|
|
140
|
-
# Returns the node with the run_flag clauses re-ordered to have the given flag of interest at the top.
|
|
141
|
-
#
|
|
142
|
-
# The caller guarantees the run_flag clause containing the given flag is present.
|
|
143
|
-
#
|
|
144
|
-
# For example, given this node:
|
|
145
|
-
#
|
|
146
|
-
# s(:run_flag, "flag1", false,
|
|
147
|
-
# s(:run_flag, "ot_BEA7F3B_FAILED", true,
|
|
148
|
-
# s(:test,
|
|
149
|
-
# s(:object, <TestSuite: inner_test1_BEA7F3B>),
|
|
150
|
-
# s(:name, "inner_test1_BEA7F3B"),
|
|
151
|
-
# s(:number, 0),
|
|
152
|
-
# s(:id, "it1_BEA7F3B"),
|
|
153
|
-
# s(:on_fail,
|
|
154
|
-
# s(:render, "multi_bin;")))))
|
|
155
|
-
#
|
|
156
|
-
# Then this node would be returned when the flag of interest is ot_BEA7F3B_FAILED:
|
|
157
|
-
#
|
|
158
|
-
# s(:run_flag, "ot_BEA7F3B_FAILED", true,
|
|
159
|
-
# s(:run_flag, "flag1", false,
|
|
160
|
-
# s(:test,
|
|
161
|
-
# s(:object, <TestSuite: inner_test1_BEA7F3B>),
|
|
162
|
-
# s(:name, "inner_test1_BEA7F3B"),
|
|
163
|
-
# s(:number, 0),
|
|
164
|
-
# s(:id, "it1_BEA7F3B"),
|
|
165
|
-
# s(:on_fail,
|
|
166
|
-
# s(:render, "multi_bin;")))))
|
|
167
|
-
def reorder_nested_run_flags(flag, node)
|
|
168
|
-
# If the run_flag we care about is already at the top, just return node
|
|
169
|
-
unless node.to_a[0] == flag && node.to_a[1]
|
|
170
|
-
run_flag_to_remove << [flag, true]
|
|
171
|
-
node = n(:run_flag, [flag, true, process(node)])
|
|
172
|
-
run_flag_to_remove.pop
|
|
173
|
-
end
|
|
174
|
-
node
|
|
175
|
-
end
|
|
176
|
-
|
|
177
|
-
def run_flag_to_remove
|
|
178
|
-
@run_flag_to_remove ||= []
|
|
179
|
-
end
|
|
180
|
-
|
|
181
|
-
def nodes_to_inline_on_pass_or_fail
|
|
182
|
-
@nodes_to_inline_on_pass_or_fail ||= []
|
|
183
|
-
end
|
|
184
|
-
end
|
|
185
|
-
end
|
|
186
|
-
end
|
|
187
|
-
end
|
|
188
|
-
end
|
|
1
|
+
module OrigenTesters
|
|
2
|
+
module SmartestBasedTester
|
|
3
|
+
class Base
|
|
4
|
+
module Processors
|
|
5
|
+
# This processor eliminates the use of run flags between adjacent tests:
|
|
6
|
+
#
|
|
7
|
+
# s(:flow,
|
|
8
|
+
# s(:name, "prb1"),
|
|
9
|
+
# s(:test,
|
|
10
|
+
# s(:name, "test1"),
|
|
11
|
+
# s(:id, "t1"),
|
|
12
|
+
# s(:on_fail,
|
|
13
|
+
# s(:set_run_flag, "t1_FAILED", "auto_generated"),
|
|
14
|
+
# s(:continue))),
|
|
15
|
+
# s(:run_flag, "t1_FAILED", true,
|
|
16
|
+
# s(:test,
|
|
17
|
+
# s(:name, "test2"))))
|
|
18
|
+
#
|
|
19
|
+
#
|
|
20
|
+
# s(:flow,
|
|
21
|
+
# s(:name, "prb1"),
|
|
22
|
+
# s(:test,
|
|
23
|
+
# s(:name, "test1"),
|
|
24
|
+
# s(:id, "t1"),
|
|
25
|
+
# s(:on_fail,
|
|
26
|
+
# s(:test,
|
|
27
|
+
# s(:name, "test2")))))
|
|
28
|
+
#
|
|
29
|
+
class FlagOptimizer < ATP::Processor
|
|
30
|
+
attr_reader :run_flag_table
|
|
31
|
+
|
|
32
|
+
def run(node)
|
|
33
|
+
# Pre-process the AST for # of occurrences of each run-flag used
|
|
34
|
+
t = ExtractRunFlagTable.new
|
|
35
|
+
t.process(node)
|
|
36
|
+
@run_flag_table = t.run_flag_table
|
|
37
|
+
process(node)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def on_named_collection(node)
|
|
41
|
+
name, *nodes = *node
|
|
42
|
+
node.updated(nil, [name] + optimize(process_all(nodes)))
|
|
43
|
+
end
|
|
44
|
+
alias_method :on_flow, :on_named_collection
|
|
45
|
+
alias_method :on_group, :on_named_collection
|
|
46
|
+
|
|
47
|
+
def on_run_flag(node)
|
|
48
|
+
name, state, *nodes = *node
|
|
49
|
+
if run_flag_to_remove.last && run_flag_to_remove.last == node.to_a[0..1]
|
|
50
|
+
node.to_a.last
|
|
51
|
+
else
|
|
52
|
+
node.updated(nil, [name, state] + optimize(process_all(nodes)))
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def on_on_fail(node)
|
|
57
|
+
if to_inline = nodes_to_inline_on_pass_or_fail.last
|
|
58
|
+
# If this node sets the flag that gates the node to be inlined
|
|
59
|
+
set_run_flag = node.find(:set_run_flag)
|
|
60
|
+
if set_run_flag && gated_by_set?(set_run_flag.to_a[0], to_inline)
|
|
61
|
+
# Remove the sub-node that sets the flag if there are no further references to it
|
|
62
|
+
|
|
63
|
+
if @run_flag_table[set_run_flag.to_a[0]] == 1 || !@run_flag_table[set_run_flag.to_a[0]]
|
|
64
|
+
node = node.updated(nil, node.children - [set_run_flag])
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# And append the content of the node to be in_lined at the end of this on pass/fail node
|
|
68
|
+
append = reorder_nested_run_flags(set_run_flag.to_a[0], to_inline).to_a[2..-1]
|
|
69
|
+
|
|
70
|
+
# Belt and braces approach to make sure this node to be inlined does
|
|
71
|
+
# not get picked up anywhere else
|
|
72
|
+
nodes_to_inline_on_pass_or_fail.pop
|
|
73
|
+
nodes_to_inline_on_pass_or_fail << nil
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
node.updated(nil, optimize(process_all(node.children + Array(append))))
|
|
77
|
+
end
|
|
78
|
+
alias_method :on_on_pass, :on_on_fail
|
|
79
|
+
|
|
80
|
+
def optimize(nodes)
|
|
81
|
+
results = []
|
|
82
|
+
node1 = nil
|
|
83
|
+
nodes.each do |node2|
|
|
84
|
+
if node1
|
|
85
|
+
if can_be_combined?(node1, node2)
|
|
86
|
+
node1 = combine(node1, node2)
|
|
87
|
+
else
|
|
88
|
+
results << node1
|
|
89
|
+
node1 = node2
|
|
90
|
+
end
|
|
91
|
+
else
|
|
92
|
+
node1 = node2
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
results << node1 if node1
|
|
96
|
+
results
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def can_be_combined?(node1, node2)
|
|
100
|
+
if node1.type == :test && node2.type == :run_flag
|
|
101
|
+
if node1.find_all(:on_fail, :on_pass).any? do |node|
|
|
102
|
+
if n = node.find(:set_run_flag)
|
|
103
|
+
# Inline instead of setting a flag if...
|
|
104
|
+
gated_by_set?(n.to_a[0], node2) && # The flag set by node1 is gating node2
|
|
105
|
+
n.to_a[1] == 'auto_generated' && # The flag has been generated and not specified by the user
|
|
106
|
+
n.to_a[0] !~ /_RAN$/ # And don't compress RAN flags because they can be set by both on_fail and on_pass
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
return true
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
false
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def combine(node1, node2)
|
|
116
|
+
nodes_to_inline_on_pass_or_fail << node2
|
|
117
|
+
node1 = node1.updated(nil, process_all(node1.children))
|
|
118
|
+
nodes_to_inline_on_pass_or_fail.pop
|
|
119
|
+
node1
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# node will always be a run_flag type node, guaranteed by the caller
|
|
123
|
+
#
|
|
124
|
+
# Returns true if flag matches the one supplied and it is required to be set(true), like this:
|
|
125
|
+
#
|
|
126
|
+
# s(:run_flag, flag, true,
|
|
127
|
+
# s(:test, ...
|
|
128
|
+
#
|
|
129
|
+
# Also returns true if flag matches the one supplied, but it is nested within other flag conditions:
|
|
130
|
+
#
|
|
131
|
+
# s(:run_flag, other_flag, false,
|
|
132
|
+
# s(:run_flag, other_flag2, true,
|
|
133
|
+
# s(:run_flag, flag, true,
|
|
134
|
+
# s(:test, ...
|
|
135
|
+
def gated_by_set?(flag, node)
|
|
136
|
+
(flag == node.to_a[0] && node.to_a[1]) ||
|
|
137
|
+
(node.to_a.size == 3 && node.to_a.last.type == :run_flag && gated_by_set?(flag, node.to_a.last))
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# Returns the node with the run_flag clauses re-ordered to have the given flag of interest at the top.
|
|
141
|
+
#
|
|
142
|
+
# The caller guarantees the run_flag clause containing the given flag is present.
|
|
143
|
+
#
|
|
144
|
+
# For example, given this node:
|
|
145
|
+
#
|
|
146
|
+
# s(:run_flag, "flag1", false,
|
|
147
|
+
# s(:run_flag, "ot_BEA7F3B_FAILED", true,
|
|
148
|
+
# s(:test,
|
|
149
|
+
# s(:object, <TestSuite: inner_test1_BEA7F3B>),
|
|
150
|
+
# s(:name, "inner_test1_BEA7F3B"),
|
|
151
|
+
# s(:number, 0),
|
|
152
|
+
# s(:id, "it1_BEA7F3B"),
|
|
153
|
+
# s(:on_fail,
|
|
154
|
+
# s(:render, "multi_bin;")))))
|
|
155
|
+
#
|
|
156
|
+
# Then this node would be returned when the flag of interest is ot_BEA7F3B_FAILED:
|
|
157
|
+
#
|
|
158
|
+
# s(:run_flag, "ot_BEA7F3B_FAILED", true,
|
|
159
|
+
# s(:run_flag, "flag1", false,
|
|
160
|
+
# s(:test,
|
|
161
|
+
# s(:object, <TestSuite: inner_test1_BEA7F3B>),
|
|
162
|
+
# s(:name, "inner_test1_BEA7F3B"),
|
|
163
|
+
# s(:number, 0),
|
|
164
|
+
# s(:id, "it1_BEA7F3B"),
|
|
165
|
+
# s(:on_fail,
|
|
166
|
+
# s(:render, "multi_bin;")))))
|
|
167
|
+
def reorder_nested_run_flags(flag, node)
|
|
168
|
+
# If the run_flag we care about is already at the top, just return node
|
|
169
|
+
unless node.to_a[0] == flag && node.to_a[1]
|
|
170
|
+
run_flag_to_remove << [flag, true]
|
|
171
|
+
node = n(:run_flag, [flag, true, process(node)])
|
|
172
|
+
run_flag_to_remove.pop
|
|
173
|
+
end
|
|
174
|
+
node
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def run_flag_to_remove
|
|
178
|
+
@run_flag_to_remove ||= []
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
def nodes_to_inline_on_pass_or_fail
|
|
182
|
+
@nodes_to_inline_on_pass_or_fail ||= []
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
end
|