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,288 @@
|
|
|
1
|
+
module Origen
|
|
2
|
+
module Registers
|
|
3
|
+
# A container can be used to easily interface register operations to an IPS-style
|
|
4
|
+
# interface where the container will take care of data alignment and byte enable
|
|
5
|
+
# calculations.
|
|
6
|
+
# A container looks and behaves like a register and drivers should be able to
|
|
7
|
+
# accept a container in place of a regular register.
|
|
8
|
+
#
|
|
9
|
+
# Here are some examples:
|
|
10
|
+
#
|
|
11
|
+
# include Origen::Registers
|
|
12
|
+
#
|
|
13
|
+
# # Name Address Size Bits
|
|
14
|
+
# add_reg :r0, 4, 8, data => {:bits => 8}
|
|
15
|
+
# add_reg :r1, 5, 8, data => {:bits => 8}
|
|
16
|
+
# add_reg :r2, 6, 8, data => {:bits => 8}
|
|
17
|
+
# add_reg :r3, 7, 8, data => {:bits => 8}
|
|
18
|
+
#
|
|
19
|
+
# reg(:r0).write(0xB0)
|
|
20
|
+
# reg(:r1).write(0xB1)
|
|
21
|
+
# reg(:r2).write(0xB2)
|
|
22
|
+
# reg(:r3).write(0xB3)
|
|
23
|
+
#
|
|
24
|
+
# big = Container.new
|
|
25
|
+
# little = Container.new(:endian => :little)
|
|
26
|
+
#
|
|
27
|
+
# big.add(reg(:r0)).data # => 0x0000_00B0
|
|
28
|
+
# little.add(reg(:r0)).data # => 0xB000_0000
|
|
29
|
+
# big.byte_enable # => 0b0001
|
|
30
|
+
# little.byte_enable # => 0b1000
|
|
31
|
+
#
|
|
32
|
+
# big.empty
|
|
33
|
+
# big.data # => 0x0000_0000
|
|
34
|
+
# big.address # => nil
|
|
35
|
+
# big.add(reg(:r2))
|
|
36
|
+
# big.address # => 4 (longword aligned)
|
|
37
|
+
# big.add(reg(:r3)).add(reg(:r1)
|
|
38
|
+
# big.add.data # => 0xB3B2_B100
|
|
39
|
+
# big.byte_enable # => 0b1110
|
|
40
|
+
#
|
|
41
|
+
# # Treat it like it's a register in drivers:
|
|
42
|
+
# big.shift_out_left do |bit|
|
|
43
|
+
# pin(:tdi).drive!(bit.data)
|
|
44
|
+
# end
|
|
45
|
+
#
|
|
46
|
+
# # The address can be overridden
|
|
47
|
+
# big.empty
|
|
48
|
+
# big.add(reg(:r2), :address => 10)
|
|
49
|
+
# big.address # => 8 (longword aligned)
|
|
50
|
+
#
|
|
51
|
+
# # Containers can accomodate other containers
|
|
52
|
+
# big.empty
|
|
53
|
+
# lower_word = Container.new
|
|
54
|
+
# lower_word.add(:r0).add(:r1)
|
|
55
|
+
# big.add(:r3)
|
|
56
|
+
# lower_word.data # => 0x0000_B1B0
|
|
57
|
+
# big.data # => 0xB300_0000
|
|
58
|
+
# big.add(lower_word)
|
|
59
|
+
# big.data # => 0xB300_B1B0
|
|
60
|
+
# lower_word.data # => 0x0000_B1B0
|
|
61
|
+
#
|
|
62
|
+
# # Contained registers are the same register objects
|
|
63
|
+
# reg(:r0).write(0x55)
|
|
64
|
+
# big.data # => 0xB300_B155
|
|
65
|
+
# lower_word.data # => 0x0000_B155
|
|
66
|
+
class Container
|
|
67
|
+
# The size of the container in bits
|
|
68
|
+
attr_reader :size
|
|
69
|
+
# The number of bits represented by an address increment
|
|
70
|
+
# of the contained registers. For example if the contained registers
|
|
71
|
+
# have a byte address this will return 8.
|
|
72
|
+
attr_reader :bits_per_address
|
|
73
|
+
# Returns the currently held registers
|
|
74
|
+
attr_reader :regs
|
|
75
|
+
alias_method :registers, :regs
|
|
76
|
+
# Set this to a string or an array of strings that represents the name of the object that owns the
|
|
77
|
+
# container. If present any owned_by? requests made to the container will be
|
|
78
|
+
# evaluated against this string. If not then the request will be sent to the
|
|
79
|
+
# first contained register (if present).
|
|
80
|
+
attr_accessor :owned_by
|
|
81
|
+
|
|
82
|
+
# @param [Hash] options Options to customize the container
|
|
83
|
+
# @option options [Integer] :size (32) The size of the container in bits
|
|
84
|
+
# @option options [Symbol] :endian (:big) The endianness of the container, :big or :little
|
|
85
|
+
# For example big endian means that 4 a 32-bit container the bytes are arranged
|
|
86
|
+
# [3,2,1,0] whereas a little endian container would be [0,1,2,3].
|
|
87
|
+
# @option options [Integer] :bits_per_address (8) The number of bits that will be represented
|
|
88
|
+
# by an address increment of the given register's addresses
|
|
89
|
+
def initialize(options = {})
|
|
90
|
+
options = {
|
|
91
|
+
size: 32,
|
|
92
|
+
endian: :big,
|
|
93
|
+
bits_per_address: 8
|
|
94
|
+
}.merge(options)
|
|
95
|
+
@size = options[:size]
|
|
96
|
+
@endian = options[:endian]
|
|
97
|
+
@owned_by = options[:owned_by]
|
|
98
|
+
@bits_per_address = options[:bits_per_address]
|
|
99
|
+
@regs = []
|
|
100
|
+
@addresses = {}
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def contains_bits?
|
|
104
|
+
true
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Add the given register to the container, currently there is no
|
|
108
|
+
# error checking performed to ensure that it doesn't overlap with
|
|
109
|
+
# any existing contained registers.
|
|
110
|
+
def add(reg, options = {})
|
|
111
|
+
@regs << reg
|
|
112
|
+
addr = options[:address] || options[:addr]
|
|
113
|
+
@addresses[reg] = addr if addr
|
|
114
|
+
@regs.sort_by! { |reg| address_of_reg(reg) }
|
|
115
|
+
self
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# @api private
|
|
119
|
+
def address_of_reg(reg)
|
|
120
|
+
@addresses[reg] || reg.address
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# Returns the data held by the contained registers where the data from
|
|
124
|
+
# each register is shifted into the correct position
|
|
125
|
+
def data
|
|
126
|
+
d = 0
|
|
127
|
+
regs.each do |reg|
|
|
128
|
+
d += (reg.data << bit_shift_for_reg(reg))
|
|
129
|
+
end
|
|
130
|
+
d
|
|
131
|
+
end
|
|
132
|
+
alias_method :val, :data
|
|
133
|
+
alias_method :value, :data
|
|
134
|
+
|
|
135
|
+
# Data bar, the ones complement of the current data value of the
|
|
136
|
+
# container
|
|
137
|
+
def data_b
|
|
138
|
+
~data & ((1 << size) - 1)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
# Remove all registers from the container
|
|
142
|
+
def empty
|
|
143
|
+
@regs = []
|
|
144
|
+
@addresses = {}
|
|
145
|
+
self
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
# Returns the owner of the contained registers (assumed to be the
|
|
149
|
+
# same for all)
|
|
150
|
+
def owner
|
|
151
|
+
unless @regs.empty?
|
|
152
|
+
@regs.first.owner
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
# Proxies to the Reg#owned_by? method
|
|
157
|
+
def owned_by?(name)
|
|
158
|
+
if owned_by
|
|
159
|
+
[owned_by].flatten.any? do |al|
|
|
160
|
+
al.to_s =~ /#{name}/i
|
|
161
|
+
end
|
|
162
|
+
else
|
|
163
|
+
if @regs.empty?
|
|
164
|
+
false
|
|
165
|
+
else
|
|
166
|
+
@regs.first.owned_by?(name)
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
# Returns the aligned address of the container based on the
|
|
172
|
+
# address of the currently contained registers
|
|
173
|
+
def address
|
|
174
|
+
unless @regs.empty?
|
|
175
|
+
addr = address_of_reg(@regs.first)
|
|
176
|
+
shift = Math.log(size / bits_per_address, 2)
|
|
177
|
+
(addr >> shift) << shift
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
alias_method :addr, :address
|
|
181
|
+
|
|
182
|
+
# Returns the byte enable required to update the contained registers.
|
|
183
|
+
def byte_enable
|
|
184
|
+
enable = 0
|
|
185
|
+
regs.each do |reg|
|
|
186
|
+
enable_bits = 0.ones_comp(reg.size / bits_per_address)
|
|
187
|
+
enable += (enable_bits << shift_for_reg(reg))
|
|
188
|
+
end
|
|
189
|
+
enable
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
# @api private
|
|
193
|
+
def local_addr_for_reg(reg)
|
|
194
|
+
address_of_reg(reg) & 0.ones_comp(Math.log(size / bits_per_address, 2))
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
# @api private
|
|
198
|
+
def shift_for_reg(reg)
|
|
199
|
+
if big_endian?
|
|
200
|
+
local_addr_for_reg(reg)
|
|
201
|
+
else
|
|
202
|
+
(size / bits_per_address) - (local_addr_for_reg(reg) + (reg.size / bits_per_address))
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
# @api private
|
|
207
|
+
def bit_shift_for_reg(reg)
|
|
208
|
+
shift_for_reg(reg) * bits_per_address
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
def big_endian?
|
|
212
|
+
@endian == :big
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
def little_endian?
|
|
216
|
+
!big_endian?
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
# Shifts out a stream of bit objects corresponding to the size of the container. i.e. calling
|
|
220
|
+
# this on a 32-bit container this will pass back 32 bit objects.
|
|
221
|
+
# If there are holes then a dummy bit object will be returned that
|
|
222
|
+
# is not writable and which will always read as 0.
|
|
223
|
+
#
|
|
224
|
+
# The index is also returned as a second argument. Note that
|
|
225
|
+
# the position property of the bit is not updated to reflect its position
|
|
226
|
+
# within the container (it will return its position with its parent
|
|
227
|
+
# register), therefore the index should be used if the calling code
|
|
228
|
+
# needs to work out the bit position within the container.
|
|
229
|
+
def shift_out_left
|
|
230
|
+
size.times do |i|
|
|
231
|
+
yield(bit_at_position(size - i - 1), i)
|
|
232
|
+
end
|
|
233
|
+
end
|
|
234
|
+
alias_method :shift_out_left_with_index, :shift_out_left
|
|
235
|
+
|
|
236
|
+
# Shifts out a stream of bit objects corresponding to the size of the container. i.e. calling
|
|
237
|
+
# this on a 32-bit container this will pass back 32 bit objects.
|
|
238
|
+
# If there are holes then a dummy bit object will be returned that
|
|
239
|
+
# is not writable and which will always read as 0.
|
|
240
|
+
#
|
|
241
|
+
# The index is also returned as a second argument. Note that
|
|
242
|
+
# the position property of the bit is not updated to reflect its position
|
|
243
|
+
# within the container (it will return its position with its parent
|
|
244
|
+
# register), therefore the index should be used if the calling code
|
|
245
|
+
# needs to work out the bit position within the container.
|
|
246
|
+
def shift_out_right
|
|
247
|
+
size.times do |i|
|
|
248
|
+
yield(bit_at_position(i), i)
|
|
249
|
+
end
|
|
250
|
+
end
|
|
251
|
+
alias_method :shift_out_right_with_index, :shift_out_right
|
|
252
|
+
|
|
253
|
+
# Returns the bit at the given bit position if it exists, otherwise
|
|
254
|
+
# returns an un-writable bit
|
|
255
|
+
def bit_at_position(i)
|
|
256
|
+
reg = regs.find { |reg| reg_contains_position?(reg, i) }
|
|
257
|
+
if reg
|
|
258
|
+
reg[i - bit_shift_for_reg(reg)]
|
|
259
|
+
else
|
|
260
|
+
dummy_bit
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
# @api private
|
|
265
|
+
def reg_contains_position?(reg, position)
|
|
266
|
+
start = bit_shift_for_reg(reg)
|
|
267
|
+
stop = start + reg.size - 1
|
|
268
|
+
position >= start && position <= stop
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
# Returns the bit at the given bit position if it exists, otherwise
|
|
272
|
+
# returns an un-writable bit
|
|
273
|
+
def [](i)
|
|
274
|
+
bit_at_position(i)
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
# @api private
|
|
278
|
+
def dummy_bit
|
|
279
|
+
@dummy_bit ||= Bit.new(self, 0, writable: false)
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
# Call the clear_flags on all contained registers
|
|
283
|
+
def clear_flags
|
|
284
|
+
@regs.each(&:clear_flags)
|
|
285
|
+
end
|
|
286
|
+
end
|
|
287
|
+
end
|
|
288
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Origen
|
|
2
|
+
module Registers
|
|
3
|
+
class Domain
|
|
4
|
+
attr_accessor :endian
|
|
5
|
+
attr_accessor :name
|
|
6
|
+
|
|
7
|
+
def initialize(name, options = {})
|
|
8
|
+
options = {
|
|
9
|
+
endian: :big
|
|
10
|
+
}.merge(options)
|
|
11
|
+
@name = name
|
|
12
|
+
@endian = options[:endian]
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|