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,277 @@
|
|
|
1
|
+
module Origen
|
|
2
|
+
class Generator
|
|
3
|
+
class Compiler # :nodoc: all
|
|
4
|
+
require 'fileutils'
|
|
5
|
+
require 'erb'
|
|
6
|
+
require 'pathname'
|
|
7
|
+
require "#{Origen.top}/helpers/url"
|
|
8
|
+
|
|
9
|
+
include Helpers
|
|
10
|
+
include Comparator
|
|
11
|
+
include Renderer
|
|
12
|
+
|
|
13
|
+
# During a compile this will return the current top-level file being compiled
|
|
14
|
+
#
|
|
15
|
+
# @example
|
|
16
|
+
# Origen.generator.compiler.current_file # => Pathname
|
|
17
|
+
attr_reader :current_file
|
|
18
|
+
|
|
19
|
+
# Where compile will place the compiled content in an output file, this method will return
|
|
20
|
+
# it as a string to the caller (i.e. without creating an output file)
|
|
21
|
+
#
|
|
22
|
+
# It expects an absolute path to a single template file as the file argument.
|
|
23
|
+
def compile_inline(file, options = {})
|
|
24
|
+
initial_options = options.merge({})
|
|
25
|
+
options = {
|
|
26
|
+
check_for_changes: false,
|
|
27
|
+
sub_template: false,
|
|
28
|
+
collect_stats: false,
|
|
29
|
+
initial_options: initial_options
|
|
30
|
+
}.merge(options)
|
|
31
|
+
run_erb(Pathname.new(file), options).strip
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Compile all files found under the source directory, non-erb files will be copied
|
|
35
|
+
# to the destination un-altered
|
|
36
|
+
def compile(file_or_dir, options = {})
|
|
37
|
+
options = {
|
|
38
|
+
check_for_changes: true,
|
|
39
|
+
sub_template: false,
|
|
40
|
+
collect_stats: true
|
|
41
|
+
}.merge(options)
|
|
42
|
+
# Doing here so the output_directory (requiring target load) doesn't get hit if
|
|
43
|
+
# it is already defined
|
|
44
|
+
options[:output_directory] ||= output_directory
|
|
45
|
+
@check_for_changes = options[:check_for_changes]
|
|
46
|
+
@options = options
|
|
47
|
+
if options[:sub_template]
|
|
48
|
+
block = options.delete(:block)
|
|
49
|
+
if is_erb?(file_or_dir)
|
|
50
|
+
run_erb(file_or_dir, options, &block)
|
|
51
|
+
else
|
|
52
|
+
f = File.open(file_or_dir)
|
|
53
|
+
content = f.read
|
|
54
|
+
f.close
|
|
55
|
+
insert(content)
|
|
56
|
+
end
|
|
57
|
+
else
|
|
58
|
+
Origen.file_handler.resolve_files(file_or_dir, ignore_with_prefix: '_', import: :template) do |file|
|
|
59
|
+
compile_file(file, options)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def merge(file_or_dir, options = {})
|
|
65
|
+
# Compile an up to date reference
|
|
66
|
+
compile(file_or_dir_path, check_for_changes: false, output_directory: merge_reference_directory)
|
|
67
|
+
diffs = []
|
|
68
|
+
Origen.file_handler.resolve_files(file_or_dir, ignore_with_prefix: '_') do |file|
|
|
69
|
+
diffs << merge_file(file, options)
|
|
70
|
+
end
|
|
71
|
+
diffs.compact!
|
|
72
|
+
puts ''
|
|
73
|
+
if diffs.size > 0
|
|
74
|
+
puts 'The following differences are present in the compiled files and must be resolved manually:'
|
|
75
|
+
puts ''
|
|
76
|
+
diffs.each do |diff|
|
|
77
|
+
puts diff
|
|
78
|
+
end
|
|
79
|
+
puts ''
|
|
80
|
+
else
|
|
81
|
+
puts 'Merged successfully!'
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def stats
|
|
86
|
+
Origen.app.stats
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Compile the supplied file if it is an erb template writing the compiled
|
|
90
|
+
# version to the destination directory.
|
|
91
|
+
# If the file is not an erb template it is simply copied un-altered to the
|
|
92
|
+
# destination directory.
|
|
93
|
+
# File must be an absolute path to the file.
|
|
94
|
+
def compile_file(file, options = {})
|
|
95
|
+
@current_file = Pathname.new(file)
|
|
96
|
+
# This is used when templates are compiled through a test program, but can
|
|
97
|
+
# be problematic when used to compile files standalone. In practice this may
|
|
98
|
+
# not be an issue except when testing Origen and generating and compiling within
|
|
99
|
+
# the same thread, but clearing this here doesn't seem to do any harm.
|
|
100
|
+
Origen.file_handler.default_extension = nil
|
|
101
|
+
Origen.log.info "Compiling... #{relative_path_to(file)}" unless options[:quiet]
|
|
102
|
+
Origen.log.info " Created... #{relative_path_to(output_file(file, options))}" unless options[:quiet]
|
|
103
|
+
stats.completed_files += 1 if options[:collect_stats]
|
|
104
|
+
if is_erb?(file)
|
|
105
|
+
output = run_erb(file, options)
|
|
106
|
+
f = output_file(file, options).to_s
|
|
107
|
+
if output.is_a?(Pathname)
|
|
108
|
+
FileUtils.mv output.to_s, f
|
|
109
|
+
else
|
|
110
|
+
File.open(f, 'w') { |out| out.puts output }
|
|
111
|
+
end
|
|
112
|
+
else # Just copy it across
|
|
113
|
+
out = output_file(file, options)
|
|
114
|
+
# Delete the target if it already exists, this prevents permission denied errors when copying
|
|
115
|
+
FileUtils.rm_f(out.to_s) if File.exist?(out.to_s)
|
|
116
|
+
FileUtils.cp(file.to_s, out.dirname.to_s)
|
|
117
|
+
end
|
|
118
|
+
if options[:zip]
|
|
119
|
+
`gzip -f -9 #{output_file(file, options)}`
|
|
120
|
+
else
|
|
121
|
+
if @check_for_changes
|
|
122
|
+
check_for_changes(output_file(file, options), reference_file(file, options),
|
|
123
|
+
comment_char: Origen.app.tester ? Origen.app.tester.program_comment_char : nil,
|
|
124
|
+
compile_job: true)
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def run_erb(file, opts = {}, &block)
|
|
130
|
+
# Refresh the target to start all settings from scratch each time
|
|
131
|
+
# This is an easy way to reset all registered values
|
|
132
|
+
Origen.app.reload_target! unless options[:preserve_target]
|
|
133
|
+
# Record the current file, this can be used to resolve any relative path
|
|
134
|
+
# references in the file about to be compiled
|
|
135
|
+
Origen.file_handler.current_file = file
|
|
136
|
+
# Make the file and options available to the template
|
|
137
|
+
if opts[:initial_options] || opts[:options]
|
|
138
|
+
options.merge!(opts.delete(:initial_options) || opts.delete(:options))
|
|
139
|
+
end
|
|
140
|
+
options[:file] = file
|
|
141
|
+
options[:top_level_file] = current_file
|
|
142
|
+
b = _get_binding(opts, &block)
|
|
143
|
+
if block_given?
|
|
144
|
+
content = ERB.new(File.read(file.to_s), 0, '%<>', buffer_name_for(file)).result(b)
|
|
145
|
+
else
|
|
146
|
+
content = ERB.new(File.read(file.to_s), 0, Origen.config.erb_trim_mode, buffer_name_for(file)).result(b)
|
|
147
|
+
end
|
|
148
|
+
insert(content)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# @api private
|
|
152
|
+
def _get_binding(opts, &block)
|
|
153
|
+
# Important, don't declare any local variable called options here,
|
|
154
|
+
# the scope of this method will be the default for any templates and
|
|
155
|
+
# we want options to refer to the global options method
|
|
156
|
+
b = opts[:binding] || opts[:scope] || binding
|
|
157
|
+
# If an object has been supplied as the scope, then do some tricks
|
|
158
|
+
# to get a hold of its internal scope
|
|
159
|
+
unless b.is_a?(Binding)
|
|
160
|
+
b.define_singleton_method :_get_binding do |local_opts, &_block|
|
|
161
|
+
# rubocop:disable Lint/UselessAssignment
|
|
162
|
+
options = local_opts
|
|
163
|
+
# rubocop:enable Lint/UselessAssignment
|
|
164
|
+
binding
|
|
165
|
+
end
|
|
166
|
+
# Here the global options, the ones visible right now, are passed to into the method defined above,
|
|
167
|
+
# they will get assigned to the local variable called option and that is what the template will
|
|
168
|
+
# be able to see
|
|
169
|
+
b = b._get_binding(options, &block)
|
|
170
|
+
end
|
|
171
|
+
b
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def current_buffer
|
|
175
|
+
instance_variable_get(@current_buffer || '@_anonymous')
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def current_buffer=(text)
|
|
179
|
+
instance_variable_set(@current_buffer || '@_anonymous', text)
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
# Returns the ERB buffer name for the given file, something like "@my_file_name"
|
|
183
|
+
def buffer_name_for(file)
|
|
184
|
+
# Not sure why the final gsub is needed but seems to fail to parse correctly otherwise.
|
|
185
|
+
@current_buffer = "@#{file.basename('.*').basename('.*').to_s.gsub('-', '_')}"
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
def merge_file(file, _options = {})
|
|
189
|
+
file = Pathname.new(file)
|
|
190
|
+
Origen.log.info "Merging... #{file.basename}"
|
|
191
|
+
if is_erb?(file) && File.exist?(output_file(file))
|
|
192
|
+
check_for_differences(output_file(file), merge_ref_file(file), file)
|
|
193
|
+
elsif File.exist?(output_file(file))
|
|
194
|
+
if check_for_differences(output_file(file), merge_ref_file(file), file)
|
|
195
|
+
FileUtils.cp(output_file(file), file.dirname.to_s)
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def display_path_to(file)
|
|
201
|
+
p = relative_path_to(file).to_s
|
|
202
|
+
p.gsub!('/', '\\') if Origen.running_on_windows?
|
|
203
|
+
p
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
def check_for_differences(a, b, file)
|
|
207
|
+
if check_for_changes(a, b, comment_char: ["'", 'logprint'], quiet: true, compile_job: true)
|
|
208
|
+
puts "*** CHANGE DETECTED *** To rollback: #{Origen.config.copy_command} #{display_path_to(b)} #{display_path_to(a)}"
|
|
209
|
+
"#{Origen.config.diff_command} #{display_path_to(a)} #{display_path_to(b)} & #{ENV['EDITOR']} #{file.cleanpath} &"
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
# Returns true if the supplied file name has a .erb extension
|
|
214
|
+
def is_erb?(file)
|
|
215
|
+
!!(file.to_s =~ /.erb$/) || !Origen.config.compile_only_dot_erb_files
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
def output_directory
|
|
219
|
+
Origen.file_handler.output_directory
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
def reference_directory
|
|
223
|
+
Origen.file_handler.reference_directory
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
def merge_reference_directory
|
|
227
|
+
"#{Origen.root}/.merge_ref"
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
# Returns the output file corresponding to the given source file, the destination
|
|
231
|
+
# directory will be created if it doesn't exist.
|
|
232
|
+
def output_file(file, options = {})
|
|
233
|
+
options = {
|
|
234
|
+
output_directory: output_directory
|
|
235
|
+
}.merge(options)
|
|
236
|
+
# return @output_file if @output_file
|
|
237
|
+
sub_dir = options[:output_sub_dir] || Origen.file_handler.sub_dir_of(file).to_s
|
|
238
|
+
sub_dir = nil if sub_dir == '.'
|
|
239
|
+
filename = options[:output_file_name] || file.basename.to_s.gsub('.erb', '')
|
|
240
|
+
# filename.gsub!('target', $target.id) if filename =~ /target/ && $target.id
|
|
241
|
+
output = Pathname.new("#{options[:output_directory]}#{sub_dir ? '/' + sub_dir : ''}/#{filename}")
|
|
242
|
+
FileUtils.mkdir_p(output.dirname.to_s) unless File.exist?(output.dirname.to_s)
|
|
243
|
+
# @output_file = output
|
|
244
|
+
output
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
# Returns the reference file corresponding to the given source file, the destination
|
|
248
|
+
# directory will be created if it doesn't exist.
|
|
249
|
+
def reference_file(file, options = {})
|
|
250
|
+
# return @reference_file if @reference_file
|
|
251
|
+
sub_dir = Origen.file_handler.sub_dir_of(file).to_s
|
|
252
|
+
sub_dir = nil if sub_dir == '.'
|
|
253
|
+
filename = options[:output_file_name] || file.basename.to_s.gsub('.erb', '')
|
|
254
|
+
# filename.gsub!('target', $target.id) if filename =~ /target/ && $target.id
|
|
255
|
+
reference = Pathname.new("#{reference_directory}#{sub_dir ? '/' + sub_dir : ''}/#{filename}")
|
|
256
|
+
FileUtils.mkdir_p(reference.dirname.to_s) unless File.exist?(reference.dirname.to_s)
|
|
257
|
+
# @reference_file = reference
|
|
258
|
+
reference
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
def merge_ref_file(file, options = {})
|
|
262
|
+
options = {
|
|
263
|
+
directory: merge_reference_directory
|
|
264
|
+
}.merge(options)
|
|
265
|
+
# return @merge_ref_file if @merge_ref_file
|
|
266
|
+
sub_dir = Origen.file_handler.sub_dir_of(file).to_s
|
|
267
|
+
sub_dir = nil if sub_dir == '.'
|
|
268
|
+
filename = file.basename.to_s.gsub('.erb', '')
|
|
269
|
+
# filename.gsub!('target', $target.id) if filename =~ /target/ && $target.id
|
|
270
|
+
output = Pathname.new("#{options[:directory]}#{sub_dir ? '/' + sub_dir : ''}/#{filename}")
|
|
271
|
+
FileUtils.mkdir_p(output.dirname.to_s) unless File.exist?(output.dirname.to_s)
|
|
272
|
+
# @merge_ref_file = output
|
|
273
|
+
output
|
|
274
|
+
end
|
|
275
|
+
end
|
|
276
|
+
end
|
|
277
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
module Origen
|
|
2
|
+
class Generator
|
|
3
|
+
class Flow
|
|
4
|
+
attr_accessor :top_level
|
|
5
|
+
|
|
6
|
+
def create(options = {}, &block)
|
|
7
|
+
# Refresh the target to start all settings from scratch each time
|
|
8
|
+
# This is an easy way to reset all registered values
|
|
9
|
+
Origen.app.reload_target!
|
|
10
|
+
Origen.tester.generating = :program
|
|
11
|
+
# Make the top level flow globally available, this helps to assign test descriptions
|
|
12
|
+
# to the correct flow whenever tests are instantiated from sub-flows
|
|
13
|
+
if Origen.interface_loaded? && Origen.interface.top_level_flow
|
|
14
|
+
sub_flow = true
|
|
15
|
+
if Origen.tester.doc?
|
|
16
|
+
Origen.interface.flow.start_section
|
|
17
|
+
end
|
|
18
|
+
else
|
|
19
|
+
sub_flow = false
|
|
20
|
+
end
|
|
21
|
+
job.output_file_body = options.delete(:name).to_s if options[:name]
|
|
22
|
+
if sub_flow
|
|
23
|
+
interface = Origen.interface
|
|
24
|
+
opts = Origen.generator.option_pipeline.pop || {}
|
|
25
|
+
interface.instance_exec(opts, &block)
|
|
26
|
+
if Origen.tester.doc?
|
|
27
|
+
Origen.interface.flow.stop_section
|
|
28
|
+
end
|
|
29
|
+
interface.close(flow: true, sub_flow: true)
|
|
30
|
+
else
|
|
31
|
+
Origen.log.info "Generating... #{Origen.file_handler.current_file.basename}"
|
|
32
|
+
interface = Origen.reset_interface(options)
|
|
33
|
+
Origen.interface.set_top_level_flow
|
|
34
|
+
Origen.interface.flow_generator.set_flow_description(Origen.interface.consume_comments)
|
|
35
|
+
interface.instance_eval(&block)
|
|
36
|
+
interface.close(flow: true)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def reset
|
|
41
|
+
Origen.interface.clear_top_level_flow if Origen.interface_loaded?
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def job
|
|
45
|
+
Origen.app.current_job
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
module Origen
|
|
2
|
+
class Generator
|
|
3
|
+
# A job is responsible for executing a single pattern source
|
|
4
|
+
class Job # :nodoc: all
|
|
5
|
+
attr_accessor :output_file_body, :pattern
|
|
6
|
+
|
|
7
|
+
def initialize(pattern, options)
|
|
8
|
+
@testing = options[:testing]
|
|
9
|
+
@options = options
|
|
10
|
+
@requested_pattern = pattern
|
|
11
|
+
@no_comments = options[:no_comments]
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# Returns true if the job is a test job, will only be true in a test scenario
|
|
15
|
+
def test?
|
|
16
|
+
@testing
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def no_comments?
|
|
20
|
+
@no_comments
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def requested_pattern
|
|
24
|
+
@requested_pattern
|
|
25
|
+
end
|
|
26
|
+
alias_method :requested_file, :requested_pattern
|
|
27
|
+
|
|
28
|
+
# Returns a full path to the output pattern, note that this is not available
|
|
29
|
+
# until the job has been run
|
|
30
|
+
def output_pattern
|
|
31
|
+
"#{output_pattern_directory}/#{output_pattern_filename}"
|
|
32
|
+
end
|
|
33
|
+
alias_method :output_file, :output_pattern
|
|
34
|
+
|
|
35
|
+
def reference_pattern
|
|
36
|
+
"#{reference_pattern_directory}/#{output_pattern_filename}"
|
|
37
|
+
end
|
|
38
|
+
alias_method :reference_file, :reference_pattern
|
|
39
|
+
|
|
40
|
+
def output_pattern_filename
|
|
41
|
+
return '' if @testing
|
|
42
|
+
# If the pattern name has been overridden by an interator use that
|
|
43
|
+
return @output_pattern_filename if @output_pattern_filename
|
|
44
|
+
if !@pattern && !@output_file_body
|
|
45
|
+
fail 'Sorry the output_pattern is not available until the job has been run'
|
|
46
|
+
end
|
|
47
|
+
body = @output_file_body ? @output_file_body : File.basename(@pattern, '.rb')
|
|
48
|
+
output_prefix + body + output_postfix + output_extension
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# This can be modified at runtime by the pattern generator in response to
|
|
52
|
+
# iterator substitutions
|
|
53
|
+
def output_pattern_filename=(val)
|
|
54
|
+
@output_pattern_filename = val
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def reset_output_pattern_filename
|
|
58
|
+
@output_pattern_filename = nil
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def output_pattern_directory
|
|
62
|
+
Origen.file_handler.output_directory
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def reference_pattern_directory
|
|
66
|
+
Origen.file_handler.reference_directory
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def output_prefix
|
|
70
|
+
p = Origen.config.pattern_prefix ? Origen.config.pattern_prefix + '_' : ''
|
|
71
|
+
p = "_#{p}" if Origen.tester.doc?
|
|
72
|
+
p
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def output_postfix
|
|
76
|
+
Origen.config.pattern_postfix ? '_' + Origen.config.pattern_postfix : ''
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def output_extension
|
|
80
|
+
'.' + Origen.tester.pat_extension
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def run
|
|
84
|
+
Origen.app.current_job = self
|
|
85
|
+
begin
|
|
86
|
+
if @options[:compile]
|
|
87
|
+
Origen.generator.compiler.compile(@requested_pattern, @options)
|
|
88
|
+
elsif @options[:job_type] == :merge
|
|
89
|
+
Origen.generator.compiler.merge(@requested_pattern)
|
|
90
|
+
elsif @options[:action] == :program
|
|
91
|
+
Origen.flow.reset
|
|
92
|
+
Origen.resources.reset
|
|
93
|
+
Origen::Tester::Generator.execute_source(@pattern)
|
|
94
|
+
else
|
|
95
|
+
Origen.generator.pattern.reset # Resets the pattern controller ready for a new pattern
|
|
96
|
+
# Give the app a chance to handle pattern dispatch
|
|
97
|
+
skip = false
|
|
98
|
+
Origen.app.listeners_for(:before_pattern_lookup).each do |listener|
|
|
99
|
+
skip ||= !listener.before_pattern_lookup(@requested_pattern)
|
|
100
|
+
end
|
|
101
|
+
unless skip
|
|
102
|
+
@pattern = Origen.generator.pattern_finder.find(@requested_pattern, @options)
|
|
103
|
+
if @pattern.is_a?(Hash)
|
|
104
|
+
@output_file_body = @pattern[:output]
|
|
105
|
+
@pattern = @pattern[:pattern]
|
|
106
|
+
end
|
|
107
|
+
load @pattern unless @pattern == :skip # Run the pattern
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
rescue Exception => e
|
|
111
|
+
if @options[:continue] || Origen.running_remotely?
|
|
112
|
+
Origen.log.error "FAILED - #{@requested_pattern} (for target #{Origen.target.name})"
|
|
113
|
+
Origen.log.error e.message
|
|
114
|
+
e.backtrace.each do |l|
|
|
115
|
+
Origen.log.error l
|
|
116
|
+
end
|
|
117
|
+
if @options[:compile]
|
|
118
|
+
Origen.app.stats.failed_files += 1
|
|
119
|
+
else
|
|
120
|
+
Origen.app.stats.failed_patterns += 1
|
|
121
|
+
end
|
|
122
|
+
else
|
|
123
|
+
puts e.message
|
|
124
|
+
puts e.backtrace
|
|
125
|
+
exit 1
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|