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
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
module Origen
|
|
2
|
+
module Tester
|
|
3
|
+
class Ultraflex
|
|
4
|
+
class Parser
|
|
5
|
+
# Extracts embedded test and flow descriptions (comments) from test
|
|
6
|
+
# program source files
|
|
7
|
+
class Descriptions
|
|
8
|
+
require 'fileutils'
|
|
9
|
+
|
|
10
|
+
attr_accessor :source_directories, :template_directories, :parser
|
|
11
|
+
|
|
12
|
+
SCRATCH_DIR = "#{Origen.root}/.j750_scratch"
|
|
13
|
+
|
|
14
|
+
# All descriptions are stored in this lookup table
|
|
15
|
+
def lookup
|
|
16
|
+
return @lookup if @lookup
|
|
17
|
+
# Use the one from the interface if present, program generation will
|
|
18
|
+
# automatically push descriptions in here
|
|
19
|
+
if Origen.interface_present?
|
|
20
|
+
@lookup = Origen.interface.descriptions
|
|
21
|
+
else
|
|
22
|
+
@lookup = Origen::Tester::Parser::DescriptionLookup.new
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def initialize(options = {})
|
|
27
|
+
@parser = options[:parser]
|
|
28
|
+
FileUtils.rm_rf(SCRATCH_DIR) if File.exist?(SCRATCH_DIR)
|
|
29
|
+
parse_program
|
|
30
|
+
true
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Returns the description for the given flow
|
|
34
|
+
def flow_summary(options = {})
|
|
35
|
+
lookup.for_flow(options[:file])
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Returns the description of the given test from the test
|
|
39
|
+
# instance sheet declaration
|
|
40
|
+
def test_instance(options = {})
|
|
41
|
+
lookup.for_test_definition(options[:name])
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Returns the description of the given test from the test
|
|
45
|
+
# flow
|
|
46
|
+
def flow_line(options = {})
|
|
47
|
+
lookup.for_test_usage(options[:name], options[:flow])
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def parse_program
|
|
51
|
+
Origen.file_handler.preserve_state do
|
|
52
|
+
generate_program_files
|
|
53
|
+
# Comments must be extracted manually for any compiled files, for
|
|
54
|
+
# generated files the comments will already be in the lookup
|
|
55
|
+
extract_flow_summaries
|
|
56
|
+
extract_test_instance_descriptions
|
|
57
|
+
extract_flow_line_descriptions
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def source_directories
|
|
62
|
+
[@source_directories, Origen.config.test_program_source_directory].compact.flatten
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def template_directories
|
|
66
|
+
[@template_directories, Origen.config.test_program_template_directory].compact.flatten
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def extract_flow_summaries
|
|
70
|
+
Origen.file_handler.resolve_files(compiled_dir) do |file|
|
|
71
|
+
if flow_file?(file)
|
|
72
|
+
lookup.add_for_flow(file, parse_flow_summary(file))
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Parses a compiled template for marked up comments
|
|
78
|
+
def extract_test_instance_descriptions
|
|
79
|
+
Origen.file_handler.resolve_files(compiled_dir) do |file|
|
|
80
|
+
if instance_file?(file)
|
|
81
|
+
comments = []
|
|
82
|
+
File.readlines(file).each do |line|
|
|
83
|
+
if line =~ /^<comment>(.*)/
|
|
84
|
+
comments << Regexp.last_match[1].gsub("\r", '')
|
|
85
|
+
else
|
|
86
|
+
fields = line.split("\t")
|
|
87
|
+
unless ['Test Instances', '', 'Test Name'].include? fields[1]
|
|
88
|
+
lookup.add_for_test_definition(fields[1], comments)
|
|
89
|
+
end
|
|
90
|
+
comments = []
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def extract_flow_line_descriptions
|
|
98
|
+
Origen.file_handler.resolve_files(compiled_dir) do |file|
|
|
99
|
+
if flow_file?(file)
|
|
100
|
+
f = file.basename('.txt').to_s
|
|
101
|
+
comments = []
|
|
102
|
+
header_line = true
|
|
103
|
+
File.readlines(file).each do |line|
|
|
104
|
+
if header_line
|
|
105
|
+
header_line = false if line =~ /^\s*Label/
|
|
106
|
+
else
|
|
107
|
+
if line =~ /^<comment>(.*)/
|
|
108
|
+
comments << Regexp.last_match[1].gsub("\r", '')
|
|
109
|
+
else
|
|
110
|
+
t = FlowLine.extract_test(line)
|
|
111
|
+
if t
|
|
112
|
+
lookup.add_for_test_usage(t, file, comments)
|
|
113
|
+
end
|
|
114
|
+
comments = []
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def generate_program_files
|
|
123
|
+
a = generate_program
|
|
124
|
+
b = compile_program
|
|
125
|
+
unless a || b
|
|
126
|
+
fail 'No source or template files declared from which to parse descriptions!'
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
# Parses the given flow file for summary text and returns it, summary
|
|
131
|
+
# text must be the very first thing in the file.
|
|
132
|
+
# Returns an array of strings each representing a line of text.
|
|
133
|
+
def parse_flow_summary(file)
|
|
134
|
+
desc = []
|
|
135
|
+
File.readlines(file).each do |line|
|
|
136
|
+
if line =~ /%?\s*<comment>(.*)/
|
|
137
|
+
desc << Regexp.last_match[1].gsub("\r", '')
|
|
138
|
+
else
|
|
139
|
+
break
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
desc
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# Generate a scratch version of the program for parsing
|
|
146
|
+
def generate_program
|
|
147
|
+
if source_directories.size > 0
|
|
148
|
+
unless @program_generated
|
|
149
|
+
Origen.log.info ''
|
|
150
|
+
Origen.log.info 'Extracting embedded comments:'
|
|
151
|
+
Origen.log.info ''
|
|
152
|
+
copy_source_files_to_scratch
|
|
153
|
+
markup_source_file_comments
|
|
154
|
+
# Compile the flow file, with Ruby comments now preserved and marked up
|
|
155
|
+
desc = Origen.app.runner.generate(program: true, patterns: ungenerated_dir, output: generated_dir,
|
|
156
|
+
check_for_changes: false, collect_stats: false, quiet: true,
|
|
157
|
+
collect_descriptions: true)
|
|
158
|
+
Origen.log.info ''
|
|
159
|
+
end
|
|
160
|
+
@program_generated = true
|
|
161
|
+
else
|
|
162
|
+
false
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
# Compile a scratch version of the program for parsing
|
|
167
|
+
def compile_program
|
|
168
|
+
if template_directories.size > 0
|
|
169
|
+
unless @program_compiled
|
|
170
|
+
Origen.log.info ''
|
|
171
|
+
Origen.log.info 'Extracting embedded comments:'
|
|
172
|
+
Origen.log.info ''
|
|
173
|
+
copy_templates_to_scratch
|
|
174
|
+
markup_template_comments
|
|
175
|
+
# Compile the flow file, with Ruby comments now preserved and marked up
|
|
176
|
+
Origen.app.runner.generate(compile: true, patterns: uncompiled_dir, output: compiled_dir,
|
|
177
|
+
check_for_changes: false, collect_stats: false, quiet: true)
|
|
178
|
+
Origen.log.info ''
|
|
179
|
+
end
|
|
180
|
+
@program_compiled = true
|
|
181
|
+
else
|
|
182
|
+
false
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
# Copy all flow and instance template files to the scratch dir
|
|
187
|
+
def copy_templates_to_scratch
|
|
188
|
+
uncompiled_dir(true)
|
|
189
|
+
template_directories.each do |dir|
|
|
190
|
+
Origen.file_handler.resolve_files(dir) do |file|
|
|
191
|
+
subdir = file.relative_path_from(Pathname.new(dir)).dirname.to_s
|
|
192
|
+
cpydir = "#{uncompiled_dir}/#{subdir}"
|
|
193
|
+
FileUtils.mkdir_p(cpydir) unless File.exist?(cpydir)
|
|
194
|
+
FileUtils.copy(file, cpydir) if flow_or_instance_file?(file)
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
`chmod -R 777 #{uncompiled_dir}/*` unless Dir["#{uncompiled_dir}/*"].empty?
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
# Copy all flow and instance source files to the scratch dir
|
|
201
|
+
def copy_source_files_to_scratch
|
|
202
|
+
source_directories.each do |dir|
|
|
203
|
+
Origen.file_handler.resolve_files(dir) do |file|
|
|
204
|
+
subdir = file.relative_path_from(Pathname.new(dir)).dirname.to_s
|
|
205
|
+
cpydir = "#{ungenerated_dir}/#{subdir}"
|
|
206
|
+
FileUtils.mkdir_p(cpydir) unless File.exist?(cpydir)
|
|
207
|
+
FileUtils.copy(file, cpydir)
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
def uncompiled_dir(force_make = false)
|
|
213
|
+
@uncompiled_dir ||= "#{SCRATCH_DIR}/uncompiled"
|
|
214
|
+
if force_make
|
|
215
|
+
FileUtils.rm_rf(@uncompiled_dir) if File.exist?(@uncompiled_dir)
|
|
216
|
+
@uncompiled_dir_created = false
|
|
217
|
+
end
|
|
218
|
+
unless @uncompiled_dir_created
|
|
219
|
+
FileUtils.mkdir_p(@uncompiled_dir) unless File.exist?(@uncompiled_dir)
|
|
220
|
+
@uncompiled_dir_created = true
|
|
221
|
+
end
|
|
222
|
+
@uncompiled_dir
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
def ungenerated_dir
|
|
226
|
+
@ungenerated_dir ||= "#{SCRATCH_DIR}/ungenerated"
|
|
227
|
+
unless @ungenerated_dir_created
|
|
228
|
+
FileUtils.mkdir_p(@ungenerated_dir) unless File.exist?(@ungenerated_dir)
|
|
229
|
+
@ungenerated_dir_created = true
|
|
230
|
+
end
|
|
231
|
+
@ungenerated_dir
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
def compiled_dir
|
|
235
|
+
@compiled_dir ||= "#{SCRATCH_DIR}/compiled"
|
|
236
|
+
unless @compiled_dir_created
|
|
237
|
+
FileUtils.mkdir_p(@compiled_dir) unless File.exist?(@compiled_dir)
|
|
238
|
+
@compiled_dir_created = true
|
|
239
|
+
end
|
|
240
|
+
@compiled_dir
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
def generated_dir
|
|
244
|
+
@generated_dir ||= "#{SCRATCH_DIR}/generated"
|
|
245
|
+
unless @generated_dir_created
|
|
246
|
+
FileUtils.mkdir_p(@generated_dir) unless File.exist?(@generated_dir)
|
|
247
|
+
@generated_dir_created = true
|
|
248
|
+
end
|
|
249
|
+
@generated_dir
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
# Returns true if the given file looks like a Ultraflex flow file, works for
|
|
253
|
+
# templates to
|
|
254
|
+
def flow_or_instance_file?(file, options = {})
|
|
255
|
+
options = { flow: true,
|
|
256
|
+
instance: true
|
|
257
|
+
}.merge(options)
|
|
258
|
+
if options[:flow] && options[:instance]
|
|
259
|
+
match = 'Flow|Instances'
|
|
260
|
+
elsif options[:flow]
|
|
261
|
+
match = 'Flow'
|
|
262
|
+
else
|
|
263
|
+
match = 'Instances'
|
|
264
|
+
end
|
|
265
|
+
# Not sure the best way to determine the file type of a partial, just
|
|
266
|
+
# return true for now to play it safe
|
|
267
|
+
return true if file.basename.to_s =~ /^_/
|
|
268
|
+
File.readlines(file).each do |line|
|
|
269
|
+
begin
|
|
270
|
+
unless line =~ /^%/ || line =~ /^\s*<comment>/
|
|
271
|
+
return !!(line =~ /#{match}/)
|
|
272
|
+
end
|
|
273
|
+
rescue Exception => e
|
|
274
|
+
if e.is_a?(ArgumentError) && e.message =~ /invalid byte sequence/
|
|
275
|
+
return false
|
|
276
|
+
else
|
|
277
|
+
puts e.message
|
|
278
|
+
puts e.backtrace
|
|
279
|
+
exit 1
|
|
280
|
+
end
|
|
281
|
+
end
|
|
282
|
+
end
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
def flow_file?(file)
|
|
286
|
+
flow_or_instance_file?(file, instance: false)
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
def instance_file?(file)
|
|
290
|
+
flow_or_instance_file?(file, flow: false)
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
# Substitute Ruby line comments so they are preserved by compilation
|
|
294
|
+
def markup_template_comments
|
|
295
|
+
Origen.file_handler.resolve_files(uncompiled_dir) do |file|
|
|
296
|
+
lines = File.readlines(file)
|
|
297
|
+
File.open(file, 'w') do |f|
|
|
298
|
+
lines.each do |line|
|
|
299
|
+
if line =~ /^%\s*#\s?(.*)/ # Remove single leading whitespace from comment if it exists
|
|
300
|
+
comment = Regexp.last_match[1]
|
|
301
|
+
# If comment starts with a '#-' it should be removed by compilation
|
|
302
|
+
if line =~ /^%\s*#-.*/
|
|
303
|
+
f.write line
|
|
304
|
+
# Otherwise preserve it
|
|
305
|
+
else
|
|
306
|
+
f.write "<comment>#{comment}\n"
|
|
307
|
+
end
|
|
308
|
+
else
|
|
309
|
+
f.write line
|
|
310
|
+
end
|
|
311
|
+
end
|
|
312
|
+
end
|
|
313
|
+
end
|
|
314
|
+
end
|
|
315
|
+
|
|
316
|
+
# Substitute Ruby line comments so they are preserved by generation
|
|
317
|
+
def markup_source_file_comments
|
|
318
|
+
Origen.file_handler.resolve_files(ungenerated_dir) do |file|
|
|
319
|
+
lines = File.readlines(file)
|
|
320
|
+
File.open(file, 'w') do |f|
|
|
321
|
+
lines.each do |line|
|
|
322
|
+
if line =~ /^\s*#\s?(.*)/ # Remove single leading whitespace from comment if it exists
|
|
323
|
+
comment = Regexp.last_match[1]
|
|
324
|
+
# If comment starts with a '#-' it should be removed by generation
|
|
325
|
+
if line =~ /^\s*#-.*/
|
|
326
|
+
f.write line
|
|
327
|
+
# Otherwise preserve it
|
|
328
|
+
else
|
|
329
|
+
f.write "Origen.interface.comment '#{comment}'\n"
|
|
330
|
+
end
|
|
331
|
+
else
|
|
332
|
+
f.write line
|
|
333
|
+
end
|
|
334
|
+
end
|
|
335
|
+
end
|
|
336
|
+
end
|
|
337
|
+
end
|
|
338
|
+
end
|
|
339
|
+
end
|
|
340
|
+
end
|
|
341
|
+
end
|
|
342
|
+
end
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
module Origen
|
|
2
|
+
module Tester
|
|
3
|
+
class Ultraflex
|
|
4
|
+
class Parser
|
|
5
|
+
class Flow < Origen::Tester::Parser::SearchableArray
|
|
6
|
+
require 'pathname'
|
|
7
|
+
|
|
8
|
+
attr_accessor :parser, :file
|
|
9
|
+
|
|
10
|
+
def initialize(file, options = {}) # :nodoc:
|
|
11
|
+
@parser = options[:parser]
|
|
12
|
+
@file = Pathname.new(file)
|
|
13
|
+
parse
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def description
|
|
17
|
+
@parser.descriptions.flow_summary(file: file)
|
|
18
|
+
end
|
|
19
|
+
alias_method :summary, :description
|
|
20
|
+
|
|
21
|
+
# Returns the filename of the sheet that contained the current flow
|
|
22
|
+
def filename
|
|
23
|
+
@file.basename.to_s
|
|
24
|
+
end
|
|
25
|
+
alias_method :name, :filename
|
|
26
|
+
|
|
27
|
+
# Returns all flow lines that are tests, optionally supply a context to
|
|
28
|
+
# have only the test that will execute in that context returned
|
|
29
|
+
#
|
|
30
|
+
# $tester.flow.first.tests.size
|
|
31
|
+
# => 20
|
|
32
|
+
# $tester.flow.first.tests(:job => "P1").size
|
|
33
|
+
# => 10
|
|
34
|
+
# $tester.flow.first.tests(:job => "P1", :enable => "data_collection").size
|
|
35
|
+
# => 15
|
|
36
|
+
def tests(context = {})
|
|
37
|
+
run_context(context)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Returns all tests in the current flow, regardless of context
|
|
41
|
+
def all_tests
|
|
42
|
+
where(opcode: %w(Test characterize), exact: true)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def run_context(context) # :nodoc:
|
|
46
|
+
capture = true
|
|
47
|
+
waiting_for_label = false
|
|
48
|
+
select do |line|
|
|
49
|
+
if capture
|
|
50
|
+
if !waiting_for_label || waiting_for_label == line.label
|
|
51
|
+
waiting_for_label = false
|
|
52
|
+
case line.type
|
|
53
|
+
when 'Test', 'characterize'
|
|
54
|
+
line.executes_under_context?(context)
|
|
55
|
+
when 'set-device', 'stop'
|
|
56
|
+
capture = false if line.executes_under_context?(context)
|
|
57
|
+
false
|
|
58
|
+
when 'enable-flow-word'
|
|
59
|
+
if line.executes_under_context?(context)
|
|
60
|
+
context[:enable] = [context[:enable]].flatten
|
|
61
|
+
context[:enable] << line.parameter
|
|
62
|
+
end
|
|
63
|
+
false
|
|
64
|
+
when 'flag-true'
|
|
65
|
+
if line.executes_under_context?(context)
|
|
66
|
+
context[:true_flags] = [context[:true_flags]].flatten
|
|
67
|
+
context[:true_flags] << line.parameter
|
|
68
|
+
end
|
|
69
|
+
false
|
|
70
|
+
when 'flag-false'
|
|
71
|
+
if line.executes_under_context?(context)
|
|
72
|
+
context[:false_flags] = [context[:false_flags]].flatten
|
|
73
|
+
context[:false_flags] << line.parameter
|
|
74
|
+
end
|
|
75
|
+
false
|
|
76
|
+
when 'disable-flow-word'
|
|
77
|
+
if line.executes_under_context?(context)
|
|
78
|
+
context[:enable] = [context[:enable]].flatten
|
|
79
|
+
context[:enable].delete(line.parameter)
|
|
80
|
+
end
|
|
81
|
+
false
|
|
82
|
+
when 'logprint', 'nop', 'print'
|
|
83
|
+
false
|
|
84
|
+
when 'goto'
|
|
85
|
+
waiting_for_label = line.parameter
|
|
86
|
+
false
|
|
87
|
+
else
|
|
88
|
+
fail "Don't know how to process: #{line.type}, in file #{filename}"
|
|
89
|
+
end
|
|
90
|
+
else
|
|
91
|
+
false
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def parse # :nodoc:
|
|
98
|
+
File.readlines(@file).each do |line|
|
|
99
|
+
l = FlowLine.new(line, parser: parser, flow: self)
|
|
100
|
+
self << l if l.valid?
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def inspect # :nodoc:
|
|
105
|
+
"<TestFlow: #{filename}, Lines: #{size}>"
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
module Origen
|
|
2
|
+
module Tester
|
|
3
|
+
class Ultraflex
|
|
4
|
+
class Parser
|
|
5
|
+
class FlowLine
|
|
6
|
+
attr_accessor :parser, :flow, :line
|
|
7
|
+
|
|
8
|
+
TYPES = %w(
|
|
9
|
+
Test characterize defaults enable-flow-word disable-flow-word error-print goto
|
|
10
|
+
goto-on-all-done goto-on-all-lastfail goto-on-all-lastfaildoall logprint modify
|
|
11
|
+
nop print reset set-device set-device-new set-error-bin set-retest-bin skip
|
|
12
|
+
stop assign-integer create-integer delete-integer create-site-var assign-site-var
|
|
13
|
+
flag-clear flag-clear-all flag-false flag-false-all flag-true flag-true-all
|
|
14
|
+
state-clear-all state-false-all state-true-all
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
ATTRS = %w(
|
|
18
|
+
label enable job part env opcode parameter
|
|
19
|
+
tname tnum bin_pass bin_fail sort_pass sort_fail result flag_pass
|
|
20
|
+
flag_fail state group_specifier group_sense group_condition group_name
|
|
21
|
+
device_sense device_condition device_name debug_assume debug_sites
|
|
22
|
+
comment
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
ALIASES = {
|
|
26
|
+
bin: :bin_fail,
|
|
27
|
+
softbin: :sort_fail,
|
|
28
|
+
soft_bin: :sort_fail,
|
|
29
|
+
name: :tname,
|
|
30
|
+
number: :tnum,
|
|
31
|
+
test_number: :tnum,
|
|
32
|
+
test_num: :tnum,
|
|
33
|
+
type: :opcode
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
# Make readers for each low level attribute
|
|
37
|
+
ATTRS.each do |attr|
|
|
38
|
+
attr_reader attr
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# And the aliases
|
|
42
|
+
ALIASES.each do |_alias, attr|
|
|
43
|
+
define_method("#{_alias}") do
|
|
44
|
+
send(attr)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Returns the test instance called by the given line or nil
|
|
49
|
+
def self.extract_test(line)
|
|
50
|
+
l = new(line)
|
|
51
|
+
if l.valid? && l.test?
|
|
52
|
+
l.test_instance_name
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def initialize(line, options = {})
|
|
57
|
+
@parser = options[:parser]
|
|
58
|
+
@flow = options[:flow]
|
|
59
|
+
@line = line
|
|
60
|
+
parse
|
|
61
|
+
if valid?
|
|
62
|
+
ATTRS.each_with_index do |attr, i|
|
|
63
|
+
instance_variable_set("@#{attr}", components[i + 1])
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def inspect # :nodoc:
|
|
69
|
+
"<FlowLine: #{type}, Parameter: #{parameter}>"
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def description
|
|
73
|
+
from_instance = test_instance ? test_instance.description : ''
|
|
74
|
+
from_flow = parser.descriptions.flow_line(name: test_instance_name, flow: flow.file)
|
|
75
|
+
if !from_instance.empty? && !from_flow.empty?
|
|
76
|
+
[from_instance, "\n", from_flow].flatten
|
|
77
|
+
elsif from_instance.empty?
|
|
78
|
+
from_flow
|
|
79
|
+
else
|
|
80
|
+
from_instance
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def parse
|
|
85
|
+
@components = @line.split("\t") unless @line.strip.empty?
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def valid?
|
|
89
|
+
components[6] && TYPES.include?(components[6])
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def components
|
|
93
|
+
@components ||= []
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def test?
|
|
97
|
+
%w(Test characterize).include? opcode
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def executes_under_context?(context)
|
|
101
|
+
enable_conditions_met?(context) &&
|
|
102
|
+
job_conditions_met?(context) &&
|
|
103
|
+
part_conditions_met?(context) &&
|
|
104
|
+
env_conditions_met?(context)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def enable_conditions_met?(context)
|
|
108
|
+
conditions_met?(enable, context[:enable])
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def job_conditions_met?(context)
|
|
112
|
+
conditions_met?(job, context[:job])
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def part_conditions_met?(context)
|
|
116
|
+
conditions_met?(part, context[:part])
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def env_conditions_met?(context)
|
|
120
|
+
conditions_met?(env, context[:env])
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def conditions_met?(conditions, values)
|
|
124
|
+
if conditions.empty?
|
|
125
|
+
true
|
|
126
|
+
else
|
|
127
|
+
values = [values].flatten
|
|
128
|
+
conditions = conditions.split(',').map(&:strip)
|
|
129
|
+
not_conditions = conditions.select { |c| c =~ /^!/ }
|
|
130
|
+
conditions = conditions - not_conditions
|
|
131
|
+
# Make sure all -ve conditions are not met
|
|
132
|
+
if not_conditions.all? do |c|
|
|
133
|
+
c =~ /^!(.*)/
|
|
134
|
+
c = Regexp.last_match[1]
|
|
135
|
+
!values.include?(c)
|
|
136
|
+
end
|
|
137
|
+
# And then any +ve conditions
|
|
138
|
+
if conditions.empty?
|
|
139
|
+
true
|
|
140
|
+
else
|
|
141
|
+
values.any? { |v| conditions.include?(v) }
|
|
142
|
+
end
|
|
143
|
+
else
|
|
144
|
+
false
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def test_instance_name
|
|
150
|
+
parameter
|
|
151
|
+
end
|
|
152
|
+
alias_method :instance_name, :test_instance_name
|
|
153
|
+
|
|
154
|
+
def test_instance
|
|
155
|
+
instances = parser.test_instances.where(name: parameter, exact: true)
|
|
156
|
+
if instances.size > 1
|
|
157
|
+
puts "Warning multiple instances of #{name} found, using the first one"
|
|
158
|
+
end
|
|
159
|
+
if instances.size == 0
|
|
160
|
+
nil
|
|
161
|
+
else
|
|
162
|
+
instances.first
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
alias_method :instance, :test_instance
|
|
166
|
+
|
|
167
|
+
# Returns an array of patterns used by the given test, if there are none
|
|
168
|
+
# an empty array is returned.
|
|
169
|
+
# Optionally supply patterns to exclude if you want to ignore common subroutine
|
|
170
|
+
# patterns for example.
|
|
171
|
+
def patterns(options = {})
|
|
172
|
+
i = test_instance
|
|
173
|
+
if i
|
|
174
|
+
pats = i.patterns
|
|
175
|
+
if options[:ignore] && pats
|
|
176
|
+
pats.reject { |p| [options[:ignore]].flatten.include?(p) }
|
|
177
|
+
else
|
|
178
|
+
[]
|
|
179
|
+
end
|
|
180
|
+
else
|
|
181
|
+
[]
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
alias_method :pattern, :patterns
|
|
185
|
+
|
|
186
|
+
# Returns a string summarizing any conditions (enable words, jobs, etc.) that
|
|
187
|
+
# gate the execution of this line
|
|
188
|
+
def conditions
|
|
189
|
+
c = []
|
|
190
|
+
c << "Enable: #{enable}" unless enable.empty?
|
|
191
|
+
c << "Job: #{job}" unless job.empty?
|
|
192
|
+
c << "Part: #{part}" unless part.empty?
|
|
193
|
+
c << "Env: #{env}" unless env.empty?
|
|
194
|
+
c.join('; ')
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
def vdd
|
|
198
|
+
i = test_instance
|
|
199
|
+
if i
|
|
200
|
+
i.vdd
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module Origen
|
|
2
|
+
module Tester
|
|
3
|
+
class Ultraflex
|
|
4
|
+
class Parser
|
|
5
|
+
class Flows < Origen::Tester::Parser::SearchableArray
|
|
6
|
+
attr_accessor :parser
|
|
7
|
+
|
|
8
|
+
def initialize(options = {})
|
|
9
|
+
@parser = options[:parser]
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def import(file)
|
|
13
|
+
self << Flow.new(file, parser: parser)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def inspect
|
|
17
|
+
"<TestFlows: #{size}>"
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|