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,437 @@
1
+ require 'set'
2
+ require 'HDLRuby'
3
+ require 'HDLRuby/hruby_low_mutable'
4
+
5
+
6
+ module HDLRuby::Low
7
+
8
+
9
+ ##
10
+ # Make explicit all the type conversions and convert the constants accordingly.
11
+ #
12
+ ########################################################################
13
+
14
+
15
+ ## Extends the SystemT class with fixing of types and constants.
16
+ class SystemT
17
+ # Explicit the types conversions in the system.
18
+ def explicit_types!
19
+ # No direct fix required in the system, recurse on the scope.
20
+ self.scope.explicit_types!
21
+ return self
22
+ end
23
+ end
24
+
25
+
26
+ ## Extends the Scope class with fixing of types and constants.
27
+ class Scope
28
+ # Explicit the types conversions in the scope.
29
+ def explicit_types!
30
+ # Recurse on the sub scopes.
31
+ self.each_scope(&:explicit_types!)
32
+ # Fix the types of the declarations.
33
+ self.each_inner(&:explicit_types!)
34
+ # Fix the types of the connections.
35
+ self.each_connection(&:explicit_types!)
36
+ # Fix the types of the behaviors.
37
+ self.each_behavior(&:explicit_types!)
38
+ return self
39
+ end
40
+ end
41
+
42
+
43
+ ## Extends the Behavior class with fixing of types and constants.
44
+ class Behavior
45
+ # Explicit the types conversions in the scope.
46
+ def explicit_types!
47
+ # Fix the types of the block.
48
+ self.block.explicit_types!
49
+ return self
50
+ end
51
+ end
52
+
53
+
54
+ ## Extends the SignalI class with fixing of types and constants.
55
+ class SignalI
56
+ # Explicit the types conversions in the signal.
57
+ def explicit_types!
58
+ # Is there a value?
59
+ value = self.value
60
+ if value then
61
+ # Yes recurse on it.
62
+ self.set_value!(value.explicit_types(self.type))
63
+ end
64
+ # No, nothing to do.
65
+ return self
66
+ end
67
+ end
68
+
69
+
70
+ ## Extends the Statement class with fixing of types and constants.
71
+ class Statement
72
+ # Explicit the types conversions in the statement.
73
+ def explicit_types!
74
+ raise "Should implement explicit_types for class #{self.class}."
75
+ end
76
+ end
77
+
78
+
79
+ ## Extends the Transmit class with fixing of types and constants.
80
+ class Transmit
81
+ # Explicit the types conversions in the statement.
82
+ def explicit_types!
83
+ # Recurse on the left and the right.
84
+ self.set_left!(self.left.explicit_types)
85
+ # The right have to match the left type.
86
+ self.set_right!(self.right.explicit_types(self.left.type))
87
+ return self
88
+ end
89
+
90
+ end
91
+
92
+
93
+ ## Extends the If class with fixing of types and constants.
94
+ class If
95
+ # Explicit the types conversions in the if.
96
+ def explicit_types!
97
+ # Recurse on the condition: it must be a Bit.
98
+ self.set_condition!(self.condition.explicit_types(Bit))
99
+ # Recurse on the yes block.
100
+ self.yes.explicit_types!
101
+ # Recruse on the alternative ifs, the conditions must be Bit.
102
+ self.map_noifs! do |cond,block|
103
+ [ cond.explicit_types(Bit), block.explicit_types! ]
104
+ end
105
+ # Recurse on the no block.
106
+ self.no.explicit_types! if self.no
107
+ return self
108
+ end
109
+ end
110
+
111
+
112
+ ## Extends the When class with fixing of types and constants.
113
+ class When
114
+ # Explicit the types conversions in the when where +type+ is the
115
+ # type of the selecting value.
116
+ def explicit_types!(type)
117
+ # Recurse on the match, it must be of type.
118
+ self.set_match!(self.match.explicit_types(type))
119
+ # Recurse on the statement.
120
+ self.statement.explicit_types!
121
+ return self
122
+ end
123
+ end
124
+
125
+
126
+ ## Extends the Case class with fixing of types and constants.
127
+ class Case
128
+ # Explicit the types conversions in the case.
129
+ def explicit_types!
130
+ # Recurse on the value.
131
+ self.set_value!(self.value.explicit_types)
132
+ # Recurse on the whens, the match of each when must be of the
133
+ # type of the value.
134
+ self.each_when { |w| w.explicit_types!(self.value.type) }
135
+ return self
136
+ end
137
+ end
138
+
139
+ ##
140
+ # Describes a wait statement: not synthesizable!
141
+ class TimeWait
142
+ # Explicit the types conversions in the time wait.
143
+ def explicit_types!
144
+ # Nothing to do.
145
+ return self
146
+ end
147
+ end
148
+
149
+ ## Extends the TimeRepeat class with fixing of types and constants.
150
+ class TimeRepeat
151
+ # Explicit the types conversions in the time repeat.
152
+ def explicit_types!
153
+ # Recurse on the statement.
154
+ self.statement.explicit_types!
155
+ return self
156
+ end
157
+ end
158
+
159
+
160
+ ## Extends the Block class with fixing of types and constants.
161
+ class Block
162
+ # Explicit the types conversions in the block.
163
+ def explicit_types!
164
+ # Recurse on the statements.
165
+ self.each_statement(&:explicit_types!)
166
+ return self
167
+ end
168
+ end
169
+
170
+
171
+ ## Extends the Connection class with fixing of types and constants.
172
+ class Connection
173
+ # Nothing required, Transmit is generated identically.
174
+ end
175
+
176
+
177
+ ## Extends the Expression class with fixing of types and constants.
178
+ class Expression
179
+ # Explicit the types conversions in the expression where
180
+ # +type+ is the expected type of the condition if any.
181
+ def explicit_types(type = nil)
182
+ raise "Should implement explicit_types for class #{self.class}."
183
+ end
184
+ end
185
+
186
+
187
+ ## Extends the Value class with fixing of types and constants.
188
+ class Value
189
+ # Explicit the types conversions in the value where
190
+ # +type+ is the expected type of the condition if any.
191
+ def explicit_types(type = nil)
192
+ # Does the type match the value?
193
+ if type && !self.type.eql?(type) then
194
+ # No, update the type of the value.
195
+ return Value.new(type,self.content)
196
+ else
197
+ # yes, return the value as is.
198
+ return self.clone
199
+ end
200
+ end
201
+ end
202
+
203
+
204
+ ## Extends the Cast class with fixing of types and constants.
205
+ class Cast
206
+ # Explicit the types conversions in the cast where
207
+ # +type+ is the expected type of the condition if any.
208
+ def explicit_types(type = nil)
209
+ # Does the type match the cast?
210
+ if type && !self.type.eql?(type) then
211
+ # No, Recurse on the child tomatch the type.
212
+ return self.child.explicit_types(type)
213
+ else
214
+ # No simply recurse on the child with the cast's type.
215
+ return self.child.explicit_types(self.type)
216
+ end
217
+ end
218
+ end
219
+
220
+
221
+ ## Extends the Operation class with fixing of types and constants.
222
+ class Operation
223
+ # Explicit the types conversions in the operation where
224
+ # +type+ is the expected type of the condition if any.
225
+ def explicit_types(type = nil)
226
+ raise "Should implement explicit_types for class #{self.class}."
227
+ end
228
+ end
229
+
230
+
231
+ ## Extends the Unary class with fixing of types and constants.
232
+ class Unary
233
+ # Explicit the types conversions in the unary operation where
234
+ # +type+ is the expected type of the condition if any.
235
+ def explicit_types(type = nil)
236
+ # Recurse on the child (no type to specify here, unary operations
237
+ # preserve the type of their child).
238
+ op = Unary.new(self.type,self.operator,self.child.explicit_types)
239
+ # Does the type match the operation?
240
+ if type && !self.type.eql?(type) then
241
+ # No create a cast.
242
+ return Cast.new(type,op)
243
+ else
244
+ # Yes, return the operation as is.
245
+ return op
246
+ end
247
+ end
248
+ end
249
+
250
+
251
+ ## Extends the Binary class with fixing of types and constants.
252
+ class Binary
253
+ # Explicit the types conversions in the binary operation where
254
+ # +type+ is the expected type of the condition if any.
255
+ def explicit_types(type = nil)
256
+ # Find the larger child type.
257
+ ctype = self.left.type.width > self.right.type.width ?
258
+ self.left.type : self.right.type
259
+ # Recurse on the children: match the larger type.
260
+ op = Binary.new(self.type,self.operator,
261
+ self.left.explicit_types(ctype),
262
+ self.right.explicit_types(ctype))
263
+ # Does the type match the operation?
264
+ if type && !self.type.eql?(type) then
265
+ # No create a cast.
266
+ return Cast.new(type,op)
267
+ else
268
+ # Yes, return the operation as is.
269
+ return op
270
+ end
271
+ end
272
+ end
273
+
274
+
275
+ ## Extends the Select class with fixing of types and constants.
276
+ class Select
277
+ # Explicit the types conversions in the selection where
278
+ # +type+ is the expected type of the condition if any.
279
+ def explicit_types(type = nil)
280
+ # If there is no type to match, use the one of the selection.
281
+ type = self.type unless type
282
+ # Each choice child must match the type.
283
+ return Select.new(type,self.operator,self.select.clone,
284
+ *self.each_choice.map { |choice| choice.explicit_types(type)})
285
+ end
286
+ end
287
+
288
+
289
+ ## Extends the Concat class with fixing of types and constants.
290
+ class Concat
291
+ # Explicit the types conversions in the concat where
292
+ # +type+ is the expected type of the condition if any.
293
+ def explicit_types(type = nil)
294
+ # Is there a type to match?
295
+ if type then
296
+ # Yes, update the concat to the type.
297
+ # Is it an array type?
298
+ if type.is_a?(TypeVector) then
299
+ # Yes, update the concat without subcasting.
300
+ return Concat.new(type,self.each_expression.map do |expr|
301
+ expr.explicit_types
302
+ end)
303
+ else
304
+ # No, it should be a tuple.
305
+ return Concat.new(type,self.expressions.map.with_index do
306
+ |expr,i|
307
+ expr.explicit_types(type.get_type(i))
308
+ end)
309
+ end
310
+ else
311
+ # No, recurse on the sub expressions.
312
+ return Concat.new(self.type,self.expressions.map do |expr|
313
+ expr.explicit_types
314
+ end)
315
+ end
316
+ end
317
+ end
318
+
319
+
320
+ ## Extends the Ref class with fixing of types and constants.
321
+ class Ref
322
+ # Explicit the types conversions in the reference where
323
+ # +type+ is the expected type of the condition if any.
324
+ def explicit_types(type = nil)
325
+ raise "Should implement explicit_types for class #{self.class}."
326
+ end
327
+ end
328
+
329
+
330
+ ## Extends the RefConcat class with fixing of types and constants.
331
+ class RefConcat
332
+ # Explicit the types conversions in the concat ref where
333
+ # +type+ is the expected type of the condition if any.
334
+ def explicit_types(type = nil)
335
+ # Is there a type to match?
336
+ if type then
337
+ # Yes, update the concat to the type.
338
+ # Is it an array type?
339
+ if type.is_a?(TypeVector) then
340
+ # Yes, update the concat accordingly.
341
+ return RefConcat.new(type,self.each_ref.map do |ref|
342
+ ref.explicit_types(type.base)
343
+ end)
344
+ else
345
+ # No, it should be a tuple.
346
+ return RefConcat.new(type,self.each_ref.map.with_index do
347
+ |ref,i|
348
+ ref.explicit_types(type.get_type(i))
349
+ end)
350
+ end
351
+ else
352
+ # No, recurse on the sub expressions.
353
+ return RefConcat.new(self.type,self.each_ref.map.with_index do
354
+ |ref,i|
355
+ ref.explicit_types(self.type.get_type(i))
356
+ end)
357
+ end
358
+ end
359
+ end
360
+
361
+
362
+ ## Extends the RefIndex class with fixing of types and constants.
363
+ class RefIndex
364
+ # Explicit the types conversions in the index ref where
365
+ # +type+ is the expected type of the condition if any.
366
+ def explicit_types(type = nil)
367
+ # Is there a type to match ?
368
+ if type then
369
+ # Regenerate the reference and cast it
370
+ return Cast.new(type,
371
+ RefIndex.new(self.type,self.ref.explicit_types,
372
+ self.index.explicit_types))
373
+ else
374
+ # No, recurse with the type of the current index ref.
375
+ return RefIndex.new(self.type,
376
+ self.ref.explicit_types,
377
+ self.index.explicit_types)
378
+ end
379
+ end
380
+ end
381
+
382
+
383
+ ## Extends the RefRange class with fixing of types and constants.
384
+ class RefRange
385
+ # Explicit the types conversions in the range ref where
386
+ # +type+ is the expected type of the condition if any.
387
+ def explicit_types(type = nil)
388
+ # Is there a type to match ?
389
+ if type then
390
+ # Regenerate the reference and cast it.
391
+ return Cast.new(type,
392
+ RefRange.new(self.type,self.ref.explicit_types,
393
+ self.range.first.explicit_types ..
394
+ self.range.last.explicit_types))
395
+ else
396
+ # No, recurse with the type of the current range ref.
397
+ return RefRange.new(self.type,
398
+ self.ref.explicit_types,
399
+ self.range.first.explicit_types ..
400
+ self.range.last.explicit_types)
401
+ end
402
+ end
403
+ end
404
+
405
+
406
+ ## Extends the RefName class with fixing of types and constants.
407
+ class RefName
408
+ # Explicit the types conversions in the index ref where
409
+ # +type+ is the expected type of the condition if any.
410
+ def explicit_types(type = nil)
411
+ # Is there a type to match, if not use current one.
412
+ type = self.type unless type
413
+ # Cast if required and return the new reference.
414
+ if self.type.eql?(type) then
415
+ # No need to cast.
416
+ return RefName.new(type,self.ref.explicit_types,self.name)
417
+ else
418
+ # Need a cast.
419
+ return Cast.new(type,
420
+ RefName.new(self.type,self.ref.explicit_types,self.name))
421
+ end
422
+ end
423
+ end
424
+
425
+
426
+ ## Extends the RefThis class with fixing of types and constants.
427
+ class RefThis
428
+ # Explicit the types conversions in the index ref where
429
+ # +type+ is the expected type of the condition if any.
430
+ def explicit_types(type = nil)
431
+ # Simply duplicate.
432
+ return self.clone
433
+ end
434
+ end
435
+
436
+
437
+ end