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.
Files changed (336) hide show
  1. checksums.yaml +4 -4
  2. data/bin/ctags +0 -0
  3. data/bin/origen +165 -1
  4. data/bin/rgen +2 -0
  5. data/config/application.rb +141 -0
  6. data/config/commands.rb +72 -0
  7. data/config/development.rb +7 -0
  8. data/config/environment.rb +0 -0
  9. data/config/rgen.policy +7 -0
  10. data/config/rubocop/easy.yml +620 -0
  11. data/config/rubocop/easy_disabled.yml +271 -0
  12. data/config/rubocop/easy_enabled.yml +731 -0
  13. data/config/rubocop/strict.yml +620 -0
  14. data/config/rubocop/strict_disabled.yml +247 -0
  15. data/config/rubocop/strict_enabled.yml +755 -0
  16. data/config/users.rb +20 -0
  17. data/config/version.rb +1 -1
  18. data/helpers/url.rb +68 -0
  19. data/lib/c99/doc_interface.rb +56 -0
  20. data/lib/c99/j750_interface.rb +85 -0
  21. data/lib/c99/nvm.rb +89 -0
  22. data/lib/c99/target/mock2.rb +1 -0
  23. data/lib/c99/target/subdir/mock3.rb +1 -0
  24. data/lib/option_parser/optparse.rb +12 -0
  25. data/lib/origen/acronyms.rb +60 -0
  26. data/lib/origen/application/command_dispatcher.rb +12 -0
  27. data/lib/origen/application/configuration.rb +206 -0
  28. data/lib/origen/application/configuration_manager.rb +78 -0
  29. data/lib/origen/application/deployer.rb +367 -0
  30. data/lib/origen/application/environment.rb +186 -0
  31. data/lib/origen/application/lsf.rb +145 -0
  32. data/lib/origen/application/lsf_manager.rb +657 -0
  33. data/lib/origen/application/plugins_manager.rb +280 -0
  34. data/lib/origen/application/release.rb +359 -0
  35. data/lib/origen/application/runner.rb +246 -0
  36. data/lib/origen/application/statistics.rb +191 -0
  37. data/lib/origen/application/target.rb +374 -0
  38. data/lib/origen/application/version_tracker.rb +59 -0
  39. data/lib/origen/application/workspace_manager.rb +151 -0
  40. data/lib/origen/application.rb +746 -0
  41. data/lib/origen/bugs/bug.rb +36 -0
  42. data/lib/origen/bugs.rb +45 -0
  43. data/lib/origen/callbacks.rb +35 -0
  44. data/lib/origen/chip_mode.rb +118 -0
  45. data/lib/origen/chip_package.rb +461 -0
  46. data/lib/origen/client.rb +87 -0
  47. data/lib/origen/code_generators/actions.rb +258 -0
  48. data/lib/origen/code_generators/base.rb +57 -0
  49. data/lib/origen/code_generators/bundler.rb +17 -0
  50. data/lib/origen/code_generators/gem_setup.rb +49 -0
  51. data/lib/origen/code_generators/rake.rb +13 -0
  52. data/lib/origen/code_generators/rspec.rb +12 -0
  53. data/lib/origen/code_generators/semver.rb +39 -0
  54. data/lib/origen/code_generators/timever.rb +37 -0
  55. data/lib/origen/code_generators.rb +111 -0
  56. data/lib/origen/commands/add.rb +12 -0
  57. data/lib/origen/commands/compile.rb +62 -0
  58. data/lib/origen/commands/ctags.rb +9 -0
  59. data/lib/origen/commands/dispatch.rb +22 -0
  60. data/lib/origen/commands/environment.rb +11 -0
  61. data/lib/origen/commands/fetch.rb +63 -0
  62. data/lib/origen/commands/generate.rb +130 -0
  63. data/lib/origen/commands/interactive.rb +73 -0
  64. data/lib/origen/commands/lint.rb +82 -0
  65. data/lib/origen/commands/lsf.rb +93 -0
  66. data/lib/origen/commands/merge.rb +55 -0
  67. data/lib/origen/commands/modifications.rb +12 -0
  68. data/lib/origen/commands/new.rb +113 -0
  69. data/lib/origen/commands/plugin.rb +105 -0
  70. data/lib/origen/commands/program.rb +70 -0
  71. data/lib/origen/commands/rc.rb +442 -0
  72. data/lib/origen/commands/save.rb +56 -0
  73. data/lib/origen/commands/target.rb +27 -0
  74. data/lib/origen/commands/time.rb +127 -0
  75. data/lib/origen/commands/version.rb +17 -0
  76. data/lib/origen/commands/web.rb +221 -0
  77. data/lib/origen/commands.rb +272 -0
  78. data/lib/origen/commands_global.rb +76 -0
  79. data/lib/origen/controller.rb +94 -0
  80. data/lib/origen/core_ext/array.rb +23 -0
  81. data/lib/origen/core_ext/bignum.rb +36 -0
  82. data/lib/origen/core_ext/enumerable.rb +76 -0
  83. data/lib/origen/core_ext/fixnum.rb +46 -0
  84. data/lib/origen/core_ext/hash.rb +52 -0
  85. data/lib/origen/core_ext/module.rb +14 -0
  86. data/lib/origen/core_ext/numeric.rb +126 -0
  87. data/lib/origen/core_ext/object.rb +13 -0
  88. data/lib/origen/core_ext/range.rb +7 -0
  89. data/lib/origen/core_ext/string.rb +124 -0
  90. data/lib/origen/core_ext.rb +10 -0
  91. data/lib/origen/database/key_value_store.rb +111 -0
  92. data/lib/origen/database/key_value_stores.rb +108 -0
  93. data/lib/origen/database.rb +6 -0
  94. data/lib/origen/encodings.rb +102 -0
  95. data/lib/origen/features/feature.rb +22 -0
  96. data/lib/origen/features.rb +104 -0
  97. data/lib/origen/file_handler.rb +429 -0
  98. data/lib/origen/generator/comparator.rb +56 -0
  99. data/lib/origen/generator/compiler.rb +277 -0
  100. data/lib/origen/generator/flow.rb +49 -0
  101. data/lib/origen/generator/job.rb +131 -0
  102. data/lib/origen/generator/pattern.rb +356 -0
  103. data/lib/origen/generator/pattern_finder.rb +155 -0
  104. data/lib/origen/generator/pattern_iterator.rb +55 -0
  105. data/lib/origen/generator/renderer.rb +113 -0
  106. data/lib/origen/generator/resources.rb +40 -0
  107. data/lib/origen/generator/stage.rb +89 -0
  108. data/lib/origen/generator.rb +85 -0
  109. data/lib/origen/global_methods.rb +205 -0
  110. data/lib/origen/import_manager.rb +596 -0
  111. data/lib/origen/location/base.rb +116 -0
  112. data/lib/origen/location/map.rb +83 -0
  113. data/lib/origen/location.rb +6 -0
  114. data/lib/origen/log.rb +217 -0
  115. data/lib/origen/logger_methods.rb +56 -0
  116. data/lib/origen/mode.rb +61 -0
  117. data/lib/origen/model.rb +267 -0
  118. data/lib/origen/model_initializer.rb +45 -0
  119. data/lib/origen/nvm/block_array.rb +72 -0
  120. data/lib/origen/nvm.rb +6 -0
  121. data/lib/origen/parameters/live.rb +22 -0
  122. data/lib/origen/parameters/missing.rb +28 -0
  123. data/lib/origen/parameters/set.rb +144 -0
  124. data/lib/origen/parameters.rb +107 -0
  125. data/lib/origen/pdm.rb +218 -0
  126. data/lib/origen/pins/function_proxy.rb +36 -0
  127. data/lib/origen/pins/ground_pin.rb +6 -0
  128. data/lib/origen/pins/pin.rb +860 -0
  129. data/lib/origen/pins/pin_bank.rb +349 -0
  130. data/lib/origen/pins/pin_clock.rb +124 -0
  131. data/lib/origen/pins/pin_collection.rb +492 -0
  132. data/lib/origen/pins/pin_common.rb +206 -0
  133. data/lib/origen/pins/port.rb +268 -0
  134. data/lib/origen/pins/power_pin.rb +30 -0
  135. data/lib/origen/pins.rb +696 -0
  136. data/lib/origen/registers/bit.rb +562 -0
  137. data/lib/origen/registers/bit_collection.rb +787 -0
  138. data/lib/origen/registers/container.rb +288 -0
  139. data/lib/origen/registers/domain.rb +16 -0
  140. data/lib/origen/registers/reg.rb +1406 -0
  141. data/lib/origen/registers/reg_collection.rb +24 -0
  142. data/lib/origen/registers.rb +652 -0
  143. data/lib/origen/regression_manager.rb +251 -0
  144. data/lib/origen/remote_manager.rb +340 -0
  145. data/lib/origen/revision_control/base.rb +257 -0
  146. data/lib/origen/revision_control/design_sync.rb +276 -0
  147. data/lib/origen/revision_control/git.rb +243 -0
  148. data/lib/origen/revision_control/subversion.rb +6 -0
  149. data/lib/origen/revision_control.rb +44 -0
  150. data/lib/origen/ruby_version_check.rb +131 -0
  151. data/lib/origen/site_config.rb +61 -0
  152. data/lib/origen/specs/checkers.rb +103 -0
  153. data/lib/origen/specs/creation_info.rb +17 -0
  154. data/lib/origen/specs/doc_resource.rb +91 -0
  155. data/lib/origen/specs/exhibit.rb +17 -0
  156. data/lib/origen/specs/mode_select.rb +16 -0
  157. data/lib/origen/specs/note.rb +17 -0
  158. data/lib/origen/specs/override.rb +21 -0
  159. data/lib/origen/specs/power_supply.rb +13 -0
  160. data/lib/origen/specs/spec.rb +226 -0
  161. data/lib/origen/specs/version_history.rb +14 -0
  162. data/lib/origen/specs.rb +552 -0
  163. data/lib/origen/sub_blocks.rb +298 -0
  164. data/lib/origen/tester/api.rb +277 -0
  165. data/lib/origen/tester/bdm/bdm.rb +25 -0
  166. data/lib/origen/tester/command_based_tester.rb +46 -0
  167. data/lib/origen/tester/doc/doc.rb +226 -0
  168. data/lib/origen/tester/doc/generator/flow.rb +71 -0
  169. data/lib/origen/tester/doc/generator/flow_line.rb +203 -0
  170. data/lib/origen/tester/doc/generator/test.rb +68 -0
  171. data/lib/origen/tester/doc/generator/test_group.rb +66 -0
  172. data/lib/origen/tester/doc/generator/tests.rb +47 -0
  173. data/lib/origen/tester/doc/generator.rb +126 -0
  174. data/lib/origen/tester/doc/model.rb +162 -0
  175. data/lib/origen/tester/generator/flow_control_api.rb +606 -0
  176. data/lib/origen/tester/generator/identity_map.rb +25 -0
  177. data/lib/origen/tester/generator/placeholder.rb +13 -0
  178. data/lib/origen/tester/generator/test_numberer.rb +25 -0
  179. data/lib/origen/tester/generator.rb +271 -0
  180. data/lib/origen/tester/interface.rb +154 -0
  181. data/lib/origen/tester/j750/files.rb +45 -0
  182. data/lib/origen/tester/j750/generator/flow.rb +123 -0
  183. data/lib/origen/tester/j750/generator/flow_line.rb +288 -0
  184. data/lib/origen/tester/j750/generator/patgroup.rb +111 -0
  185. data/lib/origen/tester/j750/generator/patgroups.rb +41 -0
  186. data/lib/origen/tester/j750/generator/patset.rb +111 -0
  187. data/lib/origen/tester/j750/generator/patsets.rb +41 -0
  188. data/lib/origen/tester/j750/generator/templates/flow.txt.erb +9 -0
  189. data/lib/origen/tester/j750/generator/templates/instances.txt.erb +16 -0
  190. data/lib/origen/tester/j750/generator/templates/patgroups.txt.erb +8 -0
  191. data/lib/origen/tester/j750/generator/templates/patsets.txt.erb +10 -0
  192. data/lib/origen/tester/j750/generator/test_instance.rb +846 -0
  193. data/lib/origen/tester/j750/generator/test_instance_group.rb +60 -0
  194. data/lib/origen/tester/j750/generator/test_instances.rb +182 -0
  195. data/lib/origen/tester/j750/generator.rb +203 -0
  196. data/lib/origen/tester/j750/j750.rb +845 -0
  197. data/lib/origen/tester/j750/j750_hpt.rb +35 -0
  198. data/lib/origen/tester/j750/parser/ac_spec.rb +11 -0
  199. data/lib/origen/tester/j750/parser/ac_specs.rb +0 -0
  200. data/lib/origen/tester/j750/parser/dc_spec.rb +36 -0
  201. data/lib/origen/tester/j750/parser/dc_specs.rb +50 -0
  202. data/lib/origen/tester/j750/parser/descriptions.rb +340 -0
  203. data/lib/origen/tester/j750/parser/flow.rb +111 -0
  204. data/lib/origen/tester/j750/parser/flow_line.rb +207 -0
  205. data/lib/origen/tester/j750/parser/flows.rb +23 -0
  206. data/lib/origen/tester/j750/parser/pattern_set.rb +94 -0
  207. data/lib/origen/tester/j750/parser/pattern_sets.rb +33 -0
  208. data/lib/origen/tester/j750/parser/test_instance.rb +322 -0
  209. data/lib/origen/tester/j750/parser/test_instances.rb +26 -0
  210. data/lib/origen/tester/j750/parser/timeset.rb +15 -0
  211. data/lib/origen/tester/j750/parser/timesets.rb +0 -0
  212. data/lib/origen/tester/j750/parser.rb +104 -0
  213. data/lib/origen/tester/jlink/jlink.rb +33 -0
  214. data/lib/origen/tester/parser/description_lookup.rb +64 -0
  215. data/lib/origen/tester/parser/searchable_array.rb +32 -0
  216. data/lib/origen/tester/parser/searchable_hash.rb +32 -0
  217. data/lib/origen/tester/parser.rb +24 -0
  218. data/lib/origen/tester/time.rb +338 -0
  219. data/lib/origen/tester/timing.rb +253 -0
  220. data/lib/origen/tester/ultraflex/files.rb +45 -0
  221. data/lib/origen/tester/ultraflex/generator/flow.rb +119 -0
  222. data/lib/origen/tester/ultraflex/generator/flow_line.rb +269 -0
  223. data/lib/origen/tester/ultraflex/generator/patgroup.rb +111 -0
  224. data/lib/origen/tester/ultraflex/generator/patgroups.rb +41 -0
  225. data/lib/origen/tester/ultraflex/generator/patset.rb +111 -0
  226. data/lib/origen/tester/ultraflex/generator/patsets.rb +41 -0
  227. data/lib/origen/tester/ultraflex/generator/templates/flow.txt.erb +9 -0
  228. data/lib/origen/tester/ultraflex/generator/templates/instances.txt.erb +16 -0
  229. data/lib/origen/tester/ultraflex/generator/templates/patgroups.txt.erb +8 -0
  230. data/lib/origen/tester/ultraflex/generator/templates/patsets.txt.erb +10 -0
  231. data/lib/origen/tester/ultraflex/generator/test_instance.rb +622 -0
  232. data/lib/origen/tester/ultraflex/generator/test_instance_group.rb +60 -0
  233. data/lib/origen/tester/ultraflex/generator/test_instances.rb +174 -0
  234. data/lib/origen/tester/ultraflex/generator.rb +200 -0
  235. data/lib/origen/tester/ultraflex/parser/ac_spec.rb +11 -0
  236. data/lib/origen/tester/ultraflex/parser/ac_specs.rb +0 -0
  237. data/lib/origen/tester/ultraflex/parser/dc_spec.rb +36 -0
  238. data/lib/origen/tester/ultraflex/parser/dc_specs.rb +50 -0
  239. data/lib/origen/tester/ultraflex/parser/descriptions.rb +342 -0
  240. data/lib/origen/tester/ultraflex/parser/flow.rb +111 -0
  241. data/lib/origen/tester/ultraflex/parser/flow_line.rb +207 -0
  242. data/lib/origen/tester/ultraflex/parser/flows.rb +23 -0
  243. data/lib/origen/tester/ultraflex/parser/pattern_set.rb +94 -0
  244. data/lib/origen/tester/ultraflex/parser/pattern_sets.rb +33 -0
  245. data/lib/origen/tester/ultraflex/parser/test_instance.rb +262 -0
  246. data/lib/origen/tester/ultraflex/parser/test_instances.rb +26 -0
  247. data/lib/origen/tester/ultraflex/parser/timeset.rb +15 -0
  248. data/lib/origen/tester/ultraflex/parser/timesets.rb +0 -0
  249. data/lib/origen/tester/ultraflex/parser.rb +104 -0
  250. data/lib/origen/tester/ultraflex/ultraflex.rb +759 -0
  251. data/lib/origen/tester/v93k/generator/flow.rb +63 -0
  252. data/lib/origen/tester/v93k/generator/flow_node/print.rb +10 -0
  253. data/lib/origen/tester/v93k/generator/flow_node.rb +17 -0
  254. data/lib/origen/tester/v93k/generator/pattern.rb +16 -0
  255. data/lib/origen/tester/v93k/generator/pattern_master.rb +54 -0
  256. data/lib/origen/tester/v93k/generator/templates/_test_method.txt.erb +6 -0
  257. data/lib/origen/tester/v93k/generator/templates/_test_suite.txt.erb +11 -0
  258. data/lib/origen/tester/v93k/generator/templates/template.flow.erb +121 -0
  259. data/lib/origen/tester/v93k/generator/templates/template.pmfl.erb +9 -0
  260. data/lib/origen/tester/v93k/generator/test_function.rb +103 -0
  261. data/lib/origen/tester/v93k/generator/test_functions.rb +79 -0
  262. data/lib/origen/tester/v93k/generator/test_method.rb +46 -0
  263. data/lib/origen/tester/v93k/generator/test_methods.rb +75 -0
  264. data/lib/origen/tester/v93k/generator/test_suite.rb +54 -0
  265. data/lib/origen/tester/v93k/generator/test_suites.rb +65 -0
  266. data/lib/origen/tester/v93k/generator.rb +80 -0
  267. data/lib/origen/tester/v93k/v93k.rb +420 -0
  268. data/lib/origen/tester/vector.rb +86 -0
  269. data/lib/origen/tester/vector_generator.rb +633 -0
  270. data/lib/origen/tester/vector_pipeline.rb +150 -0
  271. data/lib/origen/tester.rb +56 -0
  272. data/lib/origen/top_level.rb +134 -0
  273. data/lib/origen/users/ldap.rb +65 -0
  274. data/lib/origen/users/user.rb +149 -0
  275. data/lib/origen/users.rb +30 -0
  276. data/lib/origen/utility/block_args.rb +93 -0
  277. data/lib/origen/utility/csv_data.rb +110 -0
  278. data/lib/origen/utility/design_sync.rb +494 -0
  279. data/lib/origen/utility/diff.rb +158 -0
  280. data/lib/origen/utility/input_capture.rb +121 -0
  281. data/lib/origen/utility/mailer.rb +143 -0
  282. data/lib/origen/utility/s_record.rb +205 -0
  283. data/lib/origen/utility/time_and_date.rb +30 -0
  284. data/lib/origen/utility.rb +12 -0
  285. data/lib/origen/version_checker.rb +117 -0
  286. data/lib/origen/version_string.rb +356 -0
  287. data/lib/origen.rb +648 -0
  288. data/lib/tasks/gem.rake +27 -22
  289. data/origen_site_config.yml +36 -0
  290. data/source_setup +17 -0
  291. data/spec/format/rgen_formatter.rb +14 -0
  292. data/templates/api_doc/README.txt.erb +24 -0
  293. data/templates/code_generators/gemfile_app.rb +4 -0
  294. data/templates/code_generators/gemfile_plugin.rb +6 -0
  295. data/templates/code_generators/gemspec.rb +33 -0
  296. data/templates/code_generators/rakefile.rb +10 -0
  297. data/templates/code_generators/spec_helper.rb +49 -0
  298. data/templates/code_generators/version.rb +8 -0
  299. data/templates/code_generators/version_time.rb +3 -0
  300. data/templates/git/gitignore.erb +33 -0
  301. data/templates/j750/_vt_flow.txt.erb +8 -0
  302. data/templates/j750/_vt_instances.txt.erb +4 -0
  303. data/templates/j750/program_sheet.txt.erb +9 -0
  304. data/templates/nanoc/Rules +74 -0
  305. data/templates/nanoc/config.yaml +77 -0
  306. data/templates/nanoc/content/favicon.ico +0 -0
  307. data/templates/nanoc/layouts/bootstrap.html.erb +63 -0
  308. data/templates/nanoc/layouts/bootstrap3.html.erb +71 -0
  309. data/templates/nanoc/layouts/freescale.html.erb +79 -0
  310. data/templates/nanoc/lib/bootstrap_filter.rb +49 -0
  311. data/templates/nanoc/lib/codeblocks_filter.rb +41 -0
  312. data/templates/nanoc/lib/default.rb +2 -0
  313. data/templates/nanoc/lib/gzip_filter.rb +16 -0
  314. data/templates/nanoc/lib/haml_code_filter.rb +41 -0
  315. data/templates/nanoc/lib/helpers.rb +1 -0
  316. data/templates/nanoc/lib/search_filter.rb +62 -0
  317. data/templates/nanoc_dynamic/content/search.js.erb +92 -0
  318. data/templates/shared/web/_logo.html +10 -0
  319. data/templates/test/_inline_sub.txt.erb +2 -0
  320. data/templates/test/environment.txt.erb +1 -0
  321. data/templates/test/inline.txt.erb +11 -0
  322. data/templates/test/inspections.txt.erb +19 -0
  323. data/templates/test/set1/_sub1.txt.erb +12 -0
  324. data/templates/test/set1/_sub4.txt.erb +1 -0
  325. data/templates/test/set1/_sub5.txt.erb +1 -0
  326. data/templates/test/set1/main.txt.erb +53 -0
  327. data/templates/test/set1/sub_dir/_sub2.txt.erb +20 -0
  328. data/templates/test/set1/sub_dir/_sub3.txt.erb +12 -0
  329. data/templates/test/set1/sub_dir/main2.txt.erb +4 -0
  330. data/templates/test/set2/template_with_no_erb_1.txt +9 -0
  331. data/templates/test/set2/template_with_no_erb_2.txt +9 -0
  332. data/templates/test/set3/_layout.html.erb +4 -0
  333. data/templates/test/set3/content.html.erb +6 -0
  334. data/templates/time/filter.rb.erb +15 -0
  335. data/templates/time/rules.rb.erb +45 -0
  336. 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