vertigo_vhdl 0.8.2

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 (183) hide show
  1. checksums.yaml +7 -0
  2. data/bin/vertigo +7 -0
  3. data/lib/vertigo.rb +4 -0
  4. data/lib/vertigo/ast.rb +87 -0
  5. data/lib/vertigo/ast_vertigo_rkgen.rb +607 -0
  6. data/lib/vertigo/code.rb +57 -0
  7. data/lib/vertigo/compiler.rb +61 -0
  8. data/lib/vertigo/generic_lexer.rb +61 -0
  9. data/lib/vertigo/generic_parser.rb +44 -0
  10. data/lib/vertigo/indent.rb +20 -0
  11. data/lib/vertigo/lexer.rb +172 -0
  12. data/lib/vertigo/parser.rb +1458 -0
  13. data/lib/vertigo/pretty_printer.rb +749 -0
  14. data/lib/vertigo/runner.rb +115 -0
  15. data/lib/vertigo/tb_generator.rb +81 -0
  16. data/lib/vertigo/template.tb.vhd +72 -0
  17. data/lib/vertigo/token.rb +67 -0
  18. data/lib/vertigo/version.rb +3 -0
  19. data/lib/vertigo/vertigo.rkg +354 -0
  20. data/lib/vertigo/visitor_vertigo_rkgen.rb +447 -0
  21. data/tests/ghdl_tests/fsm.vhd +98 -0
  22. data/tests/ghdl_tests/fsm_synth.vhd +248 -0
  23. data/tests/ghdl_tests/test_fsm.vhd +162 -0
  24. data/tests/parser_tests/else.vhd +64 -0
  25. data/tests/parser_tests/test_MUST_fail.vhd +1 -0
  26. data/tests/parser_tests/test_accelerator.vhd +160 -0
  27. data/tests/parser_tests/test_accelerator_pp.vhd +144 -0
  28. data/tests/parser_tests/test_aggregate.vhd +17 -0
  29. data/tests/parser_tests/test_aggregate_pp.vhd +15 -0
  30. data/tests/parser_tests/test_archi_1.vhd +45 -0
  31. data/tests/parser_tests/test_archi_1_pp.vhd +41 -0
  32. data/tests/parser_tests/test_array_array_00.vhd +25 -0
  33. data/tests/parser_tests/test_array_array_00_pp.vhd +25 -0
  34. data/tests/parser_tests/test_array_urange.vhd +25 -0
  35. data/tests/parser_tests/test_array_urange_pp.vhd +25 -0
  36. data/tests/parser_tests/test_chu-1.vhd +80 -0
  37. data/tests/parser_tests/test_chu-1_pp.vhd +104 -0
  38. data/tests/parser_tests/test_concat.vhd +11 -0
  39. data/tests/parser_tests/test_concat_pp.vhd +14 -0
  40. data/tests/parser_tests/test_counter.vhd +35 -0
  41. data/tests/parser_tests/test_counter_pp.vhd +35 -0
  42. data/tests/parser_tests/test_de2.vhd +358 -0
  43. data/tests/parser_tests/test_de2_pp.vhd +274 -0
  44. data/tests/parser_tests/test_encode.vhd +2679 -0
  45. data/tests/parser_tests/test_encode_pp.vhd +2549 -0
  46. data/tests/parser_tests/test_fsm.vhd +162 -0
  47. data/tests/parser_tests/test_fsm_pp.vhd +125 -0
  48. data/tests/parser_tests/test_fsm_synth.vhd +248 -0
  49. data/tests/parser_tests/test_fsm_synth_pp.vhd +197 -0
  50. data/tests/parser_tests/test_function-01.vhd +33 -0
  51. data/tests/parser_tests/test_function-01_pp.vhd +18 -0
  52. data/tests/parser_tests/test_lfsr.vhd +75 -0
  53. data/tests/parser_tests/test_lfsr_pp.vhd +44 -0
  54. data/tests/parser_tests/test_microwatt_cache_ram.vhd +1 -0
  55. data/tests/parser_tests/test_microwatt_cache_ram_pp.vhd +68 -0
  56. data/tests/parser_tests/test_microwatt_common.vhd +1 -0
  57. data/tests/parser_tests/test_microwatt_common_pp.vhd +336 -0
  58. data/tests/parser_tests/test_microwatt_control.vhd +1 -0
  59. data/tests/parser_tests/test_microwatt_control_pp.vhd +187 -0
  60. data/tests/parser_tests/test_microwatt_core.vhd +1 -0
  61. data/tests/parser_tests/test_microwatt_core_debug.vhd +1 -0
  62. data/tests/parser_tests/test_microwatt_core_debug_pp.vhd +104 -0
  63. data/tests/parser_tests/test_microwatt_core_pp.vhd +231 -0
  64. data/tests/parser_tests/test_microwatt_core_tb.vhd +1 -0
  65. data/tests/parser_tests/test_microwatt_core_tb_pp.vhd +43 -0
  66. data/tests/parser_tests/test_microwatt_countzero.vhd +1 -0
  67. data/tests/parser_tests/test_microwatt_countzero_pp.vhd +120 -0
  68. data/tests/parser_tests/test_microwatt_countzero_tb.vhd +1 -0
  69. data/tests/parser_tests/test_microwatt_countzero_tb_pp.vhd +70 -0
  70. data/tests/parser_tests/test_microwatt_cr_file.vhd +1 -0
  71. data/tests/parser_tests/test_microwatt_cr_file_pp.vhd +74 -0
  72. data/tests/parser_tests/test_microwatt_cr_hazard.vhd +1 -0
  73. data/tests/parser_tests/test_microwatt_cr_hazard_pp.vhd +51 -0
  74. data/tests/parser_tests/test_microwatt_crhelpers.vhd +1 -0
  75. data/tests/parser_tests/test_microwatt_crhelpers_pp.vhd +48 -0
  76. data/tests/parser_tests/test_microwatt_dcache.vhd +1 -0
  77. data/tests/parser_tests/test_microwatt_dcache_pp.vhd +481 -0
  78. data/tests/parser_tests/test_microwatt_dcache_tb.vhd +1 -0
  79. data/tests/parser_tests/test_microwatt_dcache_tb_pp.vhd +98 -0
  80. data/tests/parser_tests/test_microwatt_decode1.vhd +1 -0
  81. data/tests/parser_tests/test_microwatt_decode1_pp.vhd +138 -0
  82. data/tests/parser_tests/test_microwatt_decode2.vhd +1 -0
  83. data/tests/parser_tests/test_microwatt_decode2_pp.vhd +300 -0
  84. data/tests/parser_tests/test_microwatt_decode_types.vhd +1 -0
  85. data/tests/parser_tests/test_microwatt_decode_types_pp.vhd +67 -0
  86. data/tests/parser_tests/test_microwatt_divider.vhd +1 -0
  87. data/tests/parser_tests/test_microwatt_divider_pp.vhd +132 -0
  88. data/tests/parser_tests/test_microwatt_divider_tb.vhd +1 -0
  89. data/tests/parser_tests/test_microwatt_divider_tb_pp.vhd +95 -0
  90. data/tests/parser_tests/test_microwatt_dmi_dtm_dummy.vhd +1 -0
  91. data/tests/parser_tests/test_microwatt_dmi_dtm_dummy_pp.vhd +29 -0
  92. data/tests/parser_tests/test_microwatt_dmi_dtm_tb.vhd +1 -0
  93. data/tests/parser_tests/test_microwatt_dmi_dtm_tb_pp.vhd +197 -0
  94. data/tests/parser_tests/test_microwatt_dmi_dtm_xilinx.vhd +1 -0
  95. data/tests/parser_tests/test_microwatt_dmi_dtm_xilinx_pp.vhd +139 -0
  96. data/tests/parser_tests/test_microwatt_execute1.vhd +1 -0
  97. data/tests/parser_tests/test_microwatt_execute1_pp.vhd +689 -0
  98. data/tests/parser_tests/test_microwatt_fetch1.vhd +1 -0
  99. data/tests/parser_tests/test_microwatt_fetch1_pp.vhd +88 -0
  100. data/tests/parser_tests/test_microwatt_fetch2.vhd +1 -0
  101. data/tests/parser_tests/test_microwatt_fetch2_pp.vhd +79 -0
  102. data/tests/parser_tests/test_microwatt_glibc_random.vhd +1 -0
  103. data/tests/parser_tests/test_microwatt_glibc_random_helpers.vhd +1 -0
  104. data/tests/parser_tests/test_microwatt_glibc_random_helpers_pp.vhd +25 -0
  105. data/tests/parser_tests/test_microwatt_glibc_random_pp.vhd +41 -0
  106. data/tests/parser_tests/test_microwatt_gpr_hazard.vhd +1 -0
  107. data/tests/parser_tests/test_microwatt_gpr_hazard_pp.vhd +68 -0
  108. data/tests/parser_tests/test_microwatt_helpers.vhd +1 -0
  109. data/tests/parser_tests/test_microwatt_helpers_pp.vhd +153 -0
  110. data/tests/parser_tests/test_microwatt_icache.vhd +1 -0
  111. data/tests/parser_tests/test_microwatt_icache_pp.vhd +337 -0
  112. data/tests/parser_tests/test_microwatt_icache_tb.vhd +1 -0
  113. data/tests/parser_tests/test_microwatt_icache_tb_pp.vhd +104 -0
  114. data/tests/parser_tests/test_microwatt_insn_helpers.vhd +1 -0
  115. data/tests/parser_tests/test_microwatt_insn_helpers_pp.vhd +208 -0
  116. data/tests/parser_tests/test_microwatt_loadstore1.vhd +1 -0
  117. data/tests/parser_tests/test_microwatt_loadstore1_pp.vhd +222 -0
  118. data/tests/parser_tests/test_microwatt_logical.vhd +1 -0
  119. data/tests/parser_tests/test_microwatt_logical_pp.vhd +87 -0
  120. data/tests/parser_tests/test_microwatt_multiply.vhd +1 -0
  121. data/tests/parser_tests/test_microwatt_multiply_pp.vhd +84 -0
  122. data/tests/parser_tests/test_microwatt_multiply_tb.vhd +1 -0
  123. data/tests/parser_tests/test_microwatt_multiply_tb_pp.vhd +75 -0
  124. data/tests/parser_tests/test_microwatt_plru.vhd +1 -0
  125. data/tests/parser_tests/test_microwatt_plru_pp.vhd +46 -0
  126. data/tests/parser_tests/test_microwatt_plru_tb.vhd +1 -0
  127. data/tests/parser_tests/test_microwatt_plru_tb_pp.vhd +93 -0
  128. data/tests/parser_tests/test_microwatt_ppc_fx_insns.vhd +1 -0
  129. data/tests/parser_tests/test_microwatt_ppc_fx_insns_pp.vhd +665 -0
  130. data/tests/parser_tests/test_microwatt_register_file.vhd +1 -0
  131. data/tests/parser_tests/test_microwatt_register_file_pp.vhd +86 -0
  132. data/tests/parser_tests/test_microwatt_rotator.vhd +1 -0
  133. data/tests/parser_tests/test_microwatt_rotator_pp.vhd +149 -0
  134. data/tests/parser_tests/test_microwatt_rotator_tb.vhd +1 -0
  135. data/tests/parser_tests/test_microwatt_rotator_tb_pp.vhd +134 -0
  136. data/tests/parser_tests/test_microwatt_sim_bram.vhd +1 -0
  137. data/tests/parser_tests/test_microwatt_sim_bram_helpers.vhd +1 -0
  138. data/tests/parser_tests/test_microwatt_sim_bram_helpers_pp.vhd +52 -0
  139. data/tests/parser_tests/test_microwatt_sim_bram_pp.vhd +53 -0
  140. data/tests/parser_tests/test_microwatt_sim_console.vhd +1 -0
  141. data/tests/parser_tests/test_microwatt_sim_console_pp.vhd +43 -0
  142. data/tests/parser_tests/test_microwatt_sim_jtag.vhd +1 -0
  143. data/tests/parser_tests/test_microwatt_sim_jtag_pp.vhd +64 -0
  144. data/tests/parser_tests/test_microwatt_sim_jtag_socket.vhd +1 -0
  145. data/tests/parser_tests/test_microwatt_sim_jtag_socket_pp.vhd +36 -0
  146. data/tests/parser_tests/test_microwatt_sim_uart.vhd +1 -0
  147. data/tests/parser_tests/test_microwatt_sim_uart_pp.vhd +90 -0
  148. data/tests/parser_tests/test_microwatt_soc.vhd +1 -0
  149. data/tests/parser_tests/test_microwatt_soc_pp.vhd +195 -0
  150. data/tests/parser_tests/test_microwatt_utils.vhd +1 -0
  151. data/tests/parser_tests/test_microwatt_utils_pp.vhd +39 -0
  152. data/tests/parser_tests/test_microwatt_wishbone_arbiter.vhd +1 -0
  153. data/tests/parser_tests/test_microwatt_wishbone_arbiter_pp.vhd +54 -0
  154. data/tests/parser_tests/test_microwatt_wishbone_bram_tb.vhd +1 -0
  155. data/tests/parser_tests/test_microwatt_wishbone_bram_tb_pp.vhd +157 -0
  156. data/tests/parser_tests/test_microwatt_wishbone_bram_wrapper.vhd +1 -0
  157. data/tests/parser_tests/test_microwatt_wishbone_bram_wrapper_pp.vhd +62 -0
  158. data/tests/parser_tests/test_microwatt_wishbone_debug_master.vhd +1 -0
  159. data/tests/parser_tests/test_microwatt_wishbone_debug_master_pp.vhd +124 -0
  160. data/tests/parser_tests/test_microwatt_wishbone_types.vhd +1 -0
  161. data/tests/parser_tests/test_microwatt_wishbone_types_pp.vhd +38 -0
  162. data/tests/parser_tests/test_microwatt_writeback.vhd +1 -0
  163. data/tests/parser_tests/test_microwatt_writeback_pp.vhd +87 -0
  164. data/tests/parser_tests/test_package-1.vhd +68 -0
  165. data/tests/parser_tests/test_package-1_pp.vhd +53 -0
  166. data/tests/parser_tests/test_precedence.vhd +13 -0
  167. data/tests/parser_tests/test_precedence_pp.vhd +16 -0
  168. data/tests/parser_tests/test_selected_sig.vhd +14 -0
  169. data/tests/parser_tests/test_selected_sig_pp.vhd +10 -0
  170. data/tests/parser_tests/test_slice.vhd +15 -0
  171. data/tests/parser_tests/test_slice_pp.vhd +16 -0
  172. data/tests/parser_tests/test_tb-00.vhd +94 -0
  173. data/tests/parser_tests/test_tb-00_pp.vhd +71 -0
  174. data/tests/parser_tests/test_type_decl_02.vhd +9 -0
  175. data/tests/parser_tests/test_type_decl_02_pp.vhd +11 -0
  176. data/tests/parser_tests/test_use.vhd +7 -0
  177. data/tests/parser_tests/test_use_pp.vhd +10 -0
  178. data/tests/parser_tests/test_while_1.vhd +38 -0
  179. data/tests/parser_tests/test_while_1_pp.vhd +26 -0
  180. data/tests/parser_tests/test_with-00.vhd +21 -0
  181. data/tests/parser_tests/test_with-00_pp.vhd +12 -0
  182. data/tests/tb_gen_tests/test_accelerator.vhd +160 -0
  183. metadata +224 -0
@@ -0,0 +1,749 @@
1
+ require_relative 'code'
2
+
3
+ module Vertigo
4
+
5
+ class PrettyPrinter
6
+
7
+ def print ast
8
+ code=Code.new
9
+ code << "-- generated by Vertigo VHDL tool"
10
+ code << ast.accept(self)
11
+ code
12
+ end
13
+
14
+ def visitRoot(root,args=nil)
15
+ code=Code.new
16
+ root.design_units.each{|design_unit_| code << design_unit_.accept(self,args)}
17
+ code
18
+ end
19
+
20
+ def visitToken token,args=nil
21
+ token.val
22
+ end
23
+
24
+ def visitComment(comment_,args=nil)
25
+ "-- #{comment_.str}"
26
+ end
27
+
28
+ def visitLibrary(library,args=nil)vhdl=Code.new
29
+ name=library.name.accept(self,args)
30
+ "library #{name};"
31
+ end
32
+
33
+ def visitUse(use,args=nil)
34
+ library=use.library.accept(self,args)
35
+ package=use.package.accept(self,args)
36
+ element=use.element.accept(self,args)
37
+ "use #{library}.#{package}.#{element};"
38
+ end
39
+
40
+ def visitEntity(entity,args=nil)
41
+ code=Code.new
42
+ name=entity.name.accept(self,args)
43
+ code.newline
44
+ code << "entity #{name} is"
45
+ code.indent=2
46
+ if entity.generics.any?
47
+ code << "generic("
48
+ code.indent=4
49
+ entity.generics.each{|generic_| code << generic_.accept(self,args)}
50
+ code.indent=2
51
+ code << ");"
52
+ end
53
+ if entity.ports.any?
54
+ code << "port("
55
+ code.indent=4
56
+ entity.ports.each{|port_| code << port_.accept(self,args)}
57
+ code.indent=2
58
+ code << ");"
59
+ end
60
+ code.indent=0
61
+ code << "end entity #{name};"
62
+ code.newline
63
+ code
64
+ end
65
+
66
+ def visitGeneric(generic,args=nil)
67
+ name=generic.name.accept(self,args)
68
+ type=generic.type.accept(self,args)
69
+ init=generic.init.accept(self,args) if generic.init
70
+ init+=" := #{init}" if init
71
+ "#{name} : #{type}#{init};"
72
+ end
73
+
74
+ def visitInput(input,args=nil)
75
+ name=input.name.accept(self,args)
76
+ type=input.type.accept(self,args)
77
+ init=input.init.accept(self,args) if input.init
78
+ "#{name} : in #{type}#{init};"
79
+ end
80
+
81
+ def visitOutput(output,args=nil)
82
+ name=output.name.accept(self,args)
83
+ type=output.type.accept(self,args)
84
+ init=output.init.accept(self,args) if output.init
85
+ "#{name} : out #{type}#{init};"
86
+ end
87
+
88
+ def visitInOut(inout,args=nil)
89
+ name=inout.name.accept(self,args)
90
+ type=inout.type.accept(self,args)
91
+ init=inout.init.accept(self,args) if inout.init
92
+ "#{name} : inout #{type}#{init};"
93
+ end
94
+
95
+ # ====================================================
96
+ def visitPackage package_,args=nil
97
+ name=package_.name.accept(self,args)
98
+ code=Code.new
99
+ code.newline
100
+ code << "package #{name} is"
101
+ code.indent=2
102
+ package_.decls.each{|decl_| code << decl_.accept(self,args)}
103
+ code.indent=0
104
+ code.newline
105
+ code << "end #{name};"
106
+ code.newline
107
+ code
108
+ end
109
+
110
+ def visitPackageBody(packagebody_,args=nil)
111
+ name=packagebody_.name.accept(self,args)
112
+ code=Code.new
113
+ code << "package body #{name} is"
114
+ code.indent=2
115
+ packagebody_.decls.each{|decl_| code << decl_.accept(self,args)}
116
+ code.indent=0
117
+ code << "end #{name};"
118
+ code
119
+ end
120
+
121
+ def visitProcedureDecl(proceduredecl_,args=nil)
122
+ name=proceduredecl_.name.accept(self,args)
123
+ code=Code.new
124
+ code.newline
125
+ code << "procedure #{name}("
126
+ code.indent=2
127
+ proceduredecl_.formal_args.map{|formal_arg_| code << formal_arg_.accept(self,args)+";"}
128
+ code.indent=0
129
+ code.last << ")"
130
+ if proceduredecl_.decls.any? or !proceduredecl_.body.nil?
131
+ code.last << " is"
132
+ decls=proceduredecl_.decls.each{|decl_| decl_.accept(self,args)}
133
+ body =proceduredecl_.body.accept(self,args) if proceduredecl_.body
134
+ code.indent=2
135
+ code << decls
136
+ code.indent=0
137
+ code << "begin"
138
+ code.indent=2
139
+ code << body
140
+ code.indent=0
141
+ code << "end #{name};"
142
+ else
143
+ code.last << ";"
144
+ end
145
+ code
146
+ end
147
+
148
+ def visitFormalArg formalarg_,args=nil
149
+ sig =formalarg_.signal.accept(self,args) if formalarg_.signal
150
+ dir =formalarg_.direction.accept(self,args) if formalarg_.direction
151
+ dir+=" " if dir
152
+ name=formalarg_.name.accept(self,args)
153
+ type=formalarg_.type.accept(self,args)
154
+ "#{sig}#{name} : #{dir}#{type}"
155
+ end
156
+
157
+ def visitProcedureCall(procedurecall_,args=nil)
158
+ name=procedurecall_.name.accept(self,args)
159
+ args=name=procedurecall_.actual_args.map{|actual_arg_| actual_arg_.accept(self,args)}.join(',')
160
+ args="(#{args})" if args
161
+ "#{name}#{args}"
162
+ end
163
+
164
+ # ====================================================
165
+ def visitArchitecture(architecture,args=nil)
166
+ code=Code.new
167
+ name=architecture.name.accept(self,args)
168
+ entity_name=architecture.entity_name.accept(self,args)
169
+ body=architecture.body.accept(self,args) if architecture.body
170
+
171
+ code << "architecture #{name} of #{entity_name} is"
172
+ code.indent=2
173
+ architecture.decls.each{|decl_| code << decl_.accept(self,args)}
174
+ code.indent=0
175
+ code << "begin"
176
+ code.newline
177
+ code.indent=2
178
+ code << body
179
+ code.indent=0
180
+ code << "end #{name};"
181
+ code
182
+ end
183
+
184
+ def visitTypeDecl type_decl,args=nil
185
+ name=type_decl.name.accept(self)
186
+ type_spec=type_decl.spec.accept(self)
187
+ code=Code.new
188
+ code.newline
189
+ code << "type #{name} is #{type_spec};"
190
+ code.newline
191
+ code
192
+ end
193
+
194
+ def visitSubTypeDecl sub_type_decl,args=nil
195
+ name=sub_type_decl.name.accept(self)
196
+ type_spec=sub_type_decl.spec.accept(self)
197
+ code=Code.new
198
+ code.newline
199
+ code << "subtype #{name} is #{type_spec};"
200
+ code.newline
201
+ code
202
+ end
203
+
204
+ def visitEnumDecl enum,args=nil
205
+ elems=enum.elements.map{|e| e.accept(self)}
206
+ "(#{elems.join(',')})"
207
+ end
208
+
209
+ def visitRecordDecl rec,args=nil
210
+ code=Code.new
211
+ code << "record"
212
+ code.indent=4
213
+ rec.elements.map{|e| code << e.accept(self)}
214
+ code.indent=2
215
+ code << "end record"
216
+ code.finalize
217
+ end
218
+
219
+ def visitRecordItem ri,args=nil
220
+ name=ri.name.accept(self)
221
+ type=ri.type.accept(self)
222
+ "#{name} : #{type};"
223
+ end
224
+
225
+ def visitArrayDecl(arraydecl_,args=nil)
226
+ ranges=arraydecl_.dim_decls.map{|dim_decl_| dim_decl_.accept(self,args)}
227
+ type=arraydecl_.type.accept(self)
228
+ "array(#{ranges.join(',')}) of #{type}"
229
+ end
230
+
231
+ def visitArrayDimDecl(arraydimdecl_,args=nil)
232
+ type_mark=arraydimdecl_.type_mark.accept(self)+" " if arraydimdecl_.type_mark
233
+ type_mark_range="#{type_mark}range " if arraydimdecl_.type_mark
234
+ range=arraydimdecl_.range.accept(self,args)
235
+ "#{type_mark_range}#{range}"
236
+ end
237
+
238
+ def visitConstant cst,args=nil
239
+ name=cst.name.accept(self)
240
+ type=cst.type.accept(self)
241
+ expr=cst.expr.accept(self)
242
+ "constant #{name} : #{type} := #{expr};"
243
+ end
244
+
245
+ def visitSignal signal,args=nil
246
+ name=signal.name.accept(self)
247
+ type=signal.type.accept(self)
248
+ init=signal.init.accept(self) if signal.init
249
+ init=" := #{init}" if init
250
+ "signal #{name} : #{type}#{init};"
251
+ end
252
+
253
+ def visitVariable variable,args=nil
254
+ name=variable.name.accept(self)
255
+ type=variable.type.accept(self)
256
+ init=variable.init.accept(self) if variable.init
257
+ init=" := #{init}" if init
258
+ "variable #{name} : #{type}#{init};"
259
+ end
260
+
261
+ def visitAlias(alias_,args=nil)
262
+ designator= alias_.designator.accept(self,args)
263
+ type = alias_.type.accept(self,args)
264
+ name = alias_.name.accept(self,args)
265
+ signature = alias_.signature.accept(self,args) if alias_.signature
266
+ "alias #{designator} : #{type} is #{name} #{};"
267
+ end
268
+
269
+ def visitBody(body,args=nil)
270
+ code=Code.new
271
+ body.elements.each{|element_| code << element_.accept(self,args)}
272
+ code
273
+ end
274
+
275
+ def visitLabel label,args=nil
276
+ id=label.ident.accept(self)
277
+ "#{id} : "
278
+ end
279
+
280
+ def visitIf if_,args=nil
281
+ label=if_.label.accept(self) if if_.label
282
+ cond=if_.cond.accept(self)
283
+ body=if_.body.accept(self)
284
+ elsifs_=if_.elsifs.map{|elsif_| elsif_.accept(self)} if if_.elsifs.any?
285
+ else_=if_.else_.accept(self) if if_.else_
286
+ code=Code.new
287
+ code << "#{label}if #{cond} then"
288
+ code.indent=2
289
+ code << body
290
+ code.indent=0
291
+ if if_.elsifs.any?
292
+ elsifs_.each{|elsif_| code << elsif_}
293
+ end
294
+ if if_.else_
295
+ code << else_
296
+ end
297
+ code << "end if;"
298
+ code
299
+ end
300
+
301
+ def visitElsif elsif_,args=nil
302
+ cond=elsif_.cond.accept(self)
303
+ body=elsif_.body.accept(self)
304
+ code=Code.new
305
+ code << "elsif #{cond} then"
306
+ code.indent=2
307
+ code << body
308
+ code.indent=0
309
+ code
310
+ end
311
+
312
+ def visitElse else_,args=nil
313
+ body=else_.body.accept(self)
314
+ code=Code.new
315
+ code << "else"
316
+ code.indent=2
317
+ code << body
318
+ code.indent=0
319
+ code
320
+ end
321
+
322
+ def visitCase case_,args=nil
323
+ expr=case_.expr.accept(self)
324
+ whens=case_.whens.map{|when_| when_.accept(self)}
325
+ code=Code.new
326
+ code << "case #{expr} is"
327
+ code.indent=2
328
+ case_.whens.map{|when_| code << when_.accept(self)}
329
+ code.indent=0
330
+ code << "end case;"
331
+ code
332
+ end
333
+
334
+ def visitCaseWhen cwhen,args=nil
335
+ expr=cwhen.expr.accept(self)
336
+ body=cwhen.body.accept(self)
337
+ code=Code.new
338
+ code << "when #{expr} =>"
339
+ code.indent=2
340
+ code << body
341
+ code.indent=0
342
+ code
343
+ end
344
+
345
+ def visitAlternative(alternative_,args=nil)
346
+ alternative_.elements.map{|element_| element_.accept(self,args)}.join(" | ")
347
+ end
348
+
349
+ def visitNullStmt null_,args=nil
350
+ "null;"
351
+ end
352
+
353
+ def visitAssert assert,args=nil
354
+ cond=assert.cond.accept(self)
355
+ repo=assert.report.accept(self) if assert.report
356
+ code=Code.new
357
+ code << "assert #{cond}"
358
+ code.indent=2
359
+ code << repo if repo
360
+ code.indent=0
361
+ code.last << ";"
362
+ code
363
+ end
364
+
365
+ def visitReport report,args=nil
366
+ expr=report.expr.accept(self)
367
+ sevr=report.severity.accept(self) if report.severity
368
+ severity=" severity #{sevr}" if sevr
369
+ "report #{expr}#{severity};"
370
+ end
371
+
372
+ def visitReturn(return_,args=nil)
373
+ expr=return_.expr.accept(self,args) if return_.expr
374
+ expr=" #{expr}" if expr
375
+ "return#{expr};"
376
+ end
377
+
378
+ def visitWithSelect(withselect_,args=nil)
379
+ expr=withselect_.with_expr.accept(self,args)
380
+ assigned=withselect_.assigned.accept(self,args)
381
+
382
+ code=Code.new
383
+ code << "with #{expr} select #{assigned} <="
384
+ code.indent=2
385
+ withselect_.selected_whens.each{|selected_when_| code << selected_when_.accept(self,args)+","}
386
+ code.indent=0
387
+ code.last << ";"
388
+ code
389
+ end
390
+
391
+ def visitSelectedWhen(selectedwhen_,args=nil)
392
+ lhs=selectedwhen_.lhs.accept(self,args)
393
+ rhs=selectedwhen_.rhs.accept(self,args)
394
+ "#{lhs} when #{rhs}"
395
+ end
396
+
397
+ def visitIfGenerate(ifgenerate_,args=nil)
398
+ cond=ifgenerate_.cond.accept(self,args)
399
+ body=ifgenerate_.body.accept(self,args)
400
+ code=Code.new
401
+ code << "if #{cond} generate"
402
+ code.indent=2
403
+ code << body
404
+ code.indent=0
405
+ code << "end generate;"
406
+ code
407
+ end
408
+
409
+ def visitForGenerate(forgenerate_,args=nil)
410
+ idx =forgenerate_.index.accept(self,args)
411
+ range=forgenerate_.range.accept(self,args)
412
+ decls=forgenerate_.decls.each{|decl_| decl_.accept(self,args)} if forgenerate_.decls
413
+ body =forgenerate_.body.accept(self,args)
414
+ code=Code.new
415
+ code << "for #{idx} in #{range} generate"
416
+ code.indent=2
417
+ code << decls if decls
418
+ code << body
419
+ code.indent=0
420
+ code << "end generate;"
421
+ code
422
+ end
423
+
424
+ #====================================
425
+ def visitEntityInstance inst,args=nil
426
+ code=Code.new
427
+ label=inst.label.accept(self) if inst.label
428
+ full_name=inst.full_name.accept(self)
429
+ arch_name=inst.arch_name.accept(self) if inst.arch_name
430
+ gen_map =inst.generic_map.accept(self) if inst.generic_map
431
+ port_map =inst.port_map.accept(self) if inst.port_map
432
+ code << "#{label}entity #{full_name}#{arch_name}"
433
+ code.indent=2
434
+ code << port_map
435
+ code.indent=0
436
+ code.newline
437
+ code
438
+ end
439
+
440
+ def visitPortMap port_map,args=nil
441
+ code=Code.new
442
+ code << "port map("
443
+ code.indent=2
444
+ port_map.elements.each{|e| code << e.accept(self)+","}
445
+ code.indent=0
446
+ code << ");"
447
+ code
448
+ end
449
+
450
+ def visitMap map,args=nil
451
+ lhs=map.lhs.accept(self)
452
+ rhs=map.rhs.accept(self) if map.rhs
453
+ rhs=" => #{rhs}" if rhs
454
+ "#{lhs}#{rhs}"
455
+ end
456
+
457
+ def visitAttributeDecl(attributedecl_,args=nil)
458
+ name=attributedecl_.name.accept(self,args)
459
+ type=attributedecl_.type.accept(self,args)
460
+ "attribute #{name} : #{type};"
461
+ end
462
+
463
+ def visitAttributeSpec(attributespec_,args=nil)
464
+ name =attributespec_.name.accept(self,args)
465
+ entity_spec=attributespec_.entity_spec.accept(self,args)
466
+ expr =attributespec_.expr.accept(self,args)
467
+ "attribute #{name} of #{entity_spec} is #{expr};"
468
+ end
469
+
470
+ def visitEntitySpec(entityspec_,args=nil)
471
+ elements=entityspec_.elements.map{|element_| element_.accept(self,args)}
472
+ entity_class=entityspec_.entity_class.accept(self,args)
473
+ "#{elements.join(',')} : #{entity_class}"
474
+ end
475
+
476
+ def visitGenericMap generic_map,args=nil
477
+ code=Code.new
478
+ code << "generic map("
479
+ code.indent=2
480
+ generic_map.elements.each{|e| code << e.accept(self)+","}
481
+ code.indent=0
482
+ code << ");"
483
+ code
484
+ end
485
+
486
+ def visitProcess(process,args=nil)
487
+ code=Code.new
488
+ code.newline
489
+ label=process.label.accept(self) if process.label
490
+ sensitity=process.sensitivity.accept(self,args) if process.sensitivity
491
+ sensitity="(#{sensitity})" if sensitity
492
+ body=process.body.accept(self,args) if process.body
493
+ code << "#{label}process#{sensitity}"
494
+ code.indent=2
495
+ process.decls.each{|decl_| code << decl_.accept(self,args)}
496
+ code.indent=0
497
+ code << "begin"
498
+ code.indent=2
499
+ code << body
500
+ code.indent=0
501
+ code << "end process;"
502
+ code
503
+ end
504
+
505
+ def visitSensitivity(sensitivity,args=nil)
506
+ list=sensitivity.elements.map{|element_| element_.accept(self,args)}
507
+ list.join(',')
508
+ end
509
+
510
+ def visitComponentDecl(componentdecl_,args=nil)
511
+ name=componentdecl_.name.accept(self,args)
512
+ code=Code.new
513
+ code << "component #{name} is"
514
+ code.indent=2
515
+ if componentdecl_.generics.any?
516
+ code.indent=4
517
+ code << "generic("
518
+ code.indent=6
519
+ componentdecl_.generics.map{|generic_| code << generic_.accept(self,args)}
520
+ code.indent=4
521
+ code << ");"
522
+ code.indent=2
523
+ end
524
+ code << "port("
525
+ code.indent=6
526
+ componentdecl_.ports.each{|port_| code << port_.accept(self,args)}
527
+ code.indent=4
528
+ code << ");"
529
+ code.indent=0
530
+ code << "end component;"
531
+ code
532
+ end
533
+
534
+ def visitComponentInstance(componentinstance_,args=nil)
535
+ label = componentinstance_.label.accept(self) if componentinstance_.label
536
+ name = componentinstance_.name.accept(self,args)
537
+ gen_map = componentinstance_.generic_map.accept(self,args) if componentinstance_.generic_map
538
+ port_map = componentinstance_.port_map.accept(self,args)
539
+ code=Code.new
540
+ code << "#{label}component #{name}"
541
+ code.indent=2
542
+ code << gen_map if gen_map
543
+ code << port_map
544
+ code.indent=0
545
+ code.newline
546
+ code
547
+ end
548
+
549
+ def visitSigAssign(sigassign,args=nil)
550
+ #pp sigassign
551
+ lhs=sigassign.lhs.accept(self,args)
552
+ rhs=sigassign.rhs.accept(self,args)
553
+ "#{lhs} <= #{rhs};"
554
+ end
555
+
556
+ def visitVarAssign(varassign,args=nil)
557
+ lhs=varassign.lhs.accept(self,args)
558
+ rhs=varassign.rhs.accept(self,args)
559
+ "#{lhs} := #{rhs};"
560
+ end
561
+
562
+ def visitWait(wait,args=nil)
563
+ expr=wait.until_.accept(self,args) if wait.until_
564
+ expr=wait.for_.accept(self,args) if wait.for_
565
+ "wait #{expr};"
566
+ end
567
+
568
+ def visitStdType(stdtype,args=nil)
569
+ stdtype.ident.accept(self,args)
570
+ end
571
+
572
+ def visitRangedType(rangedtype_,args=nil)
573
+ type=rangedtype_.type.accept(self,args)
574
+ range=rangedtype_.range.accept(self,args)
575
+ "#{type} range #{range}"
576
+ end
577
+
578
+ def visitNamedType(namedtype,args=nil)
579
+ namedtype.ident.accept(self,args)
580
+ end
581
+
582
+ def visitArrayType(arraytype,args=nil)
583
+ name=arraytype.name.accept(self,args)
584
+ ranges=[]
585
+ arraytype.discrete_ranges.each{|discrete_range_| ranges << discrete_range_.accept(self,args)}
586
+ "#{name}(#{ranges.join(',')})"
587
+ end
588
+
589
+ def visitDiscreteRange(discreterange,args=nil)
590
+ lhs=discreterange.lhs.accept(self,args)
591
+ dir=discreterange.dir.accept(self,args)
592
+ rhs=discreterange.rhs.accept(self,args)
593
+ "#{lhs} #{dir} #{rhs}"
594
+ end
595
+
596
+ def visitWaveform(waveform,args=nil)
597
+ elements=waveform.elements.map{|element_| element_.accept(self,args)}
598
+ elements.join(',')
599
+ end
600
+
601
+ def visitCondExpr(condexpr,args=nil)
602
+ code=Code.new
603
+ whens=condexpr.whens.map{|when_| when_.accept(self,args)}
604
+ else_=condexpr.else_.accept(self,args)
605
+ code << "#{whens.join} #{else_}"
606
+ code.finalize
607
+ end
608
+
609
+ def visitWhen(when_,args=nil)
610
+ expr=when_.expr.accept(self,args)
611
+ cond=when_.cond.accept(self,args)
612
+ "#{expr} when #{cond} else "
613
+ end
614
+
615
+ def visitBinary(binary_,args=nil)
616
+ lhs=binary_.lhs.accept(self,args)
617
+ op=binary_.op.accept(self,args)
618
+ rhs=binary_.rhs.accept(self,args)
619
+ "#{lhs} #{op} #{rhs}"
620
+ end
621
+
622
+ def visitIdent(ident,args=nil)
623
+ ident.tok.accept(self,args)
624
+ end
625
+
626
+ def visitIntLit(intlit,args=nil)
627
+ intlit.tok.accept(self,args)
628
+ end
629
+
630
+ def visitCharLit(lit,args=nil)
631
+ lit.tok.accept(self,args)
632
+ end
633
+
634
+ def visitBoolLit(boollit_,args=nil)
635
+ boollit_.tok.accept(self,args)
636
+ end
637
+
638
+ def visitSelectedName(selectedname,args=nil)
639
+ lhs=selectedname.lhs.accept(self,args)
640
+ rhs=selectedname.rhs.accept(self,args)
641
+ "#{lhs}.#{rhs}"
642
+ end
643
+
644
+ def visitAfter after,args=nil
645
+ lhs=after.lhs.accept(self,args)
646
+ rhs=after.rhs.accept(self,args)
647
+ "#{lhs} after #{rhs}"
648
+ end
649
+
650
+ def visitTimed(timed,args=nil)
651
+ lhs=timed.lhs.accept(self,args)
652
+ rhs=timed.rhs.accept(self,args)
653
+ "#{lhs} #{rhs}"
654
+ end
655
+
656
+ def visitAttributed(attributed_,args=nil)
657
+ lhs=attributed_.lhs.accept(self,args)
658
+ rhs=attributed_.rhs.accept(self,args)
659
+ "#{lhs}#{rhs}"
660
+ end
661
+
662
+ def visitConcat(concat_,args=nil)
663
+ lhs=concat_.lhs.accept(self,args)
664
+ rhs=concat_.rhs.accept(self,args)
665
+ "#{lhs} & #{rhs}"
666
+ end
667
+
668
+ def visitQualified(qualified_,args=nil)
669
+ lhs=qualified_.lhs.accept(self,args)
670
+ rhs=qualified_.rhs.accept(self,args)
671
+ "#{lhs}'#{rhs}"
672
+ end
673
+
674
+ def visitSliced(sliced_,args=nil)
675
+ exp=sliced_.expr.accept(self,args)
676
+ lhs=sliced_.lhs.accept(self,args)
677
+ dir=sliced_.dir.accept(self,args)
678
+ rhs=sliced_.rhs.accept(self,args)
679
+ "#{exp}(#{lhs} #{dir} #{rhs})"
680
+ end
681
+
682
+ def visitFuncProtoDecl(funcprotodecl_,args=nil)
683
+ name=funcprotodecl_.name.accept(self,args)
684
+ args=funcprotodecl_.formal_args.map{|formal_arg_| formal_arg_.accept(self,args)}.join(";")
685
+ type=funcprotodecl_.return_type.accept(self)
686
+ args="(#{args})" if args
687
+ "function #{name}#{args} return #{type}"
688
+ end
689
+
690
+ def visitFuncDecl(funcdecl_,args=nil)
691
+ name=funcdecl_.name.accept(self,args)
692
+ args=funcdecl_.formal_args.map{|formal_arg_| formal_arg_.accept(self,args)}.join(";")
693
+ type=funcdecl_.return_type.accept(self)
694
+ args="(#{args})" if args
695
+ code=Code.new
696
+ code.newline
697
+ code << "function #{name}#{args} return #{type} is"
698
+ code.indent=2
699
+ funcdecl_.decls.each{|decl| code << decl.accept(self)}
700
+ code.indent=0
701
+ code << "begin"
702
+ code.indent=2
703
+ code << funcdecl_.body.accept(self)
704
+ code.indent=0
705
+ code << "end function #{name};"
706
+ code
707
+ end
708
+
709
+ def visitFuncCall funcall,args=nil
710
+ name=funcall.name.accept(self)
711
+ args=funcall.actual_args.map{|arg| arg.accept(self)}.join(',')
712
+ "#{name}(#{args})"
713
+ end
714
+
715
+ def visitParenth parenth,args=nil
716
+ expr=parenth.expr.accept(self)
717
+ "(#{expr})"
718
+ end
719
+
720
+ def visitAggregate aggregate,args=nil
721
+ elems=(elements=aggregate.elements).map{|e| e.accept(self)}
722
+ # here we prototype a multiline method, for long aggregates
723
+ ret="\n\t(\n\t#{elems.join(',')})"
724
+ if ret.size>5
725
+ klasses=elements.map{|e| e.class}
726
+ #if klasses.include?(Aggregate)
727
+ code=Code.new
728
+ code << '('
729
+ code.indent=col=5
730
+ elements.each{|e|
731
+ code << e.accept(self)+","
732
+ }
733
+ code.indent=col-2
734
+ code.newline
735
+ code << ")"
736
+ ret=code.finalize
737
+ #end
738
+ end
739
+ ret
740
+ end
741
+
742
+ def visitAssoc assoc,args=nil
743
+ lhs=assoc.lhs.accept(self)
744
+ rhs=assoc.rhs.accept(self)
745
+ "(#{lhs} => #{rhs})"
746
+ end
747
+
748
+ end
749
+ end