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,246 @@
1
+ require 'fileutils'
2
+ module Origen
3
+ class Application
4
+ autoload :Statistics, 'origen/application/statistics'
5
+
6
+ # The Runner is responsible for co-ordinating all compile and generate
7
+ # requests from the command line
8
+ class Runner
9
+ attr_accessor :options
10
+
11
+ # Launch Origen, any command which generates an output file should launch from here
12
+ # as it gives a common point for listeners to hook in and to establish output
13
+ # directories and so on.
14
+ #
15
+ # Originally this method was called generate but that is now deprecated in favour
16
+ # of the more generic 'launch' as the Origen feature set has expanded.
17
+ def launch(options = {})
18
+ # Clean up the input from legacy code
19
+ options[:action] = extract_action(options)
20
+ options[:files] = extract_files(options)
21
+ @options = options
22
+ prepare_and_validate_workspace(options)
23
+ if options[:lsf]
24
+ record_invocation(options) do
25
+ prepare_for_lsf
26
+ Origen.app.listeners_for(:before_lsf_submission).each(&:before_lsf_submission)
27
+ expand_lists_and_directories(options[:files], options).each do |file|
28
+ Origen.app.lsf_manager.submit_origen_job(file, options)
29
+ end
30
+ end
31
+ Origen.log.info ''
32
+ Origen.log.info 'Monitor status of remote jobs via:'
33
+ Origen.log.info ' origen l'
34
+ else
35
+ Origen.log.info '*' * 70 unless options[:quiet]
36
+ Origen.app.listeners_for(:before_generate).each do |listener|
37
+ if listener.class.instance_method(:before_generate).arity == 0
38
+ listener.before_generate
39
+ else
40
+ listener.before_generate(options)
41
+ end
42
+ end
43
+ if Origen.running_remotely?
44
+ Origen.app.listeners_for(:before_generate_remote).each do |listener|
45
+ if listener.class.instance_method(:before_generate_remote).arity == 0
46
+ listener.before_generate_remote
47
+ else
48
+ listener.before_generate_remote(options)
49
+ end
50
+ end
51
+ else
52
+ Origen.app.listeners_for(:before_generate_local).each do |listener|
53
+ if listener.class.instance_method(:before_generate_local).arity == 0
54
+ listener.before_generate_local
55
+ else
56
+ listener.before_generate_local(options)
57
+ end
58
+ end
59
+ end
60
+
61
+ record_invocation(options) do
62
+ case options[:action]
63
+ when :forecast_test_time
64
+ Origen.time.forecast_test_time(options)
65
+ else
66
+ if options[:action] == :program
67
+ Origen.generator.generate_program(expand_lists_and_directories(options[:files], options), options)
68
+ else
69
+ temporary_plugin_from_options = options[:current_plugin]
70
+ expand_lists_and_directories(options[:files], options).each do |file|
71
+ if temporary_plugin_from_options
72
+ Origen.current_plugin.temporary = temporary_plugin_from_options
73
+ end
74
+ case options[:action]
75
+ when :compile
76
+ Origen.generator.compile_file_or_directory(file, options)
77
+ when :merge
78
+ Origen.generator.merge_file_or_directory(file, options)
79
+ when :import_test_time
80
+ Origen.time.import_test_time(file, options)
81
+ when :import_test_flow
82
+ Origen.time.import_test_flow(file, options)
83
+ else
84
+ Origen.generator.generate_pattern(file, options)
85
+ end
86
+ if temporary_plugin_from_options
87
+ Origen.current_plugin.default
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
93
+
94
+ unless options[:quiet]
95
+ Origen.log.info '*' * 70
96
+ stats.print_summary unless options[:action] == :merge
97
+ end
98
+ end
99
+ end
100
+ alias_method :generate, :launch
101
+
102
+ def prepare_and_validate_workspace(options = {})
103
+ confirm_production_ready(options)
104
+ prepare_directories(options)
105
+ end
106
+
107
+ # Post an invocation to the Origen server for usage statistics tracking.
108
+ #
109
+ # Posting an invocation was found to add ~0.5s to all command times,
110
+ # so here we run it in a separate thread to try and hide it behind
111
+ # the user's command.
112
+ #
113
+ # @api private
114
+ def record_invocation(options)
115
+ record_invocation = false
116
+ begin
117
+ # Only record user invocations at this time, also bypass windows since it seems
118
+ # that threads can't be trusted not to block
119
+ unless Origen.running_remotely? # || Origen.running_on_windows?
120
+ record_invocation = Thread.new do
121
+ Origen.client.record_invocation(options[:action]) if options[:action]
122
+ end
123
+ end
124
+ rescue
125
+ # Don't allow this to kill an origen command
126
+ end
127
+ yield
128
+ begin
129
+ unless Origen.running_remotely?
130
+ # Wait for a server response, ideally would like to not wait here, but it seems if not
131
+ # then invocation postings can be dropped, especially on windows
132
+ Origen.profile 'waiting for recording invocation' do
133
+ record_invocation.value
134
+ end
135
+ end
136
+ rescue
137
+ # Don't allow this to kill an origen command
138
+ end
139
+ end
140
+
141
+ # The action to take should be set by the action option, but legacy code will pass
142
+ # things like :compile => true, the extract_action method handles the old code
143
+ def extract_action(options)
144
+ return options[:action] if options[:action]
145
+ if options[:compile]
146
+ :compile
147
+ elsif options[:program]
148
+ :program
149
+ elsif options[:job_type] == :merge
150
+ :merge
151
+ else
152
+ :pattern
153
+ end
154
+ end
155
+
156
+ # Legacy file references can be input via :pattern, :patterns, etc. this
157
+ # cleans it up and forces them all to be in an array assigned to options[:files]
158
+ def extract_files(options)
159
+ files = [options[:pattern]] + [options[:patterns]] + [options[:file]] + [options[:files]]
160
+ files.flatten!
161
+ files.compact!
162
+ files
163
+ end
164
+
165
+ def shutdown
166
+ if Origen.app.stats.failed_files > 0 ||
167
+ Origen.app.stats.failed_patterns > 0
168
+ exit 1
169
+ end
170
+ end
171
+
172
+ # Expands any list references in the supplied pattern array and
173
+ # returns an array of pattern names. No guarantee is made to
174
+ # whether the pattern names are valid at this stage.
175
+ # Any duplicates will be removed.
176
+ def expand_lists_and_directories(files, options = {})
177
+ Origen.file_handler.expand_list(files, options)
178
+ end
179
+
180
+ def statistics
181
+ @statistics ||= Statistics.new(options)
182
+ end
183
+ alias_method :stats, :statistics
184
+
185
+ def prepare_for_lsf
186
+ if options[:lsf]
187
+ # Build an options string for saving with the LSF job that represents this runtime environment
188
+ str = "-t #{Origen.target.file.basename}"
189
+ if Origen.environment.file
190
+ str += " --environment #{Origen.environment.file.basename}"
191
+ end
192
+ if options[:output]
193
+ str += " -o #{options[:output]}"
194
+ end
195
+ if options[:reference]
196
+ str += " -r #{options[:reference]}"
197
+ end
198
+ options[:lsf_option_string] = str
199
+ # Clear the LSF manager job list if specifically requested or if that is the default action and
200
+ # no specific action has been requested
201
+ if options[:lsf_action]
202
+ if options[:lsf_action] == :clear
203
+ Origen.app.lsf_manager.clear_all
204
+ end
205
+ elsif Origen.config.default_lsf_action == :clear
206
+ Origen.app.lsf_manager.clear_all
207
+ end
208
+ end
209
+ end
210
+
211
+ def prepare_directories(options = {})
212
+ # When running remotely on the LSF never create directories to
213
+ # prevent race conditions as multiple processes run concurrently,
214
+ # instead assume they were already created by the runner who
215
+ # submitted the job.
216
+ Origen.file_handler.set_output_directory(options.merge(create: Origen.running_locally?))
217
+ Origen.file_handler.set_reference_directory(options.merge(create: Origen.running_locally?))
218
+ tmp = "#{Origen.root}/tmp"
219
+ FileUtils.mkdir(tmp) unless File.exist?(tmp)
220
+ if Origen.running_locally?
221
+ mkdir Origen::Log.log_file_directory
222
+ mkdir "#{Origen.root}/.lsf"
223
+ end
224
+ if options[:lsf]
225
+ mkdir Origen.app.lsf_manager.log_file_directory
226
+ end
227
+ end
228
+
229
+ # Make the given directory if it doesn't exist, must be a full path
230
+ def mkdir(dir)
231
+ unless File.exist?(dir)
232
+ FileUtils.mkdir_p(dir)
233
+ end
234
+ end
235
+
236
+ def confirm_production_ready(_options = {})
237
+ # The caller would have already verified the status before submission
238
+ if Origen.running_locally?
239
+ if Origen.mode.production?
240
+ Origen.app.cm.ensure_workspace_unmodified!
241
+ end
242
+ end
243
+ end
244
+ end
245
+ end
246
+ end
@@ -0,0 +1,191 @@
1
+ module Origen
2
+ class Application
3
+ # Responsible for keeping track of all stats collected during a run
4
+ class Statistics
5
+ attr_accessor :completed_files, :failed_files, :missing_files,
6
+ :new_files, :changed_files
7
+ attr_accessor :completed_patterns, :failed_patterns, :missing_patterns,
8
+ :new_patterns, :changed_patterns
9
+ attr_accessor :total_vectors, :total_cycles, :total_duration, :errors
10
+
11
+ class Pattern
12
+ attr_accessor :vectors, :cycles, :duration
13
+ def initialize
14
+ @vectors = 0
15
+ @cycles = 0
16
+ @duration = 0
17
+ end
18
+ end
19
+
20
+ def initialize(options)
21
+ @options = options
22
+ @patterns = {}
23
+ reset_global_stats
24
+ end
25
+
26
+ def reset_global_stats
27
+ @completed_files = 0
28
+ @failed_files = 0
29
+ @missing_files = 0
30
+ @new_files = 0
31
+ @changed_files = 0
32
+
33
+ @completed_patterns = 0
34
+ @failed_patterns = 0
35
+ @missing_patterns = 0
36
+ @new_patterns = 0
37
+ @changed_patterns = 0
38
+
39
+ @total_vectors = 0
40
+ @total_cycles = 0
41
+ @total_duration = 0
42
+
43
+ @errors = 0
44
+ end
45
+
46
+ def reset_pattern_stats
47
+ end
48
+
49
+ def print_summary
50
+ method = clean_run? ? :success : :info
51
+ if @completed_patterns > 0 || @failed_patterns > 0
52
+ Origen.log.send method, "Total patterns: #{@completed_patterns}"
53
+ Origen.log.send method, "Total vectors: #{@total_vectors}"
54
+ Origen.log.send method, 'Total duration: %.6f' % @total_duration
55
+ Origen.log.send method, "New patterns: #{@new_patterns}"
56
+ if @changed_patterns > 0
57
+ Origen.log.warn "Changed patterns: #{@changed_patterns}"
58
+ else
59
+ Origen.log.send method, "Changed patterns: #{@changed_patterns}"
60
+ end
61
+ Origen.log.error "FAILED patterns: #{@failed_patterns}" if @failed_patterns > 0
62
+ Origen.log.info
63
+ end
64
+ if @completed_files > 0 || @failed_files > 0
65
+ Origen.log.send method, "Total files: #{@completed_files}"
66
+ Origen.log.send method, "New files: #{@new_files}"
67
+ Origen.log.send method, "Changed files: #{@changed_files}"
68
+ Origen.log.error "FAILED files: #{@failed_files}" if @failed_files > 0
69
+ Origen.log.info
70
+ end
71
+ if @errors > 0
72
+ Origen.log.error "ERRORS: #{@errors}"
73
+ end
74
+
75
+ if @changed_files > 0 || @changed_patterns > 0
76
+ changes = true
77
+ Origen.log.info 'To accept all of these changes run:'
78
+ Origen.log.info ' origen save changed'
79
+ end
80
+ if @new_files > 0 || @new_patterns > 0
81
+ news = true
82
+ Origen.log.info 'To save all of these new files as the reference version run:'
83
+ Origen.log.info ' origen save new'
84
+ end
85
+ if changes && news
86
+ Origen.log.info 'To save both new and changed files run:'
87
+ Origen.log.info ' origen save all'
88
+ end
89
+ Origen.log.info '**********************************************************************'
90
+ end
91
+
92
+ def summary_text
93
+ <<-END
94
+ Total patterns: #{@completed_patterns}
95
+ New patterns: #{@new_patterns}
96
+ Changed patterns: #{@changed_patterns}
97
+ FAILED patterns: #{@failed_patterns}
98
+
99
+ Total files: #{@completed_files}
100
+ New files: #{@new_files}
101
+ Changed files: #{@changed_files}
102
+ FAILED files: #{@failed_files}
103
+
104
+ ERRORS: #{@errors}
105
+ END
106
+ end
107
+
108
+ def clean_run?
109
+ @changed_files == 0 && @changed_patterns == 0 &&
110
+ @new_files == 0 && @new_patterns == 0 &&
111
+ @failed_files == 0 && @failed_patterns == 0 &&
112
+ @errors == 0
113
+ end
114
+
115
+ def record_failed_pattern
116
+ @failed_patterns += 1
117
+ end
118
+
119
+ def record_missing_pattern
120
+ @missing_patterns += 1
121
+ end
122
+
123
+ def add_vector(x = 1)
124
+ current_pattern.vectors += x
125
+ end
126
+
127
+ def add_cycle(x = 1)
128
+ current_pattern.cycles += x
129
+ end
130
+
131
+ def add_time_in_ns(x)
132
+ current_pattern.duration += x
133
+ end
134
+
135
+ def collect_for_pattern(key)
136
+ @pattern_key = key
137
+ yield
138
+ @pattern_key = nil
139
+ end
140
+
141
+ def current_pattern
142
+ pattern(@pattern_key)
143
+ end
144
+
145
+ def pattern(key)
146
+ @patterns[key] ||= Pattern.new
147
+ end
148
+
149
+ def number_of_vectors_for(key)
150
+ pattern(key).vectors
151
+ end
152
+
153
+ def number_of_cycles_for(key)
154
+ pattern(key).vectors
155
+ end
156
+
157
+ def execution_time_for(key)
158
+ pattern(key).duration.to_f / 1_000_000_000
159
+ end
160
+
161
+ def record_pattern_completion(key)
162
+ @completed_patterns += 1
163
+ @total_vectors += number_of_vectors_for(key)
164
+ @total_cycles += number_of_cycles_for(key)
165
+ @total_duration += execution_time_for(key)
166
+ end
167
+
168
+ def report_pass
169
+ Origen.log.success ''
170
+ Origen.log.success ' PPPPP AA SSSS SSSS'
171
+ Origen.log.success ' PP PP AAAA SS SS SS SS'
172
+ Origen.log.success ' PPPPP AA AA SS SS'
173
+ Origen.log.success ' PP AAAAAAAA SS SS'
174
+ Origen.log.success ' PP AA AA SS SS SS SS'
175
+ Origen.log.success ' PP AA AA SSSS SSSS'
176
+ Origen.log.success ''
177
+ end
178
+
179
+ def report_fail
180
+ Origen.log.error ''
181
+ Origen.log.error ' FFFFFF AA II LL'
182
+ Origen.log.error ' FF AAAA II LL'
183
+ Origen.log.error ' FFFFF AA AA II LL'
184
+ Origen.log.error ' FF AAAAAAAA II LL'
185
+ Origen.log.error ' FF AA AA II LL'
186
+ Origen.log.error ' FF AA AA II LLLLLL'
187
+ Origen.log.error ''
188
+ end
189
+ end
190
+ end
191
+ end