HDLRuby 2.0.8

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 (224) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.travis.yml +5 -0
  4. data/.yardopts +1 -0
  5. data/Gemfile +4 -0
  6. data/HDLRuby.gemspec +36 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +2774 -0
  9. data/README.pdf +0 -0
  10. data/Rakefile +10 -0
  11. data/bin/console +14 -0
  12. data/bin/setup +8 -0
  13. data/exe/hdrcc +3 -0
  14. data/lib/HDLRuby/alcc.rb +137 -0
  15. data/lib/HDLRuby/backend/hruby_allocator.rb +69 -0
  16. data/lib/HDLRuby/backend/hruby_c_allocator.rb +76 -0
  17. data/lib/HDLRuby/hdr_samples/adder.rb +7 -0
  18. data/lib/HDLRuby/hdr_samples/adder_assign_error.rb +11 -0
  19. data/lib/HDLRuby/hdr_samples/adder_bench.rb +27 -0
  20. data/lib/HDLRuby/hdr_samples/adder_gen.rb +7 -0
  21. data/lib/HDLRuby/hdr_samples/adder_nodef_error.rb +7 -0
  22. data/lib/HDLRuby/hdr_samples/addsub.rb +19 -0
  23. data/lib/HDLRuby/hdr_samples/addsubz.rb +22 -0
  24. data/lib/HDLRuby/hdr_samples/alu.rb +47 -0
  25. data/lib/HDLRuby/hdr_samples/calculator.rb +48 -0
  26. data/lib/HDLRuby/hdr_samples/counter_bench.rb +83 -0
  27. data/lib/HDLRuby/hdr_samples/dff.rb +9 -0
  28. data/lib/HDLRuby/hdr_samples/dff_bench.rb +66 -0
  29. data/lib/HDLRuby/hdr_samples/dff_counter.rb +20 -0
  30. data/lib/HDLRuby/hdr_samples/include.rb +14 -0
  31. data/lib/HDLRuby/hdr_samples/instance_open.rb +23 -0
  32. data/lib/HDLRuby/hdr_samples/mei8.rb +256 -0
  33. data/lib/HDLRuby/hdr_samples/mei8_bench.rb +309 -0
  34. data/lib/HDLRuby/hdr_samples/multer_gen.rb +8 -0
  35. data/lib/HDLRuby/hdr_samples/multer_seq.rb +29 -0
  36. data/lib/HDLRuby/hdr_samples/neural/a.rb +9 -0
  37. data/lib/HDLRuby/hdr_samples/neural/a_sub.rb +5 -0
  38. data/lib/HDLRuby/hdr_samples/neural/bw.rb +23 -0
  39. data/lib/HDLRuby/hdr_samples/neural/counter.rb +16 -0
  40. data/lib/HDLRuby/hdr_samples/neural/dadz.rb +9 -0
  41. data/lib/HDLRuby/hdr_samples/neural/dadz_sub.rb +4 -0
  42. data/lib/HDLRuby/hdr_samples/neural/forward.rb +153 -0
  43. data/lib/HDLRuby/hdr_samples/neural/forward_sub.rb +62 -0
  44. data/lib/HDLRuby/hdr_samples/neural/forward_sub_rand.rb +41 -0
  45. data/lib/HDLRuby/hdr_samples/neural/forward_sub_rand_typedef.rb +47 -0
  46. data/lib/HDLRuby/hdr_samples/neural/mem.rb +30 -0
  47. data/lib/HDLRuby/hdr_samples/neural/random.rb +23 -0
  48. data/lib/HDLRuby/hdr_samples/neural/selector.rb +29 -0
  49. data/lib/HDLRuby/hdr_samples/neural/sigmoid.rb +20 -0
  50. data/lib/HDLRuby/hdr_samples/neural/z.rb +33 -0
  51. data/lib/HDLRuby/hdr_samples/prog.obj +256 -0
  52. data/lib/HDLRuby/hdr_samples/ram.rb +18 -0
  53. data/lib/HDLRuby/hdr_samples/register_with_code_bench.rb +98 -0
  54. data/lib/HDLRuby/hdr_samples/rom.rb +10 -0
  55. data/lib/HDLRuby/hdr_samples/struct.rb +14 -0
  56. data/lib/HDLRuby/hdr_samples/sumprod.rb +29 -0
  57. data/lib/HDLRuby/hdr_samples/sw_encrypt_bench.rb +103 -0
  58. data/lib/HDLRuby/hdr_samples/sw_encrypt_cpu_bench.rb +261 -0
  59. data/lib/HDLRuby/hdr_samples/sw_encrypt_cpusim_bench.rb +302 -0
  60. data/lib/HDLRuby/hdr_samples/system_open.rb +11 -0
  61. data/lib/HDLRuby/hdr_samples/tuple.rb +16 -0
  62. data/lib/HDLRuby/hdr_samples/with_channel.rb +118 -0
  63. data/lib/HDLRuby/hdr_samples/with_class.rb +199 -0
  64. data/lib/HDLRuby/hdr_samples/with_decoder.rb +17 -0
  65. data/lib/HDLRuby/hdr_samples/with_fsm.rb +34 -0
  66. data/lib/HDLRuby/hdr_samples/with_reconf.rb +103 -0
  67. data/lib/HDLRuby/hdrcc.rb +623 -0
  68. data/lib/HDLRuby/high_samples/_adder_fault.rb +23 -0
  69. data/lib/HDLRuby/high_samples/_generic_transmission2.rb +146 -0
  70. data/lib/HDLRuby/high_samples/adder.rb +21 -0
  71. data/lib/HDLRuby/high_samples/adder_common_errors.rb +25 -0
  72. data/lib/HDLRuby/high_samples/addsub.rb +33 -0
  73. data/lib/HDLRuby/high_samples/addsubz.rb +37 -0
  74. data/lib/HDLRuby/high_samples/after.rb +28 -0
  75. data/lib/HDLRuby/high_samples/all_signals.rb +29 -0
  76. data/lib/HDLRuby/high_samples/alu.rb +61 -0
  77. data/lib/HDLRuby/high_samples/anonymous.rb +41 -0
  78. data/lib/HDLRuby/high_samples/before.rb +28 -0
  79. data/lib/HDLRuby/high_samples/blockblock.rb +26 -0
  80. data/lib/HDLRuby/high_samples/bugs/dadz.rb +22 -0
  81. data/lib/HDLRuby/high_samples/bugs/misample_instan.rb +20 -0
  82. data/lib/HDLRuby/high_samples/bugs/misample_updown.rb +22 -0
  83. data/lib/HDLRuby/high_samples/bugs/sample_add.rb +16 -0
  84. data/lib/HDLRuby/high_samples/bugs/sample_barrel.rb +13 -0
  85. data/lib/HDLRuby/high_samples/bugs/sample_daice.rb +57 -0
  86. data/lib/HDLRuby/high_samples/bugs/sample_kumiawase.rb +52 -0
  87. data/lib/HDLRuby/high_samples/bugs/sample_multi.rb +18 -0
  88. data/lib/HDLRuby/high_samples/bugs/sample_sub.rb +14 -0
  89. data/lib/HDLRuby/high_samples/bugs/z2.rb +32 -0
  90. data/lib/HDLRuby/high_samples/case.rb +32 -0
  91. data/lib/HDLRuby/high_samples/case2.rb +30 -0
  92. data/lib/HDLRuby/high_samples/change.rb +23 -0
  93. data/lib/HDLRuby/high_samples/clocks.rb +35 -0
  94. data/lib/HDLRuby/high_samples/comparer.rb +21 -0
  95. data/lib/HDLRuby/high_samples/conditionals.rb +29 -0
  96. data/lib/HDLRuby/high_samples/dff.rb +23 -0
  97. data/lib/HDLRuby/high_samples/each.rb +28 -0
  98. data/lib/HDLRuby/high_samples/exporter.rb +42 -0
  99. data/lib/HDLRuby/high_samples/functions.rb +60 -0
  100. data/lib/HDLRuby/high_samples/if_seq.rb +26 -0
  101. data/lib/HDLRuby/high_samples/inherit_as_dff.rb +32 -0
  102. data/lib/HDLRuby/high_samples/inherit_dff.rb +36 -0
  103. data/lib/HDLRuby/high_samples/instance.rb +37 -0
  104. data/lib/HDLRuby/high_samples/memory.rb +64 -0
  105. data/lib/HDLRuby/high_samples/multi_file.rb +27 -0
  106. data/lib/HDLRuby/high_samples/overload.rb +32 -0
  107. data/lib/HDLRuby/high_samples/paper_after.rb +49 -0
  108. data/lib/HDLRuby/high_samples/ram.rb +27 -0
  109. data/lib/HDLRuby/high_samples/registers.rb +139 -0
  110. data/lib/HDLRuby/high_samples/rom.rb +23 -0
  111. data/lib/HDLRuby/high_samples/scopeblockname.rb +37 -0
  112. data/lib/HDLRuby/high_samples/scopescope.rb +26 -0
  113. data/lib/HDLRuby/high_samples/shift.rb +31 -0
  114. data/lib/HDLRuby/high_samples/shift2.rb +40 -0
  115. data/lib/HDLRuby/high_samples/simple_instance.rb +31 -0
  116. data/lib/HDLRuby/high_samples/test_all.sh +10 -0
  117. data/lib/HDLRuby/high_samples/typedef.rb +24 -0
  118. data/lib/HDLRuby/high_samples/values.rb +70 -0
  119. data/lib/HDLRuby/high_samples/vector.rb +22 -0
  120. data/lib/HDLRuby/high_samples/with_decoder.rb +30 -0
  121. data/lib/HDLRuby/high_samples/with_fsm.rb +46 -0
  122. data/lib/HDLRuby/high_samples/with_pipe.rb +43 -0
  123. data/lib/HDLRuby/high_samples/with_seq.rb +25 -0
  124. data/lib/HDLRuby/hruby_bstr.rb +1085 -0
  125. data/lib/HDLRuby/hruby_check.rb +317 -0
  126. data/lib/HDLRuby/hruby_db.rb +432 -0
  127. data/lib/HDLRuby/hruby_error.rb +44 -0
  128. data/lib/HDLRuby/hruby_high.rb +4103 -0
  129. data/lib/HDLRuby/hruby_low.rb +4735 -0
  130. data/lib/HDLRuby/hruby_low2c.rb +1986 -0
  131. data/lib/HDLRuby/hruby_low2high.rb +738 -0
  132. data/lib/HDLRuby/hruby_low2seq.rb +248 -0
  133. data/lib/HDLRuby/hruby_low2sym.rb +126 -0
  134. data/lib/HDLRuby/hruby_low2vhd.rb +1437 -0
  135. data/lib/HDLRuby/hruby_low_bool2select.rb +295 -0
  136. data/lib/HDLRuby/hruby_low_cleanup.rb +193 -0
  137. data/lib/HDLRuby/hruby_low_fix_types.rb +437 -0
  138. data/lib/HDLRuby/hruby_low_mutable.rb +1803 -0
  139. data/lib/HDLRuby/hruby_low_resolve.rb +165 -0
  140. data/lib/HDLRuby/hruby_low_skeleton.rb +129 -0
  141. data/lib/HDLRuby/hruby_low_with_bool.rb +141 -0
  142. data/lib/HDLRuby/hruby_low_with_port.rb +167 -0
  143. data/lib/HDLRuby/hruby_low_with_var.rb +302 -0
  144. data/lib/HDLRuby/hruby_low_without_bit2vector.rb +88 -0
  145. data/lib/HDLRuby/hruby_low_without_concat.rb +162 -0
  146. data/lib/HDLRuby/hruby_low_without_connection.rb +113 -0
  147. data/lib/HDLRuby/hruby_low_without_namespace.rb +718 -0
  148. data/lib/HDLRuby/hruby_low_without_outread.rb +107 -0
  149. data/lib/HDLRuby/hruby_low_without_select.rb +206 -0
  150. data/lib/HDLRuby/hruby_serializer.rb +398 -0
  151. data/lib/HDLRuby/hruby_tools.rb +37 -0
  152. data/lib/HDLRuby/hruby_types.rb +239 -0
  153. data/lib/HDLRuby/hruby_values.rb +64 -0
  154. data/lib/HDLRuby/hruby_verilog.rb +1888 -0
  155. data/lib/HDLRuby/hruby_verilog_name.rb +52 -0
  156. data/lib/HDLRuby/low_samples/adder.yaml +97 -0
  157. data/lib/HDLRuby/low_samples/after.yaml +228 -0
  158. data/lib/HDLRuby/low_samples/before.yaml +223 -0
  159. data/lib/HDLRuby/low_samples/blockblock.yaml +48 -0
  160. data/lib/HDLRuby/low_samples/bugs/sample_add.yaml +97 -0
  161. data/lib/HDLRuby/low_samples/bugs/sample_daice.yaml +444 -0
  162. data/lib/HDLRuby/low_samples/bugs/sample_kumiawase.yaml +332 -0
  163. data/lib/HDLRuby/low_samples/bugs/sample_sub.yaml +97 -0
  164. data/lib/HDLRuby/low_samples/bugs/seqpar.yaml +184 -0
  165. data/lib/HDLRuby/low_samples/case.yaml +327 -0
  166. data/lib/HDLRuby/low_samples/change.yaml +135 -0
  167. data/lib/HDLRuby/low_samples/clocks.yaml +674 -0
  168. data/lib/HDLRuby/low_samples/cloner.rb +22 -0
  169. data/lib/HDLRuby/low_samples/comparer.yaml +85 -0
  170. data/lib/HDLRuby/low_samples/conditionals.yaml +133 -0
  171. data/lib/HDLRuby/low_samples/dff.yaml +107 -0
  172. data/lib/HDLRuby/low_samples/each.yaml +1328 -0
  173. data/lib/HDLRuby/low_samples/exporter.yaml +226 -0
  174. data/lib/HDLRuby/low_samples/functions.yaml +298 -0
  175. data/lib/HDLRuby/low_samples/generic_transmission.yaml +597 -0
  176. data/lib/HDLRuby/low_samples/inherit_as_dff.yaml +125 -0
  177. data/lib/HDLRuby/low_samples/inherit_dff.yaml +107 -0
  178. data/lib/HDLRuby/low_samples/load_yaml.rb +11 -0
  179. data/lib/HDLRuby/low_samples/memory.yaml +678 -0
  180. data/lib/HDLRuby/low_samples/namespace_extractor.rb +23 -0
  181. data/lib/HDLRuby/low_samples/overload.yaml +226 -0
  182. data/lib/HDLRuby/low_samples/paper_after.yaml +431 -0
  183. data/lib/HDLRuby/low_samples/port_maker.rb +14 -0
  184. data/lib/HDLRuby/low_samples/ram.yaml +207 -0
  185. data/lib/HDLRuby/low_samples/registers.yaml +228 -0
  186. data/lib/HDLRuby/low_samples/rom.yaml +2950 -0
  187. data/lib/HDLRuby/low_samples/shift.yaml +230 -0
  188. data/lib/HDLRuby/low_samples/shift2.yaml +2095 -0
  189. data/lib/HDLRuby/low_samples/simple_instance.yaml +102 -0
  190. data/lib/HDLRuby/low_samples/test_all.sh +43 -0
  191. data/lib/HDLRuby/low_samples/typedef.yaml +115 -0
  192. data/lib/HDLRuby/low_samples/values.yaml +577 -0
  193. data/lib/HDLRuby/low_samples/variable_maker.rb +14 -0
  194. data/lib/HDLRuby/low_samples/vector.yaml +56 -0
  195. data/lib/HDLRuby/low_samples/with_seq.yaml +188 -0
  196. data/lib/HDLRuby/low_samples/yaml2hdr.rb +10 -0
  197. data/lib/HDLRuby/low_samples/yaml2vhd.rb +19 -0
  198. data/lib/HDLRuby/sim/Makefile +19 -0
  199. data/lib/HDLRuby/sim/hruby_sim.h +590 -0
  200. data/lib/HDLRuby/sim/hruby_sim_calc.c +2362 -0
  201. data/lib/HDLRuby/sim/hruby_sim_core.c +589 -0
  202. data/lib/HDLRuby/sim/hruby_sim_list.c +93 -0
  203. data/lib/HDLRuby/sim/hruby_sim_vizualize.c +91 -0
  204. data/lib/HDLRuby/sim/hruby_value_pool.c +64 -0
  205. data/lib/HDLRuby/std/channel.rb +354 -0
  206. data/lib/HDLRuby/std/clocks.rb +165 -0
  207. data/lib/HDLRuby/std/counters.rb +82 -0
  208. data/lib/HDLRuby/std/decoder.rb +214 -0
  209. data/lib/HDLRuby/std/fsm.rb +516 -0
  210. data/lib/HDLRuby/std/pipeline.rb +220 -0
  211. data/lib/HDLRuby/std/reconf.rb +309 -0
  212. data/lib/HDLRuby/test_hruby_bstr.rb +2259 -0
  213. data/lib/HDLRuby/test_hruby_high.rb +594 -0
  214. data/lib/HDLRuby/test_hruby_high_low.rb +99 -0
  215. data/lib/HDLRuby/test_hruby_low.rb +934 -0
  216. data/lib/HDLRuby/v_samples/adder.v +10 -0
  217. data/lib/HDLRuby/v_samples/dff.v +12 -0
  218. data/lib/HDLRuby/v_samples/ram.v +20 -0
  219. data/lib/HDLRuby/v_samples/rom.v +270 -0
  220. data/lib/HDLRuby/version.rb +3 -0
  221. data/lib/HDLRuby.rb +11 -0
  222. data/makedoc +1 -0
  223. data/metadata.yaml +4 -0
  224. metadata +299 -0
data/README.pdf ADDED
Binary file
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.libs << "lib"
7
+ t.test_files = FileList['test/**/*_test.rb']
8
+ end
9
+
10
+ task :default => :test
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "HDLRuby"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
data/exe/hdrcc ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require 'HDLRuby/hdrcc.rb'
@@ -0,0 +1,137 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require 'fileutils'
4
+
5
+
6
+ ##
7
+ # Front-end to the Alliance tool chain for hdrcc vhdl results
8
+ ##############################################################
9
+
10
+ if $*.include?("--clean") then
11
+ # Clean mode.
12
+ `rm *.vbe *.vst *.xsc *.ap`
13
+ exit
14
+ end
15
+
16
+ ######################################################
17
+ # Initialization phase
18
+ #
19
+ # Process the options.
20
+ # For now there should only be the name of the main file.
21
+ $input = $*[0]
22
+
23
+ # Get the extension name, the base name and the path from the main file.
24
+ $extname = File.extname($input)
25
+ $basename = File.basename($input,$extname)
26
+ $path = File.dirname($input)
27
+ $fullname = $basename + $extname
28
+
29
+ # Go the the target directory.
30
+ Dir.chdir($path)
31
+
32
+ # Gather the files other than the main to treat.
33
+ $subfiles = Dir.foreach("./").select do |name|
34
+ File.extname(name) == $extname && name != $fullname
35
+ end
36
+ # And the all files to treat.
37
+ $allfiles = [$fullname] + $subfiles
38
+
39
+ # Generate the base names for the sub files.
40
+ # $subbases = $subfiles.map {|file| File.basename(file,$extname) }
41
+ # $basename_model = $basename + "_model"
42
+ # $subbases =[ $basename_model ] + $subbases
43
+ $allbases = $allfiles.map {|file| File.basename(file,$extname) }
44
+
45
+ ######################################################
46
+ # Compiling steps
47
+
48
+ # Conversion to alliance format.
49
+ $allfiles.each do |file|
50
+ cmd = "vasy -Vaop -I vhd #{file}"
51
+ puts cmd
52
+ `#{cmd}`
53
+ end
54
+
55
+ # # Check if there is a model have been generated.
56
+ # unless File.file?($basename_model + ".vbe") then
57
+ # # No model, single file case.
58
+ # $subbases = [ $basename ]
59
+ # end
60
+
61
+ # puts "$subbases=#{$subbases}"
62
+
63
+ # Boolean minimisation.
64
+ # $subbases.each do |base|
65
+ $allbases.each do |base|
66
+ if File.file?("#{base}.vbe") then
67
+ cmd = "boom -l 3 -d 50 #{base}.vbe"
68
+ puts cmd
69
+ `#{cmd}`
70
+ end
71
+ if File.file?("#{base}_model.vbe") then
72
+ cmd = "boom -l 3 -d 50 #{base}_model.vbe"
73
+ puts cmd
74
+ `#{cmd}`
75
+ end
76
+ end
77
+
78
+ # Structureal description generation.
79
+ # $subbases.each do |base|
80
+ $allbases.each do |base|
81
+ if File.file?("#{base}.vbe") then
82
+ cmd = "boog #{base}_o #{base} -x 1 -m 2"
83
+ puts cmd
84
+ `#{cmd}`
85
+ end
86
+ if File.file?("#{base}_model.vbe") then
87
+ cmd = "boog #{base}_model_o #{base}_model -x 1 -m 2"
88
+ puts cmd
89
+ `#{cmd}`
90
+ end
91
+ end
92
+
93
+ # Flattening and global optimization.
94
+ cmd = "loon #{$basename} #{$basename}_l -x 0 -m 0"
95
+ puts cmd
96
+ `#{cmd}`
97
+
98
+ # Placement.
99
+ cmd = "ocp #{$basename}_l #{$basename}_p"
100
+ puts cmd
101
+ `#{cmd}`
102
+
103
+ # Route.
104
+ cmd = "nero -V -G -6 -p #{$basename}_p #{$basename}_l #{$basename}_r"
105
+ puts cmd
106
+ `#{cmd}`
107
+
108
+ # Technology mapping.
109
+ cmd = "s2r -v #{$basename}_r #{$basename}_core"
110
+ puts cmd
111
+ `#{cmd}`
112
+
113
+
114
+ ## Other tools
115
+ #
116
+ # Simulation:
117
+ # `asimut #{$basename}_l #{$basename}_in #{$basename}_out`
118
+ #
119
+ # View simulation result:
120
+ # `xpat -l #{basename}_out`
121
+ #
122
+ # View P&R result:
123
+ # `graal`
124
+ #
125
+ # Extract netlist:
126
+ # `cougar #{$basename}_r #{$basename}_c`
127
+ #
128
+ # Check P&R result:
129
+ # `lvx vst al #{$basename} #{$basename}_c` or
130
+ # `lvx vst vst #{$basename} #{$basename}_c`
131
+ #
132
+ # DRC check:
133
+ # `druc #{$basename}_r`
134
+ #
135
+ # View techno mapping result:
136
+ # `dreal -l #{$basename}_core`
137
+ #
@@ -0,0 +1,69 @@
1
+ require "HDLRuby/hruby_error"
2
+
3
+
4
+
5
+ ##
6
+ # Adds methods for allocating addresses to signals in Code objects.
7
+ #
8
+ ########################################################################
9
+ module HDLRuby::Low
10
+
11
+ ## An allocator.
12
+ class Allocator
13
+
14
+ # The space range for the allocation.
15
+ attr_reader :range
16
+
17
+ # The word size.
18
+ attr_reader :word
19
+
20
+ ## Creates a new allocator within +range+ memory space whose word
21
+ # size is +word+.
22
+ def initialize(range, word = 8)
23
+ # Check and set the range.
24
+ first = range.first.to_i
25
+ last = range.last.to_i
26
+ @range = first < last ? first..last : last..first
27
+ # Check and set the word size.
28
+ @word = word.to_i
29
+ # Initialize the allocation counter.
30
+ @head = first
31
+ # Initialize the allocation table.
32
+ @table = {}
33
+ end
34
+
35
+ ## Allocates space for +signal+.
36
+ # NOTE: if the signal is already allocated, returns the previous
37
+ # allocation result.
38
+ def allocate(signal)
39
+ # Has the signal been already allocated?
40
+ if @table.key?(signal) then
41
+ # Yes return the allocation result.
42
+ return @table[signal]
43
+ end
44
+ # Get the size to allocate in word.
45
+ size = signal.type.width / @word
46
+ size += 1 unless signal.type.width % word == 0
47
+ # Is there any room left?
48
+ if @head + size > @range.last then
49
+ raise AnyError, "Address range overflow."
50
+ end
51
+ # Ok, performs the allocation.
52
+ res = @head
53
+ @head += size
54
+ @table[signal] = res
55
+ return res
56
+ end
57
+
58
+ ## Get the address of +signal+ if allocated.
59
+ def get(signal)
60
+ return @table[signal]
61
+ end
62
+
63
+ ## Iterate over the allocated signals and their corresponding address.
64
+ def each
65
+ @table.each
66
+ end
67
+ end
68
+
69
+ end
@@ -0,0 +1,76 @@
1
+ require "HDLRuby/hruby_error"
2
+ require "HDLRuby/hruby_low_resolve"
3
+ require "HDLRuby/backend/hruby_allocator"
4
+
5
+
6
+
7
+ ##
8
+ # Adds methods for allocating addresses to signals in Code objects and
9
+ # integrate the result into C code.
10
+ #
11
+ ########################################################################
12
+ module HDLRuby::Low
13
+
14
+ ## Extends the SystemT class with support for C allocation of signals.
15
+ class SystemT
16
+
17
+ ## Allocates signals within C code using +allocator+.
18
+ def c_code_allocate(allocator)
19
+ self.scope.c_code_allocate(allocator)
20
+ end
21
+ end
22
+
23
+
24
+ ## Extends the scope class with support for C allocation of signals.
25
+ class Scope
26
+
27
+ ## Allocates signals within C code using +allocator+.
28
+ def c_code_allocate(allocator)
29
+ # Interrate on the sub scopes.
30
+ self.each_scope { |scope| scope.c_code_allocate(allocator) }
31
+ # Ally thr allocator on the codes.
32
+ self.each_code { |code| code.c_code_allocate(allocator) }
33
+ end
34
+ end
35
+
36
+
37
+ ## Extends the chunk class with support for self modification with
38
+ # allocation.
39
+ # NOTE: only work if the chunk is in C language.
40
+ class Chunk
41
+
42
+ ## Allocates signal within C code using +allocator+ and self-modify
43
+ # the code correspondingly.
44
+ # NOTE: non-C chunks are ignored.
45
+ def c_code_allocate!(allocator)
46
+ # Checks the chunk is actually C.
47
+ return self unless self.name == :c
48
+ # Process each lump.
49
+ @lumps.map! do |lump|
50
+ lump_r = lump.resolve if lump.respond_to?(:resolve)
51
+ if lump_r.is_a?(SignalI) then
52
+ # The lump is a signal, performs the allocation and
53
+ # change it to an address access.
54
+ "*(0x#{allocator.allocate(lump_r).to_s(16)})"
55
+ else
56
+ lump
57
+ end
58
+ end
59
+ self
60
+ end
61
+ end
62
+
63
+
64
+ ## Extends the code class with support for C allocation of signals.
65
+ class Code
66
+
67
+ ## Allocates signals within C code using +allocator+.
68
+ def c_code_allocate(allocator)
69
+ # Apply the allocator on each C chunk.
70
+ self.each_chunk do |chunk|
71
+ chunk.c_code_allocate!(allocator) if chunk.name == :c
72
+ end
73
+ end
74
+ end
75
+
76
+ end
@@ -0,0 +1,7 @@
1
+ # A simple 16-bit adder
2
+ system :adder do
3
+ [15..0].input :x,:y
4
+ [16..0].output :s
5
+
6
+ s <= x + y
7
+ end
@@ -0,0 +1,11 @@
1
+ # A simple 16-bit adder
2
+ system :adder do
3
+ [15..0].input :x,:y
4
+ [16..0].output :s
5
+
6
+ s <= x + y
7
+
8
+ s = "tot"
9
+
10
+ S = "TT"
11
+ end
@@ -0,0 +1,27 @@
1
+ # A simple 16-bit adder
2
+ system :adder do
3
+ [15..0].input :x,:y
4
+ [16..0].output :s
5
+
6
+ s <= x + y
7
+ end
8
+
9
+ # A benchmark for the adder.
10
+ system :adder_bench do
11
+ [15..0].inner :x,:y
12
+ [16..0].inner :s
13
+
14
+ adder(:my_adder).(x,y,s)
15
+
16
+ timed do
17
+ x <= 0
18
+ y <= 0
19
+ !10.ns
20
+ x <= 1
21
+ y <= _zzzzzzzzzzzzzzzz
22
+ !10.ns
23
+ x <= 2
24
+ y <= 1
25
+ !10.ns
26
+ end
27
+ end
@@ -0,0 +1,7 @@
1
+ # A simple generic adder
2
+ system :adder do |w|
3
+ [(w-1)..0].input :x,:y
4
+ [w..0].output :s
5
+
6
+ s <= x + y
7
+ end
@@ -0,0 +1,7 @@
1
+ # A simple 16-bit adder
2
+ system :adder do
3
+ [15..0].input :x,:y
4
+ [16..0].output :u
5
+
6
+ s <= x + y
7
+ end
@@ -0,0 +1,19 @@
1
+ # An adder-suber
2
+ system :addsub do
3
+ input :opr
4
+ [15..0].input :x,:y
5
+ [16..0].output :s
6
+
7
+ # The only adder instance.
8
+ instance :add do
9
+ [15..0].input :x,:y
10
+ input :cin
11
+ [16..0].output :s
12
+
13
+ s <= x+y+cin
14
+ end
15
+
16
+ # Control part for choosing between add and sub.
17
+ hif(opr) { add.(x,~y,1,s) }
18
+ helse { add.(x,y,0,s) }
19
+ end
@@ -0,0 +1,22 @@
1
+ # An extended adder-suber
2
+ system :addsubz do
3
+ [1..0].input :opr
4
+ [15..0].input :x,:y
5
+ [16..0].output :s
6
+
7
+ # The only adder instance.
8
+ instance :add do
9
+ [15..0].input :x,:y
10
+ input :cin
11
+ [16..0].output :s
12
+
13
+ s <= x+y+cin
14
+ end
15
+
16
+ # The control part for choosing between 0, add, sub and neg.
17
+ hcase(opr)
18
+ hwhen(0) { add.(0,0,0,s) }
19
+ hwhen(1) { add.(x,y,0,s) }
20
+ hwhen(2) { add.(x,~y,1,s) }
21
+ helse { add.(0,~y,1,s) }
22
+ end
@@ -0,0 +1,47 @@
1
+ # A simple ALU
2
+ system :alu do
3
+ [4].input :opr
4
+ [16].input :x,:y
5
+ [16].output :s
6
+ output :zf, :cf, :sf, :vf
7
+
8
+ # The only adder instance.
9
+ instance :add do
10
+ [16].input :x,:y
11
+ input :cin
12
+ [17].output :s
13
+
14
+ s <= x+y+cin
15
+ end
16
+
17
+ # The control part for choosing between 0, add, sub and neg.
18
+ par do
19
+ # The main computation: s and cf
20
+ # Default connections
21
+ cf <= 0
22
+ vf <= 0
23
+ add.(0,0,0)
24
+ # Depending on the operator
25
+ hcase(opr)
26
+ hwhen(1) { s <= x }
27
+ hwhen(2) { s <= y }
28
+ hwhen(3) { add.(x ,y ,0,[cf,s])
29
+ vf <= (~x[15] & ~y[15] & s[15]) | (x[15] & y[15] & ~s[15]) }
30
+ hwhen(4) { add.(x ,~y,1,[cf,s])
31
+ vf <= (~x[15] & y[15] & s[15]) | (x[15] & ~y[15] & ~s[15]) }
32
+ hwhen(5) { add.(0 ,~y,1,[cf,s])
33
+ vf <= (~y[15] & s[15]) }
34
+ hwhen(6) { add.(~x,0 ,1,[cf,s])
35
+ vf <= (x[15] & ~s[15]) }
36
+ hwhen(7) { s <= x & y }
37
+ hwhen(8) { s <= x | y }
38
+ hwhen(9) { s <= x ^ y }
39
+ hwhen(10){ s <= ~x }
40
+ hwhen(11){ s <= ~y }
41
+ helse { s <= 0 }
42
+
43
+ # The remaining flags.
44
+ zf <= (s == 0)
45
+ sf <= s[15]
46
+ end
47
+ end
@@ -0,0 +1,48 @@
1
+ require '../std/fsm.rb'
2
+
3
+ include HDLRuby::High::Std
4
+
5
+ # Implementation of an 8-bit calculator.
6
+ system :calculator do
7
+ input :clk,:rst
8
+ [1..0].input :opr
9
+ [7..0].input :x, :y
10
+ [7..0].output :s
11
+ output :zf, :sf, :cf, :vf
12
+
13
+ [8..0].inner :tmp
14
+
15
+ def common
16
+ s <= tmp[7..0]
17
+ zf <= (s == 0)
18
+ sf <= tmp[7]
19
+ cf <= tmp[8]
20
+ vf <= tmp[8] ^ tmp[7]
21
+ goto(:choice)
22
+ end
23
+
24
+ fsm(clk.posedge,rst) do
25
+ state(:zero) do
26
+ s <= 0;
27
+ zf <= 0;
28
+ sf <= 0;
29
+ cf <= 0;
30
+ vf <= 0;
31
+ end
32
+ state(:choice) do
33
+ goto(opr, :add,:sub,:neg, :zero)
34
+ end
35
+ state(:add) do
36
+ tmp <= x + y
37
+ common
38
+ end
39
+ state(:sub) do
40
+ tmp <= x - y
41
+ common
42
+ end
43
+ state(:neg) do
44
+ tmp <= -x
45
+ common
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,83 @@
1
+ # A simple counter
2
+ system :counter do
3
+ input :clk, :rst
4
+ input :ctrl
5
+ [8].output :q
6
+ output :c
7
+
8
+ [8].inner :qq
9
+ inner :cc
10
+
11
+ instance :add do
12
+ [8].input :x,:y
13
+ [9].output :z
14
+
15
+ z <= x.as([9]) + y
16
+ end
17
+
18
+
19
+ par do
20
+ add.(q,0)
21
+ hif(rst) { [cc,qq] <= 0 }
22
+ helse do
23
+ add.(q,1,[cc,qq])
24
+ hif(ctrl == 1) { add.(q,-1,[cc,qq]) }
25
+ end
26
+ end
27
+
28
+ par(clk.posedge) do
29
+ q <= qq
30
+ c <= cc
31
+ end
32
+
33
+ end
34
+
35
+
36
+ # A benchmark for the counter.
37
+ system :counter_bench do
38
+ inner :clk, :rst
39
+ inner :ctrl
40
+ [8].inner :q
41
+ inner :c
42
+
43
+ counter(:my_counter).(clk,rst,ctrl,q,c)
44
+
45
+ timed do
46
+ clk <= 0
47
+ rst <= 0
48
+ ctrl <= 0
49
+ !10.ns
50
+ clk <= 1
51
+ rst <= 0
52
+ !10.ns
53
+ clk <= 0
54
+ rst <= 1
55
+ !10.ns
56
+ clk <= 1
57
+ rst <= 1
58
+ !10.ns
59
+ clk <= 0
60
+ rst <= 0
61
+ !10.ns
62
+ clk <= 1
63
+ rst <= 0
64
+ !10.ns
65
+ 10.times do
66
+ clk <= 0
67
+ rst <= 0
68
+ !10.ns
69
+ clk <= 1
70
+ rst <= 0
71
+ !10.ns
72
+ end
73
+ ctrl <= 1
74
+ 20.times do
75
+ clk <= 0
76
+ rst <= 0
77
+ !10.ns
78
+ clk <= 1
79
+ rst <= 0
80
+ !10.ns
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,9 @@
1
+ # A simple D-FF
2
+ system :dff do
3
+ input :clk, :rst, :d
4
+ output :q, :qb
5
+
6
+ qb <= ~q
7
+
8
+ par(clk.posedge) { q <= d & ~rst }
9
+ end
@@ -0,0 +1,66 @@
1
+ # A simple D-FF
2
+ system :dff do
3
+ input :d, :clk, :rst
4
+ output :q
5
+
6
+ (q <= d & ~rst).at(clk.posedge)
7
+ end
8
+
9
+ # A benchmark for the dff.
10
+ system :dff_bench do
11
+ inner :d, :clk, :rst
12
+ inner :q
13
+
14
+ dff(:my_dff).(d,clk,rst,q)
15
+
16
+ timed do
17
+ clk <= 0
18
+ rst <= 0
19
+ d <= _z
20
+ !10.ns
21
+ clk <= 1
22
+ rst <= 0
23
+ d <= _z
24
+ !10.ns
25
+ clk <= 0
26
+ rst <= 1
27
+ d <= _z
28
+ !10.ns
29
+ clk <= 1
30
+ rst <= 1
31
+ d <= _z
32
+ !10.ns
33
+ clk <= 0
34
+ rst <= 0
35
+ d <= 1
36
+ !10.ns
37
+ clk <= 1
38
+ rst <= 0
39
+ d <= 1
40
+ !10.ns
41
+ clk <= 0
42
+ rst <= 0
43
+ d <= 1
44
+ !10.ns
45
+ clk <= 1
46
+ rst <= 0
47
+ d <= 1
48
+ !10.ns
49
+ clk <= 0
50
+ rst <= 0
51
+ d <= 0
52
+ !10.ns
53
+ clk <= 1
54
+ rst <= 0
55
+ d <= 0
56
+ !10.ns
57
+ clk <= 0
58
+ rst <= 0
59
+ d <= 0
60
+ !10.ns
61
+ clk <= 1
62
+ rst <= 0
63
+ d <= 0
64
+ !10.ns
65
+ end
66
+ end