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,860 @@
1
+ module Origen
2
+ module Pins
3
+ class Pin
4
+ include PinCommon
5
+
6
+ # Any attributes listed here will be looked up for the current function defined
7
+ # by the current mode and configuration context before falling back to a default
8
+ FUNCTION_SCOPED_ATTRIBUTES = [:name, :direction, :option, :group, :ip_block, :meta]
9
+
10
+ # Any attributes listed here will be looked up for the current package context
11
+ # before falling back to a default
12
+ PACKAGE_SCOPED_ATTRIBUTES = [:location, :dib_assignment]
13
+
14
+ # Pin Types
15
+ TYPES = [:analog, :digital]
16
+
17
+ attr_accessor :order
18
+ # Inverts pin states for drive and compare, can be useful if a timing set change requires clocks to drive low for example when all pattern logic has been set up to drive them high.
19
+ attr_accessor :invert
20
+ # Attribute used to generate vectors where the pin state is assigned the
21
+ # repeat_previous opcode, used by Tester#repeat_previous
22
+ attr_accessor :repeat_previous
23
+ attr_reader :owner
24
+ attr_reader :size
25
+ # If the pin belongs to a port then this will return the port object
26
+ attr_accessor :port
27
+ # Returns a hash containing the aliases associated with the given pin
28
+ attr_reader :aliases
29
+ # Returns a hash containing the functions associated with the given pin
30
+ attr_reader :functions
31
+ # Internal power supply pin is connected to
32
+ attr_accessor :supply
33
+ # Boolean on whether pin is open drain
34
+ attr_accessor :open_drain
35
+ # Boolean on whether pin has external pull-up
36
+ attr_accessor :ext_pullup
37
+ # Boolean on whether pin has external pull-down
38
+ attr_accessor :ext_pulldown
39
+ # Pin type, either :analog or :digital
40
+ attr_accessor :type
41
+ # Pin RTL name, short term solution for products that do not get full HDL path for pins
42
+ attr_accessor :rtl_name
43
+
44
+ # Should be instantiated through the HasPins macros
45
+ def initialize(id, owner, options = {}) # :nodoc:
46
+ options = {
47
+ reset: :dont_care,
48
+ invert: false,
49
+ direction: :io,
50
+ open_drain: false,
51
+ ext_pullup: false,
52
+ ext_pulldown: false,
53
+ rtl_name: nil
54
+ }.merge(options)
55
+ @aliases = {}
56
+ @functions = {}
57
+ @direction = sanitize_direction(options[:direction])
58
+ @invert = options[:invert]
59
+ @reset = options[:reset]
60
+ @id = id
61
+ @name = options[:name]
62
+ @rtl_name = options[:rtl_name]
63
+ @suspend = false
64
+ @order = options[:order]
65
+ @supply = options[:supply]
66
+ @open_drain = options[:open_drain]
67
+ @ext_pullup = options[:ext_pullup]
68
+ @ext_pulldown = options[:ext_pulldown]
69
+ @type = options[:type]
70
+ @dib_assignment = [] # Array to handle multi-site testing
71
+ @size = 1
72
+ @value = 0
73
+ @clock = nil
74
+ on_init(owner, options)
75
+ # Assign the initial state from the method so that any inversion is picked up...
76
+ send(@reset)
77
+ end
78
+
79
+ # When sorting pins do it by ID
80
+ def <=>(other_pin)
81
+ @id <=> other_pin.id
82
+ end
83
+
84
+ def name=(val)
85
+ @name = val
86
+ end
87
+
88
+ def functions=(val)
89
+ if val.is_a? Hash
90
+ val.each do |name, _whatever|
91
+ add_function name
92
+ end
93
+ else
94
+ fail "Attempt to set the functions hash on pin #{@name}. Argument must be a Hash."
95
+ end
96
+ end
97
+
98
+ # This generates getter methods that will lookup the given attribute within the
99
+ # scope of the current package and falling back to a default if defined
100
+ PACKAGE_SCOPED_ATTRIBUTES.each do |attribute|
101
+ define_method attribute do |options = {}|
102
+ default = instance_variable_get("@#{attribute}")
103
+ package_id = options[:package] || current_package_id
104
+ package_id = package_id.to_sym if package_id
105
+ if packages[package_id]
106
+ packages[package_id][attribute] || default
107
+ elsif packages[:all]
108
+ packages[:all][attribute] || default
109
+ else
110
+ default
111
+ end
112
+ end
113
+ end
114
+
115
+ # This generates getter methods that will lookup the given attribute within the
116
+ # scope of the function enabled by the current mode and configuration attributes
117
+ # and falling back to a default if defined
118
+ FUNCTION_SCOPED_ATTRIBUTES.each do |attribute|
119
+ define_method attribute do |options = {}|
120
+ default = instance_variable_get("@#{attribute}")
121
+ if options[:function]
122
+ v = functions[:ids][options[:function]][attribute]
123
+ return v if v
124
+ # else fall back to context-based lookup
125
+ end
126
+ mode_id = options[:mode] || current_mode_id
127
+ mode_id = mode_id.to_sym if mode_id
128
+ mode = functions[mode_id] || functions[:all]
129
+ if mode
130
+ config_id = options[:configuration] || options[:config] || current_configuration
131
+ config_id = config_id.to_sym if config_id
132
+ configuration = mode[config_id] || mode[:all]
133
+ if configuration
134
+ configuration[attribute] || default
135
+ else
136
+ default
137
+ end
138
+ else
139
+ default
140
+ end
141
+ end
142
+ end
143
+
144
+ alias_method :function_scoped_name, :name
145
+
146
+ # Returns the name of the pin, if a name has been specifically assigned by the application
147
+ # (via name=) then this will be returned, otherwise the name of the current function if present
148
+ # will be returned, and then as a last resort the ID of the pin
149
+ def name(options = {})
150
+ # Return a specifically assigned name in preference to a function name
151
+ (options.empty? ? @name : nil) || function_scoped_name(options) || @id
152
+ end
153
+
154
+ # Returns the value held by the pin as a string formatted to the current tester's pattern syntax
155
+ #
156
+ # @example
157
+ #
158
+ # pin.drive_hi
159
+ # pin.to_vector # => "1"
160
+ # pin.expect_lo
161
+ # pin.to_vector # => "L"
162
+ def to_vector
163
+ @vector_formatted_value ||= Origen.tester.format_pin_state(self)
164
+ end
165
+
166
+ # @api private
167
+ def invalidate_vector_cache
168
+ @vector_formatted_value = nil
169
+ groups.each { |_name, group| group.invalidate_vector_cache }
170
+ end
171
+
172
+ # Set the pin value and state from a string formatted to the current tester's pattern syntax,
173
+ # this is the opposite of the to_vector method
174
+ #
175
+ # @example
176
+ #
177
+ # pin.vector_formatted_value = "L"
178
+ # pin.driving? # => false
179
+ # pin.value # => 0
180
+ # pin.vector_formatted_value = "1"
181
+ # pin.driving? # => true
182
+ # pin.value # => 1
183
+ def vector_formatted_value=(val)
184
+ unless @vector_formatted_value == val
185
+ Origen.tester.update_pin_from_formatted_state(self, val)
186
+ @vector_formatted_value = val
187
+ end
188
+ end
189
+
190
+ def inspect
191
+ "<#{self.class}:#{object_id}>"
192
+ end
193
+
194
+ def describe(options = {})
195
+ desc = ['********************']
196
+ desc << "Pin id: #{id}"
197
+ func_aliases = []
198
+ unless functions.empty?
199
+ desc << ''
200
+ desc << 'Functions'
201
+ desc << '---------'
202
+ functions.each do |mode, configurations|
203
+ unless mode == :ids
204
+ configurations.each do |configuration, attrs|
205
+ a = ":#{attrs[:name]}".ljust(30)
206
+ func_aliases << attrs[:name]
207
+ unless mode == :all
208
+ a += ":modes => [#{[mode].flatten.map { |id| ':' + id.to_s }.join(', ')}]"
209
+ prev = true
210
+ end
211
+ unless configuration == :all
212
+ a += ' ; ' if prev
213
+ a += ":configurations => [#{[configuration].flatten.map { |id| ':' + id.to_s }.join(', ')}]"
214
+ end
215
+ desc << a
216
+ end
217
+ end
218
+ end
219
+ end
220
+ unless aliases.empty?
221
+ desc << ''
222
+ desc << 'Aliases'
223
+ desc << '-------'
224
+ aliases.each do |name, context|
225
+ unless func_aliases.include?(name)
226
+ a = ":#{name}".ljust(30)
227
+ unless context[:packages].empty? || context[:packages] == [:all]
228
+ a += ":packages => [#{context[:packages].map { |id| ':' + id.to_s }.join(', ')}]"
229
+ prev = true
230
+ end
231
+ unless context[:modes].empty? || context[:modes] == [:all]
232
+ a += ' ; ' if prev
233
+ a += ":modes => [#{context[:modes].map { |id| ':' + id.to_s }.join(', ')}]"
234
+ prev = true
235
+ end
236
+ unless context[:configurations].empty? || context[:configurations] == [:all]
237
+ a += ' ; ' if prev
238
+ a += ":configurations => [#{context[:configurations].map { |id| ':' + id.to_s }.join(', ')}]"
239
+ end
240
+ desc << a
241
+ end
242
+ end
243
+ end
244
+ unless Origen.top_level.modes.empty?
245
+ desc << ''
246
+ desc << 'Modes'
247
+ desc << '-------'
248
+ Origen.top_level.modes.each do |name|
249
+ unless option(mode: name).nil?
250
+ a = ":#{name}".ljust(30) + ":mode => #{option(mode: name)}"
251
+ desc << a
252
+ end
253
+ end
254
+ end
255
+ unless groups.empty?
256
+ desc << ''
257
+ desc << 'Groups'
258
+ desc << '------'
259
+ desc << groups.map { |name, _group| ':' + name.to_s }.join(', ')
260
+ end
261
+ desc << '********************'
262
+ if options[:return]
263
+ desc
264
+ else
265
+ puts desc.join("\n")
266
+ end
267
+ end
268
+
269
+ # Returns a hash containing the pin groups that the given pin is a member of
270
+ def groups
271
+ # Origen.pin_bank.all_pin_groups.select do |name, group|
272
+ @groups ||= Origen.pin_bank.pin_groups.select do |_name, group|
273
+ group.include?(self)
274
+ end
275
+ end
276
+ alias_method :ports, :groups
277
+ alias_method :pin_groups, :groups
278
+
279
+ def invalidate_group_cache
280
+ @groups = nil
281
+ end
282
+
283
+ # Add a location identifier to the pin, this is a free format field which can be a
284
+ # pin number or BGA co-ordinate for example.
285
+ #
286
+ # @example Adding a location by package
287
+ # $dut.pin(:pin3).add_location "B3", :package => :p1
288
+ # $dut.pin(:pin3).add_location "B2", :package => :p2
289
+ def add_location(str, options = {})
290
+ packages = resolve_packages(options)
291
+ if packages.empty?
292
+ @location = str
293
+ add_alias str.to_s.symbolize, package: :all, mode: :all, configuration: :all
294
+ else
295
+ packages.each do |package_id|
296
+ package_id = package_id.respond_to?(:id) ? package_id.id : package_id
297
+ self.packages[package_id] ||= {}
298
+ self.packages[package_id][:location] = str
299
+ add_alias str.to_s.symbolize, package: package_id, mode: :all, configuration: :all
300
+ end
301
+ end
302
+ end
303
+ alias_method :add_locn, :add_location
304
+
305
+ # Add a Device Interface Board (e.g. probecard at wafer probe or loadboard at final package test)
306
+ # assignment to the pin. Some refer to this as a channel but API name is meant to be generic.
307
+ def add_dib_assignment(str, options = {})
308
+ options = {
309
+ site: 0
310
+ }.merge(options)
311
+ packages = resolve_packages(options)
312
+ if packages.empty?
313
+ @dib_assignment[options[:site]] = str
314
+ add_alias str.to_s.symbolize, package: :all, mode: :all, configuration: :all
315
+ else
316
+ packages.each do |package_id|
317
+ package_id = package_id.respond_to?(:id) ? package_id.id : package_id
318
+ self.packages[package_id] ||= {}
319
+ self.packages[package_id][:dib_assignment] ||= []
320
+ self.packages[package_id][:dib_assignment][options[:site]] = str
321
+ add_alias str.to_s.symbolize, package: package_id, mode: :all, configuration: :all
322
+ end
323
+ end
324
+ end
325
+ alias_method :add_dib_info, :add_dib_assignment
326
+ alias_method :add_channel, :add_dib_assignment
327
+
328
+ # Returns the number of test sites enabled for the pin
329
+ def sites
330
+ dib_assignment.size
331
+ end
332
+
333
+ def sanitize_direction(val)
334
+ if val
335
+ val = val.to_s.downcase.gsub(/\//, '')
336
+ if val =~ /i.*o/
337
+ :io
338
+ elsif val =~ /^i/
339
+ :input
340
+ elsif val =~ /^o/
341
+ :output
342
+ else
343
+ fail "Unknown pin direction: #{val}"
344
+ end
345
+ end
346
+ end
347
+
348
+ # Sets the default direction of the pin, :input, :output or :io (default). If a function specific
349
+ # direction has been specified that will override this value.
350
+ def direction=(val)
351
+ @direction = sanitize_direction(val)
352
+ end
353
+
354
+ # Add a function to the pin.
355
+ #
356
+ # @example Adding a mode-specific function
357
+ # pin.add_function :tdi, :direction => :input
358
+ # pin.add_function :nvm_fail, :mode => :nvmbist, :direction => :output
359
+ def add_function(id, options = {})
360
+ id = id.to_sym
361
+ add_function_attributes(options.merge(name: id, id: id.to_sym))
362
+ f = FunctionProxy.new(id, self)
363
+ add_alias id, packages: :all, obj: f
364
+ end
365
+
366
+ def add_function_attributes(options = {})
367
+ id = options.delete(:id)
368
+ modes = resolve_modes(options)
369
+ configurations = resolve_configurations(options)
370
+ options[:direction] = sanitize_direction(options[:direction]) if options[:direction]
371
+ if modes.empty?
372
+ modes = [:all]
373
+ end
374
+ if configurations.empty?
375
+ configurations = [:all]
376
+ end
377
+ # Supports newer attribute lookup by function ID
378
+ if id
379
+ functions[:ids] ||= {}
380
+ if functions[:ids][id]
381
+ functions[:ids][id] = functions[:ids][id].merge!(options)
382
+ else
383
+ functions[:ids][id] = options.dup
384
+ end
385
+ end
386
+ # Supports older attribute lookup by mode context
387
+ modes.each do |mode|
388
+ configurations.each do |configuration|
389
+ functions[mode.to_sym] ||= {}
390
+ if functions[mode.to_sym][configuration.to_sym]
391
+ functions[mode.to_sym][configuration.to_sym] = functions[mode.to_sym][configuration.to_sym].merge!(options)
392
+ else
393
+ functions[mode.to_sym][configuration.to_sym] = options
394
+ end
395
+ end
396
+ end
397
+ end
398
+
399
+ # Add an alias to the given pin.
400
+ #
401
+ # If the options contain a package, mode or configuration reference then the alias
402
+ # will only work under that context.
403
+ def add_alias(id, options = {})
404
+ obj = options.delete(:obj) || self
405
+ if aliases[id]
406
+ aliases[id][:packages] += resolve_packages(options)
407
+ aliases[id][:modes] += resolve_modes(options)
408
+ aliases[id][:configurations] += resolve_configurations(options)
409
+ aliases[id][:packages].uniq!
410
+ aliases[id][:modes].uniq!
411
+ aliases[id][:configurations].uniq!
412
+ else
413
+ aliases[id] = {
414
+ packages: resolve_packages(options),
415
+ modes: resolve_modes(options),
416
+ configurations: resolve_configurations(options)
417
+ }
418
+ Origen.pin_bank.register_alias(id, obj, options)
419
+ end
420
+ end
421
+
422
+ # Returns true if the pin has the given alias within the given or current context
423
+ def has_alias?(id, options = {})
424
+ if aliases[id]
425
+ if options[:ignore_context]
426
+ true
427
+ else
428
+ packages = resolve_packages(options)
429
+ modes = resolve_modes(options)
430
+ configurations = resolve_configurations(options)
431
+ begin
432
+ aliases[id][:packages].include?(:all) || aliases[id][:packages].empty? ||
433
+ packages.any? { |package| aliases[id][:packages].include?(package) }
434
+ end && begin
435
+ aliases[id][:modes].include?(:all) || aliases[id][:modes].empty? ||
436
+ modes.any? { |mode| aliases[id][:modes].include?(mode) }
437
+ end && begin
438
+ aliases[id][:configurations].include?(:all) || aliases[id][:configurations].empty? ||
439
+ configurations.any? { |config| aliases[id][:configurations].include?(config) }
440
+ end
441
+ end
442
+ else
443
+ false
444
+ end
445
+ end
446
+
447
+ # Returns true if the pin is an alias of the given pin name
448
+ def is_alias_of?(name)
449
+ if Origen.pin_bank.find(name)
450
+ Origen.pin_bank.find(name).id == Origen.pin_bank.find(self).id
451
+ else
452
+ false
453
+ end
454
+ end
455
+
456
+ # Returns true if the pin belongs to a port.
457
+ #
458
+ # add_port :jtag, :size => 6
459
+ # add_pin :done
460
+ # add_pin_alias :fail, :jtag, :pin => 4
461
+ #
462
+ # pin(:done).belongs_to_a_port? # => false
463
+ # pin(:fail).belongs_to_a_port? # => true
464
+ def belongs_to_a_port?
465
+ !groups.empty?
466
+ end
467
+ alias_method :belongs_to_a_pin_group?, :belongs_to_a_port?
468
+
469
+ def value
470
+ @value
471
+ end
472
+ alias_method :data, :value
473
+
474
+ def suspend
475
+ invalidate_vector_cache
476
+ @suspend = true
477
+ end
478
+
479
+ def suspended?
480
+ @suspend
481
+ end
482
+
483
+ # Will resume compares on this pin
484
+ def resume
485
+ invalidate_vector_cache
486
+ @suspend = false
487
+ end
488
+
489
+ def repeat_previous=(bool)
490
+ invalidate_vector_cache
491
+ @repeat_previous = bool
492
+ end
493
+
494
+ def repeat_previous?
495
+ @repeat_previous
496
+ end
497
+
498
+ def set_state(state)
499
+ invalidate_vector_cache
500
+ @repeat_previous = false
501
+ @state = state
502
+ end
503
+
504
+ def set_value(val)
505
+ invalidate_vector_cache
506
+ # If val is a data bit extract the value of it
507
+ val = val.respond_to?(:data) ? val.data : val
508
+ # Assume driving/asserting a nil value means 0
509
+ val = 0 unless val
510
+ if val > 1
511
+ fail "Attempt to set a value of #{val} on pin #{name}"
512
+ end
513
+ @repeat_previous = false
514
+ if inverted?
515
+ @value = val == 0 ? 1 : 0
516
+ else
517
+ @value = val
518
+ end
519
+ end
520
+ alias_method :data=, :set_value
521
+
522
+ def cycle # :nodoc:
523
+ Origen.tester.cycle
524
+ end
525
+
526
+ def state
527
+ @state
528
+ end
529
+
530
+ def state=(value)
531
+ invalidate_vector_cache
532
+ @state = value
533
+ end
534
+
535
+ # Set the pin to drive a 1 on future cycles
536
+ def drive_hi
537
+ set_state(:drive)
538
+ set_value(1)
539
+ end
540
+
541
+ def drive_hi!
542
+ drive_hi
543
+ cycle
544
+ end
545
+
546
+ # Set the pin to drive a high voltage on future cycles (if the tester supports it).
547
+ # For example on a J750 high-voltage channel the pin state would be set to "2"
548
+ def drive_very_hi
549
+ set_state(:drive_very_hi)
550
+ set_value(1)
551
+ end
552
+
553
+ def drive_very_hi!
554
+ drive_very_hi
555
+ cycle
556
+ end
557
+
558
+ # Set the pin to drive a 0 on future cycles
559
+ def drive_lo
560
+ set_state(:drive)
561
+ set_value(0)
562
+ end
563
+
564
+ def drive_lo!
565
+ drive_lo
566
+ cycle
567
+ end
568
+
569
+ def drive_mem
570
+ set_state(:drive_mem)
571
+ end
572
+
573
+ def drive_mem!
574
+ drive_mem
575
+ cycle
576
+ end
577
+
578
+ def expect_mem
579
+ set_state(:expect_mem)
580
+ end
581
+
582
+ def expect_mem!
583
+ expect_mem
584
+ cycle
585
+ end
586
+
587
+ # Set the pin to expect a 1 on future cycles
588
+ def assert_hi(_options = {})
589
+ set_state(:compare)
590
+ set_value(1)
591
+ end
592
+ alias_method :expect_hi, :assert_hi
593
+ alias_method :compare_hi, :assert_hi
594
+
595
+ def assert_hi!
596
+ assert_hi
597
+ cycle
598
+ end
599
+ alias_method :expect_hi!, :assert_hi!
600
+ alias_method :compare_hi!, :assert_hi!
601
+
602
+ # Set the pin to expect a 0 on future cycles
603
+ def assert_lo(_options = {})
604
+ set_state(:compare)
605
+ set_value(0)
606
+ # Planning to add the active load logic to the tester instead...
607
+ # options = { :active => false #if active true means to take tester active load capability into account
608
+ # }.merge(options)
609
+ # unless state_to_be_inverted?
610
+ # self.state = ($tester.active_loads || !options[:active]) ? $tester.pin_state(:expect_lo) : $tester.pin_state(:dont_care)
611
+ # else
612
+ # self.state = ($tester.active_loads || !options[:active]) ? $tester.pin_state(:expect_hi) : $tester.pin_state(:dont_care)
613
+ # end
614
+ end
615
+ alias_method :expect_lo, :assert_lo
616
+ alias_method :compare_lo, :assert_lo
617
+
618
+ def assert_lo!
619
+ assert_lo
620
+ cycle
621
+ end
622
+ alias_method :expect_lo!, :assert_lo!
623
+ alias_method :compare_lo!, :assert_lo!
624
+
625
+ # Set the pin to X on future cycles
626
+ def dont_care
627
+ set_state(:dont_care)
628
+ end
629
+
630
+ def dont_care!
631
+ dont_care
632
+ cycle
633
+ end
634
+
635
+ # Pass in 0 or 1 to have the pin drive_lo or drive_hi respectively.
636
+ # This is useful when programatically setting the pin state.
637
+ # ==== Example
638
+ # [0,1,1,0].each do |level|
639
+ # $pin(:d_in).drive(level)
640
+ # end
641
+ def drive(value)
642
+ set_state(:drive)
643
+ set_value(value)
644
+ end
645
+
646
+ def drive!(value)
647
+ drive(value)
648
+ cycle
649
+ end
650
+
651
+ # Pass in 0 or 1 to have the pin expect_lo or expect_hi respectively.
652
+ # This is useful when programatically setting the pin state.
653
+ # ==== Example
654
+ # [0,1,1,0].each do |level|
655
+ # $pin(:d_in).assert(level)
656
+ # end
657
+ def assert(value, _options = {})
658
+ set_state(:compare)
659
+ set_value(value)
660
+ end
661
+ alias_method :compare, :assert
662
+ alias_method :expect, :assert
663
+
664
+ def assert!(*args)
665
+ assert(*args)
666
+ cycle
667
+ end
668
+ alias_method :compare!, :assert!
669
+ alias_method :expect!, :assert!
670
+
671
+ # Returns the state of invert
672
+ def inverted?
673
+ @invert
674
+ end
675
+
676
+ # Returns true if the pin is currently in a compare state
677
+ def comparing?
678
+ !@suspend &&
679
+ state == :compare
680
+ end
681
+
682
+ # Returns true if the pin is currently in a compare mem state
683
+ def comparing_mem?
684
+ !@suspend &&
685
+ state == :expect_mem
686
+ end
687
+
688
+ # Returns true if the pin is currently in a drive state
689
+ def driving?
690
+ !@suspend &&
691
+ (state == :drive || state == :drive_very_hi)
692
+ end
693
+
694
+ # Returns true if the pin is currently in a drive mem state
695
+ def driving_mem?
696
+ !@suspend &&
697
+ state == :drive_mem
698
+ end
699
+
700
+ # Returns true if pin is in high voltage state
701
+ def high_voltage?
702
+ !@suspend &&
703
+ state == :drive_very_hi
704
+ end
705
+
706
+ def toggle
707
+ unless state == :dont_care
708
+ set_value(value == 0 ? 1 : 0)
709
+ end
710
+ end
711
+
712
+ def toggle!
713
+ toggle
714
+ cycle
715
+ end
716
+
717
+ # Mark the (data) from the pin to be captured
718
+ def capture
719
+ set_state(:capture)
720
+ end
721
+ alias_method :store, :capture
722
+
723
+ # Mark the (data) from the pin to be captured and trigger a cycle
724
+ def capture!
725
+ capture
726
+ cycle
727
+ end
728
+ alias_method :store!, :capture!
729
+
730
+ # Returns true if the (data) from the pin is marked to be captured
731
+ def to_be_captured?
732
+ state == :capture
733
+ end
734
+ alias_method :to_be_stored?, :to_be_captured?
735
+ alias_method :is_to_be_stored?, :to_be_captured?
736
+ alias_method :is_to_be_captured?, :to_be_captured?
737
+
738
+ # Restores the state of the pin at the end of the given block
739
+ # to the state it was in at the start of the block
740
+ #
741
+ # pin(:invoke).driving? # => true
742
+ # pin(:invoke).restore_state do
743
+ # pin(:invoke).dont_care
744
+ # pin(:invoke).driving? # => false
745
+ # end
746
+ # pin(:invoke).driving? # => true
747
+ def restore_state
748
+ save
749
+ yield
750
+ restore
751
+ end
752
+
753
+ def save # :nodoc:
754
+ @_saved_state = @state
755
+ @_saved_value = @value
756
+ @_saved_suspend = @suspend
757
+ @_saved_invert = @invert
758
+ @_saved_repeat_previous = @repeat_previous
759
+ end
760
+
761
+ def restore # :nodoc:
762
+ invalidate_vector_cache
763
+ @state = @_saved_state
764
+ @value = @_saved_value
765
+ @suspend = @_saved_suspend
766
+ @invert = @_saved_invert
767
+ @repeat_previous = @_saved_repeat_previous
768
+ end
769
+
770
+ def is_not_a_clock?
771
+ @clock.nil?
772
+ end
773
+
774
+ def is_a_clock?
775
+ !(@clock.nil?)
776
+ end
777
+
778
+ def is_a_running_clock?
779
+ @clock.running?
780
+ end
781
+
782
+ def enable_clock(options = {})
783
+ @clock = PinClock.new(self, options)
784
+ end
785
+
786
+ def disable_clock(options = {})
787
+ @clock.stop_clock(options)
788
+ @clock = nil
789
+ end
790
+
791
+ def update_clock
792
+ @clock.update_clock
793
+ end
794
+
795
+ def start_clock(options = {})
796
+ enable_clock(options) if self.is_not_a_clock?
797
+ @clock.start_clock(options)
798
+ end
799
+ alias_method :resume_clock, :start_clock
800
+
801
+ def stop_clock(options = {})
802
+ @clock.stop_clock(options)
803
+ end
804
+ alias_method :pause_clock, :stop_clock
805
+
806
+ def next_edge
807
+ @clock.next_edge
808
+ end
809
+
810
+ def half_period
811
+ @clock.cycles_per_half_period
812
+ end
813
+
814
+ def toggle_clock
815
+ fail "ERROR: Clock on #{@owner.name} not running." unless is_a_running_clock?
816
+ @clock.toggle
817
+ end
818
+
819
+ # Delete this pin (self). Used bang in method name to keep same for pins and
820
+ # pin collections. Pin collections already had a delete method which deletes
821
+ # a pin from the collection. Needed delete! to indicate it is deleting the
822
+ # actual pin or pin group calling the method.
823
+ def delete!
824
+ owner.delete_pin(self)
825
+ end
826
+
827
+ def type=(value)
828
+ if TYPES.include? value
829
+ @type = value
830
+ else
831
+ fail "Pin type '#{value}' must be set to one of the following: #{TYPES.join(', ')}"
832
+ end
833
+ end
834
+
835
+ def open_drain=(value)
836
+ if [true, false].include? value
837
+ @open_drain = value
838
+ else
839
+ fail "Pin open_drain attribute '#{value}' must be either true or false"
840
+ end
841
+ end
842
+
843
+ def ext_pullup=(value)
844
+ if [true, false].include? value
845
+ @ext_pullup = value
846
+ else
847
+ fail "Pin ext_pullup attribute '#{value}' must be either true or false"
848
+ end
849
+ end
850
+
851
+ def ext_pulldown=(value)
852
+ if [true, false].include? value
853
+ @ext_pulldown = value
854
+ else
855
+ fail "Pin ext_pulldown attribute '#{value}' must be either true or false"
856
+ end
857
+ end
858
+ end
859
+ end
860
+ end