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,374 @@
1
+ module Origen
2
+ class Application
3
+ # Class to handle the target.
4
+ #
5
+ # The target is a Ruby file that is run prior to generating each pattern, and
6
+ # it should be used to instantiate the top-level models used by the application.
7
+ # It can also be used to override and settings within these classes after they
8
+ # have been instantiated and before they are run.
9
+ #
10
+ # All target files must live in Origen.root/target.
11
+ #
12
+ # An instance of this class is automatically instantiated and available globally
13
+ # as Origen.app.target
14
+ class Target
15
+ DIR = "#{Origen.root}/target" # :nodoc:
16
+ SAVE_FILE = "#{DIR}/.default" # :nodoc:
17
+ DEFAULT_FILE = "#{DIR}/default.rb" # :nodoc:
18
+
19
+ # Implement a target loop based on the supplied options.
20
+ # The options can contain the keys :target or :targets or neither.
21
+ #
22
+ # In the neither case the loop will run once for the current workspace
23
+ # default target.
24
+ #
25
+ # In the case where one of the keys is present the loop will run for each
26
+ # target and the options will be passed into the block with the key :target
27
+ # set to the current target.
28
+ def loop(options = {})
29
+ options = {
30
+ set_target: true,
31
+ force_debug: false, # Set true to force debug mode for all targets
32
+ }.merge(options)
33
+ targets = [options.delete(:target), options.delete(:targets)].flatten.compact.uniq
34
+ targets = [file!.basename.to_s] if targets.empty?
35
+ set = options.delete(:set_target)
36
+ targets.each do |target|
37
+ Origen.load_target(target, options) if set
38
+ options[:target] = target
39
+ yield options
40
+ end
41
+ end
42
+
43
+ # Use this to implement a loop for each production target, it will automatically
44
+ # load each target before yielding to the block.
45
+ #
46
+ # The production targets are defined by the production_targets configuration
47
+ # option.
48
+ # === Example
49
+ # Origen.app.target.each_production do
50
+ # Run something within the context of each target
51
+ # end
52
+ def each_production(options = {})
53
+ options = {
54
+ force_debug: false, # Set true to force debug mode for all targets
55
+ }.merge(options)
56
+ prod_targets.each do |moo, targets|
57
+ [targets].flatten.each do |target|
58
+ self.temporary = target
59
+ Origen.app.load_target!(options)
60
+ yield moo
61
+ end
62
+ end
63
+ end
64
+
65
+ # As each_production except it only yields unique targets. i.e. if you have two
66
+ # MOOs that use the same target file defined in the production_targets then this
67
+ # method will only yield once.
68
+ #
69
+ # An array of MOOs that use each target is returned each time.
70
+ # === Example
71
+ # Origen.app.target.each_unique_production do |moos|
72
+ # Run something within the context of each unique target
73
+ # end
74
+ def each_unique_production(options = {})
75
+ options = {
76
+ force_debug: false, # Set true to force debug mode for all targets
77
+ }.merge(options)
78
+ targets = {}
79
+ prod_targets.each do |moo, moos_targets|
80
+ [moos_targets].flatten.each do |target|
81
+ if targets[target]
82
+ targets[target] << moo
83
+ else
84
+ targets[target] = [moo]
85
+ end
86
+ end
87
+ end
88
+ targets.each do |target, moos|
89
+ self.temporary = target
90
+ Origen.app.load_target!(options)
91
+ yield moos
92
+ end
93
+ end
94
+
95
+ # If the production_targets moo number mapping inclues the current target then
96
+ # the MOO number will be returned, otherwise nil
97
+ def moo
98
+ prod_targets.each do |moo, targets|
99
+ [targets].flatten.each do |target|
100
+ return moo if File.basename(target, '.rb').to_s == file.basename('.rb').to_s
101
+ end
102
+ end
103
+ nil
104
+ end
105
+
106
+ # Returns the name (the filename) of the current target
107
+ def name
108
+ file.basename('.rb').to_s if file
109
+ end
110
+
111
+ # Load the target, calling this will re-instantiate all top-level objects
112
+ # defined there.
113
+ def load!(options = {})
114
+ options = {
115
+ force_debug: false, # Set true to force debug mode for all targets
116
+ }.merge(options)
117
+ Origen.app.load_target!(options)
118
+ end
119
+
120
+ # Returns Array of all targets available
121
+ def all_targets
122
+ targets = []
123
+ find('').sort.each do |file|
124
+ targets << File.basename(file)
125
+ end
126
+ targets # return
127
+ end
128
+
129
+ # Returns an array containing all current production targets
130
+ def production_targets
131
+ prod_targets.map { |_moo, targets| targets }.uniq
132
+ end
133
+
134
+ # Returns true if the target exists, this can be used to test for the presence
135
+ # of a target before calling one of the other methods to actually apply it.
136
+ #
137
+ # It will return true if one or more targets are found matching the given name,
138
+ # use the unique? method to test if the given name uniquely identifies a valid
139
+ # target.
140
+ def exists?(name)
141
+ tgts = resolve_mapping(name)
142
+ targets = tgts.is_a?(Array) ? tgts : find(tgts)
143
+ targets.size > 0
144
+ end
145
+ alias_method :exist?, :exists?
146
+
147
+ # Similar to the exists? method, this will return true only if the given name
148
+ # resolves to a single valid target.
149
+ def unique?(name)
150
+ tgts = resolve_mapping(name)
151
+ targets = tgts.is_a?(Array) ? tgts : find(tgts)
152
+ targets.size == 1
153
+ end
154
+
155
+ # Switch to the supplied target, name can be a fragment as long as it allows
156
+ # a unique target to be identified.
157
+ #
158
+ # The name can also be a MOO number mapping from the config.production_targets
159
+ # attribute of the application.
160
+ #
161
+ # Calling this method does not affect the default target setting in the workspace.
162
+ def temporary=(name)
163
+ tgts = resolve_mapping(name)
164
+ targets = tgts.is_a?(Array) ? tgts : find(tgts)
165
+ if targets.size == 0
166
+ puts "Sorry no targets were found matching '#{name}'!"
167
+ puts 'Here are the available options:'
168
+ find('').sort.each do |file|
169
+ puts File.basename(file)
170
+ end
171
+ exit 1
172
+ elsif targets.size > 1
173
+ if is_a_moo_number?(name) && prod_targets
174
+ puts "Multiple production targets exist for #{name.upcase}, use one of the following instead of the MOO number:"
175
+ targets.sort.each do |file|
176
+ puts File.basename(file)
177
+ end
178
+ else
179
+ puts 'Please try again with one of the following targets:'
180
+ targets.sort.each do |file|
181
+ puts File.basename(file)
182
+ end
183
+ end
184
+ exit 1
185
+ else
186
+ self.file = targets[0]
187
+ end
188
+ end
189
+ alias_method :switch, :temporary=
190
+ alias_method :switch_to, :temporary=
191
+
192
+ # Returns a signature for the current target, can be used to track target
193
+ # changes in cases where the name is not unique - i.e. when using a
194
+ # configurable target
195
+ def signature
196
+ @signature ||= set_signature(nil)
197
+ end
198
+
199
+ # @api private
200
+ def set_signature(options)
201
+ options ||= {}
202
+ @signature = options.merge(_tname: name).to_a.hash
203
+ end
204
+
205
+ # As #temporary= except that the given target will be set to the workspace default
206
+ def default=(name)
207
+ if name
208
+ self.temporary = name
209
+ else
210
+ @file = nil
211
+ end
212
+ save
213
+ end
214
+
215
+ # Prints out the current target details to the command line
216
+ def describe
217
+ f = self.file!
218
+ puts "Current target: #{f.basename}"
219
+ puts '*' * 70
220
+ File.open(f).each do |line|
221
+ puts " #{line}"
222
+ end
223
+ puts '*' * 70
224
+ end
225
+
226
+ # Returns an array of matching target file paths
227
+ def find(name)
228
+ if name
229
+ name = name.gsub('*', '')
230
+ if File.exist?(name)
231
+ [name]
232
+ elsif File.exist?("#{Origen.root}/target/#{name}") && name != ''
233
+ ["#{Origen.root}/target/#{name}"]
234
+ else
235
+ # The below weirdness is to make it recurse into symlinked directories
236
+ Dir.glob("#{DIR}/**{,/*/**}/*").sort.uniq.select do |file|
237
+ File.basename(file) =~ /#{name}/ && file !~ /.*\.rb.+$/
238
+ end
239
+ end
240
+ else
241
+ [nil]
242
+ end
243
+ end
244
+
245
+ # Saves the current target as the workspace default, i.e. the current target
246
+ # will be used by Origen the next time if no other target is specified
247
+ def save # :nodoc:
248
+ if @file
249
+ File.open(SAVE_FILE, 'w') do |f|
250
+ Marshal.dump(file, f)
251
+ end
252
+ else
253
+ forget
254
+ end
255
+ end
256
+
257
+ # Load the default file from the workspace default if it exists and return it,
258
+ # otherwise returns nil
259
+ def default_file
260
+ return @default_file if @default_file
261
+ if File.exist?(SAVE_FILE)
262
+ File.open(SAVE_FILE) do |f|
263
+ @default_file = Marshal.load(f)
264
+ end
265
+ elsif File.exist?(DEFAULT_FILE)
266
+ @default_file = Pathname.new(DEFAULT_FILE)
267
+ end
268
+ @default_file
269
+ end
270
+
271
+ # Returns the target file (a Pathname object) if it has been defined, otherwise nil
272
+ def file # :nodoc:
273
+ return @file if @file
274
+ if default_file && File.exist?(default_file)
275
+ @file = default_file
276
+ end
277
+ end
278
+
279
+ # As file except will raise an exception if it hasn't been defined yet
280
+ def file! # :nodoc:
281
+ unless file
282
+ puts 'No target has been specified!'
283
+ puts 'To specify a target use the -t switch.'
284
+ puts 'Look in the target directory for a list of available target names.'
285
+ exit 1
286
+ end
287
+ file
288
+ end
289
+
290
+ def file=(path) # :nodoc:
291
+ if path
292
+ @file = Pathname.new(path)
293
+ else
294
+ @file = nil
295
+ end
296
+ end
297
+
298
+ # Remove the workspace default target
299
+ def forget
300
+ File.delete(SAVE_FILE) if File.exist?(SAVE_FILE)
301
+ @default_file = nil
302
+ end
303
+
304
+ # # This attribute is used by the Origen#compile and Origen#merge tasks to allow files
305
+ # # to be compiled on a per-target basis. If the ERB source file has 'target' in the
306
+ # # name then this will be substituted for the value returned from this attribute. <br>
307
+ # # For example to simply use the MOO number to identify the target you may
308
+ # # set up a simple task like this:
309
+ # # # Compile the J750 files for each target
310
+ # # Target.each_production do
311
+ # # $target.id = $target.moo.gsub("*","")
312
+ # # compile("templates/j750", "j750")
313
+ # # end
314
+ # attr_accessor :id
315
+ #
316
+ # def initialize # :nodoc:
317
+ # restore
318
+ # end
319
+ #
320
+ # # Yields a summary of the current target settings
321
+ # def summary
322
+ # yield "Top: #{$top.class}"
323
+ # yield "SoC: #{$soc.class}"
324
+ # yield "Tester: #{$tester.class}"
325
+ # end
326
+
327
+ # Returns true if running with a temporary target, i.e. if the current
328
+ # target is not the same as the default target
329
+ def temporary?
330
+ @file == @default_file
331
+ end
332
+
333
+ # Resolves the target name to a target file if a MOO number is supplied and
334
+ # app.config.production_targets has been defined
335
+ def resolve_mapping(name) # :nodoc:
336
+ if is_a_moo_number?(name) && prod_targets
337
+ # If an exact match
338
+ if prod_targets[name.upcase]
339
+ prod_targets[name.upcase]
340
+ # If a wildcard match
341
+ elsif prod_targets["*#{moo_number_minus_revision(name)}"]
342
+ prod_targets["*#{moo_number_minus_revision(name)}"]
343
+ # Else just return the given name
344
+ else
345
+ name
346
+ end
347
+ else
348
+ name
349
+ end
350
+ end
351
+
352
+ # Returns config.production_targets with all keys forced to upper case
353
+ def prod_targets # :nodoc:
354
+ return {} unless Origen.config.production_targets
355
+ return @prod_targets if @prod_targets
356
+ @prod_targets = {}
357
+ Origen.config.production_targets.each do |key, value|
358
+ @prod_targets[key.upcase] = value
359
+ end
360
+ @prod_targets
361
+ end
362
+
363
+ # Returns true if the supplied target name is a moo number format
364
+ def is_a_moo_number?(name) # :nodoc:
365
+ !!(name.to_s.upcase =~ /^\d?\d?\*?[A-Z]\d\d[A-Z]$/)
366
+ end
367
+
368
+ def moo_number_minus_revision(name) # :nodoc:
369
+ name.to_s.upcase =~ /^\d?\d?([A-Z]\d\d[A-Z])$/
370
+ Regexp.last_match[1]
371
+ end
372
+ end
373
+ end
374
+ end
@@ -0,0 +1,59 @@
1
+ module Origen
2
+ class Application
3
+ # Keeps track of production released versions
4
+ class VersionTracker
5
+ STORAGE_FILE = "#{Origen.root}/.version_tracker"
6
+
7
+ # Returns an array containing all Production release
8
+ # tags since they started being tracked
9
+ def versions
10
+ storage[:versions] ||= []
11
+ end
12
+
13
+ # Adds a new version to the tracker
14
+ def add_version(version)
15
+ restore_to_latest
16
+ versions << version
17
+ save
18
+ check_in
19
+ end
20
+
21
+ # Returns the persisted storage container (a Hash)
22
+ def storage
23
+ return @storage if @storage
24
+ if File.exist?(STORAGE_FILE)
25
+ File.open(STORAGE_FILE) do |f|
26
+ begin
27
+ @storage = Marshal.load(f)
28
+ rescue
29
+ @storage = {}
30
+ end
31
+ end
32
+ else
33
+ @storage = {}
34
+ end
35
+ end
36
+
37
+ # Save the persisted storage container to disk
38
+ def save
39
+ File.open(STORAGE_FILE, 'w') do |f|
40
+ Marshal.dump(storage, f)
41
+ end
42
+ end
43
+
44
+ # Check in the persisted storage container
45
+ def check_in
46
+ Origen.app.rc.checkin(STORAGE_FILE, force: true, unmanaged: true)
47
+ end
48
+
49
+ # Force the storage container to the latest checked in version
50
+ def restore_to_latest
51
+ @storage = nil
52
+ # Check out the latest version of the storage, forcing to Trunk
53
+ system "dssc co -get -force '#{STORAGE_FILE};Trunk:Latest'"
54
+ system "dssc setselector 'Trunk' #{STORAGE_FILE}"
55
+ `chmod 666 #{STORAGE_FILE}`
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,151 @@
1
+ module Origen
2
+ class Application
3
+ class WorkspaceManager
4
+ # Returns the directory that contains the current application's revision control
5
+ # root (basically just Origen.app.rc.root.parent)
6
+ def container_directory
7
+ if Origen.running_on_windows?
8
+ dir = revision_control_root.parent
9
+ Pathname.new(dir.to_s.sub(/\/$/, ''))
10
+ else
11
+ revision_control_root.parent
12
+ end
13
+ end
14
+
15
+ # Returns the path to the root directory of the revision control system
16
+ # that is managing the application.
17
+ #
18
+ # This may not necessarily be Origen.root if the application is embedded within
19
+ # a larger project workspace (for example in tool_data/origen)
20
+ def revision_control_root
21
+ Origen.app.rc.root
22
+ end
23
+
24
+ # Origen.root may not necessarily be the same as the revision control root.
25
+ # This method will return the relative path from the revision control root to
26
+ # Origen.root.
27
+ def path_to_origen_root
28
+ path = Origen.root.to_s.sub(revision_control_root.to_s, '').sub(/^(\/|\\)/, '')
29
+ path = '.' if path.empty?
30
+ path
31
+ end
32
+
33
+ # Provides a proposal for where the reference workspace should live
34
+ def reference_workspace_proposal
35
+ "#{container_directory}/#{Origen.app.name}_reference"
36
+ end
37
+
38
+ # Returns the path to the actual reference workspace if it is set,
39
+ # otherwise returns nil
40
+ def reference_workspace
41
+ if reference_workspace_set?
42
+ dir = File.readlink(reference_dir)
43
+ dir.gsub!('.ref', '')
44
+ dir.gsub!(/#{Regexp.escape(path_to_origen_root)}\/?$/, '')
45
+ Pathname.new(dir).cleanpath
46
+ end
47
+ end
48
+
49
+ # Returns the path to the directory that will be used to contain
50
+ # all imported application workspaces
51
+ def imports_directory
52
+ return @imports_directory if @imports_directory
53
+ old = "#{container_directory}/#{revision_control_root.basename}_imports_DO_NOT_HAND_MODIFY"
54
+ @imports_directory = "#{container_directory}/.#{revision_control_root.basename}_imports_DO_NOT_HAND_MODIFY"
55
+ FileUtils.rm_rf(old) if File.exist?(old)
56
+ @imports_directory
57
+ end
58
+
59
+ # Returns the path to the directory that will be used to contain
60
+ # all remotes workspaces
61
+ def remotes_directory
62
+ return @remotes_directory if @remotes_directory
63
+ old = "#{container_directory}/#{revision_control_root.basename}_remotes_DO_NOT_HAND_MODIFY"
64
+ @remotes_directory = "#{container_directory}/.#{revision_control_root.basename}_remotes_DO_NOT_HAND_MODIFY"
65
+ FileUtils.rm_rf(old) if File.exist?(old)
66
+ @remotes_directory
67
+ end
68
+
69
+ # Returns true if the local reference directory is already
70
+ # pointing to an external workspace.
71
+ def reference_workspace_set?
72
+ f = reference_dir
73
+ File.exist?(f) && File.symlink?(f) &&
74
+ File.exist?(File.readlink(f))
75
+ end
76
+
77
+ def set_reference_workspace(workspace)
78
+ f = reference_dir
79
+ if File.exist?(f)
80
+ if File.symlink?(f)
81
+ FileUtils.rm_f(f)
82
+ else
83
+ FileUtils.rm_rf(f)
84
+ end
85
+ end
86
+ remote_ref = "#{origen_root(workspace)}/.ref"
87
+ unless File.exist?(remote_ref)
88
+ FileUtils.mkdir_p(remote_ref)
89
+ `touch #{remote_ref}/dont_delete` # Make sure the pop does not blow this away
90
+ end
91
+ if Origen.running_on_windows?
92
+ system("call mklink /h #{reference_dir} #{remote_ref}")
93
+ else
94
+ File.symlink(remote_ref, reference_dir)
95
+ end
96
+ end
97
+
98
+ # Returns the full path to Origen.root within the given workspace
99
+ def origen_root(workspace)
100
+ Pathname.new("#{workspace}/#{path_to_origen_root}").cleanpath
101
+ end
102
+
103
+ def reference_dir
104
+ "#{Origen.root}/.ref" # Should probably be set by a config parameter
105
+ end
106
+
107
+ # Builds a new workspace at the given path
108
+ def build(path, options = {})
109
+ options = {
110
+ rc_url: Origen.app.config.rc_url || Origen.app.config.vault,
111
+ allow_rebuild: false
112
+ }.merge(options)
113
+ if File.exist?(path.to_s) && !options[:allow_rebuild]
114
+ fail "Sorry but #{path} already exists!"
115
+ end
116
+ FileUtils.rm_rf(path.to_s) if File.exist?(path.to_s)
117
+ rc = RevisionControl.new remote: options[:rc_url], local: path.to_s
118
+ rc.build
119
+ end
120
+
121
+ # Switches the given workspace path to the given version tag
122
+ def switch_version(workspace, tag, options = {})
123
+ options = {
124
+ origen_root_only: false, # When true pop the Origen.root dir only instead
125
+ # of the whole application workspace - these may or may
126
+ # not be the same thing depending on the application.
127
+ }.merge(options)
128
+ version_file = "#{workspace}/.current_version"
129
+ FileUtils.rm_f(version_file) if File.exist?(version_file)
130
+ if options[:origen_root_only]
131
+ dir = "#{workspace}/#{path_to_origen_root}"
132
+ else
133
+ dir = workspace
134
+ end
135
+ rc_url = Origen.app.config.rc_url || Origen.app.config.vault
136
+ rc = RevisionControl.new remote: rc_url, local: dir.to_s
137
+ rc.checkout version: tag, force: true
138
+ File.open(version_file, 'w') do |f|
139
+ f.puts tag
140
+ end
141
+ end
142
+
143
+ def current_version_of(workspace)
144
+ f = "#{workspace}/.current_version"
145
+ if File.exist?(f)
146
+ File.readlines(f).first.strip
147
+ end
148
+ end
149
+ end
150
+ end
151
+ end