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,746 @@
1
+ module Origen
2
+ # In Origen v2 this class was introduced to formally co-ordinate application level
3
+ # configuration of Origen.
4
+ #
5
+ # == Configuration
6
+ #
7
+ # See Origen::Application::Configuration for the available options.
8
+ class Application
9
+ autoload :Configuration, 'origen/application/configuration'
10
+ autoload :Target, 'origen/application/target'
11
+ autoload :Environment, 'origen/application/environment'
12
+ autoload :PluginsManager, 'origen/application/plugins_manager'
13
+ autoload :LSF, 'origen/application/lsf'
14
+ autoload :Runner, 'origen/application/runner'
15
+ autoload :ConfigurationManager, 'origen/application/configuration_manager'
16
+ autoload :LSFManager, 'origen/application/lsf_manager'
17
+ autoload :Release, 'origen/application/release'
18
+ autoload :Deployer, 'origen/application/deployer'
19
+ autoload :VersionTracker, 'origen/application/version_tracker'
20
+ autoload :CommandDispatcher, 'origen/application/command_dispatcher'
21
+ autoload :WorkspaceManager, 'origen/application/workspace_manager'
22
+
23
+ require 'origen/users'
24
+ include Origen::Users
25
+
26
+ attr_accessor :current_job
27
+ attr_accessor :name
28
+ attr_accessor :namespace
29
+
30
+ class << self
31
+ def inherited(base)
32
+ # Somehow using the old import system and version file format we can get in here when
33
+ # loading the version, this can be removed in future when the imports API is retired
34
+ unless caller[0] =~ /version.rb.*/
35
+ root = Pathname.new(caller[0].sub(/(\\|\/)?config(\\|\/)application.rb.*/, '')).realpath
36
+ app = base.instance
37
+ app.root = root.to_s
38
+ Origen.register_application(app)
39
+ app.add_lib_to_load_path!
40
+ end
41
+ end
42
+
43
+ def instance
44
+ @instance ||= new
45
+ end
46
+
47
+ def respond_to?(*args)
48
+ super || instance.respond_to?(*args)
49
+ end
50
+
51
+ protected
52
+
53
+ def method_missing(*args, &block)
54
+ instance.send(*args, &block)
55
+ end
56
+ end
57
+
58
+ # A simple class to load all rake tasks available to an application, a class is used here
59
+ # to avoid collision with the Rake namespace method
60
+ class RakeLoader
61
+ require 'rake'
62
+ include Rake::DSL
63
+
64
+ def load_tasks
65
+ $VERBOSE = nil # Don't care about world writable dir warnings and the like
66
+ require 'colored'
67
+
68
+ # Load all Origen tasks first
69
+ Dir.glob("#{Origen.top}/lib/tasks/*.rake").sort.each do |file|
70
+ load file
71
+ end
72
+ # Now the application's own tasks
73
+ if Origen.app.origen_core?
74
+ Dir.glob("#{Origen.root}/lib/tasks/private/*.rake").sort.each do |file|
75
+ load file
76
+ end
77
+ else
78
+ Dir.glob("#{Origen.root}/lib/tasks/*.rake").sort.each do |file|
79
+ load file
80
+ end
81
+ end
82
+ # Finally those that the plugin's have given us
83
+ ([Origen.app] + Origen.plugins).each do |plugin|
84
+ namespace plugin.name do
85
+ Dir.glob("#{plugin.root}/lib/tasks/shared/*.rake").sort.each do |file|
86
+ load file
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
92
+
93
+ # Load all rake tasks defined in the application's lib/task directory
94
+ def load_tasks
95
+ RakeLoader.new.load_tasks
96
+ end
97
+
98
+ # Returns
99
+ def revision_controller
100
+ if current?
101
+ if config.rc_url
102
+ if config.rc_url =~ /^sync:/
103
+ @revision_controller ||= RevisionControl::DesignSync.new(
104
+ local: root,
105
+ remote: config.rc_url
106
+ )
107
+ elsif config.rc_url =~ /git/
108
+ @revision_controller ||= RevisionControl::Git.new(
109
+ local: root,
110
+ remote: config.rc_url
111
+ )
112
+ else
113
+ fail "The revision control type could not be worked out from the value config.rc_url: #{config.rc_url}"
114
+ end
115
+ else
116
+ @revision_controller ||= RevisionControl::DesignSync.new(
117
+ local: root,
118
+ remote: config.vault
119
+ )
120
+ end
121
+ else
122
+ fail "Only the top-level application has a revision controller! #{name} is a plugin"
123
+ end
124
+ end
125
+ alias_method :rc, :revision_controller
126
+
127
+ # This callback handler will fire once the main app and all of its plugins have been loaded
128
+ def on_loaded
129
+ config.log_deprecations
130
+ end
131
+
132
+ # Convenience method to check if the given application instance is Origen core
133
+ def origen_core?
134
+ name.to_s.symbolize == :origen_core
135
+ end
136
+
137
+ def inspect
138
+ "<Origen app (#{name}):#{object_id}>"
139
+ end
140
+
141
+ def root=(val)
142
+ @root = Pathname.new(val)
143
+ end
144
+
145
+ def require_environment!
146
+ Origen.deprecate 'Calling app.require_environment! is no longer required, the app environment is now automtically loaded when Origen.app is called'
147
+ end
148
+
149
+ # Returns a full path to the root directory of the given application
150
+ #
151
+ # If the application instance is a plugin then this will point to where
152
+ # the application is installed within the imports directory
153
+ def root
154
+ @root
155
+ end
156
+
157
+ # Returns the namespace used by the application as a string
158
+ def namespace
159
+ @namespace ||= self.class.to_s.split('::').first.gsub('_', '').sub('Application', '')
160
+ end
161
+
162
+ # Returns an array of users who have subscribed for production release
163
+ # notifications for the given application on the website
164
+ def subscribers_prod
165
+ if server_data
166
+ @subscribers_prod ||= server_data[:subscribers_prod].map { |u| User.new(u[:core_id]) }
167
+ else
168
+ []
169
+ end
170
+ end
171
+
172
+ # Returns an array of users who have subscribed for development release
173
+ # notifications for the given application on the website
174
+ def subscribers_dev
175
+ if server_data
176
+ @subscribers_dev ||= server_data[:subscribers_dev].map { |u| User.new(u[:core_id]) }
177
+ else
178
+ []
179
+ end
180
+ end
181
+
182
+ # Returns the server data packet available for the given application,
183
+ # returns nil if none is found
184
+ def server_data
185
+ if name == :origen
186
+ @server_data ||= Origen.client.origen
187
+ else
188
+ @server_data ||= Origen.client.plugins.find { |p| p[:origen_name].downcase == name.to_s.downcase }
189
+ end
190
+ end
191
+
192
+ # Returns true if the given application instance is the
193
+ # current top level application
194
+ def current?
195
+ Origen.app == self
196
+ end
197
+
198
+ # Returns true if the given application instance is
199
+ # the current plugin
200
+ def current_plugin?
201
+ if Origen.current_plugin.name
202
+ Origen.current_plugin.instance == self
203
+ else
204
+ false
205
+ end
206
+ end
207
+
208
+ # Returns the current top-level object (the DUT)
209
+ def top_level
210
+ toplevel_listeners.first
211
+ end
212
+
213
+ def listeners_for(*args)
214
+ callback = args.shift
215
+ max = args.first.is_a?(Numeric) ? args.shift : nil
216
+ options = args.shift || {}
217
+ options = {
218
+ top_level: :first
219
+ }.merge(options)
220
+ listeners = callback_listeners
221
+ if Origen.top_level
222
+ listeners -= [Origen.top_level]
223
+ if options[:top_level]
224
+ if options[:top_level] == :last
225
+ listeners = listeners + [Origen.top_level]
226
+ else
227
+ listeners = [Origen.top_level] + listeners
228
+ end
229
+ end
230
+ end
231
+ listeners = listeners.select { |l| l.respond_to?(callback) }
232
+ if max && listeners.size > max
233
+ fail "You can only define a #{callback} callback #{max > 1 ? (max.to_s + 'times') : 'once'}, however you have declared it #{listeners.size} times for instances of: #{listeners.map(&:class)}"
234
+ end
235
+ listeners
236
+ end
237
+
238
+ def version(options = {})
239
+ @version = nil if options[:refresh]
240
+ return @version if @version
241
+ load File.join(root, 'config', 'version.rb')
242
+ if defined? eval(namespace)::VERSION
243
+ @version = Origen::VersionString.new(eval(namespace)::VERSION)
244
+ else
245
+ # The eval of the class is required here as somehow when plugins are imported under the old
246
+ # imports system and with the old version file format we can end up with two copies of the
247
+ # same class constant. Don't understand it, but it is fixed with the move to gems and the
248
+ # namespace-based version file format.
249
+ @version = Origen::VersionString.new(eval(self.class.to_s)::VERSION)
250
+ end
251
+ @version
252
+ end
253
+
254
+ # Returns the release note for the current or given application version
255
+ def release_note(version = Origen.app.version.prefixed)
256
+ version = VersionString.new(version)
257
+ version = version.prefixed if version.semantic?
258
+ capture = false
259
+ note_started = false
260
+ note = []
261
+ File.readlines("#{Origen.root}/doc/history").each do |line|
262
+ line = line.strip
263
+ if capture
264
+ if note_started
265
+ if line =~ /^<a class="anchor release_tag/ || line =~ /^#+ Tag/
266
+ note.pop while note.last && note.last.empty?
267
+ return note
268
+ end
269
+ if line.empty? && note.empty?
270
+ # Don't capture preceding blank lines
271
+ else
272
+ note << line
273
+ end
274
+ elsif line =~ /^#+ by/
275
+ note_started = true
276
+ end
277
+ else
278
+ if line =~ /Tag:/
279
+ line = line.gsub('\\', '')
280
+ if line =~ /^#+ Tag: #{version}$/ ||
281
+ line =~ />Tag: #{version}</
282
+ capture = true
283
+ end
284
+ end
285
+ end
286
+ end
287
+ note.pop while note.last && note.last.empty?
288
+ note
289
+ end
290
+
291
+ # Returns the release date for the current or given application version
292
+ def release_date(version = Origen.app.version.prefixed)
293
+ time = release_time(version)
294
+ time ? time.to_date : nil
295
+ end
296
+
297
+ # Returns the release time for the current or given application version
298
+ def release_time(version = Origen.app.version.prefixed)
299
+ version = VersionString.new(version)
300
+ version = version.prefixed if version.semantic?
301
+ capture = false
302
+ File.readlines("#{Origen.root}/doc/history").each do |line|
303
+ line = line.strip
304
+ if capture
305
+ if capture && line =~ /^#+ by .* on (.*(AM|PM))/
306
+ return Time.parse(Regexp.last_match(1))
307
+ end
308
+ else
309
+ if line =~ /Tag:/
310
+ line = line.gsub('\\', '')
311
+ if line =~ /^#+ Tag: #{version}$/ ||
312
+ line =~ />Tag: #{version}</
313
+ capture = true
314
+ end
315
+ end
316
+ end
317
+ end
318
+ nil
319
+ end
320
+
321
+ # Returns the author (committer) for the current or given application version
322
+ #
323
+ # If the user can be found in the directory then a user object will be returned,
324
+ # otherwise the name will be returned as a String
325
+ def author(version = Origen.app.version.prefixed)
326
+ version = VersionString.new(version)
327
+ version = version.prefixed if version.semantic?
328
+ capture = false
329
+ File.readlines("#{Origen.root}/doc/history").each do |line|
330
+ line = line.strip
331
+ if capture
332
+ if capture && line =~ /^#+ by (.*) on (.*(AM|PM))/
333
+ user = Origen.fsl.find_by_name(Regexp.last_match(1))
334
+ return user if user
335
+ return Regexp.last_match(1)
336
+ end
337
+ else
338
+ if line =~ /Tag:/
339
+ line = line.gsub('\\', '')
340
+ if line =~ /^#+ Tag: #{version}$/ ||
341
+ line =~ />Tag: #{version}</
342
+ capture = true
343
+ end
344
+ end
345
+ end
346
+ end
347
+ nil
348
+ end
349
+
350
+ # Returns the branch for the current or given application version
351
+ def branch(version = Origen.app.version.prefixed)
352
+ version = VersionString.new(version)
353
+ version = version.prefixed if version.semantic?
354
+ capture = false
355
+ File.readlines("#{Origen.root}/doc/history").each do |line|
356
+ line = line.strip
357
+ if capture
358
+ if capture && line =~ /^#+ .*(Selector|Branch): '(.*)'/
359
+ return Regexp.last_match(2).gsub('\\', '')
360
+ end
361
+ else
362
+ if line =~ /Tag:/
363
+ line = line.gsub('\\', '')
364
+ if line =~ /^#+ Tag: #{version}$/ ||
365
+ line =~ />Tag: #{version}</
366
+ capture = true
367
+ end
368
+ end
369
+ end
370
+ end
371
+ nil
372
+ end
373
+ alias_method :selector, :branch
374
+
375
+ def previous_versions
376
+ versions = []
377
+ File.readlines("#{Origen.root}/doc/history").each do |line|
378
+ line = line.strip
379
+ if line =~ /^#+ Tag: (.*)$/ ||
380
+ line =~ />Tag: ([^<]*)</
381
+ versions << Regexp.last_match(1).gsub('\\', '')
382
+ end
383
+ end
384
+ versions.uniq
385
+ end
386
+
387
+ def contributors
388
+ c = []
389
+ File.readlines("#{Origen.root}/doc/history").each do |line|
390
+ if line =~ /^#+ by (.*) on /
391
+ c << Regexp.last_match(1)
392
+ end
393
+ end
394
+ c.uniq
395
+ end
396
+
397
+ def config
398
+ @config ||= Configuration.new(self)
399
+ end
400
+
401
+ # Returns the name of the given application, this is the name that will
402
+ # be used to refer to the application when it is used as a plugin
403
+ def name
404
+ (@name ||= namespace).to_s.underscore.symbolize
405
+ end
406
+
407
+ def gem_name
408
+ (Origen.app.config.gem_name || name).symbolize
409
+ end
410
+
411
+ def plugins_manager
412
+ @plugins_manager ||= PluginsManager.new
413
+ end
414
+ alias_method :plugin_manager, :plugins_manager
415
+ alias_method :current_plugin, :plugins_manager
416
+
417
+ def target
418
+ @target ||= Target.new
419
+ end
420
+
421
+ def environment
422
+ @environment ||= Environment.new
423
+ end
424
+
425
+ def lsf
426
+ @lsf ||= LSF.new
427
+ end
428
+
429
+ def runner
430
+ @runner ||= Runner.new
431
+ end
432
+
433
+ def deployer
434
+ @deployer ||= Deployer.new
435
+ end
436
+
437
+ def lsf_manager
438
+ @lsf_manager ||= LSFManager.new
439
+ end
440
+
441
+ def version_tracker
442
+ @version_tracker ||= VersionTracker.new
443
+ end
444
+
445
+ def workspace_manager
446
+ @workspace_manager ||= WorkspaceManager.new
447
+ end
448
+
449
+ def mailer
450
+ @mailer ||= Utility::Mailer.new
451
+ end
452
+
453
+ def db
454
+ @db ||= Database::KeyValueStores.new(self)
455
+ end
456
+
457
+ def session
458
+ @session ||= Database::KeyValueStores.new(self, persist: false)
459
+ end
460
+
461
+ def pdm_component
462
+ return @pdm_component if @pdm_component
463
+ require "#{Origen.root}/config/pdm_component"
464
+ begin
465
+ @pdm_component = (eval "#{Origen.app.class}::PDMComponent").new
466
+ rescue
467
+ # Try legacy case where the namespace was just Application
468
+ @pdm_component = ::Application::PDMComponent.new
469
+ end
470
+ end
471
+
472
+ def versions
473
+ version_tracker.versions
474
+ end
475
+
476
+ def release(options)
477
+ @release ||= Release.new
478
+ @release.run(options)
479
+ end
480
+
481
+ def statistics
482
+ runner.statistics
483
+ end
484
+ alias_method :stats, :statistics
485
+
486
+ def configuration_manager
487
+ @cm ||= ConfigurationManager.new
488
+ end
489
+ alias_method :cm, :configuration_manager
490
+
491
+ def pattern_iterators
492
+ @pattern_iterators ||= []
493
+ end
494
+
495
+ def callback_listeners
496
+ current = Origen.current_plugin.instance
497
+ applications = [self]
498
+ applications << current if current
499
+ applications + instantiated_callback_listeners
500
+ end
501
+
502
+ def instantiated_callback_listeners
503
+ dynamic_resource(:callback_listeners, []) + (@persistant_callback_listeners || [])
504
+ end
505
+
506
+ def toplevel_listeners
507
+ dynamic_resource(:toplevel_listeners, [])
508
+ end
509
+
510
+ def add_callback_listener(obj)
511
+ dynamic_resource(:callback_listeners, [], adding: true) << obj
512
+ end
513
+
514
+ def add_persistant_callback_listener(obj)
515
+ @persistant_callback_listeners ||= []
516
+ @persistant_callback_listeners << obj
517
+ @persistant_callback_listeners.uniq!
518
+ end
519
+
520
+ def add_toplevel_listener(obj)
521
+ if Origen.top_level
522
+ puts "Attempt to set an instance of #{obj.class} as the top level when there is already an instance of #{Origen.top_level.class} defined as the top-level!"
523
+ fail 'Only one object that include the Origen::TopLevel module can be instantiated per target!'
524
+ end
525
+ $dut = obj
526
+ dynamic_resource(:toplevel_listeners, [], adding: true) << obj
527
+ end
528
+
529
+ # Any attempts to instantiate a test within the give block will be forced to instantiate
530
+ # an Origen::Tester::Doc instance
531
+ def with_doc_tester(options = {})
532
+ @with_doc_tester = true
533
+ if options[:html]
534
+ @with_html_doc_tester = true
535
+ end
536
+ yield
537
+ @with_doc_tester = false
538
+ @with_html_doc_tester = false
539
+ end
540
+
541
+ def with_doc_tester?
542
+ @with_doc_tester
543
+ end
544
+
545
+ def with_html_doc_tester?
546
+ @with_html_doc_tester
547
+ end
548
+
549
+ def tester
550
+ dynamic_resource(:tester, []).first
551
+ end
552
+
553
+ def tester=(obj)
554
+ # if tester && obj
555
+ # raise "You can only instantiate 1 tester, you have already created an instance of #{tester.class}}"
556
+ # end
557
+ set_dynamic_resource(:tester, [obj])
558
+ end
559
+
560
+ def pin_map
561
+ dynamic_resource(:pin_map, {})
562
+ end
563
+
564
+ def add_pin_to_pin_map(id, pin)
565
+ # If being added during target load...
566
+ if @load_event
567
+ pin_map[id] = pin
568
+ # Being added late in the process...
569
+ else
570
+ @transient_resources[:pin_map][id] = pin
571
+ end
572
+ end
573
+
574
+ def pingroup_map
575
+ dynamic_resource(:pingroup_map, {})
576
+ end
577
+
578
+ def add_pingroup_to_pingroup_map(id, pins)
579
+ # If being added during target load...
580
+ if @load_event
581
+ pingroup_map[id] = pins
582
+ # Being added late in the process...
583
+ else
584
+ @transient_resources[:pingroup_map][id] = pins
585
+ end
586
+ end
587
+
588
+ def pin_pattern_order
589
+ if @load_event
590
+ dynamic_resource(:pin_pattern_order, [])
591
+ else
592
+ @transient_resources[:pin_pattern_order] ||= []
593
+ end
594
+ end
595
+
596
+ def pin_pattern_exclude
597
+ if @load_event
598
+ dynamic_resource(:pin_pattern_exclude, [])
599
+ else
600
+ @transient_resources[:pin_pattern_exclude] ||= []
601
+ end
602
+ end
603
+
604
+ def pin_names
605
+ if @load_event
606
+ dynamic_resource(:pin_names, {})
607
+ else
608
+ @transient_resources[:pin_names] ||= {}
609
+ end
610
+ end
611
+
612
+ def load_console
613
+ load_target!
614
+ end
615
+
616
+ def load_target!(options = {})
617
+ options = {
618
+ force_debug: false
619
+ }.merge(options)
620
+ if options[:reload]
621
+ @target_load_count = 0
622
+ else
623
+ @target_load_count ||= 0
624
+ @target_load_count += 1
625
+ end
626
+ listeners_for(:before_load_target).each(&:before_load_target)
627
+ # Remember these if the target has to be reloaded
628
+ @target_load_options = options.merge({})
629
+ # Since this is a load it will re-instantiate any objects that the application
630
+ # declares here, the objects registered with origen should be refreshed accordingly
631
+ clear_dynamic_resources
632
+ load_event(:transient) do
633
+ Origen.config.mode = :production # Important since a production target may rely on the default
634
+ begin
635
+ $_target_options = @target_load_options
636
+ Origen.target.set_signature(@target_load_options)
637
+ $dut = nil
638
+ load environment.file if environment.file
639
+ load target.file!
640
+ ensure
641
+ $_target_options = nil
642
+ end
643
+ @target_instantiated = true
644
+ Origen.config.mode = :debug if options[:force_debug]
645
+ listeners_for(:on_create).each(&:on_create)
646
+ # Keep this within the load_event to ensure any objects that are further instantiated objects
647
+ # will be associated with (and cleared out upon reload of) the current target
648
+ listeners_for(:on_load_target).each(&:on_load_target)
649
+ end
650
+ listeners_for(:after_load_target).each(&:after_load_target)
651
+ Origen.import_manager.validate_production_status
652
+ # @target_instantiated = true
653
+ end
654
+
655
+ # Not a clean unload, but allows objects to be re-instantiated for testing
656
+ # @api private
657
+ def unload_target!
658
+ listeners_for(:before_load_target).each(&:before_load_target)
659
+ clear_dynamic_resources
660
+ clear_dynamic_resources(:static)
661
+ Origen::Pins.clear_pin_aliases
662
+ $dut = nil
663
+ end
664
+
665
+ # Equivalent to load_target! except that any options that were passed
666
+ # to load_target! the last time it was called will be re-applied when
667
+ # (re)loading the target.
668
+ def reload_target!(options = {})
669
+ old_options = @target_load_options || {}
670
+ options = (@target_load_options || {}).merge(options)
671
+ if options[:skip_first_time] && @target_load_count == 1
672
+ @target_load_count += 1
673
+ else
674
+ load_target!(options.merge(reload: true))
675
+ end
676
+ end
677
+
678
+ def set_dynamic_resource(name, value)
679
+ dynamic_resource(name, value, set: true)
680
+ end
681
+
682
+ # Enable for debugging to see what the currently tracked objects are
683
+ # def object_store
684
+ # [@load_event, @static_resources, @transient_resources]
685
+ # end
686
+
687
+ def dynamic_resource(name, default, options = {})
688
+ @static_resources ||= {}
689
+ @transient_resources ||= {}
690
+ if @load_event == :static ||
691
+ (!@load_event && options[:adding])
692
+ if options[:set]
693
+ @static_resources[name] = default
694
+ else
695
+ @static_resources[name] ||= default
696
+ end
697
+ elsif @load_event == :transient
698
+ if options[:set]
699
+ @transient_resources[name] = default
700
+ else
701
+ @transient_resources[name] ||= default
702
+ end
703
+ else
704
+ static = @static_resources[name] ||= default
705
+ transient = @transient_resources[name] ||= default
706
+ if static.respond_to?('+')
707
+ static + transient
708
+ else
709
+ static.merge(transient)
710
+ end
711
+ end
712
+ end
713
+
714
+ def clear_dynamic_resources(type = :transient)
715
+ if type == :transient
716
+ @transient_resources = nil
717
+ else
718
+ @static_resources = nil
719
+ end
720
+ end
721
+
722
+ def load_event(type)
723
+ @load_event = type
724
+ yield
725
+ @load_event = nil
726
+ end
727
+
728
+ def target_instantiated?
729
+ @target_instantiated
730
+ end
731
+
732
+ # This method is called just after an application inherits from Origen::Application,
733
+ # allowing the developer to load classes in lib and use them during application
734
+ # configuration.
735
+ #
736
+ # class MyApplication < Origen::Application
737
+ # require "my_backend" # in lib/my_backend
738
+ # config.i18n.backend = MyBackend
739
+ # end
740
+ def add_lib_to_load_path! #:nodoc:
741
+ [root.join('lib'), root.join('vendor', 'lib')].each do |path|
742
+ $LOAD_PATH.unshift(path.to_s) if File.exist?(path) && !$LOAD_PATH.include?(path.to_s)
743
+ end
744
+ end
745
+ end
746
+ end