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,111 @@
1
+ module Origen
2
+ module Database
3
+ class KeyValueStore
4
+ attr_reader :name
5
+ # Returns the parent database (the application's collection of
6
+ # key-value stores)
7
+ attr_reader :database
8
+
9
+ def initialize(database, name)
10
+ @name = name
11
+ @database = database
12
+ end
13
+
14
+ # Read a value from the store
15
+ def [](key)
16
+ refresh if stale?
17
+ store[key]
18
+ end
19
+
20
+ # Persist a new value to the store
21
+ def []=(key, val)
22
+ refresh if persisted?
23
+ store[key] = val
24
+ save_to_file
25
+ val
26
+ end
27
+
28
+ # Force a refresh of the database
29
+ def refresh
30
+ unless @uncommitted || !persisted?
31
+ dssc.check_out(file, version: 'Trunk', force: true)
32
+ record_refresh
33
+ end
34
+ end
35
+
36
+ def record_refresh
37
+ database.record_refresh(name)
38
+ @store = nil
39
+ end
40
+
41
+ # Returns true if the database is due a time-based refresh, note that
42
+ # this has no bearing on whether or not someone else has committed to
43
+ # the store since the last refresh
44
+ def stale?
45
+ if persisted?
46
+ t = database.time_since_refresh(name)
47
+ !t || store[:refresh_interval_in_minutes] == 0 || t > store[:refresh_interval_in_minutes]
48
+ else
49
+ false
50
+ end
51
+ end
52
+
53
+ def persisted?
54
+ database.persisted?
55
+ end
56
+
57
+ private
58
+
59
+ def dssc
60
+ @dssc ||= Origen::Utility::DesignSync.new
61
+ end
62
+
63
+ def store
64
+ @store ||= begin
65
+ if file.exist?
66
+ load_from_file
67
+ elsif persisted? && dssc.managed_by_design_sync?(file)
68
+ refresh
69
+ load_from_file
70
+ else
71
+ @uncommitted = true
72
+ { refresh_interval_in_minutes: 60 }
73
+ end
74
+ end
75
+ end
76
+
77
+ def load_from_file
78
+ s = nil
79
+ File.open(file.to_s) do |f|
80
+ s = Marshal.load(f)
81
+ end
82
+ s
83
+ end
84
+
85
+ def save_to_file
86
+ unless file.dirname.exist?
87
+ FileUtils.mkdir_p(file.dirname.to_s)
88
+ end
89
+ `chmod u+w #{file}` if file.exist?
90
+ if @uncommitted
91
+ database.record_new_store(name)
92
+ @uncommitted = false
93
+ end
94
+ File.open(file.to_s, 'w') do |f|
95
+ Marshal.dump(store, f)
96
+ end
97
+ if persisted?
98
+ dssc.check_in file, new: true, keep: true, branch: 'Trunk'
99
+ end
100
+ end
101
+
102
+ def file
103
+ if persisted?
104
+ @file ||= Pathname.new("#{database.app.root}/.db/#{name.to_s.symbolize}")
105
+ else
106
+ @file ||= Pathname.new("#{database.app.root}/.session/#{name.to_s.symbolize}")
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,108 @@
1
+ module Origen
2
+ module Database
3
+ class KeyValueStores
4
+ # Returns the application that owns the database
5
+ attr_reader :app
6
+
7
+ def initialize(app, options = {})
8
+ options = {
9
+ persist: true
10
+ }.merge(options)
11
+ @app = app
12
+ @persist = options[:persist]
13
+ end
14
+
15
+ def inspect
16
+ if persisted?
17
+ "< #{app.class}'s Database >"
18
+ else
19
+ "< #{app.class}'s Session >"
20
+ end
21
+ end
22
+
23
+ # Refresh all stores
24
+ def refresh
25
+ if persisted?
26
+ _system.refresh
27
+ files = stores.map { |name| send(name).send(:file) }
28
+ dssc.check_out(files.join(' '), version: 'Trunk', force: true)
29
+ stores.each { |name| send(name).record_refresh }
30
+ end
31
+ nil
32
+ end
33
+
34
+ # Returns the time in minutes since the given store
35
+ # was last refreshed
36
+ def time_since_refresh(name)
37
+ if persisted?
38
+ if refresh_table[name]
39
+ ((Time.now - refresh_table[name]) / 60).floor
40
+ end
41
+ else
42
+ Time.now
43
+ end
44
+ end
45
+
46
+ # Record that the given store was just refreshed
47
+ def record_refresh(name)
48
+ if persisted?
49
+ t = refresh_table
50
+ t[name] = Time.now
51
+ app.session._database[:refresh_table] = t
52
+ end
53
+ end
54
+
55
+ def record_new_store(name)
56
+ unless name == :_system || name == :_database
57
+ _system.refresh
58
+ s = stores
59
+ s << name unless s.include?(name)
60
+ _system[:stores] = s
61
+ end
62
+ end
63
+
64
+ # Used to create new key value stores on the fly.
65
+ #
66
+ # On first call of a missing method a method is generated to avoid the missing lookup
67
+ # next time, this should be faster for repeated lookups of the same method, e.g. reg
68
+ def method_missing(method, *args, &block)
69
+ if method.to_s =~ /(=|\(|\)|\.|\[|\]|{|}|\\|\/)/ || [:test, :_system].include?(method)
70
+ fail "Invalid database name: #{method}"
71
+ else
72
+ define_singleton_method(method) do
73
+ loaded[method] ||= KeyValueStore.new(self, method)
74
+ end
75
+ end
76
+ send(method, *args, &block)
77
+ end
78
+
79
+ # Returns the names of all known stores
80
+ def stores
81
+ _system[:stores] || []
82
+ end
83
+
84
+ def persisted?
85
+ @persist
86
+ end
87
+
88
+ private
89
+
90
+ def refresh_table
91
+ app.session._database[:refresh_table] ||= {}
92
+ end
93
+
94
+ # Persisted key value store used by the database system
95
+ def _system
96
+ @_system ||= KeyValueStore.new(self, :_system)
97
+ end
98
+
99
+ def dssc
100
+ @dssc ||= Origen::Utility::DesignSync.new
101
+ end
102
+
103
+ def loaded
104
+ @loaded ||= {}
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,6 @@
1
+ module Origen
2
+ module Database
3
+ autoload :KeyValueStore, 'origen/database/key_value_store'
4
+ autoload :KeyValueStores, 'origen/database/key_value_stores'
5
+ end
6
+ end
@@ -0,0 +1,102 @@
1
+ module Origen
2
+ ENCODINGS = {
3
+ utf8: {
4
+ inverted_exclamation_mark: "\u00A1",
5
+ cent_sign: "\u00A2",
6
+ pound_sign: "\u00A3",
7
+ currency_sign: "\u00A4",
8
+ yen_sign: "\u00A5",
9
+ broken_bar: "\u00A6",
10
+ section_sign: "\u00A7",
11
+ diaeresis: "\u00A8",
12
+ copyright_sign: "\u00A9",
13
+ feminine_ordinal_indicator: "\u00AA",
14
+ left_pointing_double_angle_quotation_mark: "\u00AB",
15
+ not_sign: "\u00AC",
16
+ soft_hyphen: "\u00AD",
17
+ registered_sign: "\u00AE ",
18
+ macron: "\u00AF",
19
+ degree_sign: "\u00B0",
20
+ plus_minus_sign: "\u00B1",
21
+ superscript_two: "\u00B2",
22
+ superscript_three: "\u00B3",
23
+ acute_accent: "\u00B4",
24
+ micro_sign: "\u00B5",
25
+ pilcrow_sign: "\u00B6",
26
+ middle_dot: "\u00B7",
27
+ cedilla: "\u00B8",
28
+ superscript_one: "\u00B9",
29
+ masculine_ordinal_indicator: "\u00BA",
30
+ right_pointing_double_angle_quotation_mark: "\u00BB",
31
+ vulgar_fraction_one_quarter: "\u00BC",
32
+ vulgar_fraction_one_half: "\u00BD",
33
+ vulgar_fraction_three_quarters: "\u00BE",
34
+ inverted_question_mark: "\u00BF",
35
+ latin_capital_letter_a_with_grave: "\u00C0",
36
+ latin_capital_letter_a_with_acute: "\u00C1",
37
+ latin_capital_letter_a_with_circumflex: "\u00C2",
38
+ latin_capital_letter_a_with_tilde: "\u00C3",
39
+ latin_capital_letter_a_with_diaeresis: "\u00C4",
40
+ latin_capital_letter_a_with_ring_above: "\u00C5",
41
+ latin_capital_letter_ae: "\u00C6",
42
+ latin_capital_letter_c_with_cedilla: "\u00C7",
43
+ latin_capital_letter_e_with_grave: "\u00C8",
44
+ latin_capital_letter_e_with_acute: "\u00C9",
45
+ latin_capital_letter_e_with_circumflex: "\u00CA",
46
+ latin_capital_letter_e_with_diaeresis: "\u00CB",
47
+ latin_capital_letter_i_with_grave: "\u00CC",
48
+ latin_capital_letter_i_with_acute: "\u00CD",
49
+ latin_capital_letter_i_with_circumflex: "\u00CE",
50
+ latin_capital_letter_i_with_diaeresis: "\u00CF",
51
+ latin_capital_letter_eth: "\u00D0",
52
+ latin_capital_letter_n_with_tilde: "\u00D1",
53
+ latin_capital_letter_o_with_grave: "\u00D2",
54
+ latin_capital_letter_o_with_acute: "\u00D3",
55
+ latin_capital_letter_o_with_circumflex: "\u00D4",
56
+ latin_capital_letter_o_with_tilde: "\u00D5",
57
+ latin_capital_letter_o_with_diaeresis: "\u00D6",
58
+ multiplication_sign: "\u00D7",
59
+ latin_capital_letter_o_with_stroke: "\u00D8",
60
+ latin_capital_letter_u_with_grave: "\u00D9",
61
+ latin_capital_letter_u_with_acute: "\u00DA",
62
+ latin_capital_letter_u_with_circumflex: "\u00DB",
63
+ latin_capital_letter_u_with_diaeresis: "\u00DC",
64
+ latin_capital_letter_y_with_acute: "\u00DD",
65
+ latin_capital_letter_thorn: "\u00DE",
66
+ latin_small_letter_sharp_s: "\u00DF",
67
+ latin_small_letter_a_with_grave: "\u00E0",
68
+ latin_small_letter_a_with_acute: "\u00E1",
69
+ latin_small_letter_a_with_circumflex: "\u00E2",
70
+ latin_small_letter_a_with_tilde: "\u00E3",
71
+ latin_small_letter_a_with_diaeresis: "\u00E4",
72
+ latin_small_letter_a_with_ring_above: "\u00E5",
73
+ latin_small_letter_ae: "\u00E6",
74
+ latin_small_letter_c_with_cedilla: "\u00E7",
75
+ latin_small_letter_e_with_grave: "\u00E8",
76
+ latin_small_letter_e_with_acute: "\u00E9",
77
+ latin_small_letter_e_with_circumflex: "\u00EA",
78
+ latin_small_letter_e_with_diaeresis: "\u00EB",
79
+ latin_small_letter_i_with_grave: "\u00EC",
80
+ latin_small_letter_i_with_acute: "\u00ED",
81
+ latin_small_letter_i_with_circumflex: "\u00EE",
82
+ latin_small_letter_i_with_diaeresis: "\u00EF",
83
+ latin_small_letter_eth: "\u00F0",
84
+ latin_small_letter_n_with_tilde: "\u00F1",
85
+ latin_small_letter_o_with_grave: "\u00F2",
86
+ latin_small_letter_o_with_acute: "\u00F3",
87
+ latin_small_letter_o_with_circumflex: "\u00F4",
88
+ latin_small_letter_o_with_tilde: "\u00F5",
89
+ latin_small_letter_o_with_diaeresis: "\u00F6",
90
+ division_sign: "\u00F7",
91
+ latin_small_letter_o_with_stroke: "\u00F8",
92
+ latin_small_letter_u_with_grave: "\u00F9",
93
+ latin_small_letter_u_with_acute: "\u00FA",
94
+ latin_small_letter_u_with_circumflex: "\u00FB",
95
+ latin_small_letter_u_with_diaeresis: "\u00FC",
96
+ latin_small_letter_y_with_acute: "\u00FD",
97
+ latin_small_letter_thorn: "\u00FE",
98
+ latin_small_letter_y_with_diaeresis: "\u00FF",
99
+ ohm_sign: "\u03A9"
100
+ }
101
+ }
102
+ end
@@ -0,0 +1,22 @@
1
+ module Origen
2
+ module Features
3
+ class Feature
4
+ attr_reader :name
5
+ attr_reader :description
6
+
7
+ def initialize(name, options = {})
8
+ @name = name
9
+ @description = options[:description]
10
+ end
11
+
12
+ def describe
13
+ return 'No description provided!' if @description == []
14
+ if @description.class == Array
15
+ @description.join(' ')
16
+ else
17
+ @description
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,104 @@
1
+ module Origen
2
+ module Features
3
+ extend ActiveSupport::Concern
4
+
5
+ autoload :Feature, 'origen/features/feature'
6
+
7
+ module ClassMethods
8
+ def features
9
+ @features ||= {}
10
+ end
11
+
12
+ # Creates a Feature if it deos not already exists.
13
+ # Returns the Feature object if it already exists.
14
+ # Returns an array of features if no argument is provided.
15
+
16
+ private
17
+
18
+ def feature(name, options = {})
19
+ name = name.to_s.downcase.to_sym
20
+ if !features.key?(name)
21
+ # Add the feature if it does not already exists
22
+
23
+ # Read desciption from the caller if the description of feature
24
+ # is not provided
25
+ unless options.key?(:description)
26
+ @file = define_file(caller[0])
27
+ options[:description] = fetch_description(name)
28
+ end
29
+ features[name] = Feature.new(name, options)
30
+ else # if feature with given name already exists
31
+ fail "Feature #{name} already added!"
32
+ end
33
+ end
34
+
35
+ def fetch_description(name)
36
+ parse_description unless description_lookup[@file]
37
+ begin
38
+ desc = description_lookup[@file][name]
39
+ rescue
40
+ desc = []
41
+ end
42
+ desc
43
+ end
44
+
45
+ def define_file(file)
46
+ if Origen.running_on_windows?
47
+ fields = file.split(':')
48
+ "#{fields[0]}:#{fields[1]}"
49
+ else
50
+ file.split(':').first
51
+
52
+ end
53
+ end
54
+
55
+ def description_lookup
56
+ @@description_lookup ||= {}
57
+ end
58
+
59
+ def parse_description
60
+ desc = []
61
+ File.readlines(@file).each do |line|
62
+ if line =~ /^\s*#(.*)/
63
+ desc << Regexp.last_match[1].strip
64
+ elsif line =~ /(\s|:)feature(\s*)(=?>?)(\s?):(\w*)/
65
+ description_lookup[@file] ||= {}
66
+ description_lookup[@file][Regexp.last_match[5].to_sym] = desc
67
+ desc = []
68
+ else
69
+ desc = []
70
+ end
71
+ end
72
+ end
73
+ end
74
+
75
+ public
76
+
77
+ def has_features?(name = nil)
78
+ if !name
79
+ if feature.size == 0
80
+ return false
81
+ else
82
+ return true
83
+ end
84
+ else
85
+ return feature.include?(name)
86
+ end
87
+ end
88
+ alias_method :has_feature?, :has_features?
89
+
90
+ # Returns an array of the names of all associated features
91
+ def feature(name = nil)
92
+ if !name
93
+ self.class.features.keys
94
+ else
95
+ if self.class.features.key?(name)
96
+ self.class.features[name]
97
+ else
98
+ fail "Feature #{name} does not exist!"
99
+ end
100
+ end
101
+ end
102
+ alias_method :features, :feature
103
+ end
104
+ end