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,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