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,552 @@
1
+ module Origen
2
+ module Specs
3
+ autoload :Spec, 'origen/specs/spec'
4
+ autoload :Note, 'origen/specs/note'
5
+ autoload :Exhibit, 'origen/specs/exhibit'
6
+ autoload :Doc_Resource, 'origen/specs/doc_resource.rb'
7
+ autoload :Override, 'origen/specs/override.rb'
8
+ autoload :Power_Supply, 'origen/specs/power_supply.rb'
9
+ autoload :Mode_Select, 'origen/specs/mode_select.rb'
10
+ autoload :Version_History, 'origen/specs/version_history.rb'
11
+ autoload :Creation_Info, 'origen/specs/creation_info.rb'
12
+ require_relative 'specs/checkers'
13
+
14
+ attr_accessor :_specs, :_notes, :_exhibits, :_doc_resources, :_overrides, :_power_supplies, :_mode_selects, :_version_history, :_creation_info
15
+
16
+ SPEC_TYPES = [:dc, :ac, :temperature, :supply]
17
+
18
+ NOTE_TYPES = [:spec, :doc, :mode, :feature, :sighting]
19
+
20
+ SpecTableAttr = Struct.new(:table_text, :show, :padding)
21
+
22
+ # Returns a hash of hash containing all specs/modes
23
+ # If no spec is specified then all specs are returned via inspect
24
+ # If a spec is specified, a spec object will be returned if found
25
+ # in the current mode. If a mode option is passed and no spec
26
+ # is passed it will filter the specs inspect display by the mode
27
+ # and visa-versa
28
+ def specs(s = nil, options = {})
29
+ options = {
30
+ type: nil,
31
+ sub_type: nil,
32
+ mode: current_mode.nil? ? nil : current_mode.name,
33
+ spec: nil,
34
+ verbose: false,
35
+ creating_spec: false
36
+ }.update(options)
37
+ _specs
38
+ if s.nil?
39
+ return show_specs(options)
40
+ elsif s.is_a? Hash # no spec was passed but some option was passed
41
+ options.update(s)
42
+ return show_specs(options)
43
+ else # a spec was passed
44
+ options[:spec] = s
45
+ return show_specs(options)
46
+ end
47
+ end
48
+
49
+ # Define and instantiate a Spec object
50
+ def spec(name, type, mode = nil, &block)
51
+ _specs
52
+ name = name_audit(name)
53
+ fail 'Specification names must be of SPEC_TYPES Symbol or String and cannot start with a number' if name.nil?
54
+ fail "Spec type must be one of #{SPEC_TYPES.join(', ')}" unless SPEC_TYPES.include? type
55
+ type = type
56
+ mode = get_mode if mode.nil?
57
+ owner_name = ''
58
+ if self.respond_to?(:name) && send(:name)
59
+ owner_name = self.name.to_s.downcase.to_sym
60
+ elsif self == Origen.top_level
61
+ owner_name = self.class.to_s.split('::').last.downcase.to_sym
62
+ else
63
+ owner_name = self.class.to_s.split('::').last.downcase.to_sym
64
+ end
65
+ spec_placeholder = Spec
66
+ .new(name, type, mode, owner_name, &block)
67
+ # Check if the spec already exists
68
+ if has_spec?(name, type: type, mode: mode, sub_type: spec_placeholder.sub_type, creating_spec: true)
69
+ fail "Spec already exists for name: #{name}, type: #{type}, mode: #{mode} for object #{self}"
70
+ end
71
+ @_specs[name][mode][type][spec_placeholder.sub_type] = spec_placeholder
72
+ end
73
+
74
+ # Returns Boolean based on whether the calling object has any defined specs
75
+ # If the mode option is selected then the search is narrowed
76
+ def has_specs?(options = {})
77
+ _specs
78
+ options = {
79
+ type: nil,
80
+ sub_type: nil,
81
+ mode: current_mode.nil? ? nil : current_mode.name,
82
+ spec: nil,
83
+ verbose: false,
84
+ creating_spec: false
85
+ }.update(options)
86
+ if @_specs.nil? || @_specs == {}
87
+ return false
88
+ else
89
+ return !!show_specs(options)
90
+ end
91
+ end
92
+
93
+ def get_modes
94
+ @_modes
95
+ end
96
+
97
+ # Check if the current IP has a spec
98
+ def has_spec?(s, options = {})
99
+ _specs
100
+ options = {
101
+ type: nil,
102
+ sub_type: nil,
103
+ mode: current_mode.nil? ? nil : current_mode.name,
104
+ spec: nil,
105
+ verbose: false,
106
+ creating_spec: false
107
+ }.update(options)
108
+ options[:spec] = s
109
+ !!show_specs(options)
110
+ end
111
+
112
+ # Define and instantiate a Note object
113
+ def note(id, type, options = {})
114
+ _notes
115
+ @_notes[id][type] = Note.new(id, type, options)
116
+ end
117
+
118
+ def exhibit(id, type, options = {})
119
+ _exhibits
120
+ @_exhibits[id][type] = Exhibit.new(id, type, options)
121
+ end
122
+
123
+ def doc_resource(selector = {}, table_title = {}, text = {}, options = {})
124
+ _doc_resources
125
+ mode = selector[:mode]
126
+ type = selector[:type]
127
+ sub_type = selector[:sub_type]
128
+ audience = selector[:audience]
129
+ @_doc_resources[mode][type][sub_type][audience] = Doc_Resource.new(selector, table_title, text, options)
130
+ end
131
+
132
+ def version_history(date, author, changes)
133
+ _version_history
134
+ tmp_ver_history = Version_History.new(date, author, changes)
135
+ @_version_history[date][author] = tmp_ver_history
136
+ end
137
+
138
+ def override(block_options = {}, find_spec = {}, values = {}, options = {})
139
+ _overrides
140
+ block = block_options[:block]
141
+ spec_ref = find_spec[:spec_id]
142
+ mode_ref = find_spec[:mode_ref]
143
+ sub_type = find_spec[:sub_type]
144
+ audience = find_spec[:audience]
145
+ @_overrides[block][spec_ref][mode_ref][sub_type][audience] = Override.new(block_options, find_spec, values, options)
146
+ end
147
+
148
+ def power_supply(gen, act)
149
+ _power_supplies
150
+ @_power_supplies[gen][act] = Power_Supply.new(gen, act)
151
+ end
152
+
153
+ def mode_select(blk, use, mode_ref, support, loc)
154
+ _mode_selects
155
+ if use
156
+ @_mode_selects[blk][mode_ref] = Mode_Select.new(blk, use, mode_ref, support, loc)
157
+ end
158
+ end
159
+
160
+ def creation_info(author, date, src_info = {}, tool_info = {})
161
+ @_creation_info = Creation_Info.new(author, date, src_info, tool_info)
162
+ end
163
+
164
+ # Returns a Note object from the notes hash
165
+ def notes(options = {})
166
+ options = {
167
+ id: nil,
168
+ type: nil
169
+ }.update(options)
170
+ notes_found = Hash.new do |h, k|
171
+ h[k] = {}
172
+ end
173
+ _notes.filter(options[:id]).each do |id, hash|
174
+ hash.filter(options[:type]).each do |type, note|
175
+ notes_found[id][type] = note
176
+ end
177
+ end
178
+ if notes_found.empty?
179
+ return nil
180
+ elsif notes_found.size == 1
181
+ notes_found.values.first.values.first
182
+ else
183
+ return notes_found
184
+ end
185
+ end
186
+
187
+ def exhibits(options = {})
188
+ options = {
189
+ id: nil,
190
+ type: nil
191
+ }.update(options)
192
+ exhibits_found = Hash.new do|h, k|
193
+ h[k] = {}
194
+ end
195
+ _exhibits.filter(options[:id]).each do |id, hash|
196
+ hash.filter(options[:type]).each do |type, exhibit|
197
+ exhibits_found[id][type] = exhibit
198
+ end
199
+ end
200
+ if exhibits_found.empty?
201
+ return nil
202
+ elsif exhibits_found.size == 1
203
+ return exhibits_found.values.first.values.first
204
+ else
205
+ return exhibits_found
206
+ end
207
+ end
208
+
209
+ def doc_resources(options = {})
210
+ options = {
211
+ mode: nil,
212
+ type: nil,
213
+ sub_type: nil,
214
+ audience: nil,
215
+ doc_resources_to_be_shown: []
216
+ }.update(options)
217
+ doc_resources_to_be_shown = options[:doc_resources_to_be_shown]
218
+ filter_hash(_doc_resources, options[:mode]).each do |_doc_resource, hash|
219
+ filter_hash(hash, options[:type]).each do |_type, hash_|
220
+ filter_hash(hash_, options[:sub_type]).each do |_sub_type, hash__|
221
+ filter_hash(hash__, options[:audience]).each do |_audience, spec|
222
+ doc_resources_to_be_shown << spec
223
+ end
224
+ end
225
+ end
226
+ end
227
+ end
228
+
229
+ def overrides(options = {})
230
+ options = {
231
+ block: nil,
232
+ spec_ref: nil,
233
+ mode_ref: nil,
234
+ sub_type: nil,
235
+ audience: nil,
236
+ overrides: []
237
+ }.update(options)
238
+ overrides = options[:overrides]
239
+ filter_hash(_overrides, options[:block]).each do |_override, hash|
240
+ filter_hash(hash, options[:spec_ref]).each do |_spec_ref, hash_|
241
+ filter_hash(hash_, options[:mode_ref]).each do |_mode_ref, hash__|
242
+ filter_hash(hash__, options[:sub_type]).each do |_sub_type, hash___|
243
+ filter_hash(hash___, options[:audience]).each do |_audience, override|
244
+ overrides << override
245
+ end
246
+ end
247
+ end
248
+ end
249
+ end
250
+ end
251
+
252
+ def mode_selects(options = {})
253
+ options = {
254
+ block: nil,
255
+ mode: nil
256
+ }.update(options)
257
+ modes_found = Hash.new do|h, k|
258
+ h[k] = {}
259
+ end
260
+ _mode_selects.filter(options[:block]).each do |block, hash|
261
+ hash.filter(options[:mode]).each do |mode, sel|
262
+ modes_found[block][mode] = sel
263
+ end
264
+ end
265
+ if modes_found.empty?
266
+ return nil
267
+ elsif modes_found.size == 1
268
+ return modes_found.values.first.values.first
269
+ else
270
+ return modes_found
271
+ end
272
+ end
273
+
274
+ def power_supplies(options = {})
275
+ options = {
276
+ gen: nil,
277
+ act: nil
278
+ }.update(options)
279
+ ps_found = Hash.new do|h, k|
280
+ h[k] = {}
281
+ end
282
+ _power_supplies.filter(options[:gen]).each do |gen, hash|
283
+ hash.filter(options[:act]).each do |act, sel|
284
+ ps_found[gen][act] = sel
285
+ end
286
+ end
287
+ if ps_found.empty?
288
+ return nil
289
+ elsif ps_found.size == 1
290
+ return ps_found.values.first.values.first
291
+ else
292
+ return ps_found
293
+ end
294
+ end
295
+
296
+ def versions
297
+ @_version_history
298
+ end
299
+
300
+ def info
301
+ @_creation_info
302
+ end
303
+
304
+ # Delete all specs
305
+ def delete_all_specs
306
+ @_specs = nil
307
+ end
308
+
309
+ # Delete all notes
310
+ def delete_all_notes
311
+ @_notes = nil
312
+ end
313
+
314
+ # Delete all exhibits
315
+ def delete_all_exhibits
316
+ @_exhibits = nil
317
+ end
318
+
319
+ def delete_all_doc_resources
320
+ @_doc_resources = nil
321
+ end
322
+
323
+ def delete_all_overrides
324
+ @_overrides = nil
325
+ end
326
+
327
+ def delete_all_power_supplies
328
+ @_power_supplies = nil
329
+ end
330
+
331
+ def delete_all_version_history
332
+ @_version_history = nil
333
+ end
334
+
335
+ def delete_all_mode_selects
336
+ @_mode_selects = nil
337
+ end
338
+
339
+ def delete_creation_info
340
+ @_creation_info = nil
341
+ end
342
+
343
+ private
344
+
345
+ def _specs
346
+ # 4D hash with name, type, mode, and sub_type as keys
347
+ @_specs ||= Hash.new do |h, k|
348
+ h[k] = Hash.new do |hh, kk|
349
+ hh[kk] = Hash.new do |hhh, kkk|
350
+ hhh[kkk] = {}
351
+ end
352
+ end
353
+ end
354
+ end
355
+
356
+ # Two-dimensional hash with note id and type as the keys
357
+ def _notes
358
+ @_notes ||= Hash.new do |h, k|
359
+ h[k] = {}
360
+ end
361
+ end
362
+
363
+ def _exhibits
364
+ @_exhibits ||= Hash.new do |h, k|
365
+ h[k] = {}
366
+ end
367
+ end
368
+
369
+ def _doc_resources
370
+ @_doc_resources ||= Hash.new do |h, k|
371
+ h[k] = Hash.new do |hh, kk|
372
+ hh[kk] = Hash.new do |hhh, kkk|
373
+ hhh[kkk] = {}
374
+ end
375
+ end
376
+ end
377
+ end
378
+
379
+ def _overrides
380
+ @_overrides ||= Hash.new do |h, k|
381
+ h[k] = Hash.new do |hh, kk|
382
+ hh[kk] = Hash.new do |hhh, kkk|
383
+ hhh[kkk] = Hash.new do |hhhh, kkkk|
384
+ hhhh[kkkk] = {}
385
+ end
386
+ end
387
+ end
388
+ end
389
+ end
390
+
391
+ def _power_supplies
392
+ @_power_supplies ||= Hash.new do |h, k|
393
+ h[k] = {}
394
+ end
395
+ end
396
+
397
+ def _mode_selects
398
+ @_mode_selects ||= Hash.new do |h, k|
399
+ h[k] = {}
400
+ end
401
+ end
402
+
403
+ def _version_history
404
+ @_version_history ||= Hash.new do |h, k|
405
+ h[k] = {}
406
+ end
407
+ end
408
+
409
+ def _creation_info
410
+ @_creation_info = nil
411
+ end
412
+
413
+ # Return a hash based on the filter provided
414
+ def filter_hash(hash, filter)
415
+ fail 'Hash argument is not a Hash!' unless hash.is_a? Hash
416
+ filtered_hash = {}
417
+ select_logic = case filter
418
+ when String then 'k[Regexp.new(filter)]'
419
+ when (Fixnum || Integer || Float || Numeric) then "k[Regexp.new('#{filter}')]"
420
+ when Regexp then 'k[filter]'
421
+ when Symbol then
422
+ 'k == filter'
423
+ when NilClass then true # Return all specs if a filter is set to nil (i.e. user doesn't care about this filter)
424
+ else true
425
+ end
426
+ # rubocop:disable UnusedBlockArgument
427
+ filtered_hash = hash.select do |k, v|
428
+ [TrueClass, FalseClass].include?(select_logic.class) ? select_logic : eval(select_logic)
429
+ end
430
+ filtered_hash
431
+ end
432
+
433
+ # Filters the 4D hash to find specs for all user visible API
434
+ def show_specs(options = {})
435
+ options = {
436
+ mode: nil,
437
+ spec: nil,
438
+ type: nil,
439
+ sub_type: nil,
440
+ verbose: false,
441
+ specs_to_be_shown: [],
442
+ owner: nil,
443
+ creating_spec: false
444
+ }.update(options)
445
+ specs_to_be_shown = options[:specs_to_be_shown]
446
+ filter_hash(_specs, options[:spec]).each do |_spec, hash|
447
+ filter_hash(hash, options[:mode]).each do |_mode, hash_|
448
+ filter_hash(hash_, options[:type]).each do |_type, hash__|
449
+ filter_hash(hash__, options[:sub_type]).each do |_sub_type, spec|
450
+ specs_to_be_shown << spec
451
+ end
452
+ end
453
+ end
454
+ end
455
+ # If no specs were found must check the possibility another search
456
+ # should be started with mode set to :local or :global
457
+ if specs_to_be_shown.empty?
458
+ # Don't want to re-call this method if the callee is trying to create a spec and just wants to know
459
+ # if there is a spec with the exact same options
460
+ if options[:creating_spec] == false
461
+ # Doesn't make sense to recall the method however if the mode is already set to :global or :local
462
+ unless [:global, :local, nil].include?(options[:mode])
463
+ # Need to check if there are :global or :local specs that match the filter(s) as well
464
+ if self == Origen.top_level
465
+ options[:mode] = :global
466
+ else
467
+ options[:mode] = :local
468
+ end
469
+ options[:specs_to_be_shown] = specs_to_be_shown
470
+ Origen.log.debug "re-calling show_specs with options #{options}"
471
+ return show_specs(options)
472
+ end
473
+ end
474
+ Origen.log.debug "Returning no specs for options #{options}"
475
+ return nil
476
+ elsif specs_to_be_shown.size == 1
477
+ print_to_console(specs_to_be_shown) if options[:verbose] == true
478
+ Origen.log.debug "returning one spec #{specs_to_be_shown.first.name}"
479
+ return specs_to_be_shown.first
480
+ else
481
+ Origen.log.debug "returning an array of specs during initial search: #{specs_to_be_shown}"
482
+ print_to_console(specs_to_be_shown) if options[:verbose] == true
483
+ return specs_to_be_shown
484
+ end
485
+ end
486
+
487
+ # Method to print a spec table to the console
488
+ def print_to_console(specs_to_be_shown)
489
+ whitespace_padding = 3
490
+ table = []
491
+ attrs_to_be_shown = {
492
+ name: SpecTableAttr.new('Name', true, 'Name'.length + whitespace_padding),
493
+ symbol: SpecTableAttr.new('Symbol', false, 'Symbol'.length + whitespace_padding),
494
+ mode: SpecTableAttr.new('Mode', true, 'Mode'.length + whitespace_padding),
495
+ type: SpecTableAttr.new('Type', true, 'Type'.length + whitespace_padding),
496
+ sub_type: SpecTableAttr.new('Sub-Type', false, 'Sub-Type'.length + whitespace_padding),
497
+ # spec SpecTableAttribute :description is called parameter in the spec table output to match historical docs
498
+ description: SpecTableAttr.new('Parameter', false, 'Parameter'.length + whitespace_padding),
499
+ min: SpecTableAttr.new('Min', false, 'Min'.length + whitespace_padding),
500
+ typ: SpecTableAttr.new('Typ', false, 'Typ'.length + whitespace_padding),
501
+ max: SpecTableAttr.new('Max', false, 'Max'.length + whitespace_padding),
502
+ unit: SpecTableAttr.new('Unit', false, 'Unit'.length + whitespace_padding),
503
+ audience: SpecTableAttr.new('Audience', false, 'Audience'.length + whitespace_padding)
504
+ # notes: SpecTableAttr.new('Notes', false, 'Notes'.length + whitespace_padding)
505
+ }
506
+ # Calculate the padding needed in the spec table for the longest attr of all specs
507
+ specs_to_be_shown.each do |spec|
508
+ attrs_to_be_shown.each do |attr_name, attr_struct|
509
+ unless spec.send(attr_name).nil?
510
+ if spec.send(attr_name).class == Origen::Specs::Spec::Limit
511
+ next if spec.send(attr_name).value.nil?
512
+ current_padding = spec.send(attr_name).value.to_s.length + whitespace_padding
513
+ else
514
+ current_padding = spec.send(attr_name).to_s.length + whitespace_padding
515
+ end
516
+ attr_struct.padding = current_padding if attr_struct.padding < current_padding
517
+ attr_struct.show = true # We found real data for this attr on at least one spec so show it in the spec table
518
+ end
519
+ end
520
+ end
521
+ # Now that each spec attribute padding construct the spec table header
522
+ header = ''
523
+ attrs_to_be_shown.each do |_attr_name, attr_struct|
524
+ next if attr_struct.show == false
525
+ header += "| #{attr_struct.table_text}".ljust(attr_struct.padding)
526
+ end
527
+ header += '|'
528
+ ip_header = "| IP: #{specs_to_be_shown.first.ip_name} ".ljust(header.length - 1)
529
+ ip_header += '|'
530
+ table << '=' * header.length
531
+ table << ip_header
532
+ table << '=' * header.length
533
+ table << header
534
+ table << '-' * header.length
535
+ # Create the data lines in the spec table
536
+ specs_to_be_shown.each do |spec|
537
+ data = ''
538
+ attrs_to_be_shown.each do |attr_name, attr_struct|
539
+ next if attr_struct.show == false
540
+ if spec.send(attr_name).class == Origen::Specs::Spec::Limit
541
+ data += "| #{spec.send(attr_name).value}".ljust(attr_struct.padding)
542
+ else
543
+ data += "| #{spec.send(attr_name)}".ljust(attr_struct.padding)
544
+ end
545
+ end
546
+ table << data += '|'
547
+ end
548
+ table << '-' * header.length
549
+ puts table.flatten.join("\n")
550
+ end
551
+ end
552
+ end