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,342 @@
1
+ module Origen
2
+ module Tester
3
+ class Ultraflex
4
+ class Parser
5
+ # Extracts embedded test and flow descriptions (comments) from test
6
+ # program source files
7
+ class Descriptions
8
+ require 'fileutils'
9
+
10
+ attr_accessor :source_directories, :template_directories, :parser
11
+
12
+ SCRATCH_DIR = "#{Origen.root}/.j750_scratch"
13
+
14
+ # All descriptions are stored in this lookup table
15
+ def lookup
16
+ return @lookup if @lookup
17
+ # Use the one from the interface if present, program generation will
18
+ # automatically push descriptions in here
19
+ if Origen.interface_present?
20
+ @lookup = Origen.interface.descriptions
21
+ else
22
+ @lookup = Origen::Tester::Parser::DescriptionLookup.new
23
+ end
24
+ end
25
+
26
+ def initialize(options = {})
27
+ @parser = options[:parser]
28
+ FileUtils.rm_rf(SCRATCH_DIR) if File.exist?(SCRATCH_DIR)
29
+ parse_program
30
+ true
31
+ end
32
+
33
+ # Returns the description for the given flow
34
+ def flow_summary(options = {})
35
+ lookup.for_flow(options[:file])
36
+ end
37
+
38
+ # Returns the description of the given test from the test
39
+ # instance sheet declaration
40
+ def test_instance(options = {})
41
+ lookup.for_test_definition(options[:name])
42
+ end
43
+
44
+ # Returns the description of the given test from the test
45
+ # flow
46
+ def flow_line(options = {})
47
+ lookup.for_test_usage(options[:name], options[:flow])
48
+ end
49
+
50
+ def parse_program
51
+ Origen.file_handler.preserve_state do
52
+ generate_program_files
53
+ # Comments must be extracted manually for any compiled files, for
54
+ # generated files the comments will already be in the lookup
55
+ extract_flow_summaries
56
+ extract_test_instance_descriptions
57
+ extract_flow_line_descriptions
58
+ end
59
+ end
60
+
61
+ def source_directories
62
+ [@source_directories, Origen.config.test_program_source_directory].compact.flatten
63
+ end
64
+
65
+ def template_directories
66
+ [@template_directories, Origen.config.test_program_template_directory].compact.flatten
67
+ end
68
+
69
+ def extract_flow_summaries
70
+ Origen.file_handler.resolve_files(compiled_dir) do |file|
71
+ if flow_file?(file)
72
+ lookup.add_for_flow(file, parse_flow_summary(file))
73
+ end
74
+ end
75
+ end
76
+
77
+ # Parses a compiled template for marked up comments
78
+ def extract_test_instance_descriptions
79
+ Origen.file_handler.resolve_files(compiled_dir) do |file|
80
+ if instance_file?(file)
81
+ comments = []
82
+ File.readlines(file).each do |line|
83
+ if line =~ /^<comment>(.*)/
84
+ comments << Regexp.last_match[1].gsub("\r", '')
85
+ else
86
+ fields = line.split("\t")
87
+ unless ['Test Instances', '', 'Test Name'].include? fields[1]
88
+ lookup.add_for_test_definition(fields[1], comments)
89
+ end
90
+ comments = []
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
96
+
97
+ def extract_flow_line_descriptions
98
+ Origen.file_handler.resolve_files(compiled_dir) do |file|
99
+ if flow_file?(file)
100
+ f = file.basename('.txt').to_s
101
+ comments = []
102
+ header_line = true
103
+ File.readlines(file).each do |line|
104
+ if header_line
105
+ header_line = false if line =~ /^\s*Label/
106
+ else
107
+ if line =~ /^<comment>(.*)/
108
+ comments << Regexp.last_match[1].gsub("\r", '')
109
+ else
110
+ t = FlowLine.extract_test(line)
111
+ if t
112
+ lookup.add_for_test_usage(t, file, comments)
113
+ end
114
+ comments = []
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
120
+ end
121
+
122
+ def generate_program_files
123
+ a = generate_program
124
+ b = compile_program
125
+ unless a || b
126
+ fail 'No source or template files declared from which to parse descriptions!'
127
+ end
128
+ end
129
+
130
+ # Parses the given flow file for summary text and returns it, summary
131
+ # text must be the very first thing in the file.
132
+ # Returns an array of strings each representing a line of text.
133
+ def parse_flow_summary(file)
134
+ desc = []
135
+ File.readlines(file).each do |line|
136
+ if line =~ /%?\s*<comment>(.*)/
137
+ desc << Regexp.last_match[1].gsub("\r", '')
138
+ else
139
+ break
140
+ end
141
+ end
142
+ desc
143
+ end
144
+
145
+ # Generate a scratch version of the program for parsing
146
+ def generate_program
147
+ if source_directories.size > 0
148
+ unless @program_generated
149
+ Origen.log.info ''
150
+ Origen.log.info 'Extracting embedded comments:'
151
+ Origen.log.info ''
152
+ copy_source_files_to_scratch
153
+ markup_source_file_comments
154
+ # Compile the flow file, with Ruby comments now preserved and marked up
155
+ desc = Origen.app.runner.generate(program: true, patterns: ungenerated_dir, output: generated_dir,
156
+ check_for_changes: false, collect_stats: false, quiet: true,
157
+ collect_descriptions: true)
158
+ Origen.log.info ''
159
+ end
160
+ @program_generated = true
161
+ else
162
+ false
163
+ end
164
+ end
165
+
166
+ # Compile a scratch version of the program for parsing
167
+ def compile_program
168
+ if template_directories.size > 0
169
+ unless @program_compiled
170
+ Origen.log.info ''
171
+ Origen.log.info 'Extracting embedded comments:'
172
+ Origen.log.info ''
173
+ copy_templates_to_scratch
174
+ markup_template_comments
175
+ # Compile the flow file, with Ruby comments now preserved and marked up
176
+ Origen.app.runner.generate(compile: true, patterns: uncompiled_dir, output: compiled_dir,
177
+ check_for_changes: false, collect_stats: false, quiet: true)
178
+ Origen.log.info ''
179
+ end
180
+ @program_compiled = true
181
+ else
182
+ false
183
+ end
184
+ end
185
+
186
+ # Copy all flow and instance template files to the scratch dir
187
+ def copy_templates_to_scratch
188
+ uncompiled_dir(true)
189
+ template_directories.each do |dir|
190
+ Origen.file_handler.resolve_files(dir) do |file|
191
+ subdir = file.relative_path_from(Pathname.new(dir)).dirname.to_s
192
+ cpydir = "#{uncompiled_dir}/#{subdir}"
193
+ FileUtils.mkdir_p(cpydir) unless File.exist?(cpydir)
194
+ FileUtils.copy(file, cpydir) if flow_or_instance_file?(file)
195
+ end
196
+ end
197
+ `chmod -R 777 #{uncompiled_dir}/*` unless Dir["#{uncompiled_dir}/*"].empty?
198
+ end
199
+
200
+ # Copy all flow and instance source files to the scratch dir
201
+ def copy_source_files_to_scratch
202
+ source_directories.each do |dir|
203
+ Origen.file_handler.resolve_files(dir) do |file|
204
+ subdir = file.relative_path_from(Pathname.new(dir)).dirname.to_s
205
+ cpydir = "#{ungenerated_dir}/#{subdir}"
206
+ FileUtils.mkdir_p(cpydir) unless File.exist?(cpydir)
207
+ FileUtils.copy(file, cpydir)
208
+ end
209
+ end
210
+ end
211
+
212
+ def uncompiled_dir(force_make = false)
213
+ @uncompiled_dir ||= "#{SCRATCH_DIR}/uncompiled"
214
+ if force_make
215
+ FileUtils.rm_rf(@uncompiled_dir) if File.exist?(@uncompiled_dir)
216
+ @uncompiled_dir_created = false
217
+ end
218
+ unless @uncompiled_dir_created
219
+ FileUtils.mkdir_p(@uncompiled_dir) unless File.exist?(@uncompiled_dir)
220
+ @uncompiled_dir_created = true
221
+ end
222
+ @uncompiled_dir
223
+ end
224
+
225
+ def ungenerated_dir
226
+ @ungenerated_dir ||= "#{SCRATCH_DIR}/ungenerated"
227
+ unless @ungenerated_dir_created
228
+ FileUtils.mkdir_p(@ungenerated_dir) unless File.exist?(@ungenerated_dir)
229
+ @ungenerated_dir_created = true
230
+ end
231
+ @ungenerated_dir
232
+ end
233
+
234
+ def compiled_dir
235
+ @compiled_dir ||= "#{SCRATCH_DIR}/compiled"
236
+ unless @compiled_dir_created
237
+ FileUtils.mkdir_p(@compiled_dir) unless File.exist?(@compiled_dir)
238
+ @compiled_dir_created = true
239
+ end
240
+ @compiled_dir
241
+ end
242
+
243
+ def generated_dir
244
+ @generated_dir ||= "#{SCRATCH_DIR}/generated"
245
+ unless @generated_dir_created
246
+ FileUtils.mkdir_p(@generated_dir) unless File.exist?(@generated_dir)
247
+ @generated_dir_created = true
248
+ end
249
+ @generated_dir
250
+ end
251
+
252
+ # Returns true if the given file looks like a Ultraflex flow file, works for
253
+ # templates to
254
+ def flow_or_instance_file?(file, options = {})
255
+ options = { flow: true,
256
+ instance: true
257
+ }.merge(options)
258
+ if options[:flow] && options[:instance]
259
+ match = 'Flow|Instances'
260
+ elsif options[:flow]
261
+ match = 'Flow'
262
+ else
263
+ match = 'Instances'
264
+ end
265
+ # Not sure the best way to determine the file type of a partial, just
266
+ # return true for now to play it safe
267
+ return true if file.basename.to_s =~ /^_/
268
+ File.readlines(file).each do |line|
269
+ begin
270
+ unless line =~ /^%/ || line =~ /^\s*<comment>/
271
+ return !!(line =~ /#{match}/)
272
+ end
273
+ rescue Exception => e
274
+ if e.is_a?(ArgumentError) && e.message =~ /invalid byte sequence/
275
+ return false
276
+ else
277
+ puts e.message
278
+ puts e.backtrace
279
+ exit 1
280
+ end
281
+ end
282
+ end
283
+ end
284
+
285
+ def flow_file?(file)
286
+ flow_or_instance_file?(file, instance: false)
287
+ end
288
+
289
+ def instance_file?(file)
290
+ flow_or_instance_file?(file, flow: false)
291
+ end
292
+
293
+ # Substitute Ruby line comments so they are preserved by compilation
294
+ def markup_template_comments
295
+ Origen.file_handler.resolve_files(uncompiled_dir) do |file|
296
+ lines = File.readlines(file)
297
+ File.open(file, 'w') do |f|
298
+ lines.each do |line|
299
+ if line =~ /^%\s*#\s?(.*)/ # Remove single leading whitespace from comment if it exists
300
+ comment = Regexp.last_match[1]
301
+ # If comment starts with a '#-' it should be removed by compilation
302
+ if line =~ /^%\s*#-.*/
303
+ f.write line
304
+ # Otherwise preserve it
305
+ else
306
+ f.write "<comment>#{comment}\n"
307
+ end
308
+ else
309
+ f.write line
310
+ end
311
+ end
312
+ end
313
+ end
314
+ end
315
+
316
+ # Substitute Ruby line comments so they are preserved by generation
317
+ def markup_source_file_comments
318
+ Origen.file_handler.resolve_files(ungenerated_dir) do |file|
319
+ lines = File.readlines(file)
320
+ File.open(file, 'w') do |f|
321
+ lines.each do |line|
322
+ if line =~ /^\s*#\s?(.*)/ # Remove single leading whitespace from comment if it exists
323
+ comment = Regexp.last_match[1]
324
+ # If comment starts with a '#-' it should be removed by generation
325
+ if line =~ /^\s*#-.*/
326
+ f.write line
327
+ # Otherwise preserve it
328
+ else
329
+ f.write "Origen.interface.comment '#{comment}'\n"
330
+ end
331
+ else
332
+ f.write line
333
+ end
334
+ end
335
+ end
336
+ end
337
+ end
338
+ end
339
+ end
340
+ end
341
+ end
342
+ end
@@ -0,0 +1,111 @@
1
+ module Origen
2
+ module Tester
3
+ class Ultraflex
4
+ class Parser
5
+ class Flow < Origen::Tester::Parser::SearchableArray
6
+ require 'pathname'
7
+
8
+ attr_accessor :parser, :file
9
+
10
+ def initialize(file, options = {}) # :nodoc:
11
+ @parser = options[:parser]
12
+ @file = Pathname.new(file)
13
+ parse
14
+ end
15
+
16
+ def description
17
+ @parser.descriptions.flow_summary(file: file)
18
+ end
19
+ alias_method :summary, :description
20
+
21
+ # Returns the filename of the sheet that contained the current flow
22
+ def filename
23
+ @file.basename.to_s
24
+ end
25
+ alias_method :name, :filename
26
+
27
+ # Returns all flow lines that are tests, optionally supply a context to
28
+ # have only the test that will execute in that context returned
29
+ #
30
+ # $tester.flow.first.tests.size
31
+ # => 20
32
+ # $tester.flow.first.tests(:job => "P1").size
33
+ # => 10
34
+ # $tester.flow.first.tests(:job => "P1", :enable => "data_collection").size
35
+ # => 15
36
+ def tests(context = {})
37
+ run_context(context)
38
+ end
39
+
40
+ # Returns all tests in the current flow, regardless of context
41
+ def all_tests
42
+ where(opcode: %w(Test characterize), exact: true)
43
+ end
44
+
45
+ def run_context(context) # :nodoc:
46
+ capture = true
47
+ waiting_for_label = false
48
+ select do |line|
49
+ if capture
50
+ if !waiting_for_label || waiting_for_label == line.label
51
+ waiting_for_label = false
52
+ case line.type
53
+ when 'Test', 'characterize'
54
+ line.executes_under_context?(context)
55
+ when 'set-device', 'stop'
56
+ capture = false if line.executes_under_context?(context)
57
+ false
58
+ when 'enable-flow-word'
59
+ if line.executes_under_context?(context)
60
+ context[:enable] = [context[:enable]].flatten
61
+ context[:enable] << line.parameter
62
+ end
63
+ false
64
+ when 'flag-true'
65
+ if line.executes_under_context?(context)
66
+ context[:true_flags] = [context[:true_flags]].flatten
67
+ context[:true_flags] << line.parameter
68
+ end
69
+ false
70
+ when 'flag-false'
71
+ if line.executes_under_context?(context)
72
+ context[:false_flags] = [context[:false_flags]].flatten
73
+ context[:false_flags] << line.parameter
74
+ end
75
+ false
76
+ when 'disable-flow-word'
77
+ if line.executes_under_context?(context)
78
+ context[:enable] = [context[:enable]].flatten
79
+ context[:enable].delete(line.parameter)
80
+ end
81
+ false
82
+ when 'logprint', 'nop', 'print'
83
+ false
84
+ when 'goto'
85
+ waiting_for_label = line.parameter
86
+ false
87
+ else
88
+ fail "Don't know how to process: #{line.type}, in file #{filename}"
89
+ end
90
+ else
91
+ false
92
+ end
93
+ end
94
+ end
95
+ end
96
+
97
+ def parse # :nodoc:
98
+ File.readlines(@file).each do |line|
99
+ l = FlowLine.new(line, parser: parser, flow: self)
100
+ self << l if l.valid?
101
+ end
102
+ end
103
+
104
+ def inspect # :nodoc:
105
+ "<TestFlow: #{filename}, Lines: #{size}>"
106
+ end
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,207 @@
1
+ module Origen
2
+ module Tester
3
+ class Ultraflex
4
+ class Parser
5
+ class FlowLine
6
+ attr_accessor :parser, :flow, :line
7
+
8
+ TYPES = %w(
9
+ Test characterize defaults enable-flow-word disable-flow-word error-print goto
10
+ goto-on-all-done goto-on-all-lastfail goto-on-all-lastfaildoall logprint modify
11
+ nop print reset set-device set-device-new set-error-bin set-retest-bin skip
12
+ stop assign-integer create-integer delete-integer create-site-var assign-site-var
13
+ flag-clear flag-clear-all flag-false flag-false-all flag-true flag-true-all
14
+ state-clear-all state-false-all state-true-all
15
+ )
16
+
17
+ ATTRS = %w(
18
+ label enable job part env opcode parameter
19
+ tname tnum bin_pass bin_fail sort_pass sort_fail result flag_pass
20
+ flag_fail state group_specifier group_sense group_condition group_name
21
+ device_sense device_condition device_name debug_assume debug_sites
22
+ comment
23
+ )
24
+
25
+ ALIASES = {
26
+ bin: :bin_fail,
27
+ softbin: :sort_fail,
28
+ soft_bin: :sort_fail,
29
+ name: :tname,
30
+ number: :tnum,
31
+ test_number: :tnum,
32
+ test_num: :tnum,
33
+ type: :opcode
34
+ }
35
+
36
+ # Make readers for each low level attribute
37
+ ATTRS.each do |attr|
38
+ attr_reader attr
39
+ end
40
+
41
+ # And the aliases
42
+ ALIASES.each do |_alias, attr|
43
+ define_method("#{_alias}") do
44
+ send(attr)
45
+ end
46
+ end
47
+
48
+ # Returns the test instance called by the given line or nil
49
+ def self.extract_test(line)
50
+ l = new(line)
51
+ if l.valid? && l.test?
52
+ l.test_instance_name
53
+ end
54
+ end
55
+
56
+ def initialize(line, options = {})
57
+ @parser = options[:parser]
58
+ @flow = options[:flow]
59
+ @line = line
60
+ parse
61
+ if valid?
62
+ ATTRS.each_with_index do |attr, i|
63
+ instance_variable_set("@#{attr}", components[i + 1])
64
+ end
65
+ end
66
+ end
67
+
68
+ def inspect # :nodoc:
69
+ "<FlowLine: #{type}, Parameter: #{parameter}>"
70
+ end
71
+
72
+ def description
73
+ from_instance = test_instance ? test_instance.description : ''
74
+ from_flow = parser.descriptions.flow_line(name: test_instance_name, flow: flow.file)
75
+ if !from_instance.empty? && !from_flow.empty?
76
+ [from_instance, "\n", from_flow].flatten
77
+ elsif from_instance.empty?
78
+ from_flow
79
+ else
80
+ from_instance
81
+ end
82
+ end
83
+
84
+ def parse
85
+ @components = @line.split("\t") unless @line.strip.empty?
86
+ end
87
+
88
+ def valid?
89
+ components[6] && TYPES.include?(components[6])
90
+ end
91
+
92
+ def components
93
+ @components ||= []
94
+ end
95
+
96
+ def test?
97
+ %w(Test characterize).include? opcode
98
+ end
99
+
100
+ def executes_under_context?(context)
101
+ enable_conditions_met?(context) &&
102
+ job_conditions_met?(context) &&
103
+ part_conditions_met?(context) &&
104
+ env_conditions_met?(context)
105
+ end
106
+
107
+ def enable_conditions_met?(context)
108
+ conditions_met?(enable, context[:enable])
109
+ end
110
+
111
+ def job_conditions_met?(context)
112
+ conditions_met?(job, context[:job])
113
+ end
114
+
115
+ def part_conditions_met?(context)
116
+ conditions_met?(part, context[:part])
117
+ end
118
+
119
+ def env_conditions_met?(context)
120
+ conditions_met?(env, context[:env])
121
+ end
122
+
123
+ def conditions_met?(conditions, values)
124
+ if conditions.empty?
125
+ true
126
+ else
127
+ values = [values].flatten
128
+ conditions = conditions.split(',').map(&:strip)
129
+ not_conditions = conditions.select { |c| c =~ /^!/ }
130
+ conditions = conditions - not_conditions
131
+ # Make sure all -ve conditions are not met
132
+ if not_conditions.all? do |c|
133
+ c =~ /^!(.*)/
134
+ c = Regexp.last_match[1]
135
+ !values.include?(c)
136
+ end
137
+ # And then any +ve conditions
138
+ if conditions.empty?
139
+ true
140
+ else
141
+ values.any? { |v| conditions.include?(v) }
142
+ end
143
+ else
144
+ false
145
+ end
146
+ end
147
+ end
148
+
149
+ def test_instance_name
150
+ parameter
151
+ end
152
+ alias_method :instance_name, :test_instance_name
153
+
154
+ def test_instance
155
+ instances = parser.test_instances.where(name: parameter, exact: true)
156
+ if instances.size > 1
157
+ puts "Warning multiple instances of #{name} found, using the first one"
158
+ end
159
+ if instances.size == 0
160
+ nil
161
+ else
162
+ instances.first
163
+ end
164
+ end
165
+ alias_method :instance, :test_instance
166
+
167
+ # Returns an array of patterns used by the given test, if there are none
168
+ # an empty array is returned.
169
+ # Optionally supply patterns to exclude if you want to ignore common subroutine
170
+ # patterns for example.
171
+ def patterns(options = {})
172
+ i = test_instance
173
+ if i
174
+ pats = i.patterns
175
+ if options[:ignore] && pats
176
+ pats.reject { |p| [options[:ignore]].flatten.include?(p) }
177
+ else
178
+ []
179
+ end
180
+ else
181
+ []
182
+ end
183
+ end
184
+ alias_method :pattern, :patterns
185
+
186
+ # Returns a string summarizing any conditions (enable words, jobs, etc.) that
187
+ # gate the execution of this line
188
+ def conditions
189
+ c = []
190
+ c << "Enable: #{enable}" unless enable.empty?
191
+ c << "Job: #{job}" unless job.empty?
192
+ c << "Part: #{part}" unless part.empty?
193
+ c << "Env: #{env}" unless env.empty?
194
+ c.join('; ')
195
+ end
196
+
197
+ def vdd
198
+ i = test_instance
199
+ if i
200
+ i.vdd
201
+ end
202
+ end
203
+ end
204
+ end
205
+ end
206
+ end
207
+ end
@@ -0,0 +1,23 @@
1
+ module Origen
2
+ module Tester
3
+ class Ultraflex
4
+ class Parser
5
+ class Flows < Origen::Tester::Parser::SearchableArray
6
+ attr_accessor :parser
7
+
8
+ def initialize(options = {})
9
+ @parser = options[:parser]
10
+ end
11
+
12
+ def import(file)
13
+ self << Flow.new(file, parser: parser)
14
+ end
15
+
16
+ def inspect
17
+ "<TestFlows: #{size}>"
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end