ruby-vpi 7.0.0

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 (364) hide show
  1. data/HISTORY +398 -0
  2. data/LICENSE +340 -0
  3. data/MEMO +38 -0
  4. data/README +9 -0
  5. data/Rakefile +271 -0
  6. data/bin/generate_test.rb +258 -0
  7. data/bin/generate_test_tpl/bench.rb +31 -0
  8. data/bin/generate_test_tpl/bench.v +54 -0
  9. data/bin/generate_test_tpl/design.rb +26 -0
  10. data/bin/generate_test_tpl/proto.rb +8 -0
  11. data/bin/generate_test_tpl/runner.rake +28 -0
  12. data/bin/generate_test_tpl/spec.rb +46 -0
  13. data/bin/header_to_ruby.rb +70 -0
  14. data/doc/Rakefile +55 -0
  15. data/doc/src/LICENSE +397 -0
  16. data/doc/src/figures/organization.png +0 -0
  17. data/doc/src/figures/organization_detailed.png +0 -0
  18. data/doc/src/figures/ruby_init.png +0 -0
  19. data/doc/src/figures/ruby_relay.png +0 -0
  20. data/doc/src/figures.dia +0 -0
  21. data/doc/src/images/COPYING +67 -0
  22. data/doc/src/images/ChangeLog +27 -0
  23. data/doc/src/images/blank.png +0 -0
  24. data/doc/src/images/callouts/1.png +0 -0
  25. data/doc/src/images/callouts/10.png +0 -0
  26. data/doc/src/images/callouts/11.png +0 -0
  27. data/doc/src/images/callouts/12.png +0 -0
  28. data/doc/src/images/callouts/13.png +0 -0
  29. data/doc/src/images/callouts/14.png +0 -0
  30. data/doc/src/images/callouts/15.png +0 -0
  31. data/doc/src/images/callouts/2.png +0 -0
  32. data/doc/src/images/callouts/3.png +0 -0
  33. data/doc/src/images/callouts/4.png +0 -0
  34. data/doc/src/images/callouts/5.png +0 -0
  35. data/doc/src/images/callouts/6.png +0 -0
  36. data/doc/src/images/callouts/7.png +0 -0
  37. data/doc/src/images/callouts/8.png +0 -0
  38. data/doc/src/images/callouts/9.png +0 -0
  39. data/doc/src/images/callouts/ChangeLog +15 -0
  40. data/doc/src/images/caution.png +0 -0
  41. data/doc/src/images/caution.svg +290 -0
  42. data/doc/src/images/copyright +55 -0
  43. data/doc/src/images/draft.png +0 -0
  44. data/doc/src/images/home.png +0 -0
  45. data/doc/src/images/home.svg +386 -0
  46. data/doc/src/images/important.png +0 -0
  47. data/doc/src/images/important.svg +163 -0
  48. data/doc/src/images/next.png +0 -0
  49. data/doc/src/images/next.svg +191 -0
  50. data/doc/src/images/note.png +0 -0
  51. data/doc/src/images/note.svg +483 -0
  52. data/doc/src/images/prev.png +0 -0
  53. data/doc/src/images/prev.svg +852 -0
  54. data/doc/src/images/tip.png +0 -0
  55. data/doc/src/images/tip.svg +1145 -0
  56. data/doc/src/images/toc-blank.png +0 -0
  57. data/doc/src/images/toc-minus.png +0 -0
  58. data/doc/src/images/toc-plus.png +0 -0
  59. data/doc/src/images/up.png +0 -0
  60. data/doc/src/images/up.svg +195 -0
  61. data/doc/src/images/warning.png +0 -0
  62. data/doc/src/images/warning.svg +334 -0
  63. data/doc/src/license.xml +446 -0
  64. data/doc/src/manual.xml +1582 -0
  65. data/doc/src/manual.xsl +23 -0
  66. data/doc/src/shared.dtd +63 -0
  67. data/doc/src/styles/manual.css +87 -0
  68. data/doc/txt/manual.txt +1657 -0
  69. data/doc/xhtml/background.html +3 -0
  70. data/doc/xhtml/background.methodology.html +3 -0
  71. data/doc/xhtml/background.organization.html +10 -0
  72. data/doc/xhtml/background.running-tests.html +3 -0
  73. data/doc/xhtml/background.terminology.html +3 -0
  74. data/doc/xhtml/figures/organization.png +0 -0
  75. data/doc/xhtml/figures/organization_detailed.png +0 -0
  76. data/doc/xhtml/figures/ruby_init.png +0 -0
  77. data/doc/xhtml/figures/ruby_relay.png +0 -0
  78. data/doc/xhtml/gfdl-0.html +18 -0
  79. data/doc/xhtml/gfdl-1.html +70 -0
  80. data/doc/xhtml/gfdl-10.html +15 -0
  81. data/doc/xhtml/gfdl-2.html +13 -0
  82. data/doc/xhtml/gfdl-3.html +31 -0
  83. data/doc/xhtml/gfdl-4.html +75 -0
  84. data/doc/xhtml/gfdl-5.html +20 -0
  85. data/doc/xhtml/gfdl-6.html +12 -0
  86. data/doc/xhtml/gfdl-7.html +16 -0
  87. data/doc/xhtml/gfdl-8.html +17 -0
  88. data/doc/xhtml/gfdl-9.html +9 -0
  89. data/doc/xhtml/gfdl-addendum.html +25 -0
  90. data/doc/xhtml/gfdl.html +11 -0
  91. data/doc/xhtml/glossary.html +3 -0
  92. data/doc/xhtml/images/COPYING +67 -0
  93. data/doc/xhtml/images/ChangeLog +27 -0
  94. data/doc/xhtml/images/blank.png +0 -0
  95. data/doc/xhtml/images/callouts/1.png +0 -0
  96. data/doc/xhtml/images/callouts/10.png +0 -0
  97. data/doc/xhtml/images/callouts/11.png +0 -0
  98. data/doc/xhtml/images/callouts/12.png +0 -0
  99. data/doc/xhtml/images/callouts/13.png +0 -0
  100. data/doc/xhtml/images/callouts/14.png +0 -0
  101. data/doc/xhtml/images/callouts/15.png +0 -0
  102. data/doc/xhtml/images/callouts/2.png +0 -0
  103. data/doc/xhtml/images/callouts/3.png +0 -0
  104. data/doc/xhtml/images/callouts/4.png +0 -0
  105. data/doc/xhtml/images/callouts/5.png +0 -0
  106. data/doc/xhtml/images/callouts/6.png +0 -0
  107. data/doc/xhtml/images/callouts/7.png +0 -0
  108. data/doc/xhtml/images/callouts/8.png +0 -0
  109. data/doc/xhtml/images/callouts/9.png +0 -0
  110. data/doc/xhtml/images/callouts/ChangeLog +15 -0
  111. data/doc/xhtml/images/caution.png +0 -0
  112. data/doc/xhtml/images/caution.svg +290 -0
  113. data/doc/xhtml/images/copyright +55 -0
  114. data/doc/xhtml/images/draft.png +0 -0
  115. data/doc/xhtml/images/home.png +0 -0
  116. data/doc/xhtml/images/home.svg +386 -0
  117. data/doc/xhtml/images/important.png +0 -0
  118. data/doc/xhtml/images/important.svg +163 -0
  119. data/doc/xhtml/images/next.png +0 -0
  120. data/doc/xhtml/images/next.svg +191 -0
  121. data/doc/xhtml/images/note.png +0 -0
  122. data/doc/xhtml/images/note.svg +483 -0
  123. data/doc/xhtml/images/prev.png +0 -0
  124. data/doc/xhtml/images/prev.svg +852 -0
  125. data/doc/xhtml/images/tip.png +0 -0
  126. data/doc/xhtml/images/tip.svg +1145 -0
  127. data/doc/xhtml/images/toc-blank.png +0 -0
  128. data/doc/xhtml/images/toc-minus.png +0 -0
  129. data/doc/xhtml/images/toc-plus.png +0 -0
  130. data/doc/xhtml/images/up.png +0 -0
  131. data/doc/xhtml/images/up.svg +195 -0
  132. data/doc/xhtml/images/warning.png +0 -0
  133. data/doc/xhtml/images/warning.svg +334 -0
  134. data/doc/xhtml/index.html +4 -0
  135. data/doc/xhtml/introduction.html +3 -0
  136. data/doc/xhtml/introduction.license.html +3 -0
  137. data/doc/xhtml/introduction.manifest.html +3 -0
  138. data/doc/xhtml/introduction.related-works.html +3 -0
  139. data/doc/xhtml/introduction.resources.html +3 -0
  140. data/doc/xhtml/problem.ivl.html +18 -0
  141. data/doc/xhtml/problems.html +3 -0
  142. data/doc/xhtml/problems.ruby.html +3 -0
  143. data/doc/xhtml/problems.vsim.html +3 -0
  144. data/doc/xhtml/styles/manual.css +87 -0
  145. data/doc/xhtml/usage.examples.html +3 -0
  146. data/doc/xhtml/usage.html +3 -0
  147. data/doc/xhtml/usage.installation.html +3 -0
  148. data/doc/xhtml/usage.requirements.html +3 -0
  149. data/doc/xhtml/usage.tools.html +3 -0
  150. data/doc/xhtml/usage.tutorial.html +199 -0
  151. data/ext/Doxyfile +272 -0
  152. data/ext/README +124 -0
  153. data/ext/Rakefile +65 -0
  154. data/ext/common.h +56 -0
  155. data/ext/extconf.rb +4 -0
  156. data/ext/relay.cin +146 -0
  157. data/ext/relay.hin +48 -0
  158. data/ext/ruby-vpi.c +36 -0
  159. data/ext/swig.cin +38 -0
  160. data/ext/swig.hin +39 -0
  161. data/ext/swig_vpi.h +924 -0
  162. data/ext/swig_vpi.i +8 -0
  163. data/ext/swig_wrap.cin +4613 -0
  164. data/ext/verilog.h +59 -0
  165. data/ext/vlog.cin +92 -0
  166. data/ext/vlog.hin +57 -0
  167. data/ext/vpi_user.h +924 -0
  168. data/gem_extconf.rb +8 -0
  169. data/history.html +809 -0
  170. data/lib/ruby-vpi/erb.rb +41 -0
  171. data/lib/ruby-vpi/rake.rb +35 -0
  172. data/lib/ruby-vpi/rdoc.rb +51 -0
  173. data/lib/ruby-vpi/rspec.rb +32 -0
  174. data/lib/ruby-vpi/runner.rb +22 -0
  175. data/lib/ruby-vpi/vpi_util.rb +310 -0
  176. data/lib/ruby-vpi.rb +58 -0
  177. data/memo.html +86 -0
  178. data/readme.html +19 -0
  179. data/ref/c/annotated.html +36 -0
  180. data/ref/c/common_8h.html +178 -0
  181. data/ref/c/doxygen.css +310 -0
  182. data/ref/c/doxygen.png +0 -0
  183. data/ref/c/files.html +35 -0
  184. data/ref/c/functions.html +135 -0
  185. data/ref/c/functions_vars.html +135 -0
  186. data/ref/c/globals.html +55 -0
  187. data/ref/c/globals_0x63.html +86 -0
  188. data/ref/c/globals_0x65.html +55 -0
  189. data/ref/c/globals_0x66.html +55 -0
  190. data/ref/c/globals_0x70.html +71 -0
  191. data/ref/c/globals_0x72.html +62 -0
  192. data/ref/c/globals_0x73.html +65 -0
  193. data/ref/c/globals_0x74.html +55 -0
  194. data/ref/c/globals_0x76.html +472 -0
  195. data/ref/c/globals_0x78.html +55 -0
  196. data/ref/c/globals_defs.html +81 -0
  197. data/ref/c/globals_defs_0x65.html +50 -0
  198. data/ref/c/globals_defs_0x70.html +51 -0
  199. data/ref/c/globals_defs_0x76.html +463 -0
  200. data/ref/c/globals_defs_0x78.html +50 -0
  201. data/ref/c/globals_enum.html +39 -0
  202. data/ref/c/globals_eval.html +40 -0
  203. data/ref/c/globals_func.html +49 -0
  204. data/ref/c/globals_type.html +63 -0
  205. data/ref/c/globals_vars.html +42 -0
  206. data/ref/c/hierarchy.html +36 -0
  207. data/ref/c/index.html +20 -0
  208. data/ref/c/relay_8cin.html +268 -0
  209. data/ref/c/relay_8hin.html +161 -0
  210. data/ref/c/ruby-vpi_8c.html +34 -0
  211. data/ref/c/structrelay____RubyOptions____def.html +84 -0
  212. data/ref/c/structt__cb__data.html +208 -0
  213. data/ref/c/structt__vpi__delay.html +183 -0
  214. data/ref/c/structt__vpi__error__info.html +208 -0
  215. data/ref/c/structt__vpi__strengthval.html +108 -0
  216. data/ref/c/structt__vpi__systf__data.html +208 -0
  217. data/ref/c/structt__vpi__time.html +133 -0
  218. data/ref/c/structt__vpi__value.html +285 -0
  219. data/ref/c/structt__vpi__vecval.html +83 -0
  220. data/ref/c/structt__vpi__vlog__info.html +133 -0
  221. data/ref/c/swig_8cin.html +91 -0
  222. data/ref/c/swig_8hin.html +99 -0
  223. data/ref/c/tab_b.gif +0 -0
  224. data/ref/c/tab_l.gif +0 -0
  225. data/ref/c/tab_r.gif +0 -0
  226. data/ref/c/tabs.css +102 -0
  227. data/ref/c/verilog_8h.html +149 -0
  228. data/ref/c/vlog_8cin.html +199 -0
  229. data/ref/c/vlog_8hin.html +152 -0
  230. data/ref/c/vpi__user_8h.html +12747 -0
  231. data/ref/ruby/classes/Counter.html +258 -0
  232. data/ref/ruby/classes/Counter.src/M000037.html +20 -0
  233. data/ref/ruby/classes/Counter.src/M000038.html +22 -0
  234. data/ref/ruby/classes/Counter.src/M000039.html +20 -0
  235. data/ref/ruby/classes/Counter.src/M000040.html +22 -0
  236. data/ref/ruby/classes/CounterProto.html +164 -0
  237. data/ref/ruby/classes/CounterProto.src/M000004.html +22 -0
  238. data/ref/ruby/classes/CounterProto.src/M000005.html +22 -0
  239. data/ref/ruby/classes/ERB.html +158 -0
  240. data/ref/ruby/classes/ERB.src/M000034.html +29 -0
  241. data/ref/ruby/classes/FileUtils.html +165 -0
  242. data/ref/ruby/classes/FileUtils.src/M000047.html +18 -0
  243. data/ref/ruby/classes/FileUtils.src/M000048.html +18 -0
  244. data/ref/ruby/classes/Hw5UnitModel/Operation.html +216 -0
  245. data/ref/ruby/classes/Hw5UnitModel/Operation.src/M000011.html +25 -0
  246. data/ref/ruby/classes/Hw5UnitModel/Operation.src/M000012.html +33 -0
  247. data/ref/ruby/classes/Hw5UnitModel/Operation.src/M000013.html +18 -0
  248. data/ref/ruby/classes/Hw5UnitModel.html +256 -0
  249. data/ref/ruby/classes/Hw5UnitModel.src/M000006.html +24 -0
  250. data/ref/ruby/classes/Hw5UnitModel.src/M000008.html +20 -0
  251. data/ref/ruby/classes/Hw5UnitModel.src/M000009.html +38 -0
  252. data/ref/ruby/classes/Hw5UnitModel.src/M000010.html +22 -0
  253. data/ref/ruby/classes/Hw5_unit.html +196 -0
  254. data/ref/ruby/classes/Hw5_unit.src/M000003.html +27 -0
  255. data/ref/ruby/classes/Hw5_unit_spec.html +237 -0
  256. data/ref/ruby/classes/Hw5_unit_spec.src/M000023.html +21 -0
  257. data/ref/ruby/classes/Hw5_unit_spec.src/M000024.html +21 -0
  258. data/ref/ruby/classes/Hw5_unit_spec.src/M000025.html +67 -0
  259. data/ref/ruby/classes/InputGenerator.html +260 -0
  260. data/ref/ruby/classes/InputGenerator.src/M000027.html +18 -0
  261. data/ref/ruby/classes/InputGenerator.src/M000028.html +18 -0
  262. data/ref/ruby/classes/InputGenerator.src/M000029.html +19 -0
  263. data/ref/ruby/classes/InputGenerator.src/M000030.html +38 -0
  264. data/ref/ruby/classes/InputGenerator.src/M000031.html +19 -0
  265. data/ref/ruby/classes/InputGenerator.src/M000032.html +19 -0
  266. data/ref/ruby/classes/MaximumCounterValue.html +159 -0
  267. data/ref/ruby/classes/MaximumCounterValue.src/M000035.html +23 -0
  268. data/ref/ruby/classes/MaximumCounterValue.src/M000036.html +21 -0
  269. data/ref/ruby/classes/ModuleInfo.html +199 -0
  270. data/ref/ruby/classes/ModuleInfo.src/M000018.html +44 -0
  271. data/ref/ruby/classes/ModuleInfo.src/M000019.html +26 -0
  272. data/ref/ruby/classes/OutputInfo.html +304 -0
  273. data/ref/ruby/classes/OutputInfo.src/M000017.html +51 -0
  274. data/ref/ruby/classes/RDoc.html +135 -0
  275. data/ref/ruby/classes/RDoc.src/M000051.html +40 -0
  276. data/ref/ruby/classes/ResettedCounterValue.html +174 -0
  277. data/ref/ruby/classes/ResettedCounterValue.src/M000014.html +19 -0
  278. data/ref/ruby/classes/ResettedCounterValue.src/M000015.html +18 -0
  279. data/ref/ruby/classes/ResettedCounterValue.src/M000016.html +23 -0
  280. data/ref/ruby/classes/RubyVPI.html +186 -0
  281. data/ref/ruby/classes/RubyVPI.src/M000049.html +18 -0
  282. data/ref/ruby/classes/RubyVPI.src/M000050.html +39 -0
  283. data/ref/ruby/classes/SWIG/TYPE_p_unsigned_int.html +370 -0
  284. data/ref/ruby/classes/SWIG/TYPE_p_unsigned_int.src/M000041.html +22 -0
  285. data/ref/ruby/classes/SWIG/TYPE_p_unsigned_int.src/M000042.html +44 -0
  286. data/ref/ruby/classes/SWIG/TYPE_p_unsigned_int.src/M000043.html +82 -0
  287. data/ref/ruby/classes/SWIG/TYPE_p_unsigned_int.src/M000044.html +127 -0
  288. data/ref/ruby/classes/SWIG/TYPE_p_unsigned_int.src/M000045.html +26 -0
  289. data/ref/ruby/classes/SWIG/TYPE_p_unsigned_int.src/M000046.html +18 -0
  290. data/ref/ruby/classes/SWIG.html +111 -0
  291. data/ref/ruby/classes/String.html +140 -0
  292. data/ref/ruby/classes/String.src/M000033.html +37 -0
  293. data/ref/ruby/classes/Template.html +158 -0
  294. data/ref/ruby/classes/Template.src/M000026.html +18 -0
  295. data/ref/ruby/classes/TestHw5UnitModel.html +180 -0
  296. data/ref/ruby/classes/TestHw5UnitModel.src/M000020.html +19 -0
  297. data/ref/ruby/classes/TestHw5UnitModel.src/M000021.html +19 -0
  298. data/ref/ruby/classes/TestHw5UnitModel.src/M000022.html +64 -0
  299. data/ref/ruby/created.rid +1 -0
  300. data/ref/ruby/files/bin/generate_test_rb.html +236 -0
  301. data/ref/ruby/files/bin/generate_test_rb.src/M000001.html +29 -0
  302. data/ref/ruby/files/bin/generate_test_tpl/bench_rb.html +115 -0
  303. data/ref/ruby/files/bin/generate_test_tpl/design_rb.html +107 -0
  304. data/ref/ruby/files/bin/generate_test_tpl/proto_rb.html +107 -0
  305. data/ref/ruby/files/bin/generate_test_tpl/spec_rb.html +140 -0
  306. data/ref/ruby/files/bin/generate_test_tpl/spec_rb.src/M000002.html +22 -0
  307. data/ref/ruby/files/bin/header_to_ruby_rb.html +116 -0
  308. data/ref/ruby/files/ext/extconf_rb.html +108 -0
  309. data/ref/ruby/files/gem_extconf_rb.html +114 -0
  310. data/ref/ruby/files/lib/ruby-vpi/erb_rb.html +108 -0
  311. data/ref/ruby/files/lib/ruby-vpi/rake_rb.html +108 -0
  312. data/ref/ruby/files/lib/ruby-vpi/rdoc_rb.html +108 -0
  313. data/ref/ruby/files/lib/ruby-vpi/rspec_rb.html +115 -0
  314. data/ref/ruby/files/lib/ruby-vpi/runner_rb.html +108 -0
  315. data/ref/ruby/files/lib/ruby-vpi/vpi_util_rb.html +108 -0
  316. data/ref/ruby/files/lib/ruby-vpi_rb.html +108 -0
  317. data/ref/ruby/files/samp/counter/counter_rspecTest_bench_rb.html +115 -0
  318. data/ref/ruby/files/samp/counter/counter_rspecTest_design_rb.html +107 -0
  319. data/ref/ruby/files/samp/counter/counter_rspecTest_proto_rb.html +107 -0
  320. data/ref/ruby/files/samp/counter/counter_rspecTest_spec_rb.html +142 -0
  321. data/ref/ruby/files/samp/counter/counter_unitTest_bench_rb.html +115 -0
  322. data/ref/ruby/files/samp/counter/counter_unitTest_design_rb.html +107 -0
  323. data/ref/ruby/files/samp/counter/counter_unitTest_proto_rb.html +107 -0
  324. data/ref/ruby/files/samp/counter/counter_unitTest_spec_rb.html +135 -0
  325. data/ref/ruby/files/samp/pipelined_alu/Hw5UnitModel_rb.html +101 -0
  326. data/ref/ruby/files/samp/pipelined_alu/InputGenerator_rb.html +101 -0
  327. data/ref/ruby/files/samp/pipelined_alu/TestHw5UnitModel_rb.html +111 -0
  328. data/ref/ruby/files/samp/pipelined_alu/hw5_unit_bench_rb.html +108 -0
  329. data/ref/ruby/files/samp/pipelined_alu/hw5_unit_design_rb.html +107 -0
  330. data/ref/ruby/files/samp/pipelined_alu/hw5_unit_spec_rb.html +112 -0
  331. data/ref/ruby/fr_class_index.html +46 -0
  332. data/ref/ruby/fr_file_index.html +55 -0
  333. data/ref/ruby/fr_method_index.html +77 -0
  334. data/ref/ruby/index.html +24 -0
  335. data/ref/ruby/rdoc-style.css +208 -0
  336. data/samp/counter/Rakefile +1 -0
  337. data/samp/counter/counter.v +20 -0
  338. data/samp/counter/counter_rspecTest_bench.rb +9 -0
  339. data/samp/counter/counter_rspecTest_bench.v +28 -0
  340. data/samp/counter/counter_rspecTest_design.rb +22 -0
  341. data/samp/counter/counter_rspecTest_proto.rb +10 -0
  342. data/samp/counter/counter_rspecTest_runner.rake +28 -0
  343. data/samp/counter/counter_rspecTest_spec.rb +47 -0
  344. data/samp/counter/counter_unitTest_bench.rb +9 -0
  345. data/samp/counter/counter_unitTest_bench.v +28 -0
  346. data/samp/counter/counter_unitTest_design.rb +22 -0
  347. data/samp/counter/counter_unitTest_proto.rb +10 -0
  348. data/samp/counter/counter_unitTest_runner.rake +28 -0
  349. data/samp/counter/counter_unitTest_spec.rb +49 -0
  350. data/samp/pipelined_alu/Hw5UnitModel.rb +134 -0
  351. data/samp/pipelined_alu/InputGenerator.rb +94 -0
  352. data/samp/pipelined_alu/README +127 -0
  353. data/samp/pipelined_alu/Rakefile +1 -0
  354. data/samp/pipelined_alu/TestHw5UnitModel.rb +88 -0
  355. data/samp/pipelined_alu/hw5_unit.v +186 -0
  356. data/samp/pipelined_alu/hw5_unit_bench.rb +8 -0
  357. data/samp/pipelined_alu/hw5_unit_bench.v +45 -0
  358. data/samp/pipelined_alu/hw5_unit_design.rb +18 -0
  359. data/samp/pipelined_alu/hw5_unit_runner.rake +10 -0
  360. data/samp/pipelined_alu/hw5_unit_spec.rb +123 -0
  361. data/tpl/launcher.rake +30 -0
  362. data/tpl/runner.rake +96 -0
  363. data/tpl/synopsys_vcs.tab +2 -0
  364. metadata +484 -0
@@ -0,0 +1,41 @@
1
+ =begin
2
+ Copyright 2006 Suraj N. Kurapati
3
+
4
+ This file is part of Ruby-VPI.
5
+
6
+ Ruby-VPI is free software; you can redistribute it and/or
7
+ modify it under the terms of the GNU General Public License
8
+ as published by the Free Software Foundation; either version 2
9
+ of the License, or (at your option) any later version.
10
+
11
+ Ruby-VPI is distributed in the hope that it will be useful,
12
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ GNU General Public License for more details.
15
+
16
+ You should have received a copy of the GNU General Public License
17
+ along with Ruby-VPI; if not, write to the Free Software Foundation,
18
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19
+ =end
20
+
21
+ require 'erb'
22
+
23
+ # A version of ERB whose embedding tags behave like those of PHP. That is, only <%= ... %> tags produce output, whereas <% ... %> tags do *not* produce any output.
24
+ class ERB
25
+ alias original_initialize initialize
26
+
27
+ def initialize aInput, *aArgs
28
+ # ensure that only <%= ... %> tags generate output
29
+ input = aInput.gsub %r{<%=.*?%>}m do |s|
30
+ if ($' =~ /\r?\n/) == 0
31
+ s << $&
32
+ else
33
+ s
34
+ end
35
+ end
36
+
37
+ aArgs[1] = '>'
38
+
39
+ original_initialize input, *aArgs
40
+ end
41
+ end
@@ -0,0 +1,35 @@
1
+ =begin
2
+ Copyright 2006 Suraj N. Kurapati
3
+
4
+ This file is part of Ruby-VPI.
5
+
6
+ Ruby-VPI is free software; you can redistribute it and/or
7
+ modify it under the terms of the GNU General Public License
8
+ as published by the Free Software Foundation; either version 2
9
+ of the License, or (at your option) any later version.
10
+
11
+ Ruby-VPI is distributed in the hope that it will be useful,
12
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ GNU General Public License for more details.
15
+
16
+ You should have received a copy of the GNU General Public License
17
+ along with Ruby-VPI; if not, write to the Free Software Foundation,
18
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19
+ =end
20
+
21
+ require 'fileutils'
22
+
23
+ module FileUtils
24
+ alias old_sh sh
25
+
26
+ # An improved sh() that also accepts arrays as arguments.
27
+ def sh *aArgs, &aBlock
28
+ old_sh *collect_args(aArgs).reject {|i| i.to_s.empty?}, &aBlock
29
+ end
30
+
31
+ # Collects the given arguments into a single, sparse array.
32
+ def collect_args *aArgs
33
+ aArgs.flatten.compact
34
+ end
35
+ end
@@ -0,0 +1,51 @@
1
+ =begin
2
+ Copyright 2006 Suraj N. Kurapati
3
+ Copyright 2004 Dave Thomas
4
+
5
+ This file is part of Ruby-VPI.
6
+
7
+ Ruby-VPI is free software; you can redistribute it and/or
8
+ modify it under the terms of the GNU General Public License
9
+ as published by the Free Software Foundation; either version 2
10
+ of the License, or (at your option) any later version.
11
+
12
+ Ruby-VPI is distributed in the hope that it will be useful,
13
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
+ GNU General Public License for more details.
16
+
17
+ You should have received a copy of the GNU General Public License
18
+ along with Ruby-VPI; if not, write to the Free Software Foundation,
19
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20
+ =end
21
+
22
+ require 'rdoc/usage'
23
+
24
+ module RDoc
25
+ # Display usage information from RDoc comments in the given file.
26
+ def RDoc.usage_from_file input_file, *args
27
+ comment = File.open(input_file) do |file|
28
+ find_comment(file)
29
+ end
30
+
31
+ comment = comment.gsub(/^\s*#/, '')
32
+
33
+ markup = SM::SimpleMarkup.new
34
+ flow_convertor = SM::ToFlow.new
35
+
36
+ flow = markup.convert(comment, flow_convertor)
37
+
38
+ format = "plain"
39
+
40
+ unless args.empty?
41
+ flow = extract_sections(flow, args)
42
+ end
43
+
44
+ options = RI::Options.instance
45
+ if args = ENV["RI"]
46
+ options.parse(args.split)
47
+ end
48
+ formatter = options.formatter.new(options, "")
49
+ formatter.display_flow(flow)
50
+ end
51
+ end
@@ -0,0 +1,32 @@
1
+ # Bootstraps the RSpec library from within Ruby.
2
+
3
+ =begin
4
+ Copyright 2006 Suraj N. Kurapati
5
+ Copyright 2006 RSpec project
6
+
7
+ This file is part of Ruby-VPI.
8
+
9
+ Ruby-VPI is free software; you can redistribute it and/or
10
+ modify it under the terms of the GNU General Public License
11
+ as published by the Free Software Foundation; either version 2
12
+ of the License, or (at your option) any later version.
13
+
14
+ Ruby-VPI is distributed in the hope that it will be useful,
15
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
16
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
+ GNU General Public License for more details.
18
+
19
+ You should have received a copy of the GNU General Public License
20
+ along with Ruby-VPI; if not, write to the Free Software Foundation,
21
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22
+ =end
23
+
24
+ require 'rubygems'
25
+ require_gem 'rspec', '>= 0.5.4'
26
+ require 'spec'
27
+
28
+ # prevent RSpec termination when no arguments are provided
29
+ ARGV.unshift ''
30
+
31
+ $context_runner = ::Spec::Runner::OptionParser.create_context_runner(ARGV, false, STDERR, STDOUT)
32
+ at_exit {$context_runner.run false}
@@ -0,0 +1,22 @@
1
+ =begin
2
+ Copyright 2006 Suraj N. Kurapati
3
+
4
+ This file is part of Ruby-VPI.
5
+
6
+ Ruby-VPI is free software; you can redistribute it and/or
7
+ modify it under the terms of the GNU General Public License
8
+ as published by the Free Software Foundation; either version 2
9
+ of the License, or (at your option) any later version.
10
+
11
+ Ruby-VPI is distributed in the hope that it will be useful,
12
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ GNU General Public License for more details.
15
+
16
+ You should have received a copy of the GNU General Public License
17
+ along with Ruby-VPI; if not, write to the Free Software Foundation,
18
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19
+ =end
20
+
21
+ require 'ruby-vpi'
22
+ RubyVPI.load_runner_template
@@ -0,0 +1,310 @@
1
+ # A utility layer which transforms the VPI interface into one that is more suitable for Ruby.
2
+
3
+ =begin
4
+ Copyright 2006 Suraj N. Kurapati
5
+
6
+ This file is part of Ruby-VPI.
7
+
8
+ Ruby-VPI is free software; you can redistribute it and/or
9
+ modify it under the terms of the GNU General Public License
10
+ as published by the Free Software Foundation; either version 2
11
+ of the License, or (at your option) any later version.
12
+
13
+ Ruby-VPI is distributed in the hope that it will be useful,
14
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ GNU General Public License for more details.
17
+
18
+ You should have received a copy of the GNU General Public License
19
+ along with Ruby-VPI; if not, write to the Free Software Foundation,
20
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21
+ =end
22
+
23
+ module SWIG
24
+ =begin rdoc
25
+ This class represents an object inside a Verilog simulation. Such an object is known as a _handle_ in Verilog jargon. See *vpiHandle* in IEEE Std. 1364-2005 for details.
26
+
27
+ = Reading and writing values
28
+ There are several ways to read and write a handle's value, depending on its representation.
29
+
30
+ == Using +S_vpi_value+ objects
31
+ You can read and write values using +S_vpi_value+ objects through the following methods.
32
+ * #get_value_wrapper
33
+ * Vpi::vpi_get_value
34
+ * Vpi::vpi_put_value
35
+
36
+ == Using values and formats
37
+ You can read and write values, while specifying their format, through the following methods.
38
+ * value = handle.#get_value(format)
39
+ * handle.#put_value(value, format)
40
+
41
+ == Using values directly
42
+ You can read and write values directly, while implicitly specifying their format, through several shortcut methods. The names of these methods can be determined by (1) taking the name of a VPI value format listed in the *VALUE_FORMAT_NAMES* array, (2) removing the "Vpi" prefix, and (3) converting the first character into lower-case.
43
+
44
+ For example, the shortcut methods for reading and writing values using the <tt><b>Vpi</b><em>I</em>ntVal</tt> format are:
45
+ * intVal
46
+ * intVal=
47
+
48
+ The methods shown above can be used like so:
49
+ * value = handle.#intVal
50
+ * handle.#intVal = value
51
+
52
+ == Examples of all approaches
53
+ To read a handle's value as an integer:
54
+ * handle.#get_value(VpiIntVal)
55
+ * handle.intVal
56
+
57
+ To write a handle's value as an integer:
58
+ * handle.#put_value(15, VpiIntVal)
59
+ * handle.intVal = 15
60
+ =end
61
+ class TYPE_p_unsigned_int
62
+ include Vpi
63
+
64
+ # Reads the value using the given format and returns a +S_vpi_value+ object.
65
+ def get_value_wrapper aFormat
66
+ val = S_vpi_value.new
67
+ val.format = aFormat
68
+
69
+ vpi_get_value self, val
70
+ val
71
+ end
72
+
73
+ # Reads the value using the given format and returns it. If a format is not given, then the Verilog simulator will attempt to determine the correct format.
74
+ def get_value aFormat = VpiObjTypeVal
75
+ val = get_value_wrapper(aFormat)
76
+
77
+ case val.format
78
+ when VpiBinStrVal, VpiOctStrVal, VpiDecStrVal, VpiHexStrVal, VpiStringVal
79
+ val.value.str
80
+
81
+ when VpiScalarVal
82
+ val.value.scalar
83
+
84
+ when VpiIntVal
85
+ get_value_wrapper(VpiHexStrVal).value.str.to_i(16)
86
+
87
+ when VpiRealVal
88
+ val.value.real
89
+
90
+ when VpiTimeVal
91
+ val.value.time
92
+
93
+ when VpiVectorVal
94
+ val.value.vector
95
+
96
+ when VpiStrengthVal
97
+ val.value.strength
98
+
99
+ else
100
+ raise "unknown S_vpi_value.format: #{val.format}"
101
+ end
102
+ end
103
+
104
+ # Writes the given value using the given format, time, and delay, and then returns the given value. If a format is not given, then the Verilog simulator will attempt to determine the correct format.
105
+ def put_value aValue, aFormat = nil, aTime = nil, aDelay = VpiNoDelay
106
+ aFormat ||= get_value_wrapper(VpiObjTypeVal).format
107
+
108
+ newVal = S_vpi_value.new
109
+ newVal.format = aFormat
110
+
111
+ case aFormat
112
+ when VpiBinStrVal, VpiOctStrVal, VpiDecStrVal, VpiHexStrVal, VpiStringVal
113
+ newVal.value.str = aValue.to_s
114
+
115
+ when VpiScalarVal
116
+ newVal.value.scalar = aValue
117
+
118
+ when VpiIntVal
119
+ newVal.format = VpiHexStrVal
120
+ newVal.value.str = aValue.to_i.to_s(16)
121
+
122
+ when VpiRealVal
123
+ newVal.value.real = aValue.to_f
124
+
125
+ when VpiTimeVal
126
+ newVal.value.time = aValue
127
+
128
+ when VpiVectorVal
129
+ newVal.value.vector = aValue
130
+
131
+ when VpiStrengthVal
132
+ newVal.value.strength = aValue
133
+
134
+ else
135
+ raise "unknown S_vpi_value.format: #{newVal.format}"
136
+ end
137
+
138
+ vpi_put_value self, newVal, aTime, aDelay
139
+
140
+ # ensure that value was written correctly
141
+ readenVal = get_value(aFormat)
142
+
143
+ writtenCorrectly =
144
+ case aFormat
145
+ when VpiBinStrVal, VpiOctStrVal, VpiDecStrVal, VpiHexStrVal
146
+ if aValue =~ /[xz]/i # TODO: verify 'z' behavior
147
+ readenVal =~ /[xz]/i
148
+ else
149
+ readenVal == aValue.to_s
150
+ end
151
+
152
+ when VpiStringVal
153
+ readenVal == aValue.to_s
154
+
155
+ when VpiIntVal
156
+ # allow for register overflow when limit reached
157
+ readenVal == (aValue.to_i % (2 ** self.vpiSize))
158
+
159
+ when VpiRealVal
160
+ readenVal == aValue.to_f
161
+
162
+ else
163
+ true
164
+ end
165
+
166
+ unless writtenCorrectly
167
+ raise "value written (#{aValue.inspect}) does not match value read (#{readenVal.inspect}) from handle #{self}"
168
+ end
169
+
170
+ aValue
171
+ end
172
+
173
+ HINT_REGEXP = %r{_([a-z])$}
174
+ ASSIGN_REGEXP = %r{=$}
175
+ QUERY_REGEXP = %r{\?$}
176
+ PREFIX_REGEXP = %r{^(.*?)_}
177
+
178
+ # Enables read and write access to VPI properties of this handle.
179
+ def method_missing aMsg, *aArgs, &aBlockArg
180
+ methName = aMsg.to_s
181
+
182
+ # determine if property is being written
183
+ if isAssign = methName =~ ASSIGN_REGEXP
184
+ methName.sub! ASSIGN_REGEXP, ''
185
+ end
186
+
187
+ # determine if property is being queried
188
+ if isQuery = methName =~ QUERY_REGEXP
189
+ methName.sub! QUERY_REGEXP, ''
190
+ end
191
+
192
+ # parse Accessor parameter
193
+ if accessor = methName[HINT_REGEXP, 1]
194
+ methName.sub! HINT_REGEXP, ''
195
+ end
196
+
197
+ # parse Operation parameter
198
+ if operation = methName[PREFIX_REGEXP, 1]
199
+ methName.sub! PREFIX_REGEXP, ''
200
+ end
201
+
202
+ # resolve Property parameter into a valid VPI property
203
+ propName = methName[0, 1].upcase << methName[1..-1]
204
+ propName.insert(0, 'Vpi') unless methName =~ /^vpi/
205
+
206
+ puts '', Kernel.caller.join("\n"), '', "operation: #{operation}", "meth: #{aMsg}", "args: #{aArgs.inspect}", "name: #{methName}", "prop: #{propName}", "assign: #{isAssign}", "query: #{isQuery}" if $DEBUG
207
+
208
+ begin
209
+ prop = Vpi.const_get(propName)
210
+ rescue NameError
211
+ raise ArgumentError, "invalid VPI property `#{propName}'"
212
+ end
213
+
214
+ # access the VPI property
215
+ if operation
216
+ return self.send(operation.to_sym, prop, *aArgs, &aBlockArg)
217
+ else
218
+ loop do
219
+ puts "looping, accessor: #{accessor}" if $DEBUG
220
+
221
+ case accessor
222
+ when 'd' # delay values
223
+ if isAssign
224
+ # TODO: vpi_put_delays
225
+ else
226
+ # TODO: vpi_get_delays
227
+ end
228
+
229
+ when 'l' # logic values
230
+ if isAssign
231
+ value = aArgs.shift
232
+ return put_value(value, prop, *aArgs)
233
+ else
234
+ return get_value(prop)
235
+ end
236
+
237
+ when 'i' # integer values
238
+ return vpi_get(prop, self) unless isAssign
239
+
240
+ when 'b' # boolean values
241
+ unless isAssign
242
+ value = vpi_get(prop, self)
243
+ return value && (value != 0) # zero is false in C
244
+ end
245
+
246
+ when 's' # string values
247
+ return vpi_get_str(prop, self) unless isAssign
248
+
249
+ when 'h' # handle values
250
+ return vpi_handle(prop, self) unless isAssign
251
+
252
+ else # accessor not specified. guess its value from property name
253
+ if isQuery
254
+ accessor = 'b'
255
+ redo
256
+ end
257
+
258
+ case propName
259
+ when /Time$/
260
+ accessor = 'd'
261
+ redo
262
+
263
+ when /Val$/
264
+ accessor = 'l'
265
+ redo
266
+
267
+ when /Type$/, /Direction$/, /Index$/, /Size$/, /Strength\d?$/, /Polarity$/, /Edge$/, /Offset$/, /Mode$/
268
+ accessor = 'i'
269
+ redo
270
+
271
+ when /Is[A-Z]/, /ed$/
272
+ accessor = 'b'
273
+ redo
274
+
275
+ when /Name$/, /File$/, /Decompile$/
276
+ accessor = 's'
277
+ redo
278
+
279
+ when /Parent$/, /Inst$/, /Range$/, /Driver$/, /Net$/, /Load$/, /Conn$/, /Bit$/, /Word$/, /[LR]hs$/, /(In|Out)$/, /Term$/, /Argument$/, /Condition$/, /Use$/, /Operand$/, /Stmt$/, /Expr$/, /Scope$/, /Memory$/, /Delay$/
280
+ accessor = 'h'
281
+ redo
282
+ end
283
+ end
284
+
285
+ break
286
+ end
287
+ end
288
+
289
+ raise NoMethodError, "unable to access VPI property `#{propName}' through method `#{aMsg}' with arguments `#{aArgs.inspect}' for handle #{self}"
290
+ end
291
+
292
+ # Returns an array of handles of the given type.
293
+ def [] aType
294
+ handles = []
295
+
296
+ if itr = vpi_iterate(aType, self)
297
+ while h = vpi_scan(itr)
298
+ handles << h
299
+ end
300
+ end
301
+
302
+ handles
303
+ end
304
+
305
+ # Iterates over all handles of the given type and executes the given block once for each handle.
306
+ def each aType, &aBlock # :yields: handle
307
+ self[aType].each(&aBlock)
308
+ end
309
+ end
310
+ end
data/lib/ruby-vpi.rb ADDED
@@ -0,0 +1,58 @@
1
+ =begin
2
+ Copyright 2006 Suraj N. Kurapati
3
+
4
+ This file is part of Ruby-VPI.
5
+
6
+ Ruby-VPI is free software; you can redistribute it and/or
7
+ modify it under the terms of the GNU General Public License
8
+ as published by the Free Software Foundation; either version 2
9
+ of the License, or (at your option) any later version.
10
+
11
+ Ruby-VPI is distributed in the hope that it will be useful,
12
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
+ GNU General Public License for more details.
15
+
16
+ You should have received a copy of the GNU General Public License
17
+ along with Ruby-VPI; if not, write to the Free Software Foundation,
18
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19
+ =end
20
+
21
+ # Provides configuration information of the Ruby-VPI project.
22
+ module RubyVPI
23
+ LIBRARY_PATH = File.dirname(__FILE__)
24
+ PATH = File.dirname(LIBRARY_PATH)
25
+ TEMPLATE_PATH = File.join(PATH, 'tpl')
26
+ OBJECT_PATH = File.join(PATH, 'obj')
27
+
28
+ # Loads the test runner template.
29
+ def self.load_runner_template
30
+ load File.join(TEMPLATE_PATH, 'runner.rake')
31
+ end
32
+
33
+ # Initializes the current bench using the given parameters.
34
+ def self.init_bench aTestPrefix, aProtoClassId
35
+ Vpi::relay_verilog # service the $ruby_init() callback
36
+
37
+ require 'ruby-vpi/vpi_util'
38
+
39
+ # load the design under test
40
+ require "#{aTestPrefix}_design.rb"
41
+
42
+ if ENV['PROTO']
43
+ require "#{aTestPrefix}_proto.rb"
44
+
45
+ proto = Kernel.const_get(aProtoClassId).new
46
+
47
+ Vpi.class_eval do
48
+ define_method :relay_verilog do
49
+ proto.simulate!
50
+ end
51
+ end
52
+
53
+ puts "#{aTestPrefix}: verifying prototype instead of design"
54
+ end
55
+
56
+ require "#{aTestPrefix}_spec.rb"
57
+ end
58
+ end
data/memo.html ADDED
@@ -0,0 +1,86 @@
1
+ <h1>Notes</h1>
2
+
3
+
4
+ <ul>
5
+ <li>When within Rake, rubygems is automatically available for use. no need to require() it again</li>
6
+ </ul>
7
+
8
+
9
+ <h1>Pending tasks</h1>
10
+
11
+
12
+ <ul>
13
+ <li>integrate RCov for coverage statistics</li>
14
+ </ul>
15
+
16
+
17
+ <ul>
18
+ <li>define handled methods in Vpi::method_missing for faster response
19
+ <ul>
20
+ <li>this has been verified as bottleneck from profiling data</li>
21
+ </ul></li>
22
+ </ul>
23
+
24
+
25
+ <ul>
26
+ <li>file bug report for Icarus 0.8 (l0_dcache)
27
+ <ul>
28
+ <li>try new icarus snapshot</li>
29
+ </ul></li>
30
+ </ul>
31
+
32
+
33
+ <ul>
34
+ <li><span class="caps">GHDL</span> simulator supports <span class="caps">VPI</span>
35
+ <ul>
36
+ <li>need way to invoke <span class="caps">VPI</span> tasks from <span class="caps">VHDL</span>, like <code>$ruby_init();</code></li>
37
+ </ul></li>
38
+ </ul>
39
+
40
+
41
+ <ul>
42
+ <li>smarter test generation, which adjusts to user modifications in previously generated output</li>
43
+ </ul>
44
+
45
+
46
+ <h1>Finished tasks</h1>
47
+
48
+
49
+ <ul>
50
+ <li>add support for <span class="caps">ESL</span> prototyping (like SystemC)</li>
51
+ </ul>
52
+
53
+
54
+ <ul>
55
+ <li>decouple code generation with $RUBYLIB and erb</li>
56
+ </ul>
57
+
58
+
59
+ <ul>
60
+ <li>change should_be to should_equal in examples</li>
61
+ </ul>
62
+
63
+
64
+ <ul>
65
+ <li>add support for <span class="caps">GPL</span> Cver in the test runner template</li>
66
+ </ul>
67
+
68
+
69
+ <ul>
70
+ <li>build ruby-vpi once to generate all <strong>.so files
71
+ <ul>
72
+ <li>test runner should not rebuild ruby-vpi every time</li>
73
+ </ul></li>
74
+ </ul>
75
+
76
+
77
+ <ul>
78
+ <li>distribute as a <span class="caps">GEM</span>, binary, and source
79
+ <ul>
80
+ <li>use <span class="caps">RUBYLIB</span> to bypass rubygems site installation for local testing. otherwise have to build &#38; install gem <em>every</em> time!</li>
81
+ <li>put lib/</strong> into lib/ruby-vpi/*</li>
82
+ </ul></li>
83
+ </ul>
84
+
85
+
86
+ <h1>Obsolete tasks</h1>
data/readme.html ADDED
@@ -0,0 +1,19 @@
1
+ <h1>Welcome to Ruby-VPI</h1>
2
+
3
+
4
+ <p>Ruby-VPI is a Ruby interface to Verilog <span class="caps">VPI</span>. It lets you create complex Verilog test benches easily and wholly in Ruby.</p>
5
+
6
+
7
+ <ul>
8
+ <li>See the <a href="./doc/">user manual</a> to begin using Ruby-VPI.</li>
9
+ </ul>
10
+
11
+
12
+ <ul>
13
+ <li>See the <a href="./history.html">release history</a> to see what is new in this release.</li>
14
+ </ul>
15
+
16
+
17
+ <ul>
18
+ <li>Visit the <a href="http://ruby-vpi.rubyforge.org">project website</a> for additional resources.</li>
19
+ </ul>