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,24 @@
|
|
|
1
|
+
module Origen
|
|
2
|
+
module Registers
|
|
3
|
+
# This is a regular Ruby hash that is used to store collections of Reg objects, it has additional
|
|
4
|
+
# methods added to allow interaction with the contained registers.
|
|
5
|
+
# All Ruby hash methods are also available - http://www.ruby-doc.org/core/classes/Hash.html
|
|
6
|
+
class RegCollection < Hash
|
|
7
|
+
# Returns the object that owns the registers
|
|
8
|
+
attr_reader :owner
|
|
9
|
+
|
|
10
|
+
def initialize(owner, _options = {})
|
|
11
|
+
@owner = owner
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def inspect
|
|
15
|
+
map { |k, _v| k }.inspect
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Display all regs visually in a console session
|
|
19
|
+
def show
|
|
20
|
+
puts map { |_k, v| v }.inspect
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,652 @@
|
|
|
1
|
+
module Origen
|
|
2
|
+
# Origen provides a powerful register class which you are encouraged to use when
|
|
3
|
+
# you wish to interact with a silicon register (or RAM location).
|
|
4
|
+
# By interacting with the register on silicon through the register API your
|
|
5
|
+
# pattern will automatically track silicon state, so you can set and forget
|
|
6
|
+
# bits in the patgen the same as you would do with a physical register.
|
|
7
|
+
# Include this module to add registers to your block, then use the macros described
|
|
8
|
+
# below to instantiate register objects
|
|
9
|
+
# include Origen::Registers
|
|
10
|
+
module Registers
|
|
11
|
+
extend ActiveSupport::Concern
|
|
12
|
+
|
|
13
|
+
autoload :Container, 'origen/registers/container'
|
|
14
|
+
autoload :Reg, 'origen/registers/reg'
|
|
15
|
+
autoload :Bit, 'origen/registers/bit'
|
|
16
|
+
autoload :BitCollection, 'origen/registers/bit_collection'
|
|
17
|
+
autoload :RegCollection, 'origen/registers/reg_collection'
|
|
18
|
+
autoload :Domain, 'origen/registers/domain'
|
|
19
|
+
|
|
20
|
+
included do
|
|
21
|
+
include Origen::ModelInitializer
|
|
22
|
+
include Origen::SubBlocks
|
|
23
|
+
include Origen::Callbacks # Required for global register reset
|
|
24
|
+
|
|
25
|
+
attr_accessor :owner
|
|
26
|
+
attr_accessor :name
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def method_missing(method, *args, &block) # :nodoc:
|
|
30
|
+
if _registers.key?(method)
|
|
31
|
+
reg(method)
|
|
32
|
+
else
|
|
33
|
+
super
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def respond_to?(sym) # :nodoc:
|
|
38
|
+
_registers.key?(sym) || super(sym)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def delete_registers
|
|
42
|
+
@_registers = nil
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Class methods of this module
|
|
46
|
+
class << self
|
|
47
|
+
@@reg_metadata = {}
|
|
48
|
+
@@bit_metadata = {}
|
|
49
|
+
|
|
50
|
+
# @api private
|
|
51
|
+
# Returns a lookup table containing all custom register metadata
|
|
52
|
+
# defined by objects in an application
|
|
53
|
+
def reg_metadata
|
|
54
|
+
@@reg_metadata ||= {}
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# @api private
|
|
58
|
+
# Returns a lookup table containing all custom bit metadata
|
|
59
|
+
# defined by objects in an application
|
|
60
|
+
def bit_metadata
|
|
61
|
+
@@bit_metadata ||= {}
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Can be called to add app specific meta data to all registers
|
|
65
|
+
def default_reg_metadata
|
|
66
|
+
Origen::Registers.reg_metadata[:global] ||= {}
|
|
67
|
+
if block_given?
|
|
68
|
+
collector = Collector.new
|
|
69
|
+
yield collector
|
|
70
|
+
Origen::Registers.reg_metadata[:global].merge!(collector.store)
|
|
71
|
+
end
|
|
72
|
+
Origen::Registers.reg_metadata[:global]
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# An alias for default_reg_metadata
|
|
76
|
+
def default_reg_meta_data(*args, &block)
|
|
77
|
+
default_reg_metadata(*args, &block)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Can be called to add app specific meta data to all bits
|
|
81
|
+
def default_bit_metadata
|
|
82
|
+
Origen::Registers.bit_metadata[:global] ||= {}
|
|
83
|
+
if block_given?
|
|
84
|
+
collector = Collector.new
|
|
85
|
+
yield collector
|
|
86
|
+
Origen::Registers.bit_metadata[:global].merge!(collector.store)
|
|
87
|
+
end
|
|
88
|
+
Origen::Registers.bit_metadata[:global]
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# An alias for default_bit_metadata
|
|
92
|
+
def default_bit_meta_data(*args, &block)
|
|
93
|
+
default_bit_metadata(*args, &block)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# All register objects are stored here, but they should be accessed
|
|
98
|
+
# via the _reg method to ensure that feature scoping is applied
|
|
99
|
+
#
|
|
100
|
+
# @api private
|
|
101
|
+
def _registers
|
|
102
|
+
@_registers ||= RegCollection.new(self)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# Instantiating registers can be quite expensive, this object is a placeholder
|
|
106
|
+
# for a register and will transform into one automatically when it is required to
|
|
107
|
+
# (i.e. whenever a register method is called on it).
|
|
108
|
+
class Placeholder
|
|
109
|
+
attr_reader :name, :owner, :attributes, :feature
|
|
110
|
+
alias_method :id, :name
|
|
111
|
+
|
|
112
|
+
def initialize(owner, name, attributes)
|
|
113
|
+
@owner = owner
|
|
114
|
+
@name = name
|
|
115
|
+
@attributes = attributes
|
|
116
|
+
@feature = attributes[:feature] if attributes.key?(:feature)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# Make this appear like a reg to any application code
|
|
120
|
+
def is_a?(klass)
|
|
121
|
+
klass == Origen::Registers::Reg ||
|
|
122
|
+
klass == self.class
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# Returns true if the register is enabled by a feature of owner.
|
|
126
|
+
def enabled?
|
|
127
|
+
if feature
|
|
128
|
+
value = false
|
|
129
|
+
current_owner = self
|
|
130
|
+
if feature.class == Array
|
|
131
|
+
feature.each do |f|
|
|
132
|
+
current_owner = self
|
|
133
|
+
loop do
|
|
134
|
+
if current_owner.respond_to?(:owner)
|
|
135
|
+
current_owner = current_owner.owner
|
|
136
|
+
if current_owner.respond_to?(:has_feature?)
|
|
137
|
+
if current_owner.has_feature?(f)
|
|
138
|
+
value = true
|
|
139
|
+
break
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
else # if current owner does not have a owner
|
|
143
|
+
value = false
|
|
144
|
+
break
|
|
145
|
+
end
|
|
146
|
+
end # loop end
|
|
147
|
+
unless value
|
|
148
|
+
if Origen.top_level && \
|
|
149
|
+
Origen.top_level.respond_to?(:has_feature?) && \
|
|
150
|
+
Origen.top_level.has_feature?(f)
|
|
151
|
+
value = true
|
|
152
|
+
unless value
|
|
153
|
+
break
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
unless value
|
|
158
|
+
break # break if feature not found and return false
|
|
159
|
+
end
|
|
160
|
+
end # iterated through all features in array
|
|
161
|
+
return value
|
|
162
|
+
else # if feature.class != Array
|
|
163
|
+
loop do
|
|
164
|
+
if current_owner.respond_to?(:owner)
|
|
165
|
+
current_owner = current_owner.owner
|
|
166
|
+
if current_owner.respond_to?(:has_feature?)
|
|
167
|
+
if current_owner.has_feature?(feature)
|
|
168
|
+
value = true
|
|
169
|
+
break
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
else # if current owner does not have a owner
|
|
173
|
+
value = false
|
|
174
|
+
break
|
|
175
|
+
end
|
|
176
|
+
end # loop end
|
|
177
|
+
unless value
|
|
178
|
+
if Origen.top_level && \
|
|
179
|
+
Origen.top_level.respond_to?(:has_feature?) && \
|
|
180
|
+
Origen.top_level.has_feature?(feature)
|
|
181
|
+
value = true
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
return value
|
|
185
|
+
end
|
|
186
|
+
else
|
|
187
|
+
return true
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
# Returns true if the register is constrained by the given/any feature
|
|
192
|
+
def enabled_by_feature?(name = nil)
|
|
193
|
+
if !name
|
|
194
|
+
!!feature
|
|
195
|
+
else
|
|
196
|
+
if feature.class == Array
|
|
197
|
+
feature.each do |f|
|
|
198
|
+
if f == name
|
|
199
|
+
return true
|
|
200
|
+
end
|
|
201
|
+
end
|
|
202
|
+
return false
|
|
203
|
+
else
|
|
204
|
+
return feature == name
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
alias_method :has_feature_constraint?, :enabled_by_feature?
|
|
209
|
+
|
|
210
|
+
# Make it look like a reg in the console to avoid confusion
|
|
211
|
+
def inspect
|
|
212
|
+
materialize.inspect
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
# Don't need to act on reset, an un-materialized reg is by default already reset
|
|
216
|
+
def reset
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
def freeze
|
|
220
|
+
materialize.freeze
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
def method_missing(method, *args, &block)
|
|
224
|
+
materialize.send(method, *args, &block)
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
def respond_to?(method)
|
|
228
|
+
materialize.respond_to?(method)
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
def materialize
|
|
232
|
+
owner.instantiate_reg(name, attributes)
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
def clone
|
|
236
|
+
materialize.clone
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
def dup
|
|
240
|
+
materialize.dup
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
def contains_bits?
|
|
244
|
+
true
|
|
245
|
+
end
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
class Collector
|
|
249
|
+
attr_reader :store
|
|
250
|
+
|
|
251
|
+
def initialize
|
|
252
|
+
@store = {}
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
def method_missing(method, *args, &_block)
|
|
256
|
+
@store[method.to_s.sub('=', '').to_sym] = args.first
|
|
257
|
+
end
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
# Returns true if the given object is one of the recognized Origen
|
|
261
|
+
# bit containers (bit collection, reg or container).
|
|
262
|
+
def contains_bits?(obj)
|
|
263
|
+
obj.respond_to?(:contains_bits?) && obj.contains_bits?
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
# Returns true if the given object is an Origen bit
|
|
267
|
+
def is_a_bit?(obj)
|
|
268
|
+
obj.is_a?(Origen::Registers::Bit)
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
# Add a register.
|
|
272
|
+
# When adding a register you must supply a name, an address, size in bits, and bit definitions,
|
|
273
|
+
# any bits that are not declared will be filled with dummy bit objects that are
|
|
274
|
+
# not writable and will read back as 0.
|
|
275
|
+
#
|
|
276
|
+
# @example
|
|
277
|
+
# Name Address Size Bit Definitions
|
|
278
|
+
# add_reg :control, 0x00, 16 :mode => { :pos => 8, :bits => 8 },
|
|
279
|
+
# # Leaving out bits does 1 by default
|
|
280
|
+
# :launch => { :pos => 6 },
|
|
281
|
+
# # The default reset state is 0, specify an alternative..
|
|
282
|
+
# :status => { :pos => 4, :bits => 2, :res => 0b11 },
|
|
283
|
+
# :fail => { :pos => 2 },
|
|
284
|
+
# :done => { :pos => 0 }
|
|
285
|
+
#
|
|
286
|
+
# Can be called on any object to add a register to it
|
|
287
|
+
def add_reg(id, address, size = nil, bit_info = {}, &_block)
|
|
288
|
+
size, bit_info = nil, size if size.is_a?(Hash)
|
|
289
|
+
size ||= bit_info.delete(:size) || 32
|
|
290
|
+
description = bit_info.delete(:description)
|
|
291
|
+
|
|
292
|
+
local_vars = {}
|
|
293
|
+
|
|
294
|
+
Reg::REG_LEVEL_ATTRIBUTES.each do |attribute, meta|
|
|
295
|
+
aliases = [attribute]
|
|
296
|
+
aliases += meta[:aliases] if meta[:aliases]
|
|
297
|
+
aliases.each { |_a| local_vars[attribute] = bit_info.delete(attribute) if bit_info.key?(attribute) }
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
local_vars[:reset] ||= :memory if local_vars[:memory]
|
|
301
|
+
@min_reg_address ||= address
|
|
302
|
+
@max_reg_address ||= address
|
|
303
|
+
@min_reg_address = address if address < @min_reg_address
|
|
304
|
+
if address > @max_reg_address
|
|
305
|
+
@max_address_reg_size = size
|
|
306
|
+
@max_reg_address = address
|
|
307
|
+
end
|
|
308
|
+
@reg_define_file ||= define_file(caller[0])
|
|
309
|
+
|
|
310
|
+
if block_given?
|
|
311
|
+
@new_reg_attrs = { meta: bit_info }
|
|
312
|
+
yield self
|
|
313
|
+
bit_info = @new_reg_attrs
|
|
314
|
+
end
|
|
315
|
+
if _registers[id] && Origen.config.strict_errors
|
|
316
|
+
puts ''
|
|
317
|
+
puts "Add register error, you have already added a register named #{id} to #{self.class}"
|
|
318
|
+
puts ''
|
|
319
|
+
fail 'Duplicate register error!'
|
|
320
|
+
else
|
|
321
|
+
attributes = {
|
|
322
|
+
define_file: @reg_define_file,
|
|
323
|
+
address: address,
|
|
324
|
+
size: size,
|
|
325
|
+
bit_info: bit_info,
|
|
326
|
+
description: description
|
|
327
|
+
}
|
|
328
|
+
Reg::REG_LEVEL_ATTRIBUTES.each do |attribute, _meta|
|
|
329
|
+
attributes[attribute] = local_vars[attribute]
|
|
330
|
+
end
|
|
331
|
+
_registers[id] = Placeholder.new(self, id, attributes)
|
|
332
|
+
end
|
|
333
|
+
@reg_define_file = nil
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
# Delete an existing register
|
|
337
|
+
def del_reg(id)
|
|
338
|
+
_registers.delete(id)
|
|
339
|
+
end
|
|
340
|
+
|
|
341
|
+
# @api private
|
|
342
|
+
def define_file(file)
|
|
343
|
+
if Origen.running_on_windows?
|
|
344
|
+
fields = file.split(':')
|
|
345
|
+
"#{fields[0]}:#{fields[1]}"
|
|
346
|
+
else
|
|
347
|
+
file.split(':').first
|
|
348
|
+
end
|
|
349
|
+
end
|
|
350
|
+
|
|
351
|
+
# Called within an add_reg block to define bits
|
|
352
|
+
def bit(index, name, attrs = {})
|
|
353
|
+
if index.is_a?(Range)
|
|
354
|
+
msb = index.first
|
|
355
|
+
lsb = index.last
|
|
356
|
+
msb, lsb = lsb, msb if lsb > msb
|
|
357
|
+
pos = lsb
|
|
358
|
+
bits = (msb - lsb).abs + 1
|
|
359
|
+
elsif index.is_a?(Numeric)
|
|
360
|
+
pos = index
|
|
361
|
+
bits = 1
|
|
362
|
+
else
|
|
363
|
+
fail 'No valid index supplied when defining a register bit!'
|
|
364
|
+
end
|
|
365
|
+
|
|
366
|
+
# Traynor, this could be more elegant
|
|
367
|
+
# its just a dirty way to make the value of the
|
|
368
|
+
# key in @new_reg_atts hash array (ie name) tie to
|
|
369
|
+
# a value that is an array of hashes describing
|
|
370
|
+
# data for each scrambled bit
|
|
371
|
+
attrs = attrs.merge(pos: pos, bits: bits)
|
|
372
|
+
temparray = []
|
|
373
|
+
if @new_reg_attrs[name].nil?
|
|
374
|
+
@new_reg_attrs[name] = attrs
|
|
375
|
+
else
|
|
376
|
+
if @new_reg_attrs[name].is_a? Hash
|
|
377
|
+
temparray = temparray.push(@new_reg_attrs[name])
|
|
378
|
+
else
|
|
379
|
+
temparray = @new_reg_attrs[name]
|
|
380
|
+
end
|
|
381
|
+
temparray = temparray.push(attrs)
|
|
382
|
+
# added the sort so that the order the registers bits is described is not important
|
|
383
|
+
@new_reg_attrs[name] = temparray.sort { |a, b| b[:pos] <=> a[:pos] }
|
|
384
|
+
|
|
385
|
+
end
|
|
386
|
+
end
|
|
387
|
+
|
|
388
|
+
alias_method :bits, :bit
|
|
389
|
+
|
|
390
|
+
# Can be called to add app specific meta data that is isolated to all registers
|
|
391
|
+
# defined within a given class
|
|
392
|
+
def default_reg_metadata
|
|
393
|
+
Origen::Registers.reg_metadata[self.class] ||= {}
|
|
394
|
+
if block_given?
|
|
395
|
+
collector = Collector.new
|
|
396
|
+
yield collector
|
|
397
|
+
Origen::Registers.reg_metadata[self.class].merge!(collector.store)
|
|
398
|
+
end
|
|
399
|
+
Origen::Registers.reg_metadata[self.class]
|
|
400
|
+
end
|
|
401
|
+
alias_method :default_reg_meta_data, :default_reg_metadata
|
|
402
|
+
|
|
403
|
+
def default_bit_metadata
|
|
404
|
+
Origen::Registers.bit_metadata[self.class] ||= {}
|
|
405
|
+
if block_given?
|
|
406
|
+
collector = Collector.new
|
|
407
|
+
yield collector
|
|
408
|
+
Origen::Registers.bit_metadata[self.class].merge!(collector.store)
|
|
409
|
+
end
|
|
410
|
+
Origen::Registers.bit_metadata[self.class]
|
|
411
|
+
end
|
|
412
|
+
alias_method :default_bit_meta_data, :default_bit_metadata
|
|
413
|
+
|
|
414
|
+
# @api private
|
|
415
|
+
def instantiate_reg(id, attrs)
|
|
416
|
+
return _registers[id] unless _registers[id].is_a?(Origen::Registers::Placeholder)
|
|
417
|
+
attributes = {
|
|
418
|
+
define_file: attrs[:define_file],
|
|
419
|
+
description: attrs[:description]
|
|
420
|
+
}
|
|
421
|
+
Reg::REG_LEVEL_ATTRIBUTES.each do |attribute, _meta|
|
|
422
|
+
attributes[attribute] = attrs[attribute]
|
|
423
|
+
end
|
|
424
|
+
_registers[id] = Reg.new(self, attrs[:address], attrs[:size], id,
|
|
425
|
+
attrs[:bit_info].merge(attributes))
|
|
426
|
+
end
|
|
427
|
+
|
|
428
|
+
def add_reg32(id, address, args = {}, &block)
|
|
429
|
+
@reg_define_file = define_file(caller[0])
|
|
430
|
+
add_reg(id, address, 32, args, &block)
|
|
431
|
+
end
|
|
432
|
+
|
|
433
|
+
# Returns the lowest address of all registers that have been added
|
|
434
|
+
def min_reg_address
|
|
435
|
+
@min_reg_address || 0
|
|
436
|
+
end
|
|
437
|
+
|
|
438
|
+
# Returns the highest address of all registers that have been added
|
|
439
|
+
def max_reg_address
|
|
440
|
+
@max_reg_address || 0
|
|
441
|
+
end
|
|
442
|
+
|
|
443
|
+
# Returns the size (in bits) of the register with the highest address,
|
|
444
|
+
# can be useful in combination with max_reg_address to work out the
|
|
445
|
+
# range of addresses containing registers
|
|
446
|
+
def max_address_reg_size
|
|
447
|
+
@max_address_reg_size
|
|
448
|
+
end
|
|
449
|
+
|
|
450
|
+
# Resets all registers
|
|
451
|
+
def reset_registers
|
|
452
|
+
regs.each { |_name, reg| reg.reset }
|
|
453
|
+
end
|
|
454
|
+
|
|
455
|
+
# Returns true if the object contains a register matching the given name
|
|
456
|
+
def has_reg?(name, params = {})
|
|
457
|
+
params = {
|
|
458
|
+
test_for_true_false: true
|
|
459
|
+
}.update(params)
|
|
460
|
+
if params.key?(:enabled_features) || params.key?(:enabled_feature)
|
|
461
|
+
return !!get_registers(params).include?(name)
|
|
462
|
+
else
|
|
463
|
+
params[:enabled_features] = :default
|
|
464
|
+
return !!get_registers(params).include?(name)
|
|
465
|
+
end
|
|
466
|
+
end
|
|
467
|
+
alias_method :has_reg, :has_reg?
|
|
468
|
+
|
|
469
|
+
# Returns the register object matching the given name, or a hash of all registers,
|
|
470
|
+
# associated with a feature,if no name is specified.
|
|
471
|
+
#
|
|
472
|
+
# Can also be used to define a new register if a block is supplied in which case
|
|
473
|
+
# it is equivalent to calling add_reg with a block.
|
|
474
|
+
def reg(*args, &block)
|
|
475
|
+
if block_given?
|
|
476
|
+
@reg_define_file = define_file(caller[0])
|
|
477
|
+
add_reg(*args, &block)
|
|
478
|
+
else
|
|
479
|
+
# Example use cases:
|
|
480
|
+
# reg(:reg2)
|
|
481
|
+
# reg(:name => :reg2)
|
|
482
|
+
if !args.empty? && args.size == 1 && (args[0].class != Hash || (args[0].key?(:name) && args[0].size == 1))
|
|
483
|
+
if args[0].class == Hash
|
|
484
|
+
name = args[0][:name]
|
|
485
|
+
else name = args.first
|
|
486
|
+
end
|
|
487
|
+
if has_reg(name)
|
|
488
|
+
return _registers[name]
|
|
489
|
+
else
|
|
490
|
+
if Origen.config.strict_errors
|
|
491
|
+
puts ''
|
|
492
|
+
if regs.empty?
|
|
493
|
+
puts "#{self.class} does not have a register named #{name} or it is not enabled."
|
|
494
|
+
else
|
|
495
|
+
puts "#{self.class} does not have a register named #{name} or it is not enabled."
|
|
496
|
+
puts 'You may need to add it. This could also be a typo, these are the valid register names:'
|
|
497
|
+
puts regs.keys
|
|
498
|
+
end
|
|
499
|
+
puts ''
|
|
500
|
+
fail 'Missing register error!'
|
|
501
|
+
end
|
|
502
|
+
end
|
|
503
|
+
# Example use cases:
|
|
504
|
+
# reg(:enabled_features => :all)
|
|
505
|
+
# reg(:name => :reg2, enabled_features => :all)
|
|
506
|
+
# reg(:name => :reg2, enabled_features => :fac)
|
|
507
|
+
elsif !args.empty? && args.size == 1 && args[0].class == Hash
|
|
508
|
+
params = args[0]
|
|
509
|
+
|
|
510
|
+
# Example use case:
|
|
511
|
+
# reg(:name => :reg2, :enabled_features => :all)
|
|
512
|
+
if (params.key?(:enabled_features) || params.key?(:enabled_feature)) && params.key?(:name)
|
|
513
|
+
name = params[:name]
|
|
514
|
+
if has_reg(name, params)
|
|
515
|
+
_registers[name]
|
|
516
|
+
else
|
|
517
|
+
reg_missing_error(params)
|
|
518
|
+
end
|
|
519
|
+
# Example use case:
|
|
520
|
+
# reg(:enabled_features =>[:fac, fac2])
|
|
521
|
+
elsif params.size == 1 && params.key?(:enabled_features)
|
|
522
|
+
return get_registers(enabled_features: params[:enabled_features])
|
|
523
|
+
end
|
|
524
|
+
|
|
525
|
+
# Example use case:
|
|
526
|
+
# reg(:reg2, :enabled_features => :all)
|
|
527
|
+
# reg(:reg2, :enabled_features => :default)
|
|
528
|
+
# reg(:reg2, :enabled_features => :fac)
|
|
529
|
+
elsif !args.empty? && args.size == 2
|
|
530
|
+
name = args[0]
|
|
531
|
+
params = args[1]
|
|
532
|
+
name, params = params, name if name.class == Hash
|
|
533
|
+
if has_reg(name, params)
|
|
534
|
+
_registers[name]
|
|
535
|
+
else
|
|
536
|
+
reg_missing_error(params)
|
|
537
|
+
end
|
|
538
|
+
elsif args.empty?
|
|
539
|
+
if _registers.empty?
|
|
540
|
+
return _registers
|
|
541
|
+
else
|
|
542
|
+
return get_registers(enabled_features: :default)
|
|
543
|
+
end
|
|
544
|
+
else
|
|
545
|
+
if Origen.config.strict_errors
|
|
546
|
+
fail 'Invalid call to reg method or invalid arguments specified'
|
|
547
|
+
end
|
|
548
|
+
end
|
|
549
|
+
end
|
|
550
|
+
end
|
|
551
|
+
alias_method :regs, :reg
|
|
552
|
+
|
|
553
|
+
private
|
|
554
|
+
|
|
555
|
+
def reg_missing_error(params)
|
|
556
|
+
if Origen.config.strict_errors
|
|
557
|
+
puts ''
|
|
558
|
+
temp = regs(params)
|
|
559
|
+
if temp.empty?
|
|
560
|
+
puts "#{self.class} does not have a register named #{name} within the supplied feature scope, you need to add it."
|
|
561
|
+
else
|
|
562
|
+
puts "#{self.class} does not have a register named #{name} within the supplied feature scope, you may need to add it."
|
|
563
|
+
puts 'This could also be a typo, these are the valid register names:'
|
|
564
|
+
puts temp.keys
|
|
565
|
+
end
|
|
566
|
+
puts ''
|
|
567
|
+
fail 'Missing register error!'
|
|
568
|
+
end
|
|
569
|
+
end
|
|
570
|
+
|
|
571
|
+
def extract_enabled_features(options)
|
|
572
|
+
options[:enabled_features] || options[:enabled_feature]
|
|
573
|
+
end
|
|
574
|
+
|
|
575
|
+
def get_registers(params)
|
|
576
|
+
params = {
|
|
577
|
+
test_for_true_false: false
|
|
578
|
+
}.update(params)
|
|
579
|
+
regs_to_return = RegCollection.new(self)
|
|
580
|
+
req_features = extract_enabled_features(params)
|
|
581
|
+
if req_features == :all
|
|
582
|
+
regs_to_return = _registers
|
|
583
|
+
elsif req_features == :none
|
|
584
|
+
_registers.each do |k, v|
|
|
585
|
+
regs_to_return[k] = v unless v.has_feature_constraint?
|
|
586
|
+
end
|
|
587
|
+
elsif req_features == :default
|
|
588
|
+
_registers.each do |k, v|
|
|
589
|
+
regs_to_return[k] = v if v.enabled?
|
|
590
|
+
end
|
|
591
|
+
elsif req_features.class == Array
|
|
592
|
+
req_features.each do |req_feat|
|
|
593
|
+
_registers.each do |k, v|
|
|
594
|
+
regs_to_return[k] = v if v.enabled_by_feature?(req_feat) || !v.has_feature_constraint?
|
|
595
|
+
end
|
|
596
|
+
end
|
|
597
|
+
else
|
|
598
|
+
_registers.each do |k, v|
|
|
599
|
+
regs_to_return[k] = v if v.enabled_by_feature?(req_features) || !v.has_feature_constraint?
|
|
600
|
+
end
|
|
601
|
+
end
|
|
602
|
+
if regs_to_return.empty?
|
|
603
|
+
unless params[:test_for_true_false]
|
|
604
|
+
puts 'No register found with the specified feature or the register is disabled!'
|
|
605
|
+
fail 'Missing register error!'
|
|
606
|
+
end
|
|
607
|
+
end
|
|
608
|
+
regs_to_return
|
|
609
|
+
end
|
|
610
|
+
|
|
611
|
+
public
|
|
612
|
+
|
|
613
|
+
# Creates a dummy register. Equivalent to Reg.dummy except the reg owner is assigned
|
|
614
|
+
# as the caller rather than Reg. Use this if you need to call read! or write! on the
|
|
615
|
+
# dummy register object.
|
|
616
|
+
def dummy_reg(size = 16)
|
|
617
|
+
Reg.new(self, 0, size, :dummy, init_as_writable: true)
|
|
618
|
+
end
|
|
619
|
+
|
|
620
|
+
def write_register_missing!(reg)
|
|
621
|
+
puts ''
|
|
622
|
+
puts ''
|
|
623
|
+
puts <<-EOT
|
|
624
|
+
You have made a request to write register: #{reg.name}, however the #{self.class}
|
|
625
|
+
class does not know how to do this yet. You must implement a write_register
|
|
626
|
+
method in the #{self.class} like this:
|
|
627
|
+
|
|
628
|
+
def write_register(reg, options={})
|
|
629
|
+
<logic to handle the writing of the reg object here>
|
|
630
|
+
end
|
|
631
|
+
EOT
|
|
632
|
+
puts ''
|
|
633
|
+
exit 1
|
|
634
|
+
end
|
|
635
|
+
|
|
636
|
+
def read_register_missing!(reg)
|
|
637
|
+
puts ''
|
|
638
|
+
puts ''
|
|
639
|
+
puts <<-EOT
|
|
640
|
+
You have made a request to read register: #{reg.name}, however the #{self.class}
|
|
641
|
+
class does not know how to do this yet. You must implement a read_register
|
|
642
|
+
method in the #{self.class} like this:
|
|
643
|
+
|
|
644
|
+
def read_register(reg, options={})
|
|
645
|
+
<logic to handle reading the reg object here>
|
|
646
|
+
end
|
|
647
|
+
EOT
|
|
648
|
+
puts ''
|
|
649
|
+
exit 1
|
|
650
|
+
end
|
|
651
|
+
end
|
|
652
|
+
end
|