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,15 @@
1
+ module Origen
2
+ module Tester
3
+ class J750
4
+ class Parser
5
+ class Timeset
6
+ attr_accessor :parser
7
+
8
+ def initialize(options = {})
9
+ @parser = options[:parser]
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
File without changes
@@ -0,0 +1,104 @@
1
+ module Origen
2
+ module Tester
3
+ class J750
4
+ class Parser
5
+ autoload :Flows, 'origen/tester/j750/parser/flows'
6
+ autoload :Flow, 'origen/tester/j750/parser/flow'
7
+ autoload :FlowLine, 'origen/tester/j750/parser/flow_line'
8
+ autoload :TestInstances, 'origen/tester/j750/parser/test_instances'
9
+ autoload :TestInstance, 'origen/tester/j750/parser/test_instance'
10
+ autoload :PatternSets, 'origen/tester/j750/parser/pattern_sets'
11
+ autoload :PatternSet, 'origen/tester/j750/parser/pattern_set'
12
+ autoload :DCSpecs, 'origen/tester/j750/parser/dc_specs'
13
+ autoload :DCSpec, 'origen/tester/j750/parser/dc_spec'
14
+ autoload :ACSpecs, 'origen/tester/j750/parser/ac_specs'
15
+ autoload :ACSpec, 'origen/tester/j750/parser/ac_spec'
16
+ autoload :Descriptions, 'origen/tester/j750/parser/descriptions'
17
+
18
+ def reset
19
+ @flows = nil
20
+ @test_instances = nil
21
+ @pattern_sets = nil
22
+ @dc_specs = nil
23
+ @ac_specs = nil
24
+ end
25
+
26
+ def descriptions
27
+ @descriptions ||= Descriptions.new(parser: self)
28
+ end
29
+
30
+ # Returns an array of test flows
31
+ def flows
32
+ @flows ||= Flows.new(parser: self)
33
+ end
34
+
35
+ def test_instances
36
+ @test_instances ||= TestInstances.new(parser: self)
37
+ end
38
+ alias_method :instances, :test_instances
39
+
40
+ def pattern_sets
41
+ @pattern_sets ||= PatternSets.new(parser: self)
42
+ end
43
+ alias_method :patsets, :pattern_sets
44
+ alias_method :pat_sets, :pattern_sets
45
+
46
+ def dc_specs
47
+ @dc_specs ||= DCSpecs.new(parser: self)
48
+ end
49
+
50
+ def ac_specs
51
+ @ac_specs ||= ACSpecs.new(parser: self)
52
+ end
53
+
54
+ def inspect
55
+ "<Parsed Program: Flows: #{flows.size}>"
56
+ end
57
+
58
+ # Parse a file, array of files, or a directory.
59
+ #
60
+ # This can be called multiple times to add new files to the
61
+ # program model.
62
+ def parse(file)
63
+ Origen.log.info ''
64
+ Origen.log.info "Parsing J750 test program from: #{file}"
65
+ Origen.log.info ''
66
+ reset
67
+ # Note use of local file handler here, this should be how it is
68
+ # done globally, otherwise we can run into hard to debug problems
69
+ # due to state/reference dir changes in the single Origen.file_handler
70
+ Origen::FileHandler.new.resolve_files(file) do |f|
71
+ parse_file(f)
72
+ end
73
+ Origen.log.info ''
74
+ self
75
+ end
76
+
77
+ def parse_file(file)
78
+ line = File.readlines(file).first
79
+ begin
80
+ if line =~ /Flow Table/
81
+ flows.import(file)
82
+ elsif line =~ /Instances/
83
+ test_instances.import(file)
84
+ elsif line =~ /Pattern Sets/
85
+ patsets.import(file)
86
+ elsif line =~ /DC Spec/
87
+ dc_specs.import(file)
88
+ else
89
+ puts "Skipped (un-supported file type): #{file}"
90
+ end
91
+ rescue Exception => e
92
+ if e.is_a?(ArgumentError) && e.message =~ /invalid byte sequence/
93
+ puts "Skipped (not ASCII): #{file}"
94
+ else
95
+ puts e.message
96
+ puts e.backtrace
97
+ exit 1
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,33 @@
1
+ module Origen
2
+ module Tester
3
+ class JLink < CommandBasedTester
4
+ def initialize
5
+ super
6
+ # The minimum time unit is 1ms
7
+ set_timeset('default', 1_000_000)
8
+ @pat_extension = 'jlk'
9
+ @comment_char = '//'
10
+ end
11
+
12
+ def delay(cycles)
13
+ microcode "Sleep #{cycles_to_ms(cycles)}"
14
+ end
15
+
16
+ def write_byte(address, data)
17
+ microcode "w1 0x#{address.to_s(16).upcase}, 0x#{data.to_s(16).upcase}"
18
+ end
19
+
20
+ def write_word(address, data)
21
+ microcode "w2 0x#{address.to_s(16).upcase}, 0x#{data.to_s(16).upcase}"
22
+ end
23
+
24
+ def write_longword(address, data)
25
+ microcode "w4 0x#{address.to_s(16).upcase}, 0x#{data.to_s(16).upcase}"
26
+ end
27
+
28
+ def read(address, number_of_regs = 1)
29
+ microcode "mem 0x#{address.to_s(16)}, #{number_of_regs}"
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,64 @@
1
+ module Origen
2
+ module Tester
3
+ module Parser
4
+ class DescriptionLookup
5
+ def initialize
6
+ @store = { flow: {}, test: {}, usage: {} }
7
+ end
8
+
9
+ def for_flow(name, _options = {})
10
+ k = flow_key(name)
11
+ @store[:flow][k] || []
12
+ end
13
+
14
+ def for_test_definition(name, _options = {})
15
+ n = name_key(name)
16
+ @store[:test][n] || []
17
+ end
18
+
19
+ def for_test_usage(name, flow, _options = {})
20
+ k = flow_key(flow)
21
+ n = name_key(name)
22
+ @store[:usage][k] ||= {}
23
+ @store[:usage][k][n] || []
24
+ end
25
+
26
+ def add_for_flow(flow, description, _options = {})
27
+ k = flow_key(flow)
28
+ @store[:flow][k] ||= []
29
+ [description].flatten.each do |d|
30
+ @store[:flow][k] << d
31
+ end
32
+ end
33
+
34
+ def add_for_test_definition(test, description, _option = {})
35
+ n = name_key(test)
36
+ @store[:test][n] ||= []
37
+ [description].flatten.each do |d|
38
+ @store[:test][n] << d
39
+ end
40
+ end
41
+
42
+ def add_for_test_usage(test, flow, description, _option = {})
43
+ k = flow_key(flow)
44
+ n = name_key(test)
45
+ @store[:usage][k] ||= {}
46
+ @store[:usage][k][n] ||= []
47
+ [description].flatten.each do |d|
48
+ @store[:usage][k][n] << d
49
+ end
50
+ end
51
+
52
+ private
53
+
54
+ def flow_key(flow)
55
+ Pathname.new(flow).basename('.*').to_s
56
+ end
57
+
58
+ def name_key(name)
59
+ name.to_s.downcase
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,32 @@
1
+ module Origen
2
+ module Tester
3
+ module Parser
4
+ class SearchableArray < ::Array
5
+ def where(conditions)
6
+ exact = conditions.delete(:exact)
7
+ results = SearchableArray.new
8
+ each do |item|
9
+ if conditions.all? do |attr, val|
10
+ if val.is_a?(Array)
11
+ if exact
12
+ val.any? { |v| item.send(attr).to_s == v.to_s }
13
+ else
14
+ val.any? { |v| item.send(attr).to_s =~ /#{v.to_s}/ }
15
+ end
16
+ else
17
+ if exact
18
+ item.send(attr).to_s == val.to_s
19
+ else
20
+ item.send(attr).to_s =~ /#{val.to_s}/
21
+ end
22
+ end
23
+ end
24
+ results << item
25
+ end
26
+ end
27
+ results
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,32 @@
1
+ module Origen
2
+ module Tester
3
+ module Parser
4
+ class SearchableHash < ::Hash
5
+ def where(conditions)
6
+ exact = conditions.delete(:exact)
7
+ results = SearchableArray.new
8
+ each do |_key, item|
9
+ if conditions.all? do |attr, val|
10
+ if val.is_a?(Array)
11
+ if exact
12
+ val.any? { |v| item.send(attr).to_s == v.to_s }
13
+ else
14
+ val.any? { |v| item.send(attr).to_s =~ /#{v.to_s}/ }
15
+ end
16
+ else
17
+ if exact
18
+ item.send(attr).to_s == val.to_s
19
+ else
20
+ item.send(attr).to_s =~ /#{val.to_s}/
21
+ end
22
+ end
23
+ end
24
+ results << item
25
+ end
26
+ end
27
+ results
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,24 @@
1
+ module Origen
2
+ module Tester
3
+ module Parser
4
+ autoload :SearchableArray, 'origen/tester/parser/searchable_array'
5
+ autoload :SearchableHash, 'origen/tester/parser/searchable_hash'
6
+ autoload :DescriptionLookup, 'origen/tester/parser/description_lookup'
7
+
8
+ def parse(*args, &block)
9
+ parser.parse(*args, &block)
10
+ end
11
+
12
+ # Returns a SearchableArray containing all tests parsed from flows, this is intended to
13
+ # be the main API for accessing parsed test program attributes and should be a consistent
14
+ # method that is implemented accross all tester models.
15
+ #
16
+ # Direct access to the underlying structure (which will be specific to the tester model)
17
+ # can be achieved through the parser method, which returns an instance of J750::Parser
18
+ # $tester.parser.test_instances
19
+ def tests
20
+ parser.flow_items
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,338 @@
1
+ module Origen
2
+ module Tester
3
+ # Class for handling test time analysis - implements the functionality
4
+ # exposed via the 'origen time' command
5
+ class Time
6
+ require 'yaml'
7
+
8
+ TT_LIB_DIR = "#{Origen.root}/config/test_time/lib"
9
+ TT_FLOW_DIR = "#{Origen.root}/config/test_time/flow"
10
+ DEFAULT_LIBRARY = "#{TT_LIB_DIR}/default.yaml"
11
+ DEFAULT_FLOW = "#{TT_FLOW_DIR}/default.yaml"
12
+
13
+ # If any new embedded hashes are added to this a default of {} must also be added
14
+ # to the sanitize method
15
+ TEST_META_DATA = { 'rule' => nil,
16
+ 'reference' => { 'rule_result' => nil,
17
+ 'time' => nil,
18
+ 'target' => nil
19
+ }
20
+ }
21
+
22
+ def stats
23
+ @stats ||= { imported: 0, rules_assigned: 0, reference_rules_evaluated: 0 }
24
+ end
25
+
26
+ def clear_stats
27
+ @stats = nil
28
+ end
29
+
30
+ # Import a flow, this can be from either a datalog or an execution time
31
+ def import_test_flow(file, options = {})
32
+ clear_stats
33
+ @options = options
34
+ if Origen.tester.respond_to?('read_test_times')
35
+ tests = Origen.tester.read_test_times(file, options)
36
+ flow = []
37
+ merge_indexed_tests(tests) do |name, _attrs|
38
+ if import?(name)
39
+ Origen.log.info "imported... #{name}"
40
+ flow << name
41
+ end
42
+ end
43
+ puts ''
44
+ puts 'Import complete!'
45
+ puts ''
46
+ export_flow(flow, options)
47
+ else
48
+ error 'Sorry, no test time import method is defined for the current tester'
49
+ end
50
+ end
51
+
52
+ def import_test_time(file, options = {})
53
+ clear_stats
54
+ @options = options
55
+ if Origen.tester.respond_to?('read_test_times')
56
+ tests = Origen.tester.read_test_times(file, options)
57
+ total = extract_total_time(tests)
58
+ flow = []
59
+ library = {}
60
+ imported = 0.0
61
+ merge_indexed_tests(tests) do |name, attrs|
62
+ attrs = sanitize(attrs)
63
+
64
+ if import?(name)
65
+ Origen.log.info "importing... #{name}"
66
+ flow << name
67
+ if library[name]
68
+ library[name] = merge(library[name], attrs)
69
+ else
70
+ library[name] = populate(name, attrs)
71
+ stats[:imported] += 1
72
+ end
73
+ imported += attrs['reference']['time']
74
+ # puts name
75
+ end
76
+ end
77
+ puts ''
78
+ puts 'Import complete!'
79
+ puts ''
80
+ puts 'Some stats...'
81
+ puts ''
82
+ puts "Tests imported: #{stats[:imported]}"
83
+ puts "Rules assigned: #{stats[:rules_assigned]}"
84
+ puts "Ref rules calculated: #{stats[:reference_rules_evaluated]}"
85
+ puts ''
86
+ puts 'Total time: ' + total.round(6).to_s + 's'
87
+ puts 'Total filtered time: ' + imported.round(6).to_s + 's'
88
+ if stats[:imported] == stats[:rules_assigned]
89
+ puts 'Forecasted: ' + calculate_time(flow, library, options.merge(silent: true)).to_s + 's'
90
+ else
91
+ puts 'Forecasted: SOME TESTS HAVE NO RULES ASSIGNED!'
92
+ end
93
+ puts ''
94
+ export_library(library, options)
95
+ else
96
+ error 'Sorry, no test time import method is defined for the current tester'
97
+ end
98
+ end
99
+
100
+ def forecast_test_time(options = {})
101
+ clear_stats
102
+ @options = options
103
+ time = 0.0
104
+ flow = import_flow(input_flow_file(options))
105
+ library = import_library(input_library_file(options))['tests']
106
+ calculate_time(flow, library, options)
107
+ end
108
+
109
+ def output_library_file(options = {})
110
+ if options[:ref_name]
111
+ "#{TT_LIB_DIR}/#{options[:ref_name]}.yaml"
112
+ else
113
+ DEFAULT_LIBRARY
114
+ end
115
+ end
116
+
117
+ def input_library_file(options = {})
118
+ output_library_file(options)
119
+ end
120
+
121
+ def output_flow_file(options = {})
122
+ if options[:ref_name]
123
+ "#{TT_FLOW_DIR}/#{options[:ref_name]}.yaml"
124
+ else
125
+ DEFAULT_FLOW
126
+ end
127
+ end
128
+
129
+ def input_flow_file(options = {})
130
+ output_flow_file(options)
131
+ end
132
+
133
+ # Force the imported test data from the tester into a YAML compliant form
134
+ def sanitize(attrs)
135
+ # Force all keys to strings...
136
+ attrs.keys.each do |key|
137
+ begin
138
+ attrs[key.to_s] = attrs.delete(key)
139
+ rescue
140
+ # No problem
141
+ end
142
+ end
143
+ attrs['reference'] ||= {}
144
+ # attrs["opportunity"] ||= {}
145
+ if attrs['time']
146
+ attrs['reference']['time'] = attrs.delete('time')
147
+ end
148
+ deep_merge(TEST_META_DATA, attrs)
149
+ end
150
+
151
+ # Populate the attributes based on user specified rules
152
+ def populate(name, attrs, options = {})
153
+ if rules
154
+ r = rules.assign(name, attrs, options)
155
+ if r
156
+ stats[:rules_assigned] += 1
157
+ attrs['rule'] = r
158
+ else
159
+ warn "No rule assigned to: #{name}"
160
+ attrs.delete('rule')
161
+ end
162
+ r = rules.evaluate(name, attrs, options)
163
+ if r
164
+ stats[:reference_rules_evaluated] += 1
165
+ attrs['reference']['rule_result'] = r
166
+ else
167
+ warn "No reference rule result assigned to: #{name}"
168
+ attrs['reference'].delete('rule_result')
169
+ end
170
+ end
171
+ attrs['reference']['target'] = Origen.target.name
172
+ attrs
173
+ end
174
+
175
+ def export_library(lib, options = {})
176
+ tests = {}
177
+ lib.each do |name, attrs|
178
+ tests[name] = attrs
179
+ end
180
+ Origen.file_handler.open_for_write(output_library_file(options)) do |f|
181
+ f.puts YAML.dump('tests' => tests)
182
+ end
183
+ puts "Test library exported to: #{Origen.file_handler.relative_path_to(output_library_file(options))}"
184
+ end
185
+
186
+ def import_library(lib, _options = {})
187
+ YAML.load(File.open(lib))
188
+ end
189
+
190
+ def export_flow(flow, options = {})
191
+ Origen.file_handler.open_for_write(output_flow_file(options)) do |f|
192
+ f.puts YAML.dump(flow)
193
+ end
194
+ puts "Test flow exported to: #{Origen.file_handler.relative_path_to(output_flow_file(options))}"
195
+ end
196
+
197
+ def import_flow(flow, _options = {})
198
+ YAML.load(File.open(flow))
199
+ end
200
+
201
+ # Deep merge two hashes, the first one should be the defaults, the second one will override any
202
+ # items from the defaults
203
+ def deep_merge(hash1, hash2)
204
+ hash1.merge(hash2) do |_key, oldval, newval|
205
+ oldval = oldval.to_hash if oldval.respond_to?(:to_hash)
206
+ newval = newval.to_hash if newval.respond_to?(:to_hash)
207
+ oldval.class.to_s == 'Hash' && newval.class.to_s == 'Hash' ? deep_merge(oldval, newval) : newval
208
+ end
209
+ end
210
+
211
+ # Merge two sets of attributes for the same test, generally this means that the time will
212
+ # be averaged and all other attributes will remain the same
213
+ def merge(t1, t2)
214
+ t1['reference']['time'] = (t1['reference']['time'] + t2['reference']['time']) / 2
215
+ t1
216
+ end
217
+
218
+ # Calculate the time for the given flow, using times from the given library
219
+ def calculate_time(flow, library, options = {})
220
+ options = {
221
+ silent: false,
222
+ summary: false
223
+ }.merge(options)
224
+ unless options[:silent] || options[:summary]
225
+ Origen.log.info 'Test'.ljust(60) + 'Rule'.ljust(40) +
226
+ library.first[1]['reference']['target'].ljust(30) + Origen.target.name
227
+ orig = 0
228
+ end
229
+ forecasted = flow.reduce(0.0) do |sum, test|
230
+ if library[test]['include'] == false || library[test]['exclude'] == true
231
+ sum
232
+ else
233
+ orig += library[test]['reference']['time'] unless options[:silent] || options[:summary]
234
+ forecast = rules.forecast(test, library[test], options)
235
+ unless options[:silent] || options[:summary]
236
+ Origen.log.info test.ljust(60) + library[test]['rule'].to_s.ljust(40) +
237
+ "#{library[test]['reference']['time'].round(6)}".ljust(30) +
238
+ "#{forecast.round(6)}"
239
+ end
240
+ sum + forecast
241
+ end
242
+ end
243
+ if options[:silent]
244
+ forecasted.round(6)
245
+ elsif options[:summary]
246
+ Origen.log.info Origen.target.name.ljust(50) + "#{forecasted.round(6)}"
247
+ else
248
+ Origen.log.info ''
249
+ Origen.log.info ''.ljust(100) + '---------------'.ljust(30) + '---------------'
250
+ Origen.log.info ''.ljust(100) + "#{orig.round(6)}".ljust(30) + "#{forecasted.round(6)}"
251
+ Origen.log.info ''.ljust(100) + '---------------'.ljust(30) + '==============='
252
+ Origen.log.info ''
253
+ end
254
+ end
255
+
256
+ def extract_total_time(tests)
257
+ tests.reduce(0.0) { |sum, test| sum + test[:time] }
258
+ end
259
+
260
+ # This combines the test time from indexed tests and removes the :index and :group keys from all tests.
261
+ #
262
+ # If it is an indexed test then a single hash will be returned containing the total time and the key:
263
+ # {:indexed => true}.
264
+ def merge_indexed_tests(tests)
265
+ ix_counter = false
266
+ ix_group = false
267
+ ix_test = false
268
+ ix_total = false
269
+
270
+ tests.each do |t|
271
+ i = t.delete(:index)
272
+ g = t.delete(:group)
273
+ process = true
274
+ if ix_counter
275
+ if ix_test == t[:name]
276
+ process = false
277
+ warning "Incomplete index data from test: #{ix_test}" if i != ix_counter + 1
278
+ ix_counter = i
279
+ ix_total += t[:time]
280
+ # If the last test in the index
281
+ if i == ix_group
282
+ yield(ix_test, { time: ix_total, indexed: true })
283
+ ix_counter = false
284
+ end
285
+ else
286
+ warning "Incomplete index data from test: #{ix_test}"
287
+ yield(ix_test, { time: ix_total, indexed: true })
288
+ ix_counter = false
289
+ end
290
+ end
291
+ # Don't combine this with the above via an else, it is required to be separate to generate the
292
+ # next entry in the case where an index group was incomplete
293
+ if process
294
+ if i
295
+ # Ignore tests with an invalid index and a very short time, these occur from tests which
296
+ # are in the flow, but have not been executed in this run
297
+ unless i != 1 && t[:time] < 0.0001
298
+ ix_counter = i
299
+ ix_group = g
300
+ ix_test = t[:name]
301
+ ix_total = t[:time]
302
+ warning "Incomplete index data from test: #{t[:name]}" if ix_counter != 1
303
+ end
304
+ else
305
+ yield t.delete(:name), t
306
+ end
307
+ end
308
+ end
309
+ end
310
+
311
+ def import?(test)
312
+ if filter
313
+ filter.import?(test)
314
+ else
315
+ true
316
+ end
317
+ end
318
+
319
+ def filter
320
+ return @filter if defined?(@filter)
321
+ if defined?(TestTimeFilter)
322
+ @filter = TestTimeFilter.new
323
+ else
324
+ @filter = false
325
+ end
326
+ end
327
+
328
+ def rules
329
+ return @rules if defined?(@rules)
330
+ if defined?(TestTimeRules)
331
+ @rules = TestTimeRules.new
332
+ else
333
+ @rules = false
334
+ end
335
+ end
336
+ end
337
+ end
338
+ end