origen 0.0.1 → 0.0.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/bin/ctags +0 -0
- data/bin/origen +165 -1
- data/bin/rgen +2 -0
- data/config/application.rb +141 -0
- data/config/commands.rb +72 -0
- data/config/development.rb +7 -0
- data/config/environment.rb +0 -0
- data/config/rgen.policy +7 -0
- data/config/rubocop/easy.yml +620 -0
- data/config/rubocop/easy_disabled.yml +271 -0
- data/config/rubocop/easy_enabled.yml +731 -0
- data/config/rubocop/strict.yml +620 -0
- data/config/rubocop/strict_disabled.yml +247 -0
- data/config/rubocop/strict_enabled.yml +755 -0
- data/config/users.rb +20 -0
- data/config/version.rb +1 -1
- data/helpers/url.rb +68 -0
- data/lib/c99/doc_interface.rb +56 -0
- data/lib/c99/j750_interface.rb +85 -0
- data/lib/c99/nvm.rb +89 -0
- data/lib/c99/target/mock2.rb +1 -0
- data/lib/c99/target/subdir/mock3.rb +1 -0
- data/lib/option_parser/optparse.rb +12 -0
- data/lib/origen/acronyms.rb +60 -0
- data/lib/origen/application/command_dispatcher.rb +12 -0
- data/lib/origen/application/configuration.rb +206 -0
- data/lib/origen/application/configuration_manager.rb +78 -0
- data/lib/origen/application/deployer.rb +367 -0
- data/lib/origen/application/environment.rb +186 -0
- data/lib/origen/application/lsf.rb +145 -0
- data/lib/origen/application/lsf_manager.rb +657 -0
- data/lib/origen/application/plugins_manager.rb +280 -0
- data/lib/origen/application/release.rb +359 -0
- data/lib/origen/application/runner.rb +246 -0
- data/lib/origen/application/statistics.rb +191 -0
- data/lib/origen/application/target.rb +374 -0
- data/lib/origen/application/version_tracker.rb +59 -0
- data/lib/origen/application/workspace_manager.rb +151 -0
- data/lib/origen/application.rb +746 -0
- data/lib/origen/bugs/bug.rb +36 -0
- data/lib/origen/bugs.rb +45 -0
- data/lib/origen/callbacks.rb +35 -0
- data/lib/origen/chip_mode.rb +118 -0
- data/lib/origen/chip_package.rb +461 -0
- data/lib/origen/client.rb +87 -0
- data/lib/origen/code_generators/actions.rb +258 -0
- data/lib/origen/code_generators/base.rb +57 -0
- data/lib/origen/code_generators/bundler.rb +17 -0
- data/lib/origen/code_generators/gem_setup.rb +49 -0
- data/lib/origen/code_generators/rake.rb +13 -0
- data/lib/origen/code_generators/rspec.rb +12 -0
- data/lib/origen/code_generators/semver.rb +39 -0
- data/lib/origen/code_generators/timever.rb +37 -0
- data/lib/origen/code_generators.rb +111 -0
- data/lib/origen/commands/add.rb +12 -0
- data/lib/origen/commands/compile.rb +62 -0
- data/lib/origen/commands/ctags.rb +9 -0
- data/lib/origen/commands/dispatch.rb +22 -0
- data/lib/origen/commands/environment.rb +11 -0
- data/lib/origen/commands/fetch.rb +63 -0
- data/lib/origen/commands/generate.rb +130 -0
- data/lib/origen/commands/interactive.rb +73 -0
- data/lib/origen/commands/lint.rb +82 -0
- data/lib/origen/commands/lsf.rb +93 -0
- data/lib/origen/commands/merge.rb +55 -0
- data/lib/origen/commands/modifications.rb +12 -0
- data/lib/origen/commands/new.rb +113 -0
- data/lib/origen/commands/plugin.rb +105 -0
- data/lib/origen/commands/program.rb +70 -0
- data/lib/origen/commands/rc.rb +442 -0
- data/lib/origen/commands/save.rb +56 -0
- data/lib/origen/commands/target.rb +27 -0
- data/lib/origen/commands/time.rb +127 -0
- data/lib/origen/commands/version.rb +17 -0
- data/lib/origen/commands/web.rb +221 -0
- data/lib/origen/commands.rb +272 -0
- data/lib/origen/commands_global.rb +76 -0
- data/lib/origen/controller.rb +94 -0
- data/lib/origen/core_ext/array.rb +23 -0
- data/lib/origen/core_ext/bignum.rb +36 -0
- data/lib/origen/core_ext/enumerable.rb +76 -0
- data/lib/origen/core_ext/fixnum.rb +46 -0
- data/lib/origen/core_ext/hash.rb +52 -0
- data/lib/origen/core_ext/module.rb +14 -0
- data/lib/origen/core_ext/numeric.rb +126 -0
- data/lib/origen/core_ext/object.rb +13 -0
- data/lib/origen/core_ext/range.rb +7 -0
- data/lib/origen/core_ext/string.rb +124 -0
- data/lib/origen/core_ext.rb +10 -0
- data/lib/origen/database/key_value_store.rb +111 -0
- data/lib/origen/database/key_value_stores.rb +108 -0
- data/lib/origen/database.rb +6 -0
- data/lib/origen/encodings.rb +102 -0
- data/lib/origen/features/feature.rb +22 -0
- data/lib/origen/features.rb +104 -0
- data/lib/origen/file_handler.rb +429 -0
- data/lib/origen/generator/comparator.rb +56 -0
- data/lib/origen/generator/compiler.rb +277 -0
- data/lib/origen/generator/flow.rb +49 -0
- data/lib/origen/generator/job.rb +131 -0
- data/lib/origen/generator/pattern.rb +356 -0
- data/lib/origen/generator/pattern_finder.rb +155 -0
- data/lib/origen/generator/pattern_iterator.rb +55 -0
- data/lib/origen/generator/renderer.rb +113 -0
- data/lib/origen/generator/resources.rb +40 -0
- data/lib/origen/generator/stage.rb +89 -0
- data/lib/origen/generator.rb +85 -0
- data/lib/origen/global_methods.rb +205 -0
- data/lib/origen/import_manager.rb +596 -0
- data/lib/origen/location/base.rb +116 -0
- data/lib/origen/location/map.rb +83 -0
- data/lib/origen/location.rb +6 -0
- data/lib/origen/log.rb +217 -0
- data/lib/origen/logger_methods.rb +56 -0
- data/lib/origen/mode.rb +61 -0
- data/lib/origen/model.rb +267 -0
- data/lib/origen/model_initializer.rb +45 -0
- data/lib/origen/nvm/block_array.rb +72 -0
- data/lib/origen/nvm.rb +6 -0
- data/lib/origen/parameters/live.rb +22 -0
- data/lib/origen/parameters/missing.rb +28 -0
- data/lib/origen/parameters/set.rb +144 -0
- data/lib/origen/parameters.rb +107 -0
- data/lib/origen/pdm.rb +218 -0
- data/lib/origen/pins/function_proxy.rb +36 -0
- data/lib/origen/pins/ground_pin.rb +6 -0
- data/lib/origen/pins/pin.rb +860 -0
- data/lib/origen/pins/pin_bank.rb +349 -0
- data/lib/origen/pins/pin_clock.rb +124 -0
- data/lib/origen/pins/pin_collection.rb +492 -0
- data/lib/origen/pins/pin_common.rb +206 -0
- data/lib/origen/pins/port.rb +268 -0
- data/lib/origen/pins/power_pin.rb +30 -0
- data/lib/origen/pins.rb +696 -0
- data/lib/origen/registers/bit.rb +562 -0
- data/lib/origen/registers/bit_collection.rb +787 -0
- data/lib/origen/registers/container.rb +288 -0
- data/lib/origen/registers/domain.rb +16 -0
- data/lib/origen/registers/reg.rb +1406 -0
- data/lib/origen/registers/reg_collection.rb +24 -0
- data/lib/origen/registers.rb +652 -0
- data/lib/origen/regression_manager.rb +251 -0
- data/lib/origen/remote_manager.rb +340 -0
- data/lib/origen/revision_control/base.rb +257 -0
- data/lib/origen/revision_control/design_sync.rb +276 -0
- data/lib/origen/revision_control/git.rb +243 -0
- data/lib/origen/revision_control/subversion.rb +6 -0
- data/lib/origen/revision_control.rb +44 -0
- data/lib/origen/ruby_version_check.rb +131 -0
- data/lib/origen/site_config.rb +61 -0
- data/lib/origen/specs/checkers.rb +103 -0
- data/lib/origen/specs/creation_info.rb +17 -0
- data/lib/origen/specs/doc_resource.rb +91 -0
- data/lib/origen/specs/exhibit.rb +17 -0
- data/lib/origen/specs/mode_select.rb +16 -0
- data/lib/origen/specs/note.rb +17 -0
- data/lib/origen/specs/override.rb +21 -0
- data/lib/origen/specs/power_supply.rb +13 -0
- data/lib/origen/specs/spec.rb +226 -0
- data/lib/origen/specs/version_history.rb +14 -0
- data/lib/origen/specs.rb +552 -0
- data/lib/origen/sub_blocks.rb +298 -0
- data/lib/origen/tester/api.rb +277 -0
- data/lib/origen/tester/bdm/bdm.rb +25 -0
- data/lib/origen/tester/command_based_tester.rb +46 -0
- data/lib/origen/tester/doc/doc.rb +226 -0
- data/lib/origen/tester/doc/generator/flow.rb +71 -0
- data/lib/origen/tester/doc/generator/flow_line.rb +203 -0
- data/lib/origen/tester/doc/generator/test.rb +68 -0
- data/lib/origen/tester/doc/generator/test_group.rb +66 -0
- data/lib/origen/tester/doc/generator/tests.rb +47 -0
- data/lib/origen/tester/doc/generator.rb +126 -0
- data/lib/origen/tester/doc/model.rb +162 -0
- data/lib/origen/tester/generator/flow_control_api.rb +606 -0
- data/lib/origen/tester/generator/identity_map.rb +25 -0
- data/lib/origen/tester/generator/placeholder.rb +13 -0
- data/lib/origen/tester/generator/test_numberer.rb +25 -0
- data/lib/origen/tester/generator.rb +271 -0
- data/lib/origen/tester/interface.rb +154 -0
- data/lib/origen/tester/j750/files.rb +45 -0
- data/lib/origen/tester/j750/generator/flow.rb +123 -0
- data/lib/origen/tester/j750/generator/flow_line.rb +288 -0
- data/lib/origen/tester/j750/generator/patgroup.rb +111 -0
- data/lib/origen/tester/j750/generator/patgroups.rb +41 -0
- data/lib/origen/tester/j750/generator/patset.rb +111 -0
- data/lib/origen/tester/j750/generator/patsets.rb +41 -0
- data/lib/origen/tester/j750/generator/templates/flow.txt.erb +9 -0
- data/lib/origen/tester/j750/generator/templates/instances.txt.erb +16 -0
- data/lib/origen/tester/j750/generator/templates/patgroups.txt.erb +8 -0
- data/lib/origen/tester/j750/generator/templates/patsets.txt.erb +10 -0
- data/lib/origen/tester/j750/generator/test_instance.rb +846 -0
- data/lib/origen/tester/j750/generator/test_instance_group.rb +60 -0
- data/lib/origen/tester/j750/generator/test_instances.rb +182 -0
- data/lib/origen/tester/j750/generator.rb +203 -0
- data/lib/origen/tester/j750/j750.rb +845 -0
- data/lib/origen/tester/j750/j750_hpt.rb +35 -0
- data/lib/origen/tester/j750/parser/ac_spec.rb +11 -0
- data/lib/origen/tester/j750/parser/ac_specs.rb +0 -0
- data/lib/origen/tester/j750/parser/dc_spec.rb +36 -0
- data/lib/origen/tester/j750/parser/dc_specs.rb +50 -0
- data/lib/origen/tester/j750/parser/descriptions.rb +340 -0
- data/lib/origen/tester/j750/parser/flow.rb +111 -0
- data/lib/origen/tester/j750/parser/flow_line.rb +207 -0
- data/lib/origen/tester/j750/parser/flows.rb +23 -0
- data/lib/origen/tester/j750/parser/pattern_set.rb +94 -0
- data/lib/origen/tester/j750/parser/pattern_sets.rb +33 -0
- data/lib/origen/tester/j750/parser/test_instance.rb +322 -0
- data/lib/origen/tester/j750/parser/test_instances.rb +26 -0
- data/lib/origen/tester/j750/parser/timeset.rb +15 -0
- data/lib/origen/tester/j750/parser/timesets.rb +0 -0
- data/lib/origen/tester/j750/parser.rb +104 -0
- data/lib/origen/tester/jlink/jlink.rb +33 -0
- data/lib/origen/tester/parser/description_lookup.rb +64 -0
- data/lib/origen/tester/parser/searchable_array.rb +32 -0
- data/lib/origen/tester/parser/searchable_hash.rb +32 -0
- data/lib/origen/tester/parser.rb +24 -0
- data/lib/origen/tester/time.rb +338 -0
- data/lib/origen/tester/timing.rb +253 -0
- data/lib/origen/tester/ultraflex/files.rb +45 -0
- data/lib/origen/tester/ultraflex/generator/flow.rb +119 -0
- data/lib/origen/tester/ultraflex/generator/flow_line.rb +269 -0
- data/lib/origen/tester/ultraflex/generator/patgroup.rb +111 -0
- data/lib/origen/tester/ultraflex/generator/patgroups.rb +41 -0
- data/lib/origen/tester/ultraflex/generator/patset.rb +111 -0
- data/lib/origen/tester/ultraflex/generator/patsets.rb +41 -0
- data/lib/origen/tester/ultraflex/generator/templates/flow.txt.erb +9 -0
- data/lib/origen/tester/ultraflex/generator/templates/instances.txt.erb +16 -0
- data/lib/origen/tester/ultraflex/generator/templates/patgroups.txt.erb +8 -0
- data/lib/origen/tester/ultraflex/generator/templates/patsets.txt.erb +10 -0
- data/lib/origen/tester/ultraflex/generator/test_instance.rb +622 -0
- data/lib/origen/tester/ultraflex/generator/test_instance_group.rb +60 -0
- data/lib/origen/tester/ultraflex/generator/test_instances.rb +174 -0
- data/lib/origen/tester/ultraflex/generator.rb +200 -0
- data/lib/origen/tester/ultraflex/parser/ac_spec.rb +11 -0
- data/lib/origen/tester/ultraflex/parser/ac_specs.rb +0 -0
- data/lib/origen/tester/ultraflex/parser/dc_spec.rb +36 -0
- data/lib/origen/tester/ultraflex/parser/dc_specs.rb +50 -0
- data/lib/origen/tester/ultraflex/parser/descriptions.rb +342 -0
- data/lib/origen/tester/ultraflex/parser/flow.rb +111 -0
- data/lib/origen/tester/ultraflex/parser/flow_line.rb +207 -0
- data/lib/origen/tester/ultraflex/parser/flows.rb +23 -0
- data/lib/origen/tester/ultraflex/parser/pattern_set.rb +94 -0
- data/lib/origen/tester/ultraflex/parser/pattern_sets.rb +33 -0
- data/lib/origen/tester/ultraflex/parser/test_instance.rb +262 -0
- data/lib/origen/tester/ultraflex/parser/test_instances.rb +26 -0
- data/lib/origen/tester/ultraflex/parser/timeset.rb +15 -0
- data/lib/origen/tester/ultraflex/parser/timesets.rb +0 -0
- data/lib/origen/tester/ultraflex/parser.rb +104 -0
- data/lib/origen/tester/ultraflex/ultraflex.rb +759 -0
- data/lib/origen/tester/v93k/generator/flow.rb +63 -0
- data/lib/origen/tester/v93k/generator/flow_node/print.rb +10 -0
- data/lib/origen/tester/v93k/generator/flow_node.rb +17 -0
- data/lib/origen/tester/v93k/generator/pattern.rb +16 -0
- data/lib/origen/tester/v93k/generator/pattern_master.rb +54 -0
- data/lib/origen/tester/v93k/generator/templates/_test_method.txt.erb +6 -0
- data/lib/origen/tester/v93k/generator/templates/_test_suite.txt.erb +11 -0
- data/lib/origen/tester/v93k/generator/templates/template.flow.erb +121 -0
- data/lib/origen/tester/v93k/generator/templates/template.pmfl.erb +9 -0
- data/lib/origen/tester/v93k/generator/test_function.rb +103 -0
- data/lib/origen/tester/v93k/generator/test_functions.rb +79 -0
- data/lib/origen/tester/v93k/generator/test_method.rb +46 -0
- data/lib/origen/tester/v93k/generator/test_methods.rb +75 -0
- data/lib/origen/tester/v93k/generator/test_suite.rb +54 -0
- data/lib/origen/tester/v93k/generator/test_suites.rb +65 -0
- data/lib/origen/tester/v93k/generator.rb +80 -0
- data/lib/origen/tester/v93k/v93k.rb +420 -0
- data/lib/origen/tester/vector.rb +86 -0
- data/lib/origen/tester/vector_generator.rb +633 -0
- data/lib/origen/tester/vector_pipeline.rb +150 -0
- data/lib/origen/tester.rb +56 -0
- data/lib/origen/top_level.rb +134 -0
- data/lib/origen/users/ldap.rb +65 -0
- data/lib/origen/users/user.rb +149 -0
- data/lib/origen/users.rb +30 -0
- data/lib/origen/utility/block_args.rb +93 -0
- data/lib/origen/utility/csv_data.rb +110 -0
- data/lib/origen/utility/design_sync.rb +494 -0
- data/lib/origen/utility/diff.rb +158 -0
- data/lib/origen/utility/input_capture.rb +121 -0
- data/lib/origen/utility/mailer.rb +143 -0
- data/lib/origen/utility/s_record.rb +205 -0
- data/lib/origen/utility/time_and_date.rb +30 -0
- data/lib/origen/utility.rb +12 -0
- data/lib/origen/version_checker.rb +117 -0
- data/lib/origen/version_string.rb +356 -0
- data/lib/origen.rb +648 -0
- data/lib/tasks/gem.rake +27 -22
- data/origen_site_config.yml +36 -0
- data/source_setup +17 -0
- data/spec/format/rgen_formatter.rb +14 -0
- data/templates/api_doc/README.txt.erb +24 -0
- data/templates/code_generators/gemfile_app.rb +4 -0
- data/templates/code_generators/gemfile_plugin.rb +6 -0
- data/templates/code_generators/gemspec.rb +33 -0
- data/templates/code_generators/rakefile.rb +10 -0
- data/templates/code_generators/spec_helper.rb +49 -0
- data/templates/code_generators/version.rb +8 -0
- data/templates/code_generators/version_time.rb +3 -0
- data/templates/git/gitignore.erb +33 -0
- data/templates/j750/_vt_flow.txt.erb +8 -0
- data/templates/j750/_vt_instances.txt.erb +4 -0
- data/templates/j750/program_sheet.txt.erb +9 -0
- data/templates/nanoc/Rules +74 -0
- data/templates/nanoc/config.yaml +77 -0
- data/templates/nanoc/content/favicon.ico +0 -0
- data/templates/nanoc/layouts/bootstrap.html.erb +63 -0
- data/templates/nanoc/layouts/bootstrap3.html.erb +71 -0
- data/templates/nanoc/layouts/freescale.html.erb +79 -0
- data/templates/nanoc/lib/bootstrap_filter.rb +49 -0
- data/templates/nanoc/lib/codeblocks_filter.rb +41 -0
- data/templates/nanoc/lib/default.rb +2 -0
- data/templates/nanoc/lib/gzip_filter.rb +16 -0
- data/templates/nanoc/lib/haml_code_filter.rb +41 -0
- data/templates/nanoc/lib/helpers.rb +1 -0
- data/templates/nanoc/lib/search_filter.rb +62 -0
- data/templates/nanoc_dynamic/content/search.js.erb +92 -0
- data/templates/shared/web/_logo.html +10 -0
- data/templates/test/_inline_sub.txt.erb +2 -0
- data/templates/test/environment.txt.erb +1 -0
- data/templates/test/inline.txt.erb +11 -0
- data/templates/test/inspections.txt.erb +19 -0
- data/templates/test/set1/_sub1.txt.erb +12 -0
- data/templates/test/set1/_sub4.txt.erb +1 -0
- data/templates/test/set1/_sub5.txt.erb +1 -0
- data/templates/test/set1/main.txt.erb +53 -0
- data/templates/test/set1/sub_dir/_sub2.txt.erb +20 -0
- data/templates/test/set1/sub_dir/_sub3.txt.erb +12 -0
- data/templates/test/set1/sub_dir/main2.txt.erb +4 -0
- data/templates/test/set2/template_with_no_erb_1.txt +9 -0
- data/templates/test/set2/template_with_no_erb_2.txt +9 -0
- data/templates/test/set3/_layout.html.erb +4 -0
- data/templates/test/set3/content.html.erb +6 -0
- data/templates/time/filter.rb.erb +15 -0
- data/templates/time/rules.rb.erb +45 -0
- metadata +639 -5
|
File without changes
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
module Origen
|
|
2
|
+
module Tester
|
|
3
|
+
class J750
|
|
4
|
+
class Parser
|
|
5
|
+
autoload :Flows, 'origen/tester/j750/parser/flows'
|
|
6
|
+
autoload :Flow, 'origen/tester/j750/parser/flow'
|
|
7
|
+
autoload :FlowLine, 'origen/tester/j750/parser/flow_line'
|
|
8
|
+
autoload :TestInstances, 'origen/tester/j750/parser/test_instances'
|
|
9
|
+
autoload :TestInstance, 'origen/tester/j750/parser/test_instance'
|
|
10
|
+
autoload :PatternSets, 'origen/tester/j750/parser/pattern_sets'
|
|
11
|
+
autoload :PatternSet, 'origen/tester/j750/parser/pattern_set'
|
|
12
|
+
autoload :DCSpecs, 'origen/tester/j750/parser/dc_specs'
|
|
13
|
+
autoload :DCSpec, 'origen/tester/j750/parser/dc_spec'
|
|
14
|
+
autoload :ACSpecs, 'origen/tester/j750/parser/ac_specs'
|
|
15
|
+
autoload :ACSpec, 'origen/tester/j750/parser/ac_spec'
|
|
16
|
+
autoload :Descriptions, 'origen/tester/j750/parser/descriptions'
|
|
17
|
+
|
|
18
|
+
def reset
|
|
19
|
+
@flows = nil
|
|
20
|
+
@test_instances = nil
|
|
21
|
+
@pattern_sets = nil
|
|
22
|
+
@dc_specs = nil
|
|
23
|
+
@ac_specs = nil
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def descriptions
|
|
27
|
+
@descriptions ||= Descriptions.new(parser: self)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Returns an array of test flows
|
|
31
|
+
def flows
|
|
32
|
+
@flows ||= Flows.new(parser: self)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def test_instances
|
|
36
|
+
@test_instances ||= TestInstances.new(parser: self)
|
|
37
|
+
end
|
|
38
|
+
alias_method :instances, :test_instances
|
|
39
|
+
|
|
40
|
+
def pattern_sets
|
|
41
|
+
@pattern_sets ||= PatternSets.new(parser: self)
|
|
42
|
+
end
|
|
43
|
+
alias_method :patsets, :pattern_sets
|
|
44
|
+
alias_method :pat_sets, :pattern_sets
|
|
45
|
+
|
|
46
|
+
def dc_specs
|
|
47
|
+
@dc_specs ||= DCSpecs.new(parser: self)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def ac_specs
|
|
51
|
+
@ac_specs ||= ACSpecs.new(parser: self)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def inspect
|
|
55
|
+
"<Parsed Program: Flows: #{flows.size}>"
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Parse a file, array of files, or a directory.
|
|
59
|
+
#
|
|
60
|
+
# This can be called multiple times to add new files to the
|
|
61
|
+
# program model.
|
|
62
|
+
def parse(file)
|
|
63
|
+
Origen.log.info ''
|
|
64
|
+
Origen.log.info "Parsing J750 test program from: #{file}"
|
|
65
|
+
Origen.log.info ''
|
|
66
|
+
reset
|
|
67
|
+
# Note use of local file handler here, this should be how it is
|
|
68
|
+
# done globally, otherwise we can run into hard to debug problems
|
|
69
|
+
# due to state/reference dir changes in the single Origen.file_handler
|
|
70
|
+
Origen::FileHandler.new.resolve_files(file) do |f|
|
|
71
|
+
parse_file(f)
|
|
72
|
+
end
|
|
73
|
+
Origen.log.info ''
|
|
74
|
+
self
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def parse_file(file)
|
|
78
|
+
line = File.readlines(file).first
|
|
79
|
+
begin
|
|
80
|
+
if line =~ /Flow Table/
|
|
81
|
+
flows.import(file)
|
|
82
|
+
elsif line =~ /Instances/
|
|
83
|
+
test_instances.import(file)
|
|
84
|
+
elsif line =~ /Pattern Sets/
|
|
85
|
+
patsets.import(file)
|
|
86
|
+
elsif line =~ /DC Spec/
|
|
87
|
+
dc_specs.import(file)
|
|
88
|
+
else
|
|
89
|
+
puts "Skipped (un-supported file type): #{file}"
|
|
90
|
+
end
|
|
91
|
+
rescue Exception => e
|
|
92
|
+
if e.is_a?(ArgumentError) && e.message =~ /invalid byte sequence/
|
|
93
|
+
puts "Skipped (not ASCII): #{file}"
|
|
94
|
+
else
|
|
95
|
+
puts e.message
|
|
96
|
+
puts e.backtrace
|
|
97
|
+
exit 1
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
module Origen
|
|
2
|
+
module Tester
|
|
3
|
+
class JLink < CommandBasedTester
|
|
4
|
+
def initialize
|
|
5
|
+
super
|
|
6
|
+
# The minimum time unit is 1ms
|
|
7
|
+
set_timeset('default', 1_000_000)
|
|
8
|
+
@pat_extension = 'jlk'
|
|
9
|
+
@comment_char = '//'
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def delay(cycles)
|
|
13
|
+
microcode "Sleep #{cycles_to_ms(cycles)}"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def write_byte(address, data)
|
|
17
|
+
microcode "w1 0x#{address.to_s(16).upcase}, 0x#{data.to_s(16).upcase}"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def write_word(address, data)
|
|
21
|
+
microcode "w2 0x#{address.to_s(16).upcase}, 0x#{data.to_s(16).upcase}"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def write_longword(address, data)
|
|
25
|
+
microcode "w4 0x#{address.to_s(16).upcase}, 0x#{data.to_s(16).upcase}"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def read(address, number_of_regs = 1)
|
|
29
|
+
microcode "mem 0x#{address.to_s(16)}, #{number_of_regs}"
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
module Origen
|
|
2
|
+
module Tester
|
|
3
|
+
module Parser
|
|
4
|
+
class DescriptionLookup
|
|
5
|
+
def initialize
|
|
6
|
+
@store = { flow: {}, test: {}, usage: {} }
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def for_flow(name, _options = {})
|
|
10
|
+
k = flow_key(name)
|
|
11
|
+
@store[:flow][k] || []
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def for_test_definition(name, _options = {})
|
|
15
|
+
n = name_key(name)
|
|
16
|
+
@store[:test][n] || []
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def for_test_usage(name, flow, _options = {})
|
|
20
|
+
k = flow_key(flow)
|
|
21
|
+
n = name_key(name)
|
|
22
|
+
@store[:usage][k] ||= {}
|
|
23
|
+
@store[:usage][k][n] || []
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def add_for_flow(flow, description, _options = {})
|
|
27
|
+
k = flow_key(flow)
|
|
28
|
+
@store[:flow][k] ||= []
|
|
29
|
+
[description].flatten.each do |d|
|
|
30
|
+
@store[:flow][k] << d
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def add_for_test_definition(test, description, _option = {})
|
|
35
|
+
n = name_key(test)
|
|
36
|
+
@store[:test][n] ||= []
|
|
37
|
+
[description].flatten.each do |d|
|
|
38
|
+
@store[:test][n] << d
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def add_for_test_usage(test, flow, description, _option = {})
|
|
43
|
+
k = flow_key(flow)
|
|
44
|
+
n = name_key(test)
|
|
45
|
+
@store[:usage][k] ||= {}
|
|
46
|
+
@store[:usage][k][n] ||= []
|
|
47
|
+
[description].flatten.each do |d|
|
|
48
|
+
@store[:usage][k][n] << d
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
private
|
|
53
|
+
|
|
54
|
+
def flow_key(flow)
|
|
55
|
+
Pathname.new(flow).basename('.*').to_s
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def name_key(name)
|
|
59
|
+
name.to_s.downcase
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
module Origen
|
|
2
|
+
module Tester
|
|
3
|
+
module Parser
|
|
4
|
+
class SearchableArray < ::Array
|
|
5
|
+
def where(conditions)
|
|
6
|
+
exact = conditions.delete(:exact)
|
|
7
|
+
results = SearchableArray.new
|
|
8
|
+
each do |item|
|
|
9
|
+
if conditions.all? do |attr, val|
|
|
10
|
+
if val.is_a?(Array)
|
|
11
|
+
if exact
|
|
12
|
+
val.any? { |v| item.send(attr).to_s == v.to_s }
|
|
13
|
+
else
|
|
14
|
+
val.any? { |v| item.send(attr).to_s =~ /#{v.to_s}/ }
|
|
15
|
+
end
|
|
16
|
+
else
|
|
17
|
+
if exact
|
|
18
|
+
item.send(attr).to_s == val.to_s
|
|
19
|
+
else
|
|
20
|
+
item.send(attr).to_s =~ /#{val.to_s}/
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
results << item
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
results
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
module Origen
|
|
2
|
+
module Tester
|
|
3
|
+
module Parser
|
|
4
|
+
class SearchableHash < ::Hash
|
|
5
|
+
def where(conditions)
|
|
6
|
+
exact = conditions.delete(:exact)
|
|
7
|
+
results = SearchableArray.new
|
|
8
|
+
each do |_key, item|
|
|
9
|
+
if conditions.all? do |attr, val|
|
|
10
|
+
if val.is_a?(Array)
|
|
11
|
+
if exact
|
|
12
|
+
val.any? { |v| item.send(attr).to_s == v.to_s }
|
|
13
|
+
else
|
|
14
|
+
val.any? { |v| item.send(attr).to_s =~ /#{v.to_s}/ }
|
|
15
|
+
end
|
|
16
|
+
else
|
|
17
|
+
if exact
|
|
18
|
+
item.send(attr).to_s == val.to_s
|
|
19
|
+
else
|
|
20
|
+
item.send(attr).to_s =~ /#{val.to_s}/
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
results << item
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
results
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module Origen
|
|
2
|
+
module Tester
|
|
3
|
+
module Parser
|
|
4
|
+
autoload :SearchableArray, 'origen/tester/parser/searchable_array'
|
|
5
|
+
autoload :SearchableHash, 'origen/tester/parser/searchable_hash'
|
|
6
|
+
autoload :DescriptionLookup, 'origen/tester/parser/description_lookup'
|
|
7
|
+
|
|
8
|
+
def parse(*args, &block)
|
|
9
|
+
parser.parse(*args, &block)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Returns a SearchableArray containing all tests parsed from flows, this is intended to
|
|
13
|
+
# be the main API for accessing parsed test program attributes and should be a consistent
|
|
14
|
+
# method that is implemented accross all tester models.
|
|
15
|
+
#
|
|
16
|
+
# Direct access to the underlying structure (which will be specific to the tester model)
|
|
17
|
+
# can be achieved through the parser method, which returns an instance of J750::Parser
|
|
18
|
+
# $tester.parser.test_instances
|
|
19
|
+
def tests
|
|
20
|
+
parser.flow_items
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
module Origen
|
|
2
|
+
module Tester
|
|
3
|
+
# Class for handling test time analysis - implements the functionality
|
|
4
|
+
# exposed via the 'origen time' command
|
|
5
|
+
class Time
|
|
6
|
+
require 'yaml'
|
|
7
|
+
|
|
8
|
+
TT_LIB_DIR = "#{Origen.root}/config/test_time/lib"
|
|
9
|
+
TT_FLOW_DIR = "#{Origen.root}/config/test_time/flow"
|
|
10
|
+
DEFAULT_LIBRARY = "#{TT_LIB_DIR}/default.yaml"
|
|
11
|
+
DEFAULT_FLOW = "#{TT_FLOW_DIR}/default.yaml"
|
|
12
|
+
|
|
13
|
+
# If any new embedded hashes are added to this a default of {} must also be added
|
|
14
|
+
# to the sanitize method
|
|
15
|
+
TEST_META_DATA = { 'rule' => nil,
|
|
16
|
+
'reference' => { 'rule_result' => nil,
|
|
17
|
+
'time' => nil,
|
|
18
|
+
'target' => nil
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
def stats
|
|
23
|
+
@stats ||= { imported: 0, rules_assigned: 0, reference_rules_evaluated: 0 }
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def clear_stats
|
|
27
|
+
@stats = nil
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Import a flow, this can be from either a datalog or an execution time
|
|
31
|
+
def import_test_flow(file, options = {})
|
|
32
|
+
clear_stats
|
|
33
|
+
@options = options
|
|
34
|
+
if Origen.tester.respond_to?('read_test_times')
|
|
35
|
+
tests = Origen.tester.read_test_times(file, options)
|
|
36
|
+
flow = []
|
|
37
|
+
merge_indexed_tests(tests) do |name, _attrs|
|
|
38
|
+
if import?(name)
|
|
39
|
+
Origen.log.info "imported... #{name}"
|
|
40
|
+
flow << name
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
puts ''
|
|
44
|
+
puts 'Import complete!'
|
|
45
|
+
puts ''
|
|
46
|
+
export_flow(flow, options)
|
|
47
|
+
else
|
|
48
|
+
error 'Sorry, no test time import method is defined for the current tester'
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def import_test_time(file, options = {})
|
|
53
|
+
clear_stats
|
|
54
|
+
@options = options
|
|
55
|
+
if Origen.tester.respond_to?('read_test_times')
|
|
56
|
+
tests = Origen.tester.read_test_times(file, options)
|
|
57
|
+
total = extract_total_time(tests)
|
|
58
|
+
flow = []
|
|
59
|
+
library = {}
|
|
60
|
+
imported = 0.0
|
|
61
|
+
merge_indexed_tests(tests) do |name, attrs|
|
|
62
|
+
attrs = sanitize(attrs)
|
|
63
|
+
|
|
64
|
+
if import?(name)
|
|
65
|
+
Origen.log.info "importing... #{name}"
|
|
66
|
+
flow << name
|
|
67
|
+
if library[name]
|
|
68
|
+
library[name] = merge(library[name], attrs)
|
|
69
|
+
else
|
|
70
|
+
library[name] = populate(name, attrs)
|
|
71
|
+
stats[:imported] += 1
|
|
72
|
+
end
|
|
73
|
+
imported += attrs['reference']['time']
|
|
74
|
+
# puts name
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
puts ''
|
|
78
|
+
puts 'Import complete!'
|
|
79
|
+
puts ''
|
|
80
|
+
puts 'Some stats...'
|
|
81
|
+
puts ''
|
|
82
|
+
puts "Tests imported: #{stats[:imported]}"
|
|
83
|
+
puts "Rules assigned: #{stats[:rules_assigned]}"
|
|
84
|
+
puts "Ref rules calculated: #{stats[:reference_rules_evaluated]}"
|
|
85
|
+
puts ''
|
|
86
|
+
puts 'Total time: ' + total.round(6).to_s + 's'
|
|
87
|
+
puts 'Total filtered time: ' + imported.round(6).to_s + 's'
|
|
88
|
+
if stats[:imported] == stats[:rules_assigned]
|
|
89
|
+
puts 'Forecasted: ' + calculate_time(flow, library, options.merge(silent: true)).to_s + 's'
|
|
90
|
+
else
|
|
91
|
+
puts 'Forecasted: SOME TESTS HAVE NO RULES ASSIGNED!'
|
|
92
|
+
end
|
|
93
|
+
puts ''
|
|
94
|
+
export_library(library, options)
|
|
95
|
+
else
|
|
96
|
+
error 'Sorry, no test time import method is defined for the current tester'
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def forecast_test_time(options = {})
|
|
101
|
+
clear_stats
|
|
102
|
+
@options = options
|
|
103
|
+
time = 0.0
|
|
104
|
+
flow = import_flow(input_flow_file(options))
|
|
105
|
+
library = import_library(input_library_file(options))['tests']
|
|
106
|
+
calculate_time(flow, library, options)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def output_library_file(options = {})
|
|
110
|
+
if options[:ref_name]
|
|
111
|
+
"#{TT_LIB_DIR}/#{options[:ref_name]}.yaml"
|
|
112
|
+
else
|
|
113
|
+
DEFAULT_LIBRARY
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def input_library_file(options = {})
|
|
118
|
+
output_library_file(options)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def output_flow_file(options = {})
|
|
122
|
+
if options[:ref_name]
|
|
123
|
+
"#{TT_FLOW_DIR}/#{options[:ref_name]}.yaml"
|
|
124
|
+
else
|
|
125
|
+
DEFAULT_FLOW
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def input_flow_file(options = {})
|
|
130
|
+
output_flow_file(options)
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# Force the imported test data from the tester into a YAML compliant form
|
|
134
|
+
def sanitize(attrs)
|
|
135
|
+
# Force all keys to strings...
|
|
136
|
+
attrs.keys.each do |key|
|
|
137
|
+
begin
|
|
138
|
+
attrs[key.to_s] = attrs.delete(key)
|
|
139
|
+
rescue
|
|
140
|
+
# No problem
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
attrs['reference'] ||= {}
|
|
144
|
+
# attrs["opportunity"] ||= {}
|
|
145
|
+
if attrs['time']
|
|
146
|
+
attrs['reference']['time'] = attrs.delete('time')
|
|
147
|
+
end
|
|
148
|
+
deep_merge(TEST_META_DATA, attrs)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# Populate the attributes based on user specified rules
|
|
152
|
+
def populate(name, attrs, options = {})
|
|
153
|
+
if rules
|
|
154
|
+
r = rules.assign(name, attrs, options)
|
|
155
|
+
if r
|
|
156
|
+
stats[:rules_assigned] += 1
|
|
157
|
+
attrs['rule'] = r
|
|
158
|
+
else
|
|
159
|
+
warn "No rule assigned to: #{name}"
|
|
160
|
+
attrs.delete('rule')
|
|
161
|
+
end
|
|
162
|
+
r = rules.evaluate(name, attrs, options)
|
|
163
|
+
if r
|
|
164
|
+
stats[:reference_rules_evaluated] += 1
|
|
165
|
+
attrs['reference']['rule_result'] = r
|
|
166
|
+
else
|
|
167
|
+
warn "No reference rule result assigned to: #{name}"
|
|
168
|
+
attrs['reference'].delete('rule_result')
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
attrs['reference']['target'] = Origen.target.name
|
|
172
|
+
attrs
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def export_library(lib, options = {})
|
|
176
|
+
tests = {}
|
|
177
|
+
lib.each do |name, attrs|
|
|
178
|
+
tests[name] = attrs
|
|
179
|
+
end
|
|
180
|
+
Origen.file_handler.open_for_write(output_library_file(options)) do |f|
|
|
181
|
+
f.puts YAML.dump('tests' => tests)
|
|
182
|
+
end
|
|
183
|
+
puts "Test library exported to: #{Origen.file_handler.relative_path_to(output_library_file(options))}"
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
def import_library(lib, _options = {})
|
|
187
|
+
YAML.load(File.open(lib))
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
def export_flow(flow, options = {})
|
|
191
|
+
Origen.file_handler.open_for_write(output_flow_file(options)) do |f|
|
|
192
|
+
f.puts YAML.dump(flow)
|
|
193
|
+
end
|
|
194
|
+
puts "Test flow exported to: #{Origen.file_handler.relative_path_to(output_flow_file(options))}"
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
def import_flow(flow, _options = {})
|
|
198
|
+
YAML.load(File.open(flow))
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
# Deep merge two hashes, the first one should be the defaults, the second one will override any
|
|
202
|
+
# items from the defaults
|
|
203
|
+
def deep_merge(hash1, hash2)
|
|
204
|
+
hash1.merge(hash2) do |_key, oldval, newval|
|
|
205
|
+
oldval = oldval.to_hash if oldval.respond_to?(:to_hash)
|
|
206
|
+
newval = newval.to_hash if newval.respond_to?(:to_hash)
|
|
207
|
+
oldval.class.to_s == 'Hash' && newval.class.to_s == 'Hash' ? deep_merge(oldval, newval) : newval
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
# Merge two sets of attributes for the same test, generally this means that the time will
|
|
212
|
+
# be averaged and all other attributes will remain the same
|
|
213
|
+
def merge(t1, t2)
|
|
214
|
+
t1['reference']['time'] = (t1['reference']['time'] + t2['reference']['time']) / 2
|
|
215
|
+
t1
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
# Calculate the time for the given flow, using times from the given library
|
|
219
|
+
def calculate_time(flow, library, options = {})
|
|
220
|
+
options = {
|
|
221
|
+
silent: false,
|
|
222
|
+
summary: false
|
|
223
|
+
}.merge(options)
|
|
224
|
+
unless options[:silent] || options[:summary]
|
|
225
|
+
Origen.log.info 'Test'.ljust(60) + 'Rule'.ljust(40) +
|
|
226
|
+
library.first[1]['reference']['target'].ljust(30) + Origen.target.name
|
|
227
|
+
orig = 0
|
|
228
|
+
end
|
|
229
|
+
forecasted = flow.reduce(0.0) do |sum, test|
|
|
230
|
+
if library[test]['include'] == false || library[test]['exclude'] == true
|
|
231
|
+
sum
|
|
232
|
+
else
|
|
233
|
+
orig += library[test]['reference']['time'] unless options[:silent] || options[:summary]
|
|
234
|
+
forecast = rules.forecast(test, library[test], options)
|
|
235
|
+
unless options[:silent] || options[:summary]
|
|
236
|
+
Origen.log.info test.ljust(60) + library[test]['rule'].to_s.ljust(40) +
|
|
237
|
+
"#{library[test]['reference']['time'].round(6)}".ljust(30) +
|
|
238
|
+
"#{forecast.round(6)}"
|
|
239
|
+
end
|
|
240
|
+
sum + forecast
|
|
241
|
+
end
|
|
242
|
+
end
|
|
243
|
+
if options[:silent]
|
|
244
|
+
forecasted.round(6)
|
|
245
|
+
elsif options[:summary]
|
|
246
|
+
Origen.log.info Origen.target.name.ljust(50) + "#{forecasted.round(6)}"
|
|
247
|
+
else
|
|
248
|
+
Origen.log.info ''
|
|
249
|
+
Origen.log.info ''.ljust(100) + '---------------'.ljust(30) + '---------------'
|
|
250
|
+
Origen.log.info ''.ljust(100) + "#{orig.round(6)}".ljust(30) + "#{forecasted.round(6)}"
|
|
251
|
+
Origen.log.info ''.ljust(100) + '---------------'.ljust(30) + '==============='
|
|
252
|
+
Origen.log.info ''
|
|
253
|
+
end
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
def extract_total_time(tests)
|
|
257
|
+
tests.reduce(0.0) { |sum, test| sum + test[:time] }
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
# This combines the test time from indexed tests and removes the :index and :group keys from all tests.
|
|
261
|
+
#
|
|
262
|
+
# If it is an indexed test then a single hash will be returned containing the total time and the key:
|
|
263
|
+
# {:indexed => true}.
|
|
264
|
+
def merge_indexed_tests(tests)
|
|
265
|
+
ix_counter = false
|
|
266
|
+
ix_group = false
|
|
267
|
+
ix_test = false
|
|
268
|
+
ix_total = false
|
|
269
|
+
|
|
270
|
+
tests.each do |t|
|
|
271
|
+
i = t.delete(:index)
|
|
272
|
+
g = t.delete(:group)
|
|
273
|
+
process = true
|
|
274
|
+
if ix_counter
|
|
275
|
+
if ix_test == t[:name]
|
|
276
|
+
process = false
|
|
277
|
+
warning "Incomplete index data from test: #{ix_test}" if i != ix_counter + 1
|
|
278
|
+
ix_counter = i
|
|
279
|
+
ix_total += t[:time]
|
|
280
|
+
# If the last test in the index
|
|
281
|
+
if i == ix_group
|
|
282
|
+
yield(ix_test, { time: ix_total, indexed: true })
|
|
283
|
+
ix_counter = false
|
|
284
|
+
end
|
|
285
|
+
else
|
|
286
|
+
warning "Incomplete index data from test: #{ix_test}"
|
|
287
|
+
yield(ix_test, { time: ix_total, indexed: true })
|
|
288
|
+
ix_counter = false
|
|
289
|
+
end
|
|
290
|
+
end
|
|
291
|
+
# Don't combine this with the above via an else, it is required to be separate to generate the
|
|
292
|
+
# next entry in the case where an index group was incomplete
|
|
293
|
+
if process
|
|
294
|
+
if i
|
|
295
|
+
# Ignore tests with an invalid index and a very short time, these occur from tests which
|
|
296
|
+
# are in the flow, but have not been executed in this run
|
|
297
|
+
unless i != 1 && t[:time] < 0.0001
|
|
298
|
+
ix_counter = i
|
|
299
|
+
ix_group = g
|
|
300
|
+
ix_test = t[:name]
|
|
301
|
+
ix_total = t[:time]
|
|
302
|
+
warning "Incomplete index data from test: #{t[:name]}" if ix_counter != 1
|
|
303
|
+
end
|
|
304
|
+
else
|
|
305
|
+
yield t.delete(:name), t
|
|
306
|
+
end
|
|
307
|
+
end
|
|
308
|
+
end
|
|
309
|
+
end
|
|
310
|
+
|
|
311
|
+
def import?(test)
|
|
312
|
+
if filter
|
|
313
|
+
filter.import?(test)
|
|
314
|
+
else
|
|
315
|
+
true
|
|
316
|
+
end
|
|
317
|
+
end
|
|
318
|
+
|
|
319
|
+
def filter
|
|
320
|
+
return @filter if defined?(@filter)
|
|
321
|
+
if defined?(TestTimeFilter)
|
|
322
|
+
@filter = TestTimeFilter.new
|
|
323
|
+
else
|
|
324
|
+
@filter = false
|
|
325
|
+
end
|
|
326
|
+
end
|
|
327
|
+
|
|
328
|
+
def rules
|
|
329
|
+
return @rules if defined?(@rules)
|
|
330
|
+
if defined?(TestTimeRules)
|
|
331
|
+
@rules = TestTimeRules.new
|
|
332
|
+
else
|
|
333
|
+
@rules = false
|
|
334
|
+
end
|
|
335
|
+
end
|
|
336
|
+
end
|
|
337
|
+
end
|
|
338
|
+
end
|