HDLRuby 2.0.8

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,623 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require 'fileutils'
4
+ require 'HDLRuby'
5
+ require 'HDLRuby/hruby_check.rb'
6
+ require 'ripper'
7
+ require 'HDLRuby/hruby_low2high'
8
+ require 'HDLRuby/hruby_low2c'
9
+ require 'HDLRuby/hruby_low2vhd'
10
+ require 'HDLRuby/hruby_low_fix_types'
11
+ require 'HDLRuby/hruby_low_without_outread'
12
+ require 'HDLRuby/hruby_low_with_bool'
13
+ require 'HDLRuby/hruby_low_bool2select'
14
+ require 'HDLRuby/hruby_low_without_select'
15
+ require 'HDLRuby/hruby_low_without_namespace'
16
+ require 'HDLRuby/hruby_low_without_bit2vector'
17
+ require 'HDLRuby/hruby_low_with_port'
18
+ require 'HDLRuby/hruby_low_with_var'
19
+ require 'HDLRuby/hruby_low_without_concat'
20
+ require 'HDLRuby/hruby_low_without_connection'
21
+ require 'HDLRuby/hruby_low_cleanup'
22
+
23
+ require 'HDLRuby/hruby_verilog.rb'
24
+
25
+ require 'HDLRuby/backend/hruby_allocator'
26
+ require 'HDLRuby/backend/hruby_c_allocator'
27
+
28
+ ##
29
+ # HDLRuby compiler interface program
30
+ #####################################
31
+
32
+ module HDLRuby
33
+
34
+
35
+
36
+ # Class for loading HDLRuby files.
37
+ class HDRLoad
38
+
39
+ # TOP_NAME = "__hdr_top_instance__"
40
+ TOP_NAME = "__"
41
+
42
+ # The top instance, only accessible after parsing the files.
43
+ attr_reader :top_instance
44
+
45
+ # The required files.
46
+ attr_reader :requires
47
+
48
+ # Creates a new loader for a +top_system+ system in file +top_file+
49
+ # from directory +dir+ with generic parameters +params+.
50
+ def initialize(top_system,top_file,dir,*params)
51
+ # Sets the top and the looking directory.
52
+ @top_system = top_system.to_s
53
+ @top_file = top_file.to_s
54
+ @dir = dir.to_s
55
+ @params = params
56
+
57
+ # The list of required files.
58
+ @requires = []
59
+
60
+ # The list of the code texts (the first one should be the one
61
+ # containing the top system).
62
+ @texts = []
63
+
64
+ # The list of the code checkers.
65
+ @checks = []
66
+
67
+ # The name of the top instance
68
+ @top_name = TOP_NAME
69
+ end
70
+
71
+ # Loads a single +file+.
72
+ def read(file)
73
+ @texts << File.read(File.join(@dir,file) )
74
+ @checks << Checker.new(@texts[-1],file)
75
+ end
76
+
77
+ # Loads all the files from +file+.
78
+ def read_all(file = @top_file)
79
+ # puts "read_all with file=#{file}"
80
+ # Read the file
81
+ read(file)
82
+ # Get its required files.
83
+ requires = @checks[-1].get_all_requires
84
+ requires.each do |file|
85
+ read_all(file) if file != "HDLRuby"
86
+ end
87
+ @requires += requires
88
+ @requires.uniq!
89
+ end
90
+
91
+ # Checks the read files.
92
+ def check_all
93
+ @checks.each { |check| check.assign_check }
94
+ end
95
+
96
+ # Displays the syntax tree of all the files.
97
+ def show_all(outfile = $stdout)
98
+ # puts "@checks.size=#{@checks.size}"
99
+ @checks.each { |check| check.show(outfile) }
100
+ end
101
+
102
+ # Gets the (first) top system.
103
+ def get_top
104
+ # Get all the systems.
105
+ systems = @checks.reduce([]) {|ar,check| ar + check.get_all_systems}
106
+ # puts "First systems=#{systems}"
107
+ # Remove the systems that are instantiated or included
108
+ # (they cannot be tops)
109
+ @checks.each do |check|
110
+ # The instances
111
+ check.get_all_instances(systems).each do |instance|
112
+ systems.delete(check.get_instance_system(instance))
113
+ end
114
+ # The explicitly included systems
115
+ check.get_all_includes(systems).each do |included|
116
+ systems.delete(check.get_include_system(included))
117
+ end
118
+ # The system included when declaring (inheritance)
119
+ check.get_all_inherits(systems).each do |inherit|
120
+ systems -= check.get_inherit_systems(inherit)
121
+ end
122
+ end
123
+ # puts "Now systems=#{systems}"
124
+ # Return the first top of the list.
125
+ return systems[-1]
126
+ end
127
+
128
+
129
+ # Load the HDLRuby structure from an instance of the top module.
130
+ def parse
131
+ # Is there a top system specified yet?
132
+ if @top_system == "" then
133
+ # No, look for it.
134
+ @top_system = get_top
135
+ # puts "@top_system=#{@top_system}"
136
+ unless @top_system then
137
+ # Not found? Error.
138
+ # Maybe it is a parse error, look for it.
139
+ bind = TOPLEVEL_BINDING.clone
140
+ eval("require 'HDLRuby'\n\nconfigure_high\n\n",bind)
141
+ eval(@texts[0],bind,@top_file,1)
142
+ # No parse error found.
143
+ raise "Cannot find a top system." unless @top_system
144
+ end
145
+ end
146
+ # Initialize the environment for processing the hdr file.
147
+ bind = TOPLEVEL_BINDING.clone
148
+ eval("require 'HDLRuby'\n\nconfigure_high\n\n",bind)
149
+ # Process it.
150
+ eval(@texts[0],bind,@top_file,1)
151
+ # Get the resulting instance
152
+ if @params.empty? then
153
+ # There is no generic parameter
154
+ @top_instance =
155
+ eval("#{@top_system} :#{@top_name}\n#{@top_name}",bind)
156
+ else
157
+ # There are generic parameters
158
+ @top_instance =
159
+ # eval("#{@top_system} :#{@top_name},#{@params.join(",")}\n#{@top_name}",bind)
160
+ eval("#{@top_system}(#{@params.join(",")}).(:#{@top_name})\n#{@top_name}",bind)
161
+ end
162
+ end
163
+ end
164
+
165
+
166
+ # Extend the Code class with generation of file for the content.
167
+ class HDLRuby::Low::Code
168
+
169
+ ## Creates a file in +path+ containing the content of the code.
170
+ def to_file(path = "")
171
+ self.each_chunk do |chunk|
172
+ # Process the lumps of the chunk.
173
+ # NOTE: for now use the C code generation of Low2C
174
+ content = chunk.to_c
175
+ # Dump to a file.
176
+ if chunk.name != :sim then
177
+ # The chunk is to be dumbed to a file.
178
+ # puts "Outputing chunk:#{HDLRuby::Low::Low2C.obj_name(chunk)}"
179
+ outfile = File.open(path + "/" +
180
+ HDLRuby::Low::Low2C.obj_name(chunk) + "." +
181
+ chunk.name.to_s,"w")
182
+ outfile << content
183
+ outfile.close
184
+ end
185
+ end
186
+ end
187
+ end
188
+
189
+
190
+ end
191
+
192
+
193
+
194
+ if __FILE__ == $0 then
195
+ # From hdrcc.rb
196
+ $hdr_dir = File.dirname(__FILE__)
197
+ else
198
+ # Form hdrcc
199
+ $hdr_dir = File.dirname(Gem.bin_path("HDLRuby","hdrcc")).chomp("exe") +
200
+ "lib/HDLRuby"
201
+ end
202
+
203
+ require 'optparse'
204
+ # Used standalone, check the files given in the standard input.
205
+ include HDLRuby
206
+
207
+ # Process the command line options
208
+ $options = {}
209
+ $optparse = OptionParser.new do |opts|
210
+ opts.banner = "Usage: hdrcc.rb [options] <input file> [<output file>]"
211
+
212
+ opts.separator ""
213
+ opts.separator "Where:"
214
+ opts.separator "* `options` is a list of options"
215
+ opts.separator "* `<input file>` is the initial file to compile (mandatory)"
216
+ opts.separator "* `<output file>` is the output file"
217
+ opts.separator ""
218
+ opts.separator "Options:"
219
+
220
+ opts.on("-y", "--yaml", "Output in YAML format") do |y|
221
+ $options[:yaml] = y
222
+ end
223
+ opts.on("-r", "--hdr","Output in HDLRuby format") do |v|
224
+ $options[:hdr] = v
225
+ end
226
+ opts.on("-C", "--clang","Output in C format (simulator)") do |v|
227
+ $options[:clang] = v
228
+ $options[:multiple] = v
229
+ end
230
+ opts.on("--allocate=LOW,HIGH,WORD","Allocate signals to addresses") do |v|
231
+ $options[:allocate] = v
232
+ end
233
+ opts.on("-S", "--sim","Output in C format (simulator)") do |v|
234
+ $options[:clang] = v
235
+ $options[:multiple] = v
236
+ $options[:sim] = v
237
+ end
238
+ opts.on("-v", "--verilog","Output in Verlog HDL format") do |v|
239
+ $options[:verilog] = v
240
+ $options[:multiple] = v
241
+ end
242
+ opts.on("-V", "--vhdl","Output in VHDL format") do |v|
243
+ HDLRuby::Low::Low2VHDL.vhdl08 = false
244
+ $options[:vhdl] = v
245
+ $options[:multiple] = v
246
+ $options[:vhdl08] = false
247
+ end
248
+ opts.on("-A", "--alliance","Output in Alliance-compatible VHDL format") do |v|
249
+ HDLRuby::Low::Low2VHDL.vhdl08 = false
250
+ HDLRuby::Low::Low2VHDL.alliance = true
251
+ $options[:vhdl] = v
252
+ $options[:alliance] = v
253
+ $options[:multiple] = v
254
+ $options[:vhdl08] = false
255
+ end
256
+ opts.on("-U", "--vhdl08","Output in VHDL'08 format") do |v|
257
+ HDLRuby::Low::Low2VHDL.vhdl08 = true
258
+ $options[:vhdl] = v
259
+ $options[:multiple] = v
260
+ $options[:vhdl08] = true
261
+ end
262
+ opts.on("-s", "--syntax","Output the Ruby syntax tree") do |s|
263
+ $options[:syntax] = s
264
+ end
265
+ opts.on("-m", "--multiple", "Produce multiple files for the result.\nThe output name is then interpreted as a directory name.") do |v|
266
+ $options[:multiple] = v
267
+ end
268
+ opts.on("-d", "--directory dir","Specify the base directory for loading the hdr files") do |d|
269
+ $options[:directory] = d
270
+ end
271
+ opts.on("-D", "--debug","Set the HDLRuby debug mode") do |d|
272
+ $options[:debug] = d
273
+ end
274
+ opts.on("-t", "--top system", "Specify the top system to process") do|t|
275
+ $options[:top] = t
276
+ end
277
+ opts.on("-p", "--param x,y,z", "Specify the generic parameters") do |p|
278
+ $options[:param] = p
279
+ end
280
+ opts.on_tail("-h", "--help", "Show this message") do
281
+ puts opts
282
+ exit
283
+ end
284
+ opts.separator ""
285
+ opts.separator "Notice:"
286
+ opts.separator "* If no output option is given, simply checks the input file"
287
+ opts.separator "* If no output file is given, the result is given through the standard output."
288
+ opts.separator "* If no top system is given, it will be automatically searched in the input file."
289
+ opts.separator ""
290
+ opts.separator "Examples:"
291
+ opts.separator "* Compile system named `adder` from `adder.rb` input file and generate `adder.yaml` low-level YAML description:"
292
+ opts.separator " hdrcc.rb --yaml --top adder adder.rb adder.yaml"
293
+ opts.separator "* Compile `adder.rb` input file and generate `adder.vhd` low-level VHDL description:"
294
+ opts.separator " hdrcc.rb --vhdl adder.rb adder.vhd"
295
+ opts.separator "* Check the validity of `adder.rb` input file:"
296
+ opts.separator " hdrcc.rb adder.rb"
297
+ opts.separator "* Compile system `adder` whose bit width is generic from `adder_gen.rb` input file to a 16-bit circuit whose low-level Verilog HDL description is dumped to the standard output:"
298
+ opts.separator " hdrcc -v -t adder --param 16 adder_gen.rb"
299
+ opts.separator "* Compile system `multer` with inputs and output bit width is generic from `multer_gen.rb` input file to a 16x16->32 bit cicruit whose low-level YAML description is saved to output file `multer_gen.yaml`"
300
+ opts.separator "hdrcc -y -t multer -p 16,16,32 multer_gen.rb multer_gen.yaml"
301
+
302
+ end
303
+ $optparse.parse!
304
+
305
+ # puts "options=#{$options}"
306
+
307
+ # Check the compatibility of the options
308
+ if $options.count {|op| [:yaml,:hdr,:verilog,:vhdl].include?(op) } > 1 then
309
+ warn("Please choose either YAML, HDLRuby, Verilog HDL, or VHDL output.")
310
+ puts $optparse.help()
311
+ end
312
+
313
+ # Get the the input and the output files.
314
+ $input,$output = $*
315
+ # Get the top system name if name.
316
+ $top = $options[:top].to_s
317
+ unless $top == "" || (/^[_[[:alpha:]]][_\w]*$/ =~ $top) then
318
+ warn("Please provide a valid top system name.")
319
+ exit
320
+ end
321
+ # Get the generic parameters if any.
322
+ $params = $options[:param].to_s.split(",")
323
+
324
+
325
+ if $input == nil then
326
+ warn("Please provide an input file (or consult the help using the --help option.)")
327
+ exit
328
+ end
329
+
330
+ # Open the output.
331
+ if $output then
332
+ if $options[:multiple] then
333
+ # Create a directory if necessary.
334
+ unless File.directory?($output)
335
+ FileUtils.mkdir_p($output)
336
+ end
337
+ else
338
+ # Open the file.
339
+ $output = File.open($output,"w")
340
+ end
341
+ else
342
+ if $option[:multiple] then
343
+ raise "Need a target directory in multiple files generation mode."
344
+ end
345
+ $output = $stdout
346
+ end
347
+
348
+ # Load and process the hdr files.
349
+ $options[:directory] ||= "./"
350
+ $loader = HDRLoad.new($top,$input,$options[:directory].to_s,*$params)
351
+ $loader.read_all
352
+ $loader.check_all
353
+
354
+ if $options[:syntax] then
355
+ if $options[:multiple] then
356
+ raise "Multiple files generation mode not supported for syntax tree output."
357
+ end
358
+ $output << $loader.show_all
359
+ exit
360
+ end
361
+
362
+ if $options[:debug] then
363
+ # Debug mode, no error management.
364
+ $top_instance = $loader.parse
365
+ else
366
+ # Not debug mode, use the error management.
367
+ error_manager($loader.requires + [$input]) { $top_instance = $loader.parse }
368
+ end
369
+
370
+ # Generate the result.
371
+ # Get the top systemT.
372
+ $top_system = $top_instance.to_low.systemT
373
+
374
+ # Gather the non-HDLRuby code.
375
+ $non_hdlruby = []
376
+ $top_system.each_systemT_deep do |systemT|
377
+ systemT.scope.each_scope_deep do |scope|
378
+ scope.each_code do |code|
379
+ $non_hdlruby << code
380
+ end
381
+ end
382
+ end
383
+ # Applies the allocators if required.
384
+ $allocate_range = $options[:allocate]
385
+ if $allocate_range then
386
+ # Get the allocation characteristics.
387
+ $allocate_range = $allocate_range.split(",")
388
+ $allocate_range = [$allocate_range[0]..$allocate_range[1],
389
+ $allocate_range[2]].compact
390
+ # Create the allocator.
391
+ allocator = HDLRuby::Low::Allocator.new(*$allocate_range)
392
+ $non_hdlruby.each do |code|
393
+ # Try the C allocator.
394
+ code.c_code_allocate(allocator)
395
+ end
396
+ end
397
+ # Generates its code.
398
+ $non_hdlruby.each {|code| code.to_file($output) }
399
+
400
+ # The HDLRuby code
401
+ if $options[:yaml] then
402
+ if $options[:multiple] then
403
+ raise "Multiple files generation mode not supported for YAML output yet."
404
+ end
405
+ # $output << $top_instance.to_low.systemT.to_yaml
406
+ $output << $top_system.to_yaml
407
+ elsif $options[:hdr] then
408
+ if $options[:multiple] then
409
+ raise "Multiple files generation mode not supported for HDLRuby output yet."
410
+ end
411
+ # $top_system.each_systemT_deep.reverse_each do |systemT|
412
+ # $output << systemT.to_high
413
+ # end
414
+ # $output << $top_instance.to_low.systemT.to_high
415
+ $output << $top_system.to_high
416
+ elsif $options[:clang] then
417
+ # top_system = $top_instance.to_low.systemT
418
+ top_system = $top_system
419
+ # Preprocess the HW description for valid C generation.
420
+ top_system.each_systemT_deep do |systemT|
421
+ # Converts the connections to behaviors.
422
+ systemT.connections_to_behaviors!
423
+ # Break the RefConcat.
424
+ systemT.break_concat_assigns!
425
+ # Explicits the types.
426
+ systemT.explicit_types!
427
+ end
428
+ # Generate the C.
429
+ if $options[:multiple] then
430
+ # Get the base name of the input file, it will be used for
431
+ # generating the main name of the multiple result files.
432
+ basename = File.basename($input,File.extname($input))
433
+ basename = $output + "/" + basename
434
+ # File name counter.
435
+ count = 0
436
+
437
+ # # Converts the connections to behaviors (C generation does not
438
+ # # support connections).
439
+ # top_system.each_systemT_deep do |systemT|
440
+ # systemT.connections_to_behaviors!
441
+ # end
442
+
443
+ # Multiple files generation mode.
444
+ # Generate the h file.
445
+ hname = $output + "/hruby_sim_gen.h"
446
+ hnames = [ File.basename(hname) ]
447
+ outfile = File.open(hname,"w")
448
+ # Adds the generated globals
449
+ top_system.each_systemT_deep do |systemT|
450
+ # For the h file.
451
+ # hname = $output + "/" +
452
+ # HDLRuby::Low::Low2C.c_name(systemT.name) +
453
+ # ".h"
454
+ # hnames << File.basename(hname)
455
+ # # Open the file for current systemT
456
+ # output = File.open(hname,"w")
457
+ # Generate the H code in to.
458
+ outfile << systemT.to_ch
459
+ # # Close the file.
460
+ # output.close
461
+ # # Clears the name.
462
+ # hname = nil
463
+ end
464
+ # Adds the globals from the non-HDLRuby code
465
+ $non_hdlruby.each do |code|
466
+ code.each_chunk do |chunk|
467
+ if chunk.name == :sim then
468
+ outfile << "extern " +
469
+ HDLRuby::Low::Low2C.prototype(chunk.to_c)
470
+ end
471
+ end
472
+ end
473
+ outfile.close
474
+
475
+ # Prepare the initial name for the main file.
476
+ name = basename + ".c"
477
+ # Generate the code for it.
478
+ main = File.open(name,"w")
479
+
480
+ # Generate the code of the main function.
481
+ # HDLRuby start code
482
+ main << HDLRuby::Low::Low2C.main(top_system,
483
+ top_system.each_systemT_deep.to_a.reverse,hnames)
484
+ main.close
485
+
486
+ top_system.each_systemT_deep do |systemT|
487
+ # For the c file.
488
+ name = $output + "/" +
489
+ HDLRuby::Low::Low2C.c_name(systemT.name) +
490
+ ".c"
491
+ # Open the file for current systemT
492
+ outfile = File.open(name,"w")
493
+ # Generate the C code in to.
494
+ outfile << systemT.to_c(0,*hnames)
495
+ # Close the file.
496
+ outfile.close
497
+ # Clears the name.
498
+ name = nil
499
+ end
500
+ else
501
+ # Single file generation mode.
502
+ top_system.each_systemT_deep.reverse_each do |systemT|
503
+ $output << systemT.to_ch
504
+ $output << systemT.to_c
505
+ end
506
+ # Adds the main code.
507
+ $output << HDLRuby::Low::Low2C.main(top_system,
508
+ *top_system.each_systemT_deep.to_a)
509
+ end
510
+ if $options[:sim] then
511
+ # Simulation mode, compile and exectute.
512
+ # Path of the simulator core files.
513
+ # simdir = File.dirname(__FILE__) + "/sim/"
514
+ simdir = $hdr_dir + "/sim/"
515
+ # Generate and execute the simulation commands.
516
+ # Kernel.system("cp -n #{simdir}* #{$output}/; cd #{$output}/ ; make -s ; ./hruby_simulator")
517
+ Dir.entries(simdir).each do |filename|
518
+ unless File.directory?(filename) then
519
+ FileUtils.cp(simdir + "/" + filename,$output)
520
+ end
521
+ end
522
+ Dir.chdir($output)
523
+ Kernel.system("make -s")
524
+ Kernel.system("./hruby_simulator")
525
+ end
526
+ elsif $options[:verilog] then
527
+ # warn("Verilog HDL output is not available yet... but it will be soon, promise!")
528
+ # top_system = $top_instance.to_low.systemT
529
+ top_system = $top_system
530
+ # Make description compatible with verilog generation.
531
+ top_system.each_systemT_deep do |systemT|
532
+ systemT.to_upper_space!
533
+ systemT.to_global_systemTs!
534
+ systemT.break_types!
535
+ systemT.with_port!
536
+ end
537
+ # # Verilog generation
538
+ # $output << top_system.to_verilog
539
+ # Generate the Verilog.
540
+ if $options[:multiple] then
541
+ # Get the base name of the input file, it will be used for
542
+ # generating the main name of the multiple result files.
543
+ basename = File.basename($input,File.extname($input))
544
+ basename = $output + "/" + basename
545
+ # File name counter.
546
+ count = 0
547
+ # Prepare the initial name for the main file.
548
+ name = basename + ".v"
549
+ # Multiple files generation mode.
550
+ top_system.each_systemT_deep do |systemT|
551
+ # Generate the name if necessary.
552
+ unless name
553
+ name = $output + "/" +
554
+ HDLRuby::Verilog.name_to_verilog(systemT.name) +
555
+ ".v"
556
+ end
557
+ # Open the file for current systemT
558
+ outfile = File.open(name,"w")
559
+ # Generate the VHDL code in to.
560
+ outfile << systemT.to_verilog
561
+ # Close the file.
562
+ outfile.close
563
+ # Clears the name.
564
+ name = nil
565
+ end
566
+ else
567
+ # Single file generation mode.
568
+ top_system.each_systemT_deep.reverse_each do |systemT|
569
+ $output << systemT.to_verilog
570
+ end
571
+ end
572
+ elsif $options[:vhdl] then
573
+ # top_system = $top_instance.to_low.systemT
574
+ top_system = $top_system
575
+ # Make description compatible with vhdl generation.
576
+ top_system.each_systemT_deep do |systemT|
577
+ systemT.outread2inner! unless $options[:vhdl08] || $options[:alliance]
578
+ systemT.with_boolean!
579
+ systemT.boolean_in_assign2select! unless $options[:alliance]
580
+ systemT.bit2vector2inner! unless $options[:vhdl08] || $options[:alliance]
581
+ systemT.select2case! # if $options[:alliance]
582
+ systemT.break_concat_assigns! # if $options[:alliance]
583
+ systemT.to_upper_space!
584
+ systemT.to_global_systemTs!
585
+ systemT.break_types!
586
+ systemT.with_port!
587
+ systemT.with_var!
588
+ systemT.cleanup!
589
+ end
590
+ # Generate the vhdl.
591
+ if $options[:multiple] then
592
+ # Get the base name of the input file, it will be used for
593
+ # generating the main name of the multiple result files.
594
+ basename = File.basename($input,File.extname($input))
595
+ basename = $output + "/" + basename
596
+ # File name counter.
597
+ count = 0
598
+ # Prepare the initial name for the main file.
599
+ name = basename + ".vhd"
600
+ # Multiple files generation mode.
601
+ top_system.each_systemT_deep do |systemT|
602
+ # Generate the name if necessary.
603
+ unless name
604
+ name = $output + "/" +
605
+ HDLRuby::Low::Low2VHDL.entity_name(systemT.name) +
606
+ ".vhd"
607
+ end
608
+ # Open the file for current systemT
609
+ outfile = File.open(name,"w")
610
+ # Generate the VHDL code in to.
611
+ outfile << systemT.to_vhdl
612
+ # Close the file.
613
+ outfile.close
614
+ # Clears the name.
615
+ name = nil
616
+ end
617
+ else
618
+ # Single file generation mode.
619
+ top_system.each_systemT_deep.reverse_each do |systemT|
620
+ $output << systemT.to_vhdl
621
+ end
622
+ end
623
+ end
@@ -0,0 +1,23 @@
1
+ require 'HDLRuby'
2
+
3
+ configure_high
4
+
5
+
6
+ # A simple 16-bit adder with an error
7
+ system :adder do
8
+ [15..0].input :x,:y
9
+ [16..0].output :s
10
+
11
+ seq do
12
+ s = x + y
13
+ end
14
+ end
15
+
16
+ # Instantiate it for checking.
17
+ adder :adderI
18
+
19
+ # Generate the low level representation.
20
+ low = adderI.systemT.to_low
21
+
22
+ # Displays it
23
+ puts low.to_yaml