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
@@ -0,0 +1,248 @@
1
+ require 'HDLRuby'
2
+ require 'HDLRuby/hruby_tools'
3
+ require 'HDLRuby/hruby_low_mutable'
4
+
5
+
6
+ module HDLRuby::Low
7
+
8
+
9
+ ##
10
+ # Converts par blocks to seq blocks.
11
+ # Also provides detection of mixed par and seq blocks.
12
+ #
13
+ ########################################################################
14
+
15
+
16
+ ## Extends the SystemT class with functionality for converting par block
17
+ # to seq.
18
+ class SystemT
19
+
20
+ # Converts the par sub blocks to seq.
21
+ def blocks2seq!
22
+ # Recurse on the scope.
23
+ self.scope.to_seq!
24
+ return self
25
+ end
26
+
27
+ # Converts the par sub blocks to seq if they are not full par.
28
+ def mixblocks2seq!
29
+ # Recurse on the scope.
30
+ self.scope.mixblocks2seq!
31
+ end
32
+
33
+ end
34
+
35
+ ## Extends the Scope class with functionality for converting par block
36
+ # to seq.
37
+
38
+ class Scope
39
+
40
+ # Converts the par sub blocks to seq.
41
+ def blocks2seq!
42
+ # Recurse on the behaviors.
43
+ self.each_behavior { |beh| beh.blocks2seq! }
44
+ return self
45
+ end
46
+
47
+ # Converts the par sub blocks to seq if they are not full par.
48
+ def mixblocks2seq!
49
+ # Recurse on the behaviors.
50
+ self.each_behavior { |beh| beh.mixblocs2seq! }
51
+ end
52
+
53
+ end
54
+
55
+
56
+ ## Extends the Behavior class with functionality for converting par block
57
+ # to seq.
58
+
59
+ class Behavior
60
+
61
+ # Converts the par sub blocks to seq.
62
+ def blocks2seq!
63
+ # Converts the block to seq.
64
+ self.block.to_seq!
65
+ return self
66
+ end
67
+
68
+ # Converts the par sub blocks to seq if they are not full par.
69
+ def mixblocks2seq!
70
+ # Is the block mix?
71
+ return unless block.mix?
72
+ # Mixed, do convert.
73
+ # Converts the block to seq.
74
+ self.block.to_seq!
75
+ end
76
+
77
+ end
78
+
79
+ ## Extends the Statement class with functionality for converting par block
80
+ # to seq.
81
+ class Statement
82
+
83
+ # Converts the par sub blocks to seq.
84
+ def blocks2seq!
85
+ # By default, nothing to do.
86
+ return self
87
+ end
88
+
89
+ # Tell if there is a mix block.
90
+ # +mode+ is the mode of the upper block.
91
+ def mix?(mode = nil)
92
+ # By default, no mix block.
93
+ return false
94
+ end
95
+ end
96
+
97
+ ## Extends the If class with functionality for converting par block
98
+ # to seq.
99
+ class If
100
+
101
+ # Converts the par sub blocks to seq.
102
+ def blocks2seq!
103
+ # Convert each sub block.
104
+ # If block.
105
+ self.yes.blocks2seq!
106
+ # Elsif blocks
107
+ self.each_noif do |cond, stmnt|
108
+ stmnt.blocks2seq!
109
+ end
110
+ # Else block if any.
111
+ self.no.blocks2seq! if self.no
112
+ return self
113
+ end
114
+
115
+ # Tell if there is a mix block.
116
+ # +mode+ is the mode of the upper block.
117
+ def mix?(mode = nil)
118
+ # Check each sub block.
119
+ # If block.
120
+ return true if self.yes.mix?(mode)
121
+ # Elsif blocks
122
+ self.each_noif do |cond, stmnt|
123
+ return true if stmnt.mix?(mode)
124
+ end
125
+ # Else block if any.
126
+ true if self.no && self.no.mix?(mode)
127
+ end
128
+
129
+ end
130
+
131
+ ## Extends the When class with functionality for converting par block
132
+ # to seq.
133
+ class When
134
+ # Converts the par sub blocks to seq.
135
+ def blocks2seq!
136
+ # Convert the statement.
137
+ self.statement.blocks2seq!
138
+ return self
139
+ end
140
+
141
+ # Tell if there is a mix block.
142
+ # +mode+ is the mode of the upper block.
143
+ def mix?(mode = nil)
144
+ # Check the statement.
145
+ return statement.mix?(mode)
146
+ end
147
+
148
+ end
149
+
150
+ ## Extends the When class with functionality for converting par block
151
+ # to seq.
152
+ class Case
153
+ # Converts the par sub blocks to seq.
154
+ def blocks2seq!
155
+ # Recurse on the whens.
156
+ self.each_when(&:blocks2seq!)
157
+ # Converts the default if any.
158
+ self.default.blocks2seq! if self.default
159
+ return self
160
+ end
161
+
162
+ # Tell if there is a mix block.
163
+ # +mode+ is the mode of the upper block.
164
+ def mix?(mode = nil)
165
+ # Recuse on the whens.
166
+ return true if self.each_when.any? { |w| w.mix?(mode) }
167
+ # Check the default if any.
168
+ return self.default.mix?(mode)
169
+ end
170
+
171
+ end
172
+
173
+ ## Extends the TimeRepeat class with functionality for converting par block
174
+ # to seq.
175
+ class TimeRepeat
176
+
177
+ # Converts the par sub blocks to seq.
178
+ def blocks2seq!
179
+ # Converts the statement.
180
+ self.statement.blocks2seq!
181
+ return self
182
+ end
183
+
184
+ # Tell if there is a mix block.
185
+ # +mode+ is the mode of the upper block.
186
+ def mix?(mode = nil)
187
+ # Check the statement.
188
+ return self.statement.mix?(mode)
189
+ end
190
+
191
+ end
192
+
193
+ ## Extends the Block class with functionality for converting par block
194
+ # to seq.
195
+ class Block
196
+
197
+ # Converts the par sub blocks to seq.
198
+ def blocks2seq!
199
+ # First recurse on each statement.
200
+ self.each_statement { |stmnt| stmnt.blocks2seq! }
201
+ # If the block is already seq, nothing more to do.
202
+ return self if self.mode == :seq
203
+ # IF the block contains one or less transmit statement,
204
+ # simply change its mode.
205
+ if self.each_statement.count { |stmnt| stmnt.is_a?(Transmit) } <= 1
206
+ self.set_mode!(:par)
207
+ return self
208
+ end
209
+ # Gather the left values of the assignments.
210
+ lvalues = self.each_statement.select do |stmnt|
211
+ stmnt.is_a?(Transmit)
212
+ end.map { |trans| trans.left }
213
+ # Gather the right values inside the whole block.
214
+ rvalues = self.each_node_deep.select do |node|
215
+ node.is_a?(Expression) and node.rightvalue?
216
+ end
217
+ # Keep the left value that are reused.
218
+ lvalues = lvalues & rvalues
219
+ # Create new inner variable for replacing them.
220
+ nvalues = []
221
+ lvalues.each do |lvalue|
222
+ # Create the replacing variable.
223
+ nvalues << nvalue = self.add_inner(
224
+ SignalI.new(HDLRuby.uniq_name,lvalue.type))
225
+ # Replace it.
226
+ ref = RefName.new(lvalue.type, RefThis.new, nvalues[-1].name)
227
+ lvalue.parent.set_left!(ref)
228
+ # And reassign it at the end of the block.
229
+ lvalue.parent = nil
230
+ assign = Transmit.new(lvalue,ref.clone)
231
+ self.add_statement(assign)
232
+ end
233
+ return self
234
+ end
235
+
236
+ # Tell if there is a mix block.
237
+ # +mode+ is the mode of the upper block.
238
+ def mix?(mode = nil)
239
+ # Check if different from mode block if any.
240
+ return true if mode && self.type != mode
241
+ # No difference with the upper block, maybe there is one within.
242
+ # Check each statement.
243
+ self.each_statement.any? { |stmt| stmnt.mix?(mode) }
244
+ end
245
+
246
+ end
247
+
248
+ end
@@ -0,0 +1,126 @@
1
+ require 'HDLRuby'
2
+
3
+
4
+ module HDLRuby
5
+
6
+ # The new field symbol_equiv is not to be dumped.
7
+ FIELDS_TO_EXCLUDE.default << :@_symbol_equiv
8
+ end
9
+
10
+ module HDLRuby::Low
11
+
12
+
13
+ ##
14
+ # Converts a HDLRuby::Low description to a uniq symbol and vice versa.
15
+ #
16
+ ########################################################################
17
+
18
+ ##
19
+ # Module adding the conversion to symbol feature to HDLRuby objects.
20
+ module Low2Symbol
21
+
22
+ # The correspondance tables between HDLRuby objects and symbols.
23
+ Low2SymbolTable = {}
24
+ Symbol2LowTable = {}
25
+
26
+ # The prefix used when building symbols.
27
+ Low2SymbolPrefix = "`"
28
+
29
+ # Converts to a symbol.
30
+ def to_sym
31
+ # Get the associated symbol if any.
32
+ @_symbol_equiv ||= Low2SymbolTable[self]
33
+ unless @_symbol_equiv then
34
+ # No symbol yet, create it.
35
+ @_symbol_equiv =
36
+ (Low2SymbolPrefix + Symbol2LowTable.size.to_s).to_sym
37
+ # And regiter it.
38
+ Symbol2LowTable[@_symbol_equiv] = self
39
+ Low2SymbolTable[self] = @_symbol_equiv
40
+ end
41
+ # Now there is a symbol, return it.
42
+ return @_symbol_equiv
43
+ end
44
+ end
45
+
46
+ ## Extends the Symbol class with of equivalent HDLRuby object.
47
+ class ::Symbol
48
+ # Convert to the equivalent HDLRuby object if any, returns nil if not.
49
+ def to_hdr
50
+ return Low2Symbol::Symbol2LowTable[self]
51
+ end
52
+ end
53
+
54
+
55
+ ## Extends the SystemT class with conversion to symbol.
56
+ class SystemT
57
+ include Low2Symbol
58
+ end
59
+
60
+
61
+ ## Extends the Scope class with conversion to symbol.
62
+ class Scope
63
+ include Low2Symbol
64
+ end
65
+
66
+
67
+ ## Extends the Type class with conversion to symbol.
68
+ class Type
69
+ include Low2Symbol
70
+ end
71
+
72
+
73
+ ## Extends the Behavior class with conversion to symbol.
74
+ class Behavior
75
+ include Low2Symbol
76
+ end
77
+
78
+
79
+ ## Extends the Event class with conversion to symbol.
80
+ class Event
81
+ include Low2Symbol
82
+ end
83
+
84
+
85
+ ## Extends the SignalI class with conversion to symbol.
86
+ class SignalI
87
+ include Low2Symbol
88
+ end
89
+
90
+
91
+ ## Extends the SystemI class with conversion to symbol.
92
+ class SystemI
93
+ include Low2Symbol
94
+ end
95
+
96
+
97
+ ## Extends the Statement class with conversion to symbol.
98
+ class Statement
99
+ include Low2Symbol
100
+ end
101
+
102
+
103
+ ## Extends the When class with conversion to symbol.
104
+ class When
105
+ include Low2Symbol
106
+ end
107
+
108
+
109
+ ## Extends the Delay class with conversion to symbol.
110
+ class Delay
111
+ include Low2Symbol
112
+ end
113
+
114
+
115
+ ## Extends the Code class with conversion to symbol.
116
+ class Code
117
+ include Low2Symbol
118
+ end
119
+
120
+
121
+ ## Extends the Expression class with conversion to symbol.
122
+ class Expression
123
+ include Low2Symbol
124
+ end
125
+
126
+ end