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,298 @@
1
+ module Origen
2
+ module SubBlocks
3
+ # This will be called whenever an object that includes this module
4
+ # is instantiated
5
+ #
6
+ # @api private
7
+ def init_sub_blocks(*args)
8
+ options = args.find { |a| a.is_a?(Hash) }
9
+ if options
10
+ # Using reg_base_address for storage to avoid class with the original Origen base
11
+ # address API, but will accept any of these
12
+ @reg_base_address = options.delete(:reg_base_address) || options.delete(:reg_base_address) ||
13
+ options.delete(:base_address) || options.delete(:base) || 0
14
+ @domain_names = [options.delete(:domain) || options.delete(:domains)].flatten.compact
15
+ @domain_specified = !@domain_names.empty?
16
+ @path = options.delete(:path)
17
+ @abs_path = options.delete(:abs_path) || options.delete(:absolute_path)
18
+ end
19
+ if is_a?(SubBlock)
20
+ options.each do |k, v|
21
+ send("#{k}=", v)
22
+ end
23
+ end
24
+ end
25
+
26
+ module Domains
27
+ def domain(name, options = {})
28
+ domains[name] = Origen::Registers::Domain.new(name, options)
29
+ end
30
+
31
+ def domain_specified?
32
+ @domain_specified
33
+ end
34
+
35
+ def domains
36
+ @domains ||= {}.with_indifferent_access
37
+ if @domain_names
38
+ @domain_names.each do |domain|
39
+ if domain.is_a?(Origen::Registers::Domain)
40
+ @domains[domain.id] = domain
41
+ elsif parent.domains[domain]
42
+ @domains[domain] = parent.domains[domain]
43
+ else
44
+ fail "Uknown domain: #{domain}"
45
+ end
46
+ end
47
+ @domain_names = nil
48
+ end
49
+ if parent && @domains.empty?
50
+ parent.domains
51
+ else
52
+ @domains
53
+ end
54
+ end
55
+ alias_method :register_domains, :domains
56
+ end
57
+ include Domains
58
+
59
+ # Jumping through some hoops here since many Origen modules talk about an owner,
60
+ # but would prefer to start standardizing on parent in future, so this should give
61
+ # most Origen models a parent method
62
+ module Parent
63
+ def parent
64
+ @owner
65
+ end
66
+ alias_method :owner, :parent
67
+
68
+ unless method_defined? :owner=
69
+ def owner=(obj)
70
+ if obj.respond_to?(:controller) && obj.controller
71
+ @owner = obj.controller
72
+ else
73
+ @owner = obj
74
+ end
75
+ end
76
+ end
77
+ alias_method :parent=, :owner=
78
+ end
79
+ include Parent
80
+
81
+ module RegBaseAddress
82
+ def reg_base_address(options = {})
83
+ if options[:relative]
84
+ reg_base_address_for_domain(options)
85
+ else
86
+ total_reg_base_address = reg_base_address_for_domain(options)
87
+ if parent
88
+ total_reg_base_address += parent.reg_base_address(options)
89
+ end
90
+ total_reg_base_address
91
+ end
92
+ end
93
+
94
+ def reg_base_address_for_domain(options)
95
+ if @reg_base_address
96
+ if @reg_base_address.is_a?(Hash)
97
+ if options[:domain]
98
+ if options[:domain].is_a?(Hash)
99
+ domains = options[:domain].keys
100
+ else
101
+ domains = [options[:domain]].flatten
102
+ end
103
+ bases = domains.map do |d|
104
+ @reg_base_address.with_indifferent_access[d]
105
+ end.compact
106
+ if bases.empty?
107
+ @reg_base_address[:default] || 0
108
+ else
109
+ if bases.size > 1
110
+ fail 'Multiple base addresses found, specify the domain you want, e.g. reg.address(domain: :ahb)'
111
+ else
112
+ bases.first
113
+ end
114
+ end
115
+ else
116
+ @reg_base_address[:default] || 0
117
+ end
118
+ else
119
+ @reg_base_address
120
+ end
121
+ else
122
+ 0
123
+ end
124
+ end
125
+
126
+ unless method_defined? :base_address
127
+ def base_address
128
+ reg_base_address
129
+ end
130
+ end
131
+ end
132
+ include RegBaseAddress
133
+
134
+ module Path
135
+ def path=(val)
136
+ @path = val
137
+ end
138
+
139
+ def path_var
140
+ @path
141
+ end
142
+
143
+ def abs_path=(val)
144
+ @abs_path = val
145
+ end
146
+ alias_method :full_path=, :abs_path=
147
+
148
+ def abs_path
149
+ @abs_path
150
+ end
151
+ alias_method :full_path, :abs_path
152
+
153
+ def path(options = {})
154
+ return abs_path if abs_path
155
+ if is_a?(Origen::Registers::BitCollection)
156
+ # Special case where path relative to the register has been requested
157
+ if options[:relative_to] == parent
158
+ if size == 1
159
+ return "[#{position}]"
160
+ else
161
+ return "[#{position + size - 1}:#{position}]"
162
+ end
163
+ else
164
+ p = parent.parent
165
+ end
166
+ else
167
+ p = parent
168
+ end
169
+ if p && p != options[:relative_to]
170
+ if p.path(options).empty?
171
+ root = ''
172
+ else
173
+ root = "#{p.path(options)}."
174
+ end
175
+ else
176
+ root = ''
177
+ end
178
+ local = (path_var || name || self.class.to_s.split('::').last).to_s
179
+ if local == 'hidden'
180
+ root.chop
181
+ else
182
+ "#{root}#{local}"
183
+ end
184
+ end
185
+ alias_method :hdl_path, :path
186
+ end
187
+ include Path
188
+
189
+ # Returns a hash containing all immediate children of the given sub-block
190
+ def sub_blocks
191
+ @sub_blocks ||= {}.with_indifferent_access
192
+ end
193
+ alias_method :children, :sub_blocks
194
+
195
+ # Delete all sub_blocks by emptyig the Hash
196
+ def delete_sub_blocks
197
+ @sub_blocks = {}
198
+ end
199
+
200
+ def sub_blocks_array
201
+ sub_blocks.map { |_name, sub_block| sub_block }
202
+ end
203
+ alias_method :children_array, :sub_blocks_array
204
+
205
+ # Returns an array containing all descendant child objects of the given sub-block, i.e. this returns
206
+ # an array containing children's children as well
207
+ #
208
+ # Note that this returns an array instead of a hash since there could be naming collisions in the
209
+ # hash keys
210
+ def all_sub_blocks
211
+ @all_sub_blocks ||= begin
212
+ (sub_blocks_array + sub_blocks_array.map(&:all_sub_blocks)).flatten
213
+ end
214
+ end
215
+
216
+ # Returns true if the given sub block owns at least one register
217
+ def owns_registers?
218
+ if regs
219
+ regs.is_a?(Origen::Registers::RegCollection) && !regs.empty?
220
+ else
221
+ false
222
+ end
223
+ end
224
+
225
+ def sub_block(name, options = {})
226
+ class_name = options.delete(:class_name)
227
+ if class_name
228
+ begin
229
+ klass = eval("::#{namespace}::#{class_name}")
230
+ rescue
231
+ begin
232
+ klass = eval(class_name)
233
+ rescue
234
+ begin
235
+ klass = eval("#{self.class}::#{class_name}")
236
+ rescue
237
+ puts "Could not find class: #{class_name}"
238
+ raise 'Unknown sub block class!'
239
+ end
240
+ end
241
+ end
242
+ else
243
+ klass = Origen::SubBlock
244
+ end
245
+ unless klass.respond_to?(:includes_origen_model)
246
+ puts 'Any class which is to be instantiated as a sub_block must include Origen::Model,'
247
+ puts "add this to #{klass}:"
248
+ puts ''
249
+ puts ' include Origen::Model'
250
+ puts ''
251
+ fail 'Sub block does not include Origen::Model!'
252
+ end
253
+ block = klass.new(options.merge(parent: self))
254
+ block.name = name
255
+ sub_blocks[name] = block
256
+ if respond_to?(name)
257
+ # puts "Tried to create a sub-block named #{name} in #{self.class}, but it already has a method with this name!"
258
+ # puts "To avoid confusion rename one of them and try again!"
259
+ # raise "Non-unique sub-block name!"
260
+ else
261
+ define_singleton_method name do
262
+ sub_blocks[name]
263
+ end
264
+ end
265
+ block
266
+ end
267
+
268
+ def namespace
269
+ self.class.to_s.sub(/::[^:]*$/, '')
270
+ end
271
+ end
272
+
273
+ # A simple class that will be instantiated by default when a sub block is
274
+ # defined without another class name specified
275
+ #
276
+ # This class includes support for registers, pins, etc.
277
+ class SubBlock
278
+ include Origen::Model
279
+
280
+ # Used to create attribute accessors on the fly.
281
+ #
282
+ # On first call of a missing method a method is generated to avoid the missing lookup
283
+ # next time, this should be faster for repeated lookups of the same method, e.g. reg
284
+ def method_missing(method, *args, &block)
285
+ return regs(method) if self.has_reg?(method)
286
+ if method.to_s =~ /=$/
287
+ define_singleton_method(method) do |val|
288
+ instance_variable_set("@#{method.to_s.sub('=', '')}", val)
289
+ end
290
+ else
291
+ define_singleton_method(method) do
292
+ instance_variable_get("@#{method}")
293
+ end
294
+ end
295
+ send(method, *args, &block)
296
+ end
297
+ end
298
+ end
@@ -0,0 +1,277 @@
1
+ module Origen
2
+ module Tester
3
+ # This module implements the basic set of methods that a tester must have
4
+ # in order for Origen to talk to it.
5
+ #
6
+ # They can be overridden by tester specific classes and who may go on to add
7
+ # additional methods of their own.
8
+ #
9
+ # Essentially this API means that any class that includes Origen::Tester will
10
+ # function as a tester, although it might not do very much!
11
+ module API
12
+ attr_accessor :includes
13
+ attr_accessor :comment_level
14
+ attr_accessor :generating
15
+ attr_accessor :inhibit_comments
16
+ attr_accessor :inhibit_vectors
17
+
18
+ def name
19
+ @name || self.class
20
+ end
21
+
22
+ def generate?
23
+ true
24
+ end
25
+
26
+ def generating_pattern?
27
+ @generating == :pattern
28
+ end
29
+
30
+ def generating_program?
31
+ @generating == :program
32
+ end
33
+
34
+ def pat_extension
35
+ @pat_extension || 'txt'
36
+ end
37
+ alias_method :pattern_extension, :pat_extension
38
+
39
+ def comment_char
40
+ @comment_char || '//'
41
+ end
42
+
43
+ def program_comment_char
44
+ @program_comment_char || comment_char
45
+ end
46
+
47
+ def pattern_header(*_args)
48
+ end
49
+
50
+ def pattern_footer(*_args)
51
+ end
52
+
53
+ def step_comment_prefix
54
+ @step_comment_prefix || '##'
55
+ end
56
+
57
+ def is_vector_based?
58
+ return @vector_based if defined?(@vector_based)
59
+ true
60
+ end
61
+
62
+ def is_command_based?
63
+ !is_vector_based?
64
+ end
65
+
66
+ def j750?
67
+ false
68
+ end
69
+
70
+ def v93k?
71
+ false
72
+ end
73
+
74
+ def ultraflex?
75
+ false
76
+ end
77
+
78
+ def doc?
79
+ false
80
+ end
81
+
82
+ def j750_hpt?
83
+ false
84
+ end
85
+
86
+ def annotate(_msg, _options = {})
87
+ end
88
+
89
+ # Ignore fails on the given pins for the duration of the given block, this
90
+ # has the effect of temporarily setting the states of the given pins to
91
+ # don't care.
92
+ def ignore_fails(*pins)
93
+ pins.each(&:suspend)
94
+ yield
95
+ pins.each(&:resume)
96
+ end
97
+
98
+ # Output a comment in the pattern, normally you would not call this directly
99
+ # and instead use these shorthand methods:
100
+ # cc "Some comment"
101
+ # ss "A single line step comment"
102
+ # step_comment do
103
+ # cc "A multi line"
104
+ # cc "step comment"
105
+ # end
106
+ def c1(msg, _options = {})
107
+ prefix = comment_char + ' '
108
+ prefix += step_comment_prefix + ' ' if @step_comment_on
109
+ push_comment(prefix + msg.to_s)
110
+ end
111
+
112
+ def c2(msg, options = {})
113
+ c1(msg, options)
114
+ end
115
+
116
+ def pattern_section(msg)
117
+ if generating_program?
118
+ yield
119
+ else
120
+ step_comment(msg)
121
+ yield
122
+ end
123
+ end
124
+
125
+ def ss(msg = nil)
126
+ div = step_comment_prefix.length
127
+ div = 1 if div == 0
128
+ c1(step_comment_prefix * (70 / div))
129
+ @step_comment_on = true
130
+ if block_given?
131
+ yield
132
+ else
133
+ c1(msg)
134
+ end
135
+ @step_comment_on = false
136
+ c1(step_comment_prefix * (70 / div))
137
+ end
138
+
139
+ def snip(_number, _options = {})
140
+ yield
141
+ end
142
+
143
+ # Allows a section to be run without actually generating any vectors. This can be useful
144
+ # to ensure the pin states end up as they otherwise would have if the section had been run.
145
+ # Classic example of this is a subroutine pattern, wrap this around a call to the startup
146
+ # routine to ensure the pin states are as they would have been immediately after the startup.
147
+ # ==== Example
148
+ # # Setup state as if I had run startup without actually doing so
149
+ # $tester.inhibit_vectors_and_comments do
150
+ # $soc.startup
151
+ # $top.startup
152
+ # end
153
+ def inhibit_vectors_and_comments
154
+ inhibit_vectors = @inhibit_vectors
155
+ inhibit_comments = @inhibit_comments
156
+ @inhibit_vectors = true
157
+ @inhibit_comments = true
158
+ yield
159
+ @inhibit_vectors = inhibit_vectors # Restore to their initial state
160
+ @inhibit_comments = inhibit_comments
161
+ end
162
+
163
+ # @see inhibit_vectors_and_comments
164
+ def inhibit_vectors
165
+ inhibit_vectors = @inhibit_vectors
166
+ @inhibit_vectors = true
167
+ yield
168
+ @inhibit_vectors = inhibit_vectors # Restore to their initial state
169
+ end
170
+
171
+ # @see inhibit_vectors_and_comments
172
+ def inhibit_comments
173
+ inhibit_comments = @inhibit_comments
174
+ @inhibit_comments = true
175
+ yield
176
+ @inhibit_comments = inhibit_comments
177
+ end
178
+
179
+ # Generate a vector.
180
+ # Calling this method will generate a vector in the output pattern based on the
181
+ # current pin states and timeset.
182
+ def cycle(options = {})
183
+ options = {
184
+ microcode: '',
185
+ timeset: current_timeset,
186
+ pin_vals: current_pin_vals,
187
+ repeat: nil
188
+ }.merge(options)
189
+
190
+ if any_clocks_running?
191
+ update_running_clocks
192
+ if options[:repeat]
193
+ slice_repeats(options).each do |slice|
194
+ options[:repeat] = slice[0]
195
+ delay(options.delete(:repeat), options) do |options|
196
+ push_vector(options)
197
+ end
198
+ slice[1].each { |clock_pin_name| clocks_running[clock_pin_name].toggle_clock }
199
+ options[:pin_vals] = current_pin_vals
200
+ end
201
+ else
202
+ push_vector(options)
203
+ pins_need_toggling.each { |clock_pin_name| clocks_running[clock_pin_name].toggle_clock }
204
+ end
205
+ else
206
+ if options[:repeat]
207
+ delay(options.delete(:repeat), options) do |options|
208
+ push_vector(options)
209
+ end
210
+ else
211
+ push_vector(options)
212
+ end
213
+ end
214
+ end
215
+
216
+ def import_test_time(_file, _options = {})
217
+ puts "Sorry but an importer doesn't exist for: #{Origen.tester.class}"
218
+ end
219
+
220
+ def any_clocks_running?
221
+ @clocks_running.nil? ? false : @clocks_running.count > 0
222
+ end
223
+
224
+ def clocks_running
225
+ @clocks_running
226
+ end
227
+ alias_method :running_clocks, :clocks_running
228
+
229
+ def push_running_clock(pin)
230
+ @clocks_running.nil? ? @clocks_running = { pin.name.to_s => pin } : @clocks_running[pin.name.to_s] = pin
231
+ end
232
+
233
+ def pop_running_clock(pin)
234
+ fail "ERROR: No clocks running, doesn't make sense to pop one" unless any_clocks_running?
235
+ @clocks_running.delete(pin.name.to_s)
236
+ end
237
+
238
+ def slice_repeats(options = {})
239
+ slices = {}
240
+ repeat_ary = []
241
+ clocks_running.each do |name, clock_pin|
242
+ if clock_pin.next_edge < (cycle_count + options[:repeat])
243
+ pin_slices = (clock_pin.next_edge..(cycle_count + options[:repeat])).step(clock_pin.half_period).to_a
244
+ pin_slices.insert(0, cycle_count)
245
+ else
246
+ pin_slices = [cycle_count]
247
+ end
248
+ pin_slices.each do |cycle|
249
+ slices[cycle].nil? ? slices[cycle] = name : slices[cycle] = "#{slices[cycle]},#{name}"
250
+ end
251
+ slices[cycle_count + options[:repeat]] = '' if pin_slices[-1] != cycle_count + options[:repeat]
252
+ end
253
+ slices.keys.sort.each do |edge_cycles|
254
+ # puts "Toggle #{slices[edge_cycles]} on #{edge_cycles}"
255
+ repeat_ary.push([edge_cycles, slices[edge_cycles].split(',')])
256
+ end
257
+
258
+ (repeat_ary.count - 1).downto(1).each { |i| repeat_ary[i][0] = repeat_ary[i][0] - repeat_ary[i - 1][0] }
259
+ repeat_ary[1..-1]
260
+ end
261
+
262
+ def pins_need_toggling
263
+ toggle_ary = []
264
+ clocks_running.each do |name, clock_pin|
265
+ toggle_ary.push("#{name}") if clock_pin.next_edge == cycle_count
266
+ end
267
+ toggle_ary
268
+ end
269
+
270
+ def update_running_clocks
271
+ clocks_running.each do |_name, clock_pin|
272
+ clock_pin.update_clock
273
+ end
274
+ end
275
+ end
276
+ end
277
+ end
@@ -0,0 +1,25 @@
1
+ module Origen
2
+ module Tester
3
+ class BDM < CommandBasedTester
4
+ def initialize
5
+ super
6
+ # The minimum time unit is 0.1s
7
+ set_timeset('default', 100_000_000)
8
+ @pat_extension = 'cmd'
9
+ @comment_char = '//'
10
+ end
11
+
12
+ def delay(cycles)
13
+ microcode "WAIT #{cycles_to_ts(cycles)}"
14
+ end
15
+
16
+ def write_byte(address, data)
17
+ microcode "WB 0x#{address.to_s(16).upcase} 0x#{data.to_s(16).upcase}"
18
+ end
19
+
20
+ def write_word(address, data)
21
+ microcode "WW 0x#{address.to_s(16).upcase} 0x#{data.to_s(16).upcase}"
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,46 @@
1
+ module Origen
2
+ module Tester
3
+ # A base class that can be used to model command-based, rather than
4
+ # vector-based testers.
5
+ class CommandBasedTester
6
+ include Tester
7
+
8
+ def initialize
9
+ @vector_based = false
10
+ end
11
+
12
+ # Write a string directly to the output file without being processed
13
+ # or modified in any way
14
+ def direct_write(str)
15
+ microcode str
16
+ end
17
+ alias_method :dw, :direct_write
18
+
19
+ # Concept of a cycle not supported, print out an error to the output
20
+ # file to alert the user that execution has hit code that is not
21
+ # compatible with a command based tester.
22
+ def cycle(*_args)
23
+ microcode '*** Cycle called ***'
24
+ end
25
+
26
+ # Concept of a subroutine not supported, print out an error to the output
27
+ # file to alert the user that execution has hit code that is not
28
+ # compatible with a command based tester.
29
+ def call_subroutine(sub)
30
+ microcode "Call_subroutine called to #{sub}"
31
+ end
32
+
33
+ def format_vector(vec)
34
+ vec.microcode
35
+ end
36
+
37
+ # Loop the content embedded in the supplied block
38
+ def loop(_name = nil, number_of_loops)
39
+ number_of_loops.times do
40
+ yield
41
+ end
42
+ end
43
+ alias_method :loop_vector, :loop
44
+ end
45
+ end
46
+ end