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,429 @@
1
+ require 'pathname'
2
+
3
+ module Origen
4
+ # All logic for working with files/directories and resolving path names
5
+ # should be included here.
6
+ #
7
+ # An instance of this class is available as Origen.file_handler
8
+ #
9
+ # Some portions of Origen may implement local code to do this, but these
10
+ # should all be transitioned to use this over time.
11
+ class FileHandler
12
+ attr_accessor :default_extension
13
+
14
+ # Returns an array of file/pattern names lines from a list file.
15
+ # This will also take care of recursively expanding any embedded
16
+ # list references.
17
+ def expand_list(files, options = {})
18
+ [files].flatten.map do |file|
19
+ f = file.strip
20
+ # Takes care of blank or comment lines in a list file
21
+ if f.empty? || f =~ /^\s*#/
22
+ nil
23
+ # Don't expand program lists when submitting to lsf,
24
+ # there are likely to be relational dependencies between
25
+ # flows meaning that they must be generated together
26
+ elsif is_a_list?(f) && !(options[:lsf] && options[:action] == :program)
27
+ expand_list(open_list(f), options)
28
+ else
29
+ f
30
+ end
31
+ end.flatten.compact.uniq
32
+ end
33
+
34
+ # Returns the contents of the given list file in an array, if it
35
+ # can be found, if not will raise an error
36
+ def open_list(file)
37
+ f = clean_path_to(file, allow_missing: true)
38
+ if f
39
+ f = File.open(f, 'r')
40
+ elsif File.exist?("#{Origen.root}/list/#{File.basename(file)}")
41
+ f = File.open("#{Origen.root}/list/#{File.basename(file)}", 'r')
42
+ elsif @last_opened_list_dir && File.exist?("#{@last_opened_list_dir}/#{file}")
43
+ f = File.open("#{@last_opened_list_dir}/#{file}", 'r')
44
+ else
45
+ fail "Could not find list file: #{file}"
46
+ end
47
+ lines = f.readlines
48
+ f.close
49
+ # Before we go save the directory of this list, this will help
50
+ # us to resolve any relative path references to other lists that
51
+ # it may contain
52
+ @last_opened_list_dir = clean_path_to(Pathname.new(f).dirname)
53
+ lines
54
+ end
55
+
56
+ # Returns true if the input argument is a list, for now this is
57
+ # simply defined by the filename ending in .list
58
+ def is_a_list?(file)
59
+ !!(file =~ /list$/)
60
+ end
61
+
62
+ # Yields absolute paths to the given file or directory. If a directory is supplied
63
+ # the method will recurse into the sub directories and ultimately yield
64
+ # every file contained within the directory and its children.
65
+ def resolve_files(file_or_dir_path, options = {}, &block)
66
+ options = {
67
+ # Set to :template when calling to consider references to template
68
+ # files from an import library
69
+ import: false
70
+ }.merge(options)
71
+ [file_or_dir_path].flatten.each do |file_or_dir_path|
72
+ path = inject_import_path(file_or_dir_path, type: options[:import]) if options[:import]
73
+ path = clean_path_to(file_or_dir_path, options)
74
+ self.base_directory = path unless options[:internal_call]
75
+ if path.directory?
76
+ Dir.glob("#{path}/*").sort.each do |file|
77
+ resolve_files(file, { internal_call: true }.merge(options), &block)
78
+ end
79
+ else
80
+ # Ignore files with the given prefix if supplied, but only if this is a file that
81
+ # has been found, if explicitly asked to compile a file from the caller do it regardless
82
+ if options[:ignore_with_prefix] && options[:internal_call]
83
+ return nil if path.basename.to_s =~ /^#{options[:ignore_with_prefix]}/
84
+ end
85
+ yield path
86
+ end
87
+ end
88
+ end
89
+
90
+ # Returns a full path to the given file or directory, raises an error if it
91
+ # can't be resolved
92
+ def clean_path_to(file, options = {})
93
+ # Allow individual calls to this method to specify additional custom load paths to consider
94
+ if options[:load_paths]
95
+ [options[:load_paths]].each do |root|
96
+ if File.exist?("#{root}/#{file}")
97
+ return Pathname.new("#{root}/#{file}")
98
+ end
99
+ end
100
+ end
101
+ if File.exist?(file)
102
+ if Pathname.new(file).absolute?
103
+ Pathname.new(file)
104
+ else
105
+ Pathname.new("#{Pathname.pwd}/#{file}")
106
+ end
107
+ # Is it a relative reference within a list file?
108
+ elsif @last_opened_list_dir && File.exist?("#{@last_opened_list_dir}/#{file}")
109
+ Pathname.new("#{@last_opened_list_dir}/#{file}")
110
+ # Is it a relative reference to the current base directory?
111
+ elsif File.exist?("#{base_directory}/#{file}")
112
+ Pathname.new("#{base_directory}/#{file}")
113
+ # Is it a path relative to Origen.root?
114
+ elsif File.exist?("#{Origen.root}/#{file}")
115
+ Pathname.new("#{Origen.root}/#{file}")
116
+ # Is it a path relative to the current directory?
117
+ elsif current_directory && File.exist?("#{current_directory}/#{file}")
118
+ Pathname.new("#{current_directory}/#{file}")
119
+ # Is it a path relative to the current plugin's Origen.root?
120
+ elsif Origen.current_plugin.instance && File.exist?("#{Origen.current_plugin.instance.root}/#{file}")
121
+ Pathname.new("#{Origen.current_plugin.instance.root}/#{file}")
122
+ elsif options[:default_dir]
123
+ m = all_matches(file, options)
124
+ if m
125
+ Pathname.new(m)
126
+ else
127
+ if options[:allow_missing]
128
+ return nil
129
+ else
130
+ fail "Can't find: #{file}"
131
+ end
132
+ end
133
+ else
134
+ if options[:allow_missing]
135
+ return nil
136
+ else
137
+ fail "Can't find: #{file}"
138
+ end
139
+ end
140
+ end
141
+
142
+ def check(path)
143
+ file_plugin = Origen.import_manager.path_within_a_plugin(path)
144
+ if file_plugin
145
+ if Origen.current_plugin.name
146
+ if file_plugin == Origen.current_plugin.name
147
+ return path
148
+ else
149
+ puts "The requested file is from plugin #{file_plugin} and current system plugin is set to plugin #{Origen.current_plugin.name}!"
150
+ fail 'Incorrect plugin error!'
151
+ end
152
+ else
153
+ Origen.current_plugin.temporary = file_plugin
154
+ return path
155
+ end
156
+ else
157
+ return path
158
+ end
159
+ end
160
+
161
+ def all_matches(file, options)
162
+ if Origen.current_plugin.name
163
+ matches = Dir.glob("#{options[:default_dir]}/#{Origen.current_plugin.name}/**/#{file}").sort
164
+ matches = matches.flatten.uniq
165
+ if matches.size == 0
166
+ matches = Dir.glob("#{options[:default_dir]}/**/#{file}").sort
167
+ matches = matches.flatten.uniq
168
+ end
169
+ else
170
+ matches = (Dir.glob("#{options[:default_dir]}/**/#{file}") + # Avoids symlinks
171
+ Dir.glob("#{options[:default_dir]}/#{file}")).sort
172
+ if matches.size == 0
173
+ matches = Dir.glob("#{options[:default_dir]}/**{,/*/**}/#{file}").sort # Takes symlinks into consideration
174
+ matches = matches.flatten.uniq
175
+ end
176
+ end
177
+
178
+ if matches.size == 0
179
+ return nil
180
+ elsif matches.size > 1
181
+ puts 'The following matches were found:'
182
+ puts matches
183
+ fail "Ambiguous file #{file}"
184
+ else
185
+ return check(matches.first)
186
+ end
187
+ end
188
+
189
+ # Returns an absolute path for the given
190
+ def relative_to_absolute(path)
191
+ if Pathname.new(path).absolute?
192
+ Pathname.new(path)
193
+ else
194
+ Pathname.new("#{Pathname.pwd}/#{path}")
195
+ end
196
+ end
197
+
198
+ def relative_path_to(path)
199
+ clean_path_to(path).relative_path_from(Pathname.pwd)
200
+ end
201
+
202
+ def clean_path_to_sub_template(file)
203
+ if File.exist?(file)
204
+ if Pathname.new(file).absolute?
205
+ return Pathname.new(file)
206
+ else
207
+ return Pathname.new("#{Pathname.pwd}/#{file}")
208
+ end
209
+ end
210
+ file = inject_import_path(file, type: :template)
211
+ file = add_underscore_to(file)
212
+ file = add_extension_to(file)
213
+ begin
214
+ # Allow relative references to templates/web when compiling a web template
215
+ if Origen.lsf.current_command == 'web'
216
+ clean_path_to(file, load_paths: "#{Origen.root}/templates/web")
217
+ else
218
+ clean_path_to(file)
219
+ end
220
+ rescue
221
+ # Try again without .erb
222
+ file = file.gsub('.erb', '')
223
+ if Origen.lsf.current_command == 'web'
224
+ clean_path_to(file, load_paths: "#{Origen.root}/templates/web")
225
+ else
226
+ clean_path_to(file)
227
+ end
228
+ end
229
+ end
230
+
231
+ def clean_path_to_template(file)
232
+ file = inject_import_path(file, type: :template)
233
+ file = add_extension_to(file)
234
+ clean_path_to(file)
235
+ end
236
+
237
+ # If the current path looks like it is a reference to an import, the
238
+ # path will be replaced with the absolute path to the local import directory
239
+ def inject_import_path(path, options = {})
240
+ path = path.to_s unless path.is_a?(String)
241
+ if path =~ /(.*?)\/.*/
242
+ import_name = Regexp.last_match[1].downcase.to_sym
243
+ if import_name == :origen || import_name == :origen_core || Origen.import_manager.names.include?(import_name)
244
+ unless import_name == :origen || import_name == :origen_core
245
+ root = Origen.app(import_name).root
246
+ end
247
+ if options[:type] == :template
248
+ if import_name == :origen || import_name == :origen_core
249
+ path.sub! 'origen', "#{Origen.top}/templates/shared"
250
+ else
251
+ path.sub! Regexp.last_match[1], "#{root}/templates/shared"
252
+ end
253
+ else
254
+ fail 'Unknown import path type!'
255
+ end
256
+ end
257
+ end
258
+ path
259
+ end
260
+
261
+ def clean_path_to_sub_program(file)
262
+ file = add_underscore_to(file)
263
+ file = add_rb_to(file)
264
+ clean_path_to(file)
265
+ end
266
+
267
+ # Insert _ in file name if not present
268
+ def add_underscore_to(file)
269
+ f = Pathname.new(file)
270
+ if f.basename.to_s =~ /^_/
271
+ file
272
+ else
273
+ "#{f.dirname}/_#{f.basename}"
274
+ end
275
+ end
276
+
277
+ def add_rb_to(file)
278
+ f = Pathname.new(file)
279
+ "#{f.dirname}/#{f.basename('.rb')}.rb"
280
+ end
281
+
282
+ def add_extension_to(file)
283
+ f = Pathname.new(file)
284
+ if f.basename('.erb').extname.empty?
285
+ if default_extension
286
+ "#{f.dirname}/#{f.basename('.erb')}#{default_extension}.erb"
287
+ else
288
+ "#{f.dirname}/#{f.basename('.erb')}#{Pathname.new(Origen.file_handler.current_file).basename('.erb').extname}.erb"
289
+ end
290
+ else
291
+ "#{f.dirname}/#{f.basename('.erb')}.erb"
292
+ end
293
+ end
294
+
295
+ def set_output_directory(options = {})
296
+ options = {
297
+ create: true
298
+ }.merge(options)
299
+ if options[:output]
300
+ @output_directory = relative_to_absolute(options[:output])
301
+ else
302
+ @output_directory = Pathname.new(Origen.config.output_directory)
303
+ end
304
+ if options[:create]
305
+ FileUtils.mkdir_p(@output_directory) unless @output_directory.exist?
306
+ end
307
+ @output_directory
308
+ end
309
+
310
+ # Returns an absolute pathname to the current output directory
311
+ def output_directory
312
+ @output_directory ||= set_output_directory
313
+ end
314
+
315
+ def set_reference_directory(options = {})
316
+ options = {
317
+ create: true
318
+ }.merge(options)
319
+ if options[:reference]
320
+ @reference_directory = relative_to_absolute(options[:reference])
321
+ else
322
+ @reference_directory = Pathname.new(Origen.config.reference_directory)
323
+ end
324
+ if options[:create]
325
+ # Delete any broken symlinks in the top level .ref
326
+ dir = "#{Origen.root}/.ref"
327
+ if File.symlink?(dir)
328
+ FileUtils.rm_f(dir) unless File.exist?(dir)
329
+ end
330
+ FileUtils.mkdir_p(@reference_directory) unless @reference_directory.exist?
331
+ end
332
+ @reference_directory
333
+ end
334
+
335
+ # Returns an absolute pathname to the current reference directory
336
+ def reference_directory
337
+ @reference_directory ||= set_reference_directory
338
+ end
339
+
340
+ # Returns the base directory containing the source files being generated/compiled.
341
+ #
342
+ # When operating on a single file this will return the directory containing that
343
+ # file, when operating on a directory this will return the directory.
344
+ def base_directory
345
+ @base_directory
346
+ end
347
+
348
+ def base_directory=(file_or_dir)
349
+ # puts "Base directory changed by: #{caller[0]}"
350
+ if file_or_dir.directory?
351
+ @base_directory = file_or_dir
352
+ else
353
+ @base_directory = file_or_dir.dirname
354
+ end
355
+ end
356
+
357
+ def current_directory
358
+ return @current_directory if @current_directory
359
+ @current_directory = clean_path_to(current_file).dirname if current_file
360
+ end
361
+
362
+ def current_file=(file)
363
+ @current_directory = nil
364
+ @current_file = file
365
+ end
366
+
367
+ def current_file
368
+ @current_file
369
+ end
370
+
371
+ def preserve_current_file
372
+ file = current_file
373
+ yield
374
+ self.current_file = file
375
+ end
376
+
377
+ def preserve_state
378
+ file = current_file
379
+ dir = base_directory
380
+ output = output_directory
381
+ ref = reference_directory
382
+ yield
383
+ self.base_directory = dir if dir
384
+ self.current_file = file if file
385
+ set_output_directory(output: output) if output
386
+ set_reference_directory(reference: ref) if ref
387
+ end
388
+
389
+ def preserve_and_clear_state
390
+ file = current_file
391
+ dir = base_directory
392
+ output = output_directory
393
+ ref = reference_directory
394
+ current_file = nil
395
+ base_directory = nil
396
+ output_directory = nil
397
+ reference_directory = nil
398
+ yield
399
+ self.base_directory = dir if dir
400
+ self.current_file = file if file
401
+ set_output_directory(output: output) if output
402
+ set_reference_directory(reference: ref) if ref
403
+ end
404
+
405
+ # Returns the sub directory of the current base directory that the
406
+ # given file is in
407
+ def sub_dir_of(file, base = base_directory)
408
+ file = Pathname.new(file) unless file.respond_to?(:relative_path_from)
409
+ base = Pathname.new(base) unless base.respond_to?(:relative_path_from)
410
+ rel = file.relative_path_from(base)
411
+ if file.directory?
412
+ rel
413
+ else
414
+ rel.dirname
415
+ end
416
+ end
417
+
418
+ # Convenience method to use when you want to write to a file, this takes
419
+ # care of ensuring that the directory exists prior to attempting to open
420
+ # the file
421
+ def open_for_write(path)
422
+ dir = Pathname.new(path).dirname
423
+ FileUtils.mkdir_p(dir) unless File.exist?(dir)
424
+ File.open(path, 'w') do |f|
425
+ yield f
426
+ end
427
+ end
428
+ end
429
+ end
@@ -0,0 +1,56 @@
1
+ module Origen
2
+ class Generator
3
+ module Comparator
4
+ # Will check if the supplied file has changed from the last time it was generated
5
+ # Returns true if it is a new file, or if a change has been detected
6
+ def check_for_changes(new, old, options = {})
7
+ options = {
8
+ comment_char: Origen.app.tester ? Origen.app.tester.comment_char : nil,
9
+ quiet: false,
10
+ compile_job: false,
11
+ suspend_string: 'STOPDIFF',
12
+ resume_string: 'STARTDIFF'
13
+ }.merge(options)
14
+
15
+ if File.exist?(old)
16
+ if Utility::Diff.new(file_a: new, file_b: old, ignore_blank_lines: true,
17
+ comment_char: options[:comment_char],
18
+ suspend_string: options[:suspend_string],
19
+ resume_string: options[:resume_string]).diffs?
20
+
21
+ unless options[:quiet]
22
+ cmd = "*** CHANGE DETECTED *** To update the reference: #{Origen.config.copy_command} #{relative_path_to(new)} #{relative_path_to(old)}"
23
+ cmd += ' /Y' if Origen.running_on_windows?
24
+ Origen.log.info cmd
25
+ Origen.log.info "#{Origen.config.diff_command} #{relative_path_to(old)} #{relative_path_to(new)} &"
26
+ Origen.log.info '**********************************************************************'
27
+ end
28
+ if options[:compile_job]
29
+ stats.changed_files += 1
30
+ else
31
+ stats.changed_patterns += 1
32
+ end
33
+ true
34
+ end
35
+ else
36
+ unless options[:quiet]
37
+ Origen.log.info "*** NEW FILE *** To save it: #{Origen.config.copy_command} #{relative_path_to(new)} #{relative_path_to(old)}"
38
+ Origen.log.info '**********************************************************************'
39
+ end
40
+ if options[:compile_job]
41
+ stats.new_files += 1
42
+ else
43
+ stats.new_patterns += 1
44
+ end
45
+ true
46
+ end
47
+ end
48
+
49
+ def relative_path_to(file)
50
+ p = Pathname(file).relative_path_from(Pathname.pwd).to_s
51
+ p.gsub!('/', '\\') if Origen.running_on_windows?
52
+ p
53
+ end
54
+ end
55
+ end
56
+ end