HDLRuby 2.4.27 → 2.6.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/lib/HDLRuby/drivers/xcd.rb +79 -0
  3. data/lib/HDLRuby/drivers/xcd/dummy.xcd +4 -0
  4. data/lib/HDLRuby/hdr_samples/adder.rb +1 -1
  5. data/lib/HDLRuby/hdr_samples/adder_bench.rb +1 -1
  6. data/lib/HDLRuby/hdr_samples/adder_gen.rb +1 -1
  7. data/lib/HDLRuby/hdr_samples/constant_in_function.rb +27 -0
  8. data/lib/HDLRuby/hdr_samples/dff_properties.rb +19 -0
  9. data/lib/HDLRuby/hdr_samples/dff_unit.rb +54 -0
  10. data/lib/HDLRuby/hdr_samples/huge_rom.rb +25 -0
  11. data/lib/HDLRuby/hdr_samples/logic_bench.rb +21 -0
  12. data/lib/HDLRuby/hdr_samples/mei8_bench.rb +1 -1
  13. data/lib/HDLRuby/hdr_samples/music.rb +79 -0
  14. data/lib/HDLRuby/hdr_samples/named_sub.rb +42 -0
  15. data/lib/HDLRuby/hdr_samples/rom.rb +16 -0
  16. data/lib/HDLRuby/hdr_samples/seqpar_bench.rb +59 -0
  17. data/lib/HDLRuby/hdr_samples/with_function_generator.rb +25 -0
  18. data/lib/HDLRuby/hdrcc.rb +140 -24
  19. data/lib/HDLRuby/hruby_decorator.rb +250 -0
  20. data/lib/HDLRuby/hruby_high.rb +468 -91
  21. data/lib/HDLRuby/hruby_low.rb +913 -45
  22. data/lib/HDLRuby/hruby_low2c.rb +189 -168
  23. data/lib/HDLRuby/hruby_low2hdr.rb +738 -0
  24. data/lib/HDLRuby/hruby_low2high.rb +331 -549
  25. data/lib/HDLRuby/hruby_low2vhd.rb +39 -2
  26. data/lib/HDLRuby/hruby_low_bool2select.rb +29 -0
  27. data/lib/HDLRuby/hruby_low_casts_without_expression.rb +27 -0
  28. data/lib/HDLRuby/hruby_low_fix_types.rb +25 -0
  29. data/lib/HDLRuby/hruby_low_mutable.rb +70 -0
  30. data/lib/HDLRuby/hruby_low_resolve.rb +28 -0
  31. data/lib/HDLRuby/hruby_low_without_connection.rb +6 -3
  32. data/lib/HDLRuby/hruby_low_without_namespace.rb +7 -4
  33. data/lib/HDLRuby/hruby_low_without_parinseq.rb +151 -0
  34. data/lib/HDLRuby/hruby_low_without_select.rb +13 -0
  35. data/lib/HDLRuby/hruby_tools.rb +11 -1
  36. data/lib/HDLRuby/hruby_verilog.rb +1602 -1629
  37. data/lib/HDLRuby/sim/hruby_sim.h +25 -2
  38. data/lib/HDLRuby/sim/hruby_sim_calc.c +63 -6
  39. data/lib/HDLRuby/sim/hruby_sim_vcd.c +5 -1
  40. data/lib/HDLRuby/sim/hruby_sim_vizualize.c +22 -6
  41. data/lib/HDLRuby/std/fixpoint.rb +9 -0
  42. data/lib/HDLRuby/std/function_generator.rb +139 -0
  43. data/lib/HDLRuby/std/hruby_unit.rb +75 -0
  44. data/lib/HDLRuby/template_expander.rb +61 -0
  45. data/lib/HDLRuby/version.rb +1 -1
  46. metadata +22 -5
@@ -162,6 +162,19 @@ module HDLRuby::Low
162
162
  return selects
163
163
  end
164
164
  end
165
+
166
+ ## Extends the String class with functionality for converting select
167
+ # expressions to case statements.
168
+ class Print
169
+ # Extract the Select expressions.
170
+ def extract_selects!
171
+ selects = []
172
+ self.map_args! do |arg|
173
+ arg.extract_selects_to!(selects)
174
+ end
175
+ return selects
176
+ end
177
+ end
165
178
 
166
179
  ## Extends the If class with functionality for converting select
167
180
  # expressions to case statements.
@@ -1,4 +1,3 @@
1
-
2
1
  module HDLRuby
3
2
 
4
3
  ##
@@ -40,4 +39,15 @@ module HDLRuby
40
39
  end
41
40
  end
42
41
 
42
+
43
+ # Module for adding prefixes to names.
44
+ module HDLRuby::Prefix
45
+
46
+ # Get the prefix
47
+ def prefix
48
+ return self.name + "#"
49
+ end
50
+
51
+ end
52
+
43
53
  end
@@ -14,146 +14,147 @@ module HDLRuby::Low
14
14
  # The list of base types used both in verilog and HDLRuby
15
15
  VERILOG_BASE_TYPES = ["signed"]
16
16
 
17
+ # The list of signals that are actually verilog regs.
18
+ VERILOG_REGS = []
19
+
20
+ ## Converts string +str+ to a Verilog-compatible string.
21
+ def self.v_string(str)
22
+ str = str.gsub(/\n/,"\\n")
23
+ str.gsub!(/\t/,"\\t")
24
+ return str
25
+ end
26
+
27
+
28
+ # Sample of very handy for programming.
29
+ # puts "class=#{self.yes.class}" # Confirm class of self.yes.
30
+ # puts "methods=#{self.right.methods}" # Confirm method of self.right.
31
+ # puts "outputs=#{outputs}" # Confirm outputs
32
+
33
+ # each. do |*arg| # I forgot this.
34
+ # puts args
35
+ # end
17
36
 
18
- # Sample of very handy for programming.
19
- # puts "class=#{self.yes.class}" # Confirm class of self.yes.
20
- # puts "methods=#{self.right.methods}" # Confirm method of self.right.
21
- # puts "outputs=#{outputs}" # Confirm outputs
22
-
23
- # each. do |*arg| # I forgot this.
24
- # puts args
25
- # end
26
-
27
- # Global variable used for indentation and structure (temporary).
28
- $space_count = 0 # Count used for increasing indent by if statement. (temporary)
29
- $vector_reg = "" # For storing signal type at structure declaration. (temporary)
30
- $vector_cnt = 0 # For allocating numbers at structure declaration. (temporary)
31
-
32
- # class Fixnum
33
- # def to_verilog
34
- # to_s
35
- # end
36
- # end
37
- class ::Integer
38
- def to_verilog
39
- to_s
37
+ # Global variable used for indentation and structure (temporary).
38
+ $vector_reg = "" # For storing signal type at structure declaration. (temporary)
39
+ $vector_cnt = 0 # For allocating numbers at structure declaration. (temporary)
40
+
41
+ class ::Integer
42
+ def to_verilog
43
+ to_s
44
+ end
40
45
  end
41
- end
42
46
 
43
- # Class summarizing "hash" used for "par" or "seq" conversion.
44
- class Fm
45
- attr_reader :fm_seq, :fm_par, :rep, :rep_sharp
46
- def initialize
47
- @fm_seq = {} # Used to seq -> par.
48
- @fm_par = {} # Used to par -> seq.
49
- @rep = {} # Used to give ' to variables
50
- @rep_sharp = {} # Used to give # to variables
47
+ # Class summarizing "hash" used for "par" or "seq" conversion.
48
+ class Fm
49
+ attr_reader :fm_seq, :fm_par, :rep, :rep_sharp
50
+ def initialize
51
+ @fm_seq = {} # Used to seq -> par.
52
+ @fm_par = {} # Used to par -> seq.
53
+ @rep = {} # Used to give ' to variables
54
+ @rep_sharp = {} # Used to give # to variables
55
+ end
51
56
  end
52
- end
53
57
 
54
- # Declaration of fm to manage each hash.
55
- $fm = Fm.new
58
+ # Declaration of fm to manage each hash.
59
+ $fm = Fm.new
56
60
 
57
- # A class that translates the left-hand side, operator, and right-hand side into form of expression.
58
- class Binary
59
- # Converts the system to Verilog code.
60
- def to_verilog
61
- return "(#{self.left.to_verilog} #{self.operator} #{self.right.to_verilog})"
62
- end
61
+ # A class that translates the left-hand side, operator, and right-hand side into form of expression.
62
+ class Binary
63
+ # Converts the system to Verilog code.
64
+ def to_verilog
65
+ return "(#{self.left.to_verilog} #{self.operator} #{self.right.to_verilog})"
66
+ end
63
67
 
64
- # Method called when two or more expression terms are present.
65
- # When translating par into seq mode = seq, when translating seq to par mode = par.
66
- # Search recursively and replace if hash matches identifier.
67
- def to_change(mode)
68
- # Recursively search the left side and the right side, check the identifier and replace it.
69
- if self.left.is_a? (Binary) then
70
- # If there is an expression on the left side of the right side, to_chang is executed again.
71
- left = self.left.to_change(mode)
72
- else
73
- # If you need to replace the variable, replace it. Otherwise we will get a clone.
74
- if $fm.fm_par.has_key?(self.left.to_verilog) && mode == :par then
75
- left = $fm.fm_par["#{self.left.to_verilog}"]
76
- elsif $fm.fm_seq.has_key?(self.left.to_verilog) && mode == :seq then
77
- left = $fm.fm_seq["#{self.left.to_verilog}"]
68
+ # Method called when two or more expression terms are present.
69
+ # When translating par into seq mode = seq, when translating seq to par mode = par.
70
+ # Search recursively and replace if hash matches identifier.
71
+ def to_change(mode)
72
+ # Recursively search the left side and the right side, check the identifier and replace it.
73
+ if self.left.is_a? (Binary) then
74
+ # If there is an expression on the left side of the right side, to_chang is executed again.
75
+ left = self.left.to_change(mode)
78
76
  else
79
- left = self.left.clone
77
+ # If you need to replace the variable, replace it. Otherwise we will get a clone.
78
+ if $fm.fm_par.has_key?(self.left.to_verilog) && mode == :par then
79
+ left = $fm.fm_par["#{self.left.to_verilog}"]
80
+ elsif $fm.fm_seq.has_key?(self.left.to_verilog) && mode == :seq then
81
+ left = $fm.fm_seq["#{self.left.to_verilog}"]
82
+ else
83
+ left = self.left.clone
84
+ end
80
85
  end
81
- end
82
- if self.right.is_a? (Binary) then
83
- # Recursively search the right side and the right side, check the identifier and replace it.
84
- right = self.right.to_change(mode)
85
- else
86
- # If you need to replace the variable, replace it. Otherwise we will get a clone.
87
- if $fm.fm_par.has_key?(self.right.to_verilog) && mode == :par then
88
- right = $fm.fm_par["#{self.right.to_verilog}"]
89
- elsif $fm.fm_seq.has_key?(self.right.to_verilog) && mode == :seq then
90
- right = $fm.fm_seq["#{self.right.to_verilog}"]
86
+ if self.right.is_a? (Binary) then
87
+ # Recursively search the right side and the right side, check the identifier and replace it.
88
+ right = self.right.to_change(mode)
91
89
  else
92
- right = self.right.clone
90
+ # If you need to replace the variable, replace it. Otherwise we will get a clone.
91
+ if $fm.fm_par.has_key?(self.right.to_verilog) && mode == :par then
92
+ right = $fm.fm_par["#{self.right.to_verilog}"]
93
+ elsif $fm.fm_seq.has_key?(self.right.to_verilog) && mode == :seq then
94
+ right = $fm.fm_seq["#{self.right.to_verilog}"]
95
+ else
96
+ right = self.right.clone
97
+ end
93
98
  end
99
+ # After confirmation, we create and return an expression.
100
+ return Binary.new(self.type,self.operator,left.clone,right.clone)
94
101
  end
95
- # After confirmation, we create and return an expression.
96
- return Binary.new(self.type,self.operator,left.clone,right.clone)
97
102
  end
98
- end
99
103
 
100
- # class of Represent blocking substitution or nonblocking assignment.
101
- # Enhance Transmit with generation of verilog code.
102
- class Transmit
103
- # Converts the system to Verilog code.
104
- def to_verilog(mode = nil)
105
- # Determine blocking assignment or nonblocking substitution from mode and return it.
106
- code = "#{self.left.to_verilog} #{mode == "seq" ? "=" : "<="} #{self.right.to_verilog};\n"
107
- return code
104
+ # class of Represent blocking substitution or nonblocking assignment.
105
+ # Enhance Transmit with generation of verilog code.
106
+ class Transmit
107
+ # Converts the system to Verilog code.
108
+ def to_verilog(spc = 3)
109
+ # Determine blocking assignment or nonblocking substitution from mode and return it.
110
+ code = "#{" " * spc}#{self.left.to_verilog} #{self.block.mode == :seq ? "=" : "<="} #{self.right.to_verilog};"
111
+ return code
112
+ end
108
113
  end
109
- end
110
114
 
111
- # To scheduling to the Block.
112
- # Enhance Block with generation of verilog code.
113
- class Block
114
- # Converts the system to Verilog code.
115
- def to_verilog(mode = nil)
116
- # No translation is done in this class.
117
- puts "Block to_verilog not found" # For debugging
115
+ # Enhance Print with generation of verilog code.
116
+ class Print
117
+ # Converts the system to Verilog code.
118
+ def to_verilog(spc = 3)
119
+ code = "#{" " * spc}$write(#{self.each_arg.map do |arg|
120
+ arg.to_verilog
121
+ end.join(",") });"
122
+ return code
123
+ end
118
124
  end
119
125
 
120
- # Extract and convert to verilog the TimeRepeat statements.
121
- # NOTE: work only on the current level of the block (should be called
122
- # through each_block_deep).
123
- def repeat_to_verilog!
124
- code = ""
125
- # Gather the TimeRepeat statements.
126
- repeats = self.each_statement.find_all { |st| st.is_a?(TimeRepeat) }
127
- # Remove them from the block.
128
- repeats.each { |st| self.delete_statement!(st) }
129
- # Generate them separately in timed always processes.
130
- repeats.each do |st|
131
- code << " always #{st.delay.to_verilog} begin\n"
132
-
133
- # Perform "scheduling" using the method "flatten".
134
- block = st.statement.flatten(st.statement.mode.to_s)
135
-
126
+ # To scheduling to the Block.
127
+ # Enhance Block with generation of verilog code.
128
+ class Block
129
+
130
+ # Converts the system to Verilog code adding 'spc' spaces at the begining
131
+ # of each line.
132
+ def to_verilog(spc = 3)
133
+ code = "begin"
134
+ if self.name && !self.name.empty? then
135
+ vname = name_to_verilog(self.name)
136
+ code << " : #{vname}"
137
+ self.properties[:verilog_name] = vname
138
+ end
139
+ code << "\n" if block.each_inner.any?
136
140
  # Declaration of "inner" part within "always".
137
141
  block.each_inner do |inner|
138
- # if regs.include?(inner.name) then
139
- if regs.include?(inner.to_verilog) then
140
- code << " reg"
142
+ if HDLRuby::Low::VERILOG_REGS.include?(inner.to_verilog) then
143
+ # code << " reg"
144
+ code << "#{" " * (spc+3)}reg"
141
145
  else
142
- code << " wire"
146
+ code << "#{" " * (spc+3)}wire"
143
147
  end
144
148
 
145
149
  # Variable has "base", but if there is width etc, it is not in "base".
146
150
  # It is determined by an if.
147
151
  if inner.type.base?
148
152
  if inner.type.base.base?
149
- # code << "#{inner.type.base.to_verilog} #{inner.to_verilog} #{inner.type.to_verilog};\n"
150
153
  code << "#{inner.type.base.to_verilog} #{inner.to_verilog} #{inner.type.to_verilog}"
151
154
  else
152
- # code << "#{inner.type.to_verilog} #{inner.to_verilog};\n"
153
155
  code << "#{inner.type.to_verilog} #{inner.to_verilog}"
154
156
  end
155
157
  else
156
- # code << " #{inner.type.to_verilog}#{inner.to_verilog};\n"
157
158
  code << " #{inner.type.to_verilog}#{inner.to_verilog}"
158
159
  end
159
160
  if inner.value then
@@ -165,40 +166,187 @@ class Block
165
166
 
166
167
  # Translate the block that finished scheduling.
167
168
  block.each_statement do |statement|
168
- code << "\n #{statement.to_verilog(block.mode.to_s)}"
169
+ # puts "#{statement.to_verilog(spc+3)}"
170
+ if statement.is_a?(Block) then
171
+ code << "\n#{" " * (spc+3)}#{statement.to_verilog(spc+3)}"
172
+ else
173
+ code << "\n#{statement.to_verilog(spc+3)}"
174
+ end
169
175
  end
176
+ # Close the block."
177
+ code << "\n#{" "*spc}end"
178
+ return code
179
+ end
170
180
 
171
- $fm.fm_par.clear()
172
181
 
173
- code << "\n end\n\n"
174
- end
175
- return code
176
- end
177
182
 
178
183
 
179
- # Process top layer of Block.
180
- # Determine whether there is a block under block and convert it.
181
- def flatten(mode = nil)
182
- if self.is_a?(TimeBlock) then
183
- new_block = TimeBlock.new(self.mode,"")
184
- else
185
- new_block = Block.new(self.mode,"") # A new block to store the converted statement.
184
+
185
+ # Extract and convert to verilog the TimeRepeat statements.
186
+ # NOTE: work only on the current level of the block (should be called
187
+ # through each_block_deep).
188
+ def repeat_to_verilog!
189
+ code = ""
190
+ # Gather the TimeRepeat statements.
191
+ repeats = self.each_statement.find_all { |st| st.is_a?(TimeRepeat) }
192
+ # Remove them from the block.
193
+ repeats.each { |st| self.delete_statement!(st) }
194
+ # Generate them separately in timed always processes.
195
+ repeats.each do |st|
196
+ code << " always #{st.delay.to_verilog} begin\n"
197
+
198
+ # Perform "scheduling" using the method "flatten".
199
+ block = st.statement.flatten(st.statement.mode.to_s)
200
+
201
+ # Declaration of "inner" part within "always".
202
+ block.each_inner do |inner|
203
+ # if regs.include?(inner.name) then
204
+ if HDLRuby::Low::VERILOG_REGS.include?(inner.to_verilog) then
205
+ code << " reg"
206
+ else
207
+ code << " wire"
208
+ end
209
+
210
+ # Variable has "base", but if there is width etc, it is not in "base".
211
+ # It is determined by an if.
212
+ if inner.type.base?
213
+ if inner.type.base.base?
214
+ code << "#{inner.type.base.to_verilog} #{inner.to_verilog} #{inner.type.to_verilog}"
215
+ else
216
+ code << "#{inner.type.to_verilog} #{inner.to_verilog}"
217
+ end
218
+ else
219
+ code << " #{inner.type.to_verilog}#{inner.to_verilog}"
220
+ end
221
+ if inner.value then
222
+ # There is an initial value.
223
+ code << " = #{inner.value.to_verilog}"
224
+ end
225
+ code << ";\n"
226
+ end
227
+
228
+ # Translate the block that finished scheduling.
229
+ block.each_statement do |statement|
230
+ code << "\n #{statement.to_verilog(block.mode.to_s)}"
231
+ end
232
+
233
+ $fm.fm_par.clear()
234
+
235
+ code << "\n end\n\n"
236
+ end
237
+ return code
186
238
  end
187
- list = [] # A list for confirming that variable declarations do not overlap.
188
239
 
189
- # Is block in the statement?
190
- if (self.each_statement.find {|stmnt| stmnt.is_a?(Block)}) then
191
- # Process for each type of statement in block.
192
- self.each_statement do |statement|
193
240
 
241
+ # Process top layer of Block.
242
+ # Determine whether there is a block under block and convert it.
243
+ def flatten(mode = nil)
244
+ if self.is_a?(TimeBlock) then
245
+ new_block = TimeBlock.new(self.mode,"")
246
+ else
247
+ new_block = Block.new(self.mode,"") # A new block to store the converted statement.
248
+ end
249
+ list = [] # A list for confirming that variable declarations do not overlap.
250
+
251
+ # Is block in the statement?
252
+ if (self.each_statement.find {|stmnt| stmnt.is_a?(Block)}) then
253
+ # Process for each type of statement in block.
254
+ self.each_statement do |statement|
255
+ # If statement is case, there is a block for each default and when, so translate each.
256
+ if statement.is_a?(Case) then
257
+ if statement.default.is_a?(Block)
258
+ default = statement.default.flatten
259
+ new_default = Block.new(default.mode,"")
260
+
261
+ default.each_inner do |inner|
262
+ # I read inner, but when I am par, I delete all '.
263
+ unless (list.include?(inner.name.to_s)) then
264
+ if (self.mode == :seq) || (inner.name.to_s.include? "#") then
265
+ list << inner.name.to_s
266
+ new_block.add_inner(inner.clone)
267
+ end
268
+ end
269
+ end
194
270
 
195
- # If statement is case, there is a block for each default and when, so translate each.
196
- if statement.is_a?(Case) then
197
- if statement.default.is_a?(Block)
198
- default = statement.default.flatten
199
- new_default = Block.new(default.mode,"")
271
+ default.each_statement do |statement|
272
+ # If statement is Transmit, it is an expression and should be processed.
273
+ if statement.is_a?(Transmit) then
274
+ # If you add a # to the one with 'on the left side, the shape of the formula will collapse and it will be removed.
275
+ unless (res_name(statement.left).name.to_s.include? "'") || default.mode == :par then
276
+ # Prepare a new signal with the # on the variable on the left side using the att_signal method.
277
+ new_signal = att_signal(statement.left, "#")
278
+ # Check list and add new variables to inner if they do not duplicate.
279
+ unless (list.include?(new_signal.name.to_s)) then
280
+ list << new_signal.name.to_s
281
+ new_block.add_inner(new_signal)
282
+ end
283
+
284
+ new_statement = Transmit.new(search_refname(statement.left,"#"),statement.right.clone)
285
+
286
+ $fm.rep_sharp[statement.left] = search_refname(statement.left,"#")
287
+
288
+ $fm.fm_par["#{statement.left.to_verilog}"] = new_statement.left
289
+ new_default.add_statement(new_statement.clone)
290
+ else
291
+ new_default.add_statement(statement.clone)
292
+ end
293
+ else
294
+ new_default.add_statement(statement.clone)
295
+ end
296
+ end
297
+ end
200
298
 
201
- default.each_inner do |inner|
299
+ new_statement = Case.new(statement.value.clone,statement.default ? new_default.clone : nil,[])
300
+
301
+ statement.each_when do |whens|
302
+ when_smt = whens.statement.flatten
303
+ new_when_smt = Block.new(when_smt.mode,"")
304
+
305
+ when_smt.each_statement do |statement|
306
+ # If statement is Transmit, it is an expression and should be processed.
307
+ if statement.is_a?(Transmit) then
308
+ # # If you add a # to the one with 'on the left side, the shape of the formula will collapse and it will be removed.
309
+ unless (res_name(statement.left).name.to_s.include? "'") || when_smt.mode == :par then
310
+ # # Prepare a new signal with the # on the variable on the left side using the att_signal method.
311
+ new_signal = att_signal(statement.left, "#")
312
+ # Check list and add new variables to inner if they do not duplicate.
313
+ unless (list.include?(new_signal.name.to_s)) then
314
+ list << new_signal.name.to_s
315
+ new_block.add_inner(new_signal)
316
+ end
317
+
318
+ new_smt = Transmit.new(search_refname(statement.left,"#"),statement.right.clone)
319
+
320
+ $fm.rep_sharp[statement.left] = search_refname(statement.left,"#")
321
+
322
+ $fm.fm_par["#{statement.left.to_verilog}"] = new_smt.left
323
+ new_when_smt.add_statement(new_smt.clone)
324
+ else
325
+ new_when_smt.add_statement(statement.clone)
326
+ end
327
+ else
328
+ new_when_smt.add_statement(statement.clone)
329
+ end
330
+ end
331
+
332
+ new_when = When.new(whens.match.clone,new_when_smt.clone)
333
+ new_statement.add_when(new_when.clone)
334
+ end
335
+
336
+ new_block.add_statement(new_statement)
337
+
338
+ $fm.rep_sharp.each_key do |key|
339
+ new_smt = Transmit.new(key.clone,$fm.rep_sharp[key].clone)
340
+ new_block.add_statement(new_smt.clone)
341
+ end
342
+ $fm.rep_sharp.clear() # Deactivate rep that has become obsolete.
343
+
344
+ # If the statement is if, there is a block for each of yes, no, noifs, so translate each.
345
+ elsif statement.is_a?(If) then
346
+ yes = statement.yes.flatten # Smooth yes of if statement.
347
+ new_yes = Block.new(yes.mode,"") # New yes storage block
348
+
349
+ yes.each_inner do |inner|
202
350
  # I read inner, but when I am par, I delete all '.
203
351
  unless (list.include?(inner.name.to_s)) then
204
352
  if (self.mode == :seq) || (inner.name.to_s.include? "#") then
@@ -208,11 +356,12 @@ class Block
208
356
  end
209
357
  end
210
358
 
211
- default.each_statement do |statement|
359
+ # Check the statements in "yes" in order.
360
+ yes.each_statement do |statement|
212
361
  # If statement is Transmit, it is an expression and should be processed.
213
362
  if statement.is_a?(Transmit) then
214
363
  # If you add a # to the one with 'on the left side, the shape of the formula will collapse and it will be removed.
215
- unless (res_name(statement.left).name.to_s.include? "'") || default.mode == :par then
364
+ unless (res_name(statement.left).name.to_s.include? "'") || yes.mode == :par then
216
365
  # Prepare a new signal with the # on the variable on the left side using the att_signal method.
217
366
  new_signal = att_signal(statement.left, "#")
218
367
  # Check list and add new variables to inner if they do not duplicate.
@@ -225,130 +374,188 @@ class Block
225
374
 
226
375
  $fm.rep_sharp[statement.left] = search_refname(statement.left,"#")
227
376
 
377
+ new_yes.add_statement(new_statement.clone)
378
+
379
+
228
380
  $fm.fm_par["#{statement.left.to_verilog}"] = new_statement.left
229
- new_default.add_statement(new_statement.clone)
381
+
230
382
  else
231
- new_default.add_statement(statement.clone)
383
+ new_yes.add_statement(statement.clone)
232
384
  end
233
385
  else
234
- new_default.add_statement(statement.clone)
386
+ new_yes.add_statement(statement.clone)
235
387
  end
236
- end
237
- end
388
+ end
238
389
 
239
- new_statement = Case.new(statement.value.clone,statement.default ? new_default.clone : nil,[])
390
+ # Confirm that "else" exists and convert it if it exists.
391
+ # Because error occurs when trying to convert when "else" does not exist.
392
+ if statement.no.is_a? (Block) then
393
+ no = statement.no.flatten
394
+ new_no = Block.new(no.mode,"")
395
+
396
+ no.each_inner do |inner|
397
+ # I read inner, but when I am par, I delete all '.
398
+ unless (list.include?(inner.name.to_s)) then
399
+ if (self.mode == :seq) || (inner.name.to_s.include? "#") then
400
+ list << inner.name.to_s
401
+ new_block.add_inner(inner.clone)
402
+ end
403
+ end
404
+ end
240
405
 
241
- statement.each_when do |whens|
242
- when_smt = whens.statement.flatten
243
- new_when_smt = Block.new(when_smt.mode,"")
406
+ no.each_statement do |statement|
407
+ # If statement is Transmit, it is an expression and should be processed.
408
+ if statement.is_a?(Transmit) then
409
+ # If you add a # to the one with 'on the left side, the shape of the formula will collapse and it will be removed.
410
+ unless (res_name(statement.left).name.to_s.include? "'") || yes.mode == :par then
244
411
 
245
- when_smt.each_statement do |statement|
246
- # If statement is Transmit, it is an expression and should be processed.
247
- if statement.is_a?(Transmit) then
248
- # # If you add a # to the one with 'on the left side, the shape of the formula will collapse and it will be removed.
249
- unless (res_name(statement.left).name.to_s.include? "'") || when_smt.mode == :par then
250
- # # Prepare a new signal with the # on the variable on the left side using the att_signal method.
251
- new_signal = att_signal(statement.left, "#")
252
- # Check list and add new variables to inner if they do not duplicate.
253
- unless (list.include?(new_signal.name.to_s)) then
254
- list << new_signal.name.to_s
255
- new_block.add_inner(new_signal)
256
- end
412
+ new_signal = att_signal(statement.left, "#")
257
413
 
258
- new_smt = Transmit.new(search_refname(statement.left,"#"),statement.right.clone)
414
+ # Double declaration of existing variable can not be done, so it is excluded.
415
+ unless (list.include?(new_signal.name.to_s)) then
416
+ list << new_signal.name.to_s
417
+ new_block.add_inner(new_signal)
418
+ end
259
419
 
260
- $fm.rep_sharp[statement.left] = search_refname(statement.left,"#")
420
+ new_statement = Transmit.new(search_refname(statement.left,"#"),statement.right.clone)
261
421
 
262
- $fm.fm_par["#{statement.left.to_verilog}"] = new_smt.left
263
- new_when_smt.add_statement(new_smt.clone)
422
+ $fm.rep_sharp[statement.left] = search_refname(statement.left,"#")
423
+
424
+ $fm.fm_par["#{statement.left.to_verilog}"] = new_statement.left
425
+ new_no.add_statement(new_statement.clone)
426
+ else
427
+ new_no.add_statement(statement.clone)
428
+ end
264
429
  else
265
- new_when_smt.add_statement(statement.clone)
266
- end
267
- else
268
- new_when_smt.add_statement(statement.clone)
430
+ new_no.add_statement(statement.clone)
431
+ end
269
432
  end
270
433
  end
271
434
 
272
- new_when = When.new(whens.match.clone,new_when_smt.clone)
273
- new_statement.add_when(new_when.clone)
274
- end
435
+ # Rebuild the converted "if" as a new" statement (If)".
436
+ new_statement = If.new(statement.condition.clone,new_yes.clone,statement.no ? new_no.clone : nil)
437
+
438
+ # Just like "no", check if "noifs (elsif)" exists and if there is, take one by one and convert.
439
+ # After that, add the converted "noif" to "If".
440
+ statement.each_noif do |condition, block|
441
+ noif = block.flatten
442
+ new_noif = Block.new(noif.mode,"")
443
+
444
+ noif.each_inner do |inner|
445
+ # I read inner, but when I am par, I delete all '.
446
+ unless (list.include?(inner.name.to_s)) then
447
+ if (self.mode == :seq) || (inner.name.to_s.include? "#") then
448
+ list << inner.name.to_s
449
+ new_block.add_inner(inner.clone)
450
+ end
451
+ end
452
+ end
275
453
 
276
- new_block.add_statement(new_statement)
277
454
 
278
- $fm.rep_sharp.each_key do |key|
279
- new_smt = Transmit.new(key.clone,$fm.rep_sharp[key].clone)
280
- new_block.add_statement(new_smt.clone)
281
- end
282
- $fm.rep_sharp.clear() # Deactivate rep that has become obsolete.
455
+ noif.each_statement do |statement|
456
+ # If statement is Transmit, it is an expression and should be processed.
457
+ if statement.is_a?(Transmit) then
458
+ # If you add a # to the one with 'on the left side, the shape of the formula will collapse and it will be removed.
459
+ unless (res_name(statement.left).name.to_s.include? "'") || yes.mode == :par then
283
460
 
284
- # If the statement is if, there is a block for each of yes, no, noifs, so translate each.
285
- elsif statement.is_a?(If) then
286
- yes = statement.yes.flatten # Smooth yes of if statement.
287
- new_yes = Block.new(yes.mode,"") # New yes storage block
461
+ new_signal = att_signal(statement.left, "#")
288
462
 
289
- yes.each_inner do |inner|
290
- # I read inner, but when I am par, I delete all '.
291
- unless (list.include?(inner.name.to_s)) then
292
- if (self.mode == :seq) || (inner.name.to_s.include? "#") then
293
- list << inner.name.to_s
294
- new_block.add_inner(inner.clone)
295
- end
296
- end
297
- end
463
+ # Double declaration of existing variable can not be done, so it is excluded.
464
+ unless (list.include?(new_signal.name.to_s)) then
465
+ list << new_signal.name.to_s
466
+ new_block.add_inner(new_signal)
467
+ end
298
468
 
299
- # Check the statements in "yes" in order.
300
- yes.each_statement do |statement|
301
- # If statement is Transmit, it is an expression and should be processed.
302
- if statement.is_a?(Transmit) then
303
- # If you add a # to the one with 'on the left side, the shape of the formula will collapse and it will be removed.
304
- unless (res_name(statement.left).name.to_s.include? "'") || yes.mode == :par then
305
- # Prepare a new signal with the # on the variable on the left side using the att_signal method.
306
- new_signal = att_signal(statement.left, "#")
307
- # Check list and add new variables to inner if they do not duplicate.
308
- unless (list.include?(new_signal.name.to_s)) then
309
- list << new_signal.name.to_s
310
- new_block.add_inner(new_signal)
469
+ new_statement = Transmit.new(search_refname(statement.left,"#"),statement.right.clone)
470
+
471
+ $fm.rep_sharp[statement.left] = search_refname(statement.left,"#")
472
+
473
+ $fm.fm_par["#{statement.left.to_verilog}"] = new_statement.left
474
+ new_noif.add_statement(new_statement.clone)
475
+ else
476
+ new_noif.add_statement(statement.clone)
477
+ end
478
+ else
479
+ new_noif.add_statement(statement.clone)
311
480
  end
481
+ end
312
482
 
313
- new_statement = Transmit.new(search_refname(statement.left,"#"),statement.right.clone)
483
+ new_statement.add_noif(condition.clone,new_noif.clone)
484
+ end
314
485
 
315
- $fm.rep_sharp[statement.left] = search_refname(statement.left,"#")
486
+ new_block.add_statement(new_statement.clone)
316
487
 
317
- new_yes.add_statement(new_statement.clone)
488
+ $fm.rep_sharp.each_key do |key|
489
+ new_smt = Transmit.new(key.clone,$fm.rep_sharp[key].clone)
490
+ new_block.add_statement(new_smt.clone)
491
+ end
492
+ $fm.rep_sharp.clear() # Deactivate rep that has become obsolete.
318
493
 
494
+ # Process when "statement" is "Transmit" (just expression).
495
+ # Record the expression in fm_par used for par-> seq and add the expression to new_block which is the "new block".
496
+ elsif statement.is_a?(Transmit) then
497
+ if self.mode == :seq then
498
+ $fm.fm_par["#{statement.left.to_verilog}"] = statement.right
499
+ end
500
+ new_block.add_statement(statement.clone)
319
501
 
320
- $fm.fm_par["#{statement.left.to_verilog}"] = new_statement.left
502
+ # When statement is Block (lower layer exists).
503
+ # Smooth the lower layer with do_flat.
504
+ # Add the added variables (inner) and expressions (statement) to new_block, respectively.
505
+ elsif statement.is_a?(Block) then
506
+ smt = statement.do_flat(self.mode)
321
507
 
322
- else
323
- new_yes.add_statement(statement.clone)
324
- end
325
- else
326
- new_yes.add_statement(statement.clone)
508
+ smt.each_inner do |inner|
509
+ # I read inner, but when I am par, I delete all '.
510
+ unless (list.include?(inner.name.to_s)) then
511
+ if (self.mode == :seq) || (inner.name.to_s.include? "#") then
512
+ list << inner.name.to_s
513
+ new_block.add_inner(inner.clone)
514
+ end
515
+ end
516
+ end
517
+ smt.each_statement do |tmt|
518
+ # Retrieve the RefName of the variable on the left side and store it in this_name.
519
+ if ((tmt.is_a? (Transmit)) && (self.mode == :seq)) then
520
+ $fm.fm_par["#{tmt.left.to_verilog}"] = tmt.right
521
+ end
522
+ new_block.add_statement(tmt.clone)
327
523
  end
524
+ else
525
+ # Other statements are simply added as is.
526
+ new_block.add_statement(statement.clone)
328
527
  end
528
+ end
329
529
 
330
- # Confirm that "else" exists and convert it if it exists.
331
- # Because error occurs when trying to convert when "else" does not exist.
332
- if statement.no.is_a? (Block) then
333
- no = statement.no.flatten
334
- new_no = Block.new(no.mode,"")
530
+ return new_block # Return the new_block that completed the smoothing.
335
531
 
336
- no.each_inner do |inner|
532
+ # Processing when there is no block beneath.
533
+ # Unlike ordinary "if" and "case" blocks come down, we check individually block under block.
534
+ else
535
+ self.each_statement do |statement|
536
+ # If the if statement, convert it, otherwise add it as is
537
+ if statement.is_a?(If) then
538
+ # Since yes always exists, it is no problem even if it is converted as it is.
539
+ yes = statement.yes.flatten
540
+ new_yes = Block.new(yes.mode,"")
541
+
542
+ yes.each_inner do |inner|
337
543
  # I read inner, but when I am par, I delete all '.
338
544
  unless (list.include?(inner.name.to_s)) then
339
- if (self.mode == :seq) || (inner.name.to_s.include? "#") then
545
+ if (yes.mode == :seq) || (inner.name.to_s.include? "#") then
340
546
  list << inner.name.to_s
341
547
  new_block.add_inner(inner.clone)
342
548
  end
343
549
  end
344
550
  end
345
551
 
346
- no.each_statement do |statement|
552
+ # Check the statements in "yes" in order.
553
+ yes.each_statement do |statement|
347
554
  # If statement is Transmit, it is an expression and should be processed.
348
555
  if statement.is_a?(Transmit) then
349
556
  # If you add a # to the one with 'on the left side, the shape of the formula will collapse and it will be removed.
350
557
  unless (res_name(statement.left).name.to_s.include? "'") || yes.mode == :par then
351
-
558
+ # Generate a new signal to return #.
352
559
  new_signal = att_signal(statement.left, "#")
353
560
 
354
561
  # Double declaration of existing variable can not be done, so it is excluded.
@@ -362,320 +569,378 @@ class Block
362
569
  $fm.rep_sharp[statement.left] = search_refname(statement.left,"#")
363
570
 
364
571
  $fm.fm_par["#{statement.left.to_verilog}"] = new_statement.left
365
- new_no.add_statement(new_statement.clone)
572
+ new_yes.add_statement(new_statement.clone)
366
573
  else
367
- new_no.add_statement(statement.clone)
574
+ new_yes.add_statement(statement.clone)
368
575
  end
369
576
  else
370
- new_no.add_statement(statement.clone)
577
+ new_yes.add_statement(statement.clone)
371
578
  end
372
579
  end
373
- end
374
580
 
375
- # Rebuild the converted "if" as a new" statement (If)".
376
- new_statement = If.new(statement.condition.clone,new_yes.clone,statement.no ? new_no.clone : nil)
581
+ # Confirm that "else" exists and convert it if it exists.
582
+ # Because error occurs when trying to convert when "else" does not exist.
583
+ if statement.no.is_a? (Block) then
584
+ no = statement.no.flatten
585
+ new_no = Block.new(no.mode,"")
586
+
587
+ no.each_inner do |inner|
588
+ # I read inner, but when I am par, I delete all '.
589
+ unless (list.include?(inner.name.to_s)) then
590
+ if (no.mode == :seq) || (inner.name.to_s.include? "#") then
591
+ list << inner.name.to_s
592
+ new_block.add_inner(inner.clone)
593
+ end
594
+ end
595
+ end
377
596
 
378
- # Just like "no", check if "noifs (elsif)" exists and if there is, take one by one and convert.
379
- # After that, add the converted "noif" to "If".
380
- statement.each_noif do |condition, block|
381
- noif = block.flatten
382
- new_noif = Block.new(noif.mode,"")
597
+ no.each_statement do |statement|
598
+ # If statement is Transmit, it is an expression and should be processed.
599
+ if statement.is_a?(Transmit) then
600
+ # If you add a # to the one with 'on the left side, the shape of the formula will collapse and it will be removed.
601
+ unless (res_name(statement.left).name.to_s.include? "'") || no.mode == :par then
383
602
 
384
- noif.each_inner do |inner|
385
- # I read inner, but when I am par, I delete all '.
386
- unless (list.include?(inner.name.to_s)) then
387
- if (self.mode == :seq) || (inner.name.to_s.include? "#") then
388
- list << inner.name.to_s
389
- new_block.add_inner(inner.clone)
390
- end
603
+ new_signal = att_signal(statement.left, "#")
604
+
605
+ # Double declaration of existing variable can not be done, so it is excluded.
606
+ unless (list.include?(new_signal.name.to_s)) then
607
+ list << new_signal.name.to_s
608
+ new_block.add_inner(new_signal)
609
+ end
610
+
611
+ new_statement = Transmit.new(search_refname(statement.left,"#"),statement.right.clone)
612
+
613
+ $fm.rep_sharp[statement.left] = search_refname(statement.left,"#")
614
+
615
+ $fm.fm_par["#{statement.left.to_verilog}"] = new_statement.left
616
+ new_no.add_statement(new_statement.clone)
617
+ else
618
+ new_no.add_statement(statement.clone)
619
+ end
620
+ else
621
+ new_no.add_statement(statement.clone)
622
+ end
391
623
  end
392
624
  end
625
+ # Rebuild the converted "if" as a new" statement (If)".
626
+ new_statement = If.new(statement.condition.clone,new_yes.clone,statement.no ? new_no.clone : nil)
627
+ # Just like "no", check if "noifs (elsif)" exists and if there is, take one by one and convert.
628
+ # After that, add the converted "noif" to "If".
629
+ statement.each_noif do |condition, block|
630
+
631
+ noif = block.flatten
632
+ new_noif = Block.new(noif.mode,"")
633
+
634
+ noif.each_inner do |inner|
635
+ # I read inner, but when I am par, I delete all '.
636
+ unless (list.include?(inner.name.to_s)) then
637
+ if (noif.mode == :seq) || (inner.name.to_s.include? "#") then
638
+ list << inner.name.to_s
639
+ new_block.add_inner(inner.clone)
640
+ end
641
+ end
642
+ end
393
643
 
394
644
 
395
- noif.each_statement do |statement|
396
- # If statement is Transmit, it is an expression and should be processed.
397
- if statement.is_a?(Transmit) then
398
- # If you add a # to the one with 'on the left side, the shape of the formula will collapse and it will be removed.
399
- unless (res_name(statement.left).name.to_s.include? "'") || yes.mode == :par then
645
+ noif.each_statement do |statement|
646
+ # If statement is Transmit, it is an expression and should be processed.
647
+ if statement.is_a?(Transmit) then
648
+ # If you add a # to the one with 'on the left side, the shape of the formula will collapse and it will be removed.
649
+ unless (res_name(statement.left).name.to_s.include? "'") || noif.mode == :par then
400
650
 
401
- new_signal = att_signal(statement.left, "#")
651
+ new_signal = att_signal(statement.left, "#")
402
652
 
403
- # Double declaration of existing variable can not be done, so it is excluded.
404
- unless (list.include?(new_signal.name.to_s)) then
405
- list << new_signal.name.to_s
406
- new_block.add_inner(new_signal)
407
- end
653
+ # Double declaration of existing variable can not be done, so it is excluded.
654
+ unless (list.include?(new_signal.name.to_s)) then
655
+ list << new_signal.name.to_s
656
+ new_block.add_inner(new_signal)
657
+ end
408
658
 
409
- new_statement = Transmit.new(search_refname(statement.left,"#"),statement.right.clone)
659
+ new_statement = Transmit.new(search_refname(statement.left,"#"),statement.right.clone)
410
660
 
411
- $fm.rep_sharp[statement.left] = search_refname(statement.left,"#")
661
+ $fm.rep_sharp[statement.left] = search_refname(statement.left,"#")
412
662
 
413
- $fm.fm_par["#{statement.left.to_verilog}"] = new_statement.left
414
- new_noif.add_statement(new_statement.clone)
663
+ $fm.fm_par["#{statement.left.to_verilog}"] = new_statement.left
664
+ new_noif.add_statement(new_statement.clone)
665
+ else
666
+ new_noif.add_statement(statement.clone)
667
+ end
415
668
  else
416
669
  new_noif.add_statement(statement.clone)
417
- end
418
- else
419
- new_noif.add_statement(statement.clone)
670
+ end
420
671
  end
421
- end
422
672
 
423
- new_statement.add_noif(condition.clone,new_noif.clone)
424
- end
673
+ new_statement.add_noif(condition.clone,new_noif.clone)
674
+ end
425
675
 
426
- new_block.add_statement(new_statement.clone)
676
+ new_block.add_statement(new_statement.clone)
427
677
 
428
- $fm.rep_sharp.each_key do |key|
429
- new_smt = Transmit.new(key.clone,$fm.rep_sharp[key].clone)
430
- new_block.add_statement(new_smt.clone)
431
- end
432
- $fm.rep_sharp.clear() # Deactivate rep that has become obsolete.
678
+ $fm.rep_sharp.each_key do |key|
679
+ new_smt = Transmit.new(key.clone,$fm.rep_sharp[key].clone)
680
+ new_block.add_statement(new_smt.clone)
681
+ end
682
+ $fm.rep_sharp.clear() # Deactivate rep that has become obsolete.
433
683
 
434
- # Process when "statement" is "Transmit" (just expression).
435
- # Record the expression in fm_par used for par-> seq and add the expression to new_block which is the "new block".
436
- elsif statement.is_a?(Transmit) then
437
- if self.mode == :seq then
438
- $fm.fm_par["#{statement.left.to_verilog}"] = statement.right
439
- end
440
- new_block.add_statement(statement.clone)
684
+ elsif statement.is_a?(Case) then
685
+ if statement.default.is_a?(Block)
686
+ new_default = statement.default.flatten
687
+ end
441
688
 
442
- # When statement is Block (lower layer exists).
443
- # Smooth the lower layer with do_flat.
444
- # Add the added variables (inner) and expressions (statement) to new_block, respectively.
445
- elsif statement.is_a?(Block) then
446
- smt = statement.do_flat(self.mode)
689
+ new_statement = Case.new(statement.value.clone,statement.default ? new_default.clone : nil,[])
690
+ statement.each_when do |whens|
691
+ new_when_statement = whens.statement.flatten
692
+ new_when = When.new(whens.match.clone,new_when_statement.clone)
447
693
 
448
- smt.each_inner do |inner|
449
- # I read inner, but when I am par, I delete all '.
450
- unless (list.include?(inner.name.to_s)) then
451
- if (self.mode == :seq) || (inner.name.to_s.include? "#") then
452
- list << inner.name.to_s
453
- new_block.add_inner(inner.clone)
454
- end
455
- end
456
- end
457
- smt.each_statement do |tmt|
458
- # Retrieve the RefName of the variable on the left side and store it in this_name.
459
- if ((tmt.is_a? (Transmit)) && (self.mode == :seq)) then
460
- $fm.fm_par["#{tmt.left.to_verilog}"] = tmt.right
694
+ new_statement.add_when(new_when.clone)
461
695
  end
462
- new_block.add_statement(tmt.clone)
696
+
697
+ new_block.add_statement(new_statement)
698
+ else
699
+ new_block.add_statement(statement.clone)
463
700
  end
701
+ end
702
+ return new_block
703
+ end
704
+ end
705
+
706
+ def do_flat(mode = nil)
707
+ flat = Block.new(self.mode,"") # Block between lower layers when converting.
708
+ trans = Block.new(self.mode,"") # The block used for converting itself.
709
+ replase = Block.new(self.mode,"") # block to be used for further conversion in case of if statement.
710
+ list = []
711
+ rep_list = []
712
+
713
+ # If there is a block inside the statement it is not the lowest layer. If there is, it is the lowest layer.
714
+ if (self.each_statement.find {|stmnt| stmnt.is_a?(Block)} || (self.each_statement.find {|stmnt| stmnt.is_a?(If)}) || (self.each_statement.find {|stmnt| stmnt.is_a?(Case)}))then
715
+ # In the case of seq, the lower layer is par. Isolate fm_par so that it is not crosstalked.
716
+ if(self.mode == :seq) then
717
+ fm_buckup = $fm.fm_par.clone
718
+ $fm.fm_par.clear()
719
+
720
+ new_block = change_branch(self)
464
721
  else
465
- # Other statements are simply added as is.
466
- new_block.add_statement(statement.clone)
722
+ new_block = self.clone
467
723
  end
468
- end
469
724
 
470
- return new_block # Return the new_block that completed the smoothing.
725
+ # Process for each statement.
726
+ new_block.each_statement do |statement|
727
+ # If statement is If, convert yes, no, noif and add them to flat.
728
+ if statement.is_a?(Case) then
729
+ if(self.mode == :seq) then
730
+ fm_buckup_if = $fm.fm_par.clone
731
+ end
732
+
733
+ if statement.default.is_a?(Block)
734
+ default = statement.default.flatten
735
+ new_default = Block.new(default.mode,"")
471
736
 
472
- # Processing when there is no block beneath.
473
- # Unlike ordinary "if" and "case" blocks come down, we check individually block under block.
474
- else
475
- self.each_statement do |statement|
476
- # If the if statement, convert it, otherwise add it as is
477
- if statement.is_a?(If) then
478
- # Since yes always exists, it is no problem even if it is converted as it is.
479
- yes = statement.yes.flatten
480
- new_yes = Block.new(yes.mode,"")
481
-
482
- yes.each_inner do |inner|
483
- # I read inner, but when I am par, I delete all '.
484
- unless (list.include?(inner.name.to_s)) then
485
- if (yes.mode == :seq) || (inner.name.to_s.include? "#") then
486
- list << inner.name.to_s
487
- new_block.add_inner(inner.clone)
488
- end
737
+ default.each_statement do |statement|
738
+ new_default.add_statement(statement.clone)
739
+ end
489
740
  end
490
- end
491
741
 
492
- # Check the statements in "yes" in order.
493
- yes.each_statement do |statement|
494
- # If statement is Transmit, it is an expression and should be processed.
495
- if statement.is_a?(Transmit) then
496
- # If you add a # to the one with 'on the left side, the shape of the formula will collapse and it will be removed.
497
- unless (res_name(statement.left).name.to_s.include? "'") || yes.mode == :par then
498
- # Generate a new signal to return #.
499
- new_signal = att_signal(statement.left, "#")
500
742
 
501
- # Double declaration of existing variable can not be done, so it is excluded.
502
- unless (list.include?(new_signal.name.to_s)) then
503
- list << new_signal.name.to_s
504
- new_block.add_inner(new_signal)
505
- end
743
+ new_statement = Case.new(statement.value.clone,statement.default ? new_default.clone : nil,[])
506
744
 
507
- new_statement = Transmit.new(search_refname(statement.left,"#"),statement.right.clone)
745
+ statement.each_when do |whens|
746
+ if(self.mode == :seq) then
747
+ fm_buckup_if.each_key do |key|
748
+ $fm.fm_par[key] = fm_buckup_if[key]
749
+ end
750
+ end
508
751
 
509
- $fm.rep_sharp[statement.left] = search_refname(statement.left,"#")
752
+ when_smt = whens.statement.flatten
753
+ new_when = When.new(whens.match.clone,when_smt.clone)
754
+ new_statement.add_when(new_when.clone)
755
+ end
756
+ flat.add_statement(new_statement)
510
757
 
511
- $fm.fm_par["#{statement.left.to_verilog}"] = new_statement.left
512
- new_yes.add_statement(new_statement.clone)
513
- else
514
- new_yes.add_statement(statement.clone)
515
- end
516
- else
517
- new_yes.add_statement(statement.clone)
758
+ elsif statement.is_a?(If) then
759
+ if(self.mode == :seq) then
760
+ fm_buckup_if = $fm.fm_par.clone
518
761
  end
519
- end
520
762
 
521
- # Confirm that "else" exists and convert it if it exists.
522
- # Because error occurs when trying to convert when "else" does not exist.
523
- if statement.no.is_a? (Block) then
524
- no = statement.no.flatten
525
- new_no = Block.new(no.mode,"")
763
+ # Since yes always exist, convert without confirming.
764
+ new_yes = statement.yes.flatten
526
765
 
527
- no.each_inner do |inner|
528
- # I read inner, but when I am par, I delete all '.
529
- unless (list.include?(inner.name.to_s)) then
530
- if (no.mode == :seq) || (inner.name.to_s.include? "#") then
531
- list << inner.name.to_s
532
- new_block.add_inner(inner.clone)
533
- end
766
+ # I do not know whether no (else) exists, so convert it if it is confirmed.
767
+ if statement.no.is_a? (Block) then
768
+
769
+ if(self.mode == :seq) then
770
+ fm_buckup_if.each_key do |key|
771
+ $fm.fm_par[key] = fm_buckup_if[key]
772
+ end
534
773
  end
774
+
775
+ new_no = statement.no.flatten
535
776
  end
777
+ # Create a new if statement with converted yes and no.
778
+ new_statement = If.new(statement.condition.clone,new_yes.clone,statement.no ? new_no.clone : nil)
779
+
780
+ # Since I do not know whether there is noifs (elsif), I convert it and add it if it is confirmed.
781
+ statement.each_noif do |condition, block|
782
+ if(self.mode == :seq) then
783
+ fm_buckup_if.each_key do |key|
784
+ $fm.fm_par[key] = fm_buckup_if[key]
785
+ end
786
+ end
536
787
 
537
- no.each_statement do |statement|
538
- # If statement is Transmit, it is an expression and should be processed.
539
- if statement.is_a?(Transmit) then
540
- # If you add a # to the one with 'on the left side, the shape of the formula will collapse and it will be removed.
541
- unless (res_name(statement.left).name.to_s.include? "'") || no.mode == :par then
788
+ new_noif = block.flatten
789
+ new_statement.add_noif(condition.clone,new_noif.clone)
790
+ end
791
+ # Add the new statement (if statement) created to flat.
792
+ flat.add_statement(new_statement.clone)
542
793
 
543
- new_signal = att_signal(statement.left, "#")
794
+ # If statement is Transmit, record the expression in fm_par and add the expression to flat as it is.
795
+ elsif statement.is_a?(Transmit) then
796
+ if(self.mode == :seq) then
797
+ $fm.fm_par["#{statement.left.to_verilog}"] = statement.right.clone
798
+ end
544
799
 
545
- # Double declaration of existing variable can not be done, so it is excluded.
546
- unless (list.include?(new_signal.name.to_s)) then
547
- list << new_signal.name.to_s
548
- new_block.add_inner(new_signal)
800
+ flat.add_statement(statement.clone)
801
+ # If statement is Block, convert it with do_flat and add the returned expression and variable to flat respectively.
802
+
803
+ elsif statement.is_a?(Block) then
804
+ smt = statement.do_flat(self.mode)
805
+ # If smt has inner, check it separately and add it if it's convenient.
806
+ smt.each_inner do |inner|
807
+ if self.mode == :seq then
808
+ unless (list.include?(inner.name.to_s)) then
809
+ list << inner.name.to_s
810
+ flat.add_inner(inner.clone)
811
+ end
812
+ else
813
+ unless (list.include?(inner.name.to_s)) then
814
+ if(inner.name.to_s.include? "#") then
815
+ list << inner.name.to_s
816
+ flat.add_inner(inner.clone) # It was new_block. why?
549
817
  end
818
+ end
819
+ end
820
+ end
821
+ # If it is seq, the expression after conversion is also likely to be used, so record the expression.
822
+ smt.each_statement do |tmt|
823
+ if self.mode == :seq then
824
+ $fm.fm_par["#{tmt.left.to_verilog}"] = tmt.right.clone
825
+ end
826
+ flat.add_statement(tmt.clone)
827
+ end
828
+ end
829
+ end
550
830
 
551
- new_statement = Transmit.new(search_refname(statement.left,"#"),statement.right.clone)
831
+ # Overwrite to restore fm_par which was quarantined.
832
+ if(self.mode == :seq) then
833
+ $fm.fm_par.clear()
834
+ fm_buckup.each_key do |key|
835
+ $fm.fm_par[key] = fm_buckup[key]
836
+ end
837
+ end
552
838
 
553
- $fm.rep_sharp[statement.left] = search_refname(statement.left,"#")
554
839
 
555
- $fm.fm_par["#{statement.left.to_verilog}"] = new_statement.left
556
- new_no.add_statement(new_statement.clone)
557
- else
558
- new_no.add_statement(statement.clone)
559
- end
560
- else
561
- new_no.add_statement(statement.clone)
562
- end
840
+
841
+ # Since it is a middle tier itself, it performs flat transformation, shifts inner, and returns the result.
842
+ trans = flat.to_conversion(mode)
843
+
844
+
845
+ # Write an expression that assigns an identifier that added # to an identifier that has not added.
846
+ trans.each_statement do |statement|
847
+ replase.add_statement(statement.clone)
848
+ if statement.is_a?(If)
849
+ $fm.rep_sharp.each_key do |key|
850
+ new_statement = Transmit.new(key.clone,$fm.rep_sharp[key].clone)
851
+ replase.add_statement(new_statement.clone)
563
852
  end
853
+ $fm.rep_sharp.clear() # Deactivate rep that has become obsolete.
564
854
  end
565
- # Rebuild the converted "if" as a new" statement (If)".
566
- new_statement = If.new(statement.condition.clone,new_yes.clone,statement.no ? new_no.clone : nil)
567
- # Just like "no", check if "noifs (elsif)" exists and if there is, take one by one and convert.
568
- # After that, add the converted "noif" to "If".
569
- statement.each_noif do |condition, block|
855
+ end
856
+
857
+ # Extract the inner left in flat and add it to replase.
858
+ flat.each_inner do |inner|
859
+ replase.add_inner(inner.clone)
860
+ end
861
+
862
+ # Extract the inner left in trans and add it to replase.
863
+ trans.each_inner do |inner|
864
+ replase.add_inner(inner.clone)
865
+ end
866
+
867
+ return replase
868
+
869
+ # Processing when there is no block (reaching the bottom layer).
870
+ else
871
+ # Since it is the lowest layer, it does not smooth but converts itself and returns it.
872
+ flat = self.to_conversion(mode)
873
+ return flat
874
+ end
875
+ end
876
+
877
+ def to_conversion(mode = nil, rst = true, rep = true)
878
+ flat = Block.new(mode,"") # Block that stores results.
879
+ new_yes = Block.new(mode,"") # Block containing the new yes.
880
+ new_no = Block.new(mode,"") # Block containing the new no.
881
+ new_noif = Block.new(mode,"") # Block containing the new noif.
882
+ list = []
883
+
884
+ if rst == false then
885
+ fm_seq_backup = $fm.fm_seq.dup
886
+ end
887
+
888
+ # The statement is divided (since it is the lowest layer, there is only Transmit).
889
+ self.each_statement do |statement|
890
+ # Various processing is performed depending on the type of Transmit.
891
+ # If the mode of the upper layer = its own mode, it compresses as it is.
892
+
893
+ if(mode == self.mode) then
894
+ new_statement = statement.clone
895
+ # In the case of an If statement, processing of if, else, elsif is performed.
896
+ elsif statement.is_a?(Case) then
897
+
898
+ if statement.default.is_a?(Block)
899
+ rep_buckup = $fm.rep.dup
900
+ $fm.rep.clear()
901
+ default = statement.default.to_conversion(mode,false,false)
902
+ $fm.rep.clear()
903
+ rep_buckup.each_key do |key|
904
+ $fm.rep[key] = rep_buckup[key]
905
+ end
570
906
 
571
- noif = block.flatten
572
- new_noif = Block.new(noif.mode,"")
907
+ new_default = Block.new(default.mode,"")
573
908
 
574
- noif.each_inner do |inner|
909
+ default.each_inner do |inner|
575
910
  # I read inner, but when I am par, I delete all '.
576
911
  unless (list.include?(inner.name.to_s)) then
577
- if (noif.mode == :seq) || (inner.name.to_s.include? "#") then
912
+ if (self.mode == :seq) || (inner.name.to_s.include? "#") then
578
913
  list << inner.name.to_s
579
- new_block.add_inner(inner.clone)
914
+ flat.add_inner(inner.clone)
580
915
  end
581
916
  end
582
917
  end
583
918
 
584
-
585
- noif.each_statement do |statement|
919
+ default.each_statement do |statement|
586
920
  # If statement is Transmit, it is an expression and should be processed.
587
921
  if statement.is_a?(Transmit) then
588
922
  # If you add a # to the one with 'on the left side, the shape of the formula will collapse and it will be removed.
589
- unless (res_name(statement.left).name.to_s.include? "'") || noif.mode == :par then
590
-
923
+ unless (res_name(statement.left).name.to_s.include? "'") || default.mode == :par then
924
+ # Prepare a new signal with the # on the variable on the left side using the att_signal method.
591
925
  new_signal = att_signal(statement.left, "#")
592
-
593
- # Double declaration of existing variable can not be done, so it is excluded.
926
+ # Check list and add new variables to inner if they do not duplicate.
594
927
  unless (list.include?(new_signal.name.to_s)) then
595
928
  list << new_signal.name.to_s
596
- new_block.add_inner(new_signal)
929
+ flat.add_inner(new_signal)
597
930
  end
598
931
 
599
- new_statement = Transmit.new(search_refname(statement.left,"#"),statement.right.clone)
932
+ new_smt = Transmit.new(search_refname(statement.left,"#"),statement.right.clone)
600
933
 
601
934
  $fm.rep_sharp[statement.left] = search_refname(statement.left,"#")
602
935
 
603
- $fm.fm_par["#{statement.left.to_verilog}"] = new_statement.left
604
- new_noif.add_statement(new_statement.clone)
936
+ $fm.fm_par["#{statement.left.to_verilog}"] = new_smt.left
937
+ new_default.add_statement(new_smt.clone)
605
938
  else
606
- new_noif.add_statement(statement.clone)
939
+ new_default.add_statement(statement.clone)
607
940
  end
608
941
  else
609
- new_noif.add_statement(statement.clone)
942
+ new_default.add_statement(statement.clone)
610
943
  end
611
- end
612
-
613
- new_statement.add_noif(condition.clone,new_noif.clone)
614
- end
615
-
616
- new_block.add_statement(new_statement.clone)
617
-
618
- $fm.rep_sharp.each_key do |key|
619
- new_smt = Transmit.new(key.clone,$fm.rep_sharp[key].clone)
620
- new_block.add_statement(new_smt.clone)
621
- end
622
- $fm.rep_sharp.clear() # Deactivate rep that has become obsolete.
623
-
624
- elsif statement.is_a?(Case) then
625
- if statement.default.is_a?(Block)
626
- new_default = statement.default.flatten
627
- end
628
-
629
- new_statement = Case.new(statement.value.clone,statement.default ? new_default.clone : nil,[])
630
- statement.each_when do |whens|
631
- new_when_statement = whens.statement.flatten
632
- new_when = When.new(whens.match.clone,new_when_statement.clone)
633
-
634
- new_statement.add_when(new_when.clone)
635
- end
636
-
637
- new_block.add_statement(new_statement)
638
- else
639
- new_block.add_statement(statement.clone)
640
- end
641
- end
642
- return new_block
643
- end
644
- end
645
-
646
- def do_flat(mode = nil)
647
- flat = Block.new(self.mode,"") # Block between lower layers when converting.
648
- trans = Block.new(self.mode,"") # The block used for converting itself.
649
- replase = Block.new(self.mode,"") # block to be used for further conversion in case of if statement.
650
- list = []
651
- rep_list = []
652
-
653
- # If there is a block inside the statement it is not the lowest layer. If there is, it is the lowest layer.
654
- if (self.each_statement.find {|stmnt| stmnt.is_a?(Block)} || (self.each_statement.find {|stmnt| stmnt.is_a?(If)}) || (self.each_statement.find {|stmnt| stmnt.is_a?(Case)}))then
655
- # In the case of seq, the lower layer is par. Isolate fm_par so that it is not crosstalked.
656
- if(self.mode == :seq) then
657
- fm_buckup = $fm.fm_par.clone
658
- $fm.fm_par.clear()
659
-
660
- new_block = change_branch(self)
661
- else
662
- new_block = self.clone
663
- end
664
-
665
- # Process for each statement.
666
- new_block.each_statement do |statement|
667
- # If statement is If, convert yes, no, noif and add them to flat.
668
- if statement.is_a?(Case) then
669
- if(self.mode == :seq) then
670
- fm_buckup_if = $fm.fm_par.clone
671
- end
672
-
673
- if statement.default.is_a?(Block)
674
- default = statement.default.flatten
675
- new_default = Block.new(default.mode,"")
676
-
677
- default.each_statement do |statement|
678
- new_default.add_statement(statement.clone)
679
944
  end
680
945
  end
681
946
 
@@ -683,1457 +948,1165 @@ class Block
683
948
  new_statement = Case.new(statement.value.clone,statement.default ? new_default.clone : nil,[])
684
949
 
685
950
  statement.each_when do |whens|
686
- if(self.mode == :seq) then
687
- fm_buckup_if.each_key do |key|
688
- $fm.fm_par[key] = fm_buckup_if[key]
689
- end
690
- end
691
-
692
- when_smt = whens.statement.flatten
693
- new_when = When.new(whens.match.clone,when_smt.clone)
694
- new_statement.add_when(new_when.clone)
695
- end
696
- flat.add_statement(new_statement)
697
-
698
- elsif statement.is_a?(If) then
699
- if(self.mode == :seq) then
700
- fm_buckup_if = $fm.fm_par.clone
701
- end
702
-
703
- # Since yes always exist, convert without confirming.
704
- new_yes = statement.yes.flatten
705
951
 
706
- # I do not know whether no (else) exists, so convert it if it is confirmed.
707
- if statement.no.is_a? (Block) then
708
-
709
- if(self.mode == :seq) then
710
- fm_buckup_if.each_key do |key|
711
- $fm.fm_par[key] = fm_buckup_if[key]
712
- end
952
+ rep_buckup = $fm.rep.dup
953
+ $fm.rep.clear()
954
+ when_smt = whens.statement.to_conversion(mode,false,false)
955
+ $fm.rep.clear()
956
+ rep_buckup.each_key do |key|
957
+ $fm.rep[key] = rep_buckup[key]
713
958
  end
714
959
 
715
- new_no = statement.no.flatten
716
- end
717
- # Create a new if statement with converted yes and no.
718
- new_statement = If.new(statement.condition.clone,new_yes.clone,statement.no ? new_no.clone : nil)
719
-
720
- # Since I do not know whether there is noifs (elsif), I convert it and add it if it is confirmed.
721
- statement.each_noif do |condition, block|
722
- if(self.mode == :seq) then
723
- fm_buckup_if.each_key do |key|
724
- $fm.fm_par[key] = fm_buckup_if[key]
725
- end
726
- end
960
+ new_when_smt = Block.new(when_smt.mode,"")
727
961
 
728
- new_noif = block.flatten
729
- new_statement.add_noif(condition.clone,new_noif.clone)
730
- end
731
- # Add the new statement (if statement) created to flat.
732
- flat.add_statement(new_statement.clone)
962
+ when_smt.each_statement do |statement|
963
+ # If statement is Transmit, it is an expression and should be processed.
964
+ if statement.is_a?(Transmit) then
965
+ # If you add a # to the one with 'on the left side, the shape of the formula will collapse and it will be removed.
966
+ unless (res_name(statement.left).name.to_s.include? "'") || when_smt.mode == :par then
967
+ # Prepare a new signal with the # on the variable on the left side using the att_signal method.
968
+ new_signal = att_signal(statement.left, "#")
969
+ # Check list and add new variables to inner if they do not duplicate.
970
+ unless (list.include?(new_signal.name.to_s)) then
971
+ list << new_signal.name.to_s
972
+ flat.add_inner(new_signal)
973
+ end
733
974
 
734
- # If statement is Transmit, record the expression in fm_par and add the expression to flat as it is.
735
- elsif statement.is_a?(Transmit) then
736
- if(self.mode == :seq) then
737
- $fm.fm_par["#{statement.left.to_verilog}"] = statement.right.clone
738
- end
975
+ new_smt = Transmit.new(search_refname(statement.left,"#"),statement.right.clone)
739
976
 
740
- flat.add_statement(statement.clone)
741
- # If statement is Block, convert it with do_flat and add the returned expression and variable to flat respectively.
977
+ $fm.rep_sharp[statement.left] = search_refname(statement.left,"#")
742
978
 
743
- elsif statement.is_a?(Block) then
744
- smt = statement.do_flat(self.mode)
745
- # If smt has inner, check it separately and add it if it's convenient.
746
- smt.each_inner do |inner|
747
- if self.mode == :seq then
748
- unless (list.include?(inner.name.to_s)) then
749
- list << inner.name.to_s
750
- flat.add_inner(inner.clone)
979
+ $fm.fm_par["#{statement.left.to_verilog}"] = new_smt.left
980
+ new_when_smt.add_statement(new_smt.clone)
981
+ else
982
+ new_when_smt.add_statement(statement.clone)
983
+ end
984
+ else
985
+ new_when_smt.add_statement(statement.clone)
751
986
  end
752
- else
753
- unless (list.include?(inner.name.to_s)) then
754
- if(inner.name.to_s.include? "#") then
755
- list << inner.name.to_s
756
- flat.add_inner(inner.clone) # It was new_block. why?
757
- end
758
- end
759
- end
760
- end
761
- # If it is seq, the expression after conversion is also likely to be used, so record the expression.
762
- smt.each_statement do |tmt|
763
- if self.mode == :seq then
764
- $fm.fm_par["#{tmt.left.to_verilog}"] = tmt.right.clone
765
987
  end
766
- flat.add_statement(tmt.clone)
767
- end
768
- end
769
- end
770
-
771
- # Overwrite to restore fm_par which was quarantined.
772
- if(self.mode == :seq) then
773
- $fm.fm_par.clear()
774
- fm_buckup.each_key do |key|
775
- $fm.fm_par[key] = fm_buckup[key]
776
- end
777
- end
778
988
 
779
-
780
-
781
- # Since it is a middle tier itself, it performs flat transformation, shifts inner, and returns the result.
782
- trans = flat.to_conversion(mode)
783
-
784
-
785
- # Write an expression that assigns an identifier that added # to an identifier that has not added.
786
- trans.each_statement do |statement|
787
- replase.add_statement(statement.clone)
788
- if statement.is_a?(If)
789
- $fm.rep_sharp.each_key do |key|
790
- new_statement = Transmit.new(key.clone,$fm.rep_sharp[key].clone)
791
- replase.add_statement(new_statement.clone)
989
+ new_when = When.new(whens.match.clone,new_when_smt.clone)
990
+ new_statement.add_when(new_when.clone)
792
991
  end
793
- $fm.rep_sharp.clear() # Deactivate rep that has become obsolete.
794
- end
795
- end
796
992
 
797
- # Extract the inner left in flat and add it to replase.
798
- flat.each_inner do |inner|
799
- replase.add_inner(inner.clone)
800
- end
801
-
802
- # Extract the inner left in trans and add it to replase.
803
- trans.each_inner do |inner|
804
- replase.add_inner(inner.clone)
805
- end
806
-
807
- return replase
808
-
809
- # Processing when there is no block (reaching the bottom layer).
810
- else
811
- # Since it is the lowest layer, it does not smooth but converts itself and returns it.
812
- flat = self.to_conversion(mode)
813
- return flat
814
- end
815
- end
816
-
817
- def to_conversion(mode = nil, rst = true, rep = true)
818
- flat = Block.new(mode,"") # Block that stores results.
819
- new_yes = Block.new(mode,"") # Block containing the new yes.
820
- new_no = Block.new(mode,"") # Block containing the new no.
821
- new_noif = Block.new(mode,"") # Block containing the new noif.
822
- list = []
823
-
824
- if rst == false then
825
- fm_seq_backup = $fm.fm_seq.dup
826
- end
827
-
828
- # The statement is divided (since it is the lowest layer, there is only Transmit).
829
- self.each_statement do |statement|
830
- # Various processing is performed depending on the type of Transmit.
831
- # If the mode of the upper layer = its own mode, it compresses as it is.
832
-
833
- if(mode == self.mode) then
834
- new_statement = statement.clone
835
- # In the case of an If statement, processing of if, else, elsif is performed.
836
- elsif statement.is_a?(Case) then
993
+ elsif statement.is_a?(If) then
837
994
 
838
- if statement.default.is_a?(Block)
839
995
  rep_buckup = $fm.rep.dup
840
996
  $fm.rep.clear()
841
- default = statement.default.to_conversion(mode,false,false)
997
+ yes = statement.yes.to_conversion(mode, false,false)
842
998
  $fm.rep.clear()
843
999
  rep_buckup.each_key do |key|
844
1000
  $fm.rep[key] = rep_buckup[key]
845
1001
  end
846
1002
 
847
- new_default = Block.new(default.mode,"")
848
-
849
- default.each_inner do |inner|
850
- # I read inner, but when I am par, I delete all '.
1003
+ yes.each_inner do |inner|
851
1004
  unless (list.include?(inner.name.to_s)) then
852
- if (self.mode == :seq) || (inner.name.to_s.include? "#") then
1005
+ if (yes.mode == :seq) || (inner.name.to_s.include? "#") then
853
1006
  list << inner.name.to_s
854
- flat.add_inner(inner.clone)
1007
+ flat.add_inner(inner.clone) # It was new_block. why?
855
1008
  end
856
1009
  end
857
1010
  end
858
1011
 
859
- default.each_statement do |statement|
860
- # If statement is Transmit, it is an expression and should be processed.
861
- if statement.is_a?(Transmit) then
862
- # If you add a # to the one with 'on the left side, the shape of the formula will collapse and it will be removed.
863
- unless (res_name(statement.left).name.to_s.include? "'") || default.mode == :par then
864
- # Prepare a new signal with the # on the variable on the left side using the att_signal method.
865
- new_signal = att_signal(statement.left, "#")
866
- # Check list and add new variables to inner if they do not duplicate.
867
- unless (list.include?(new_signal.name.to_s)) then
868
- list << new_signal.name.to_s
869
- flat.add_inner(new_signal)
870
- end
1012
+ yes.each_statement do |smt|
1013
+ if(yes.mode == :seq) then
1014
+ new_signal = att_signal(smt.left, "#")
1015
+
1016
+ unless (list.include?(new_signal.name.to_s)) then
1017
+ list << new_signal.name.to_s
1018
+ flat.add_inner(new_signal)
1019
+ end
871
1020
 
872
- new_smt = Transmit.new(search_refname(statement.left,"#"),statement.right.clone)
1021
+ yes_statement = Transmit.new(search_refname(smt.left,"#"),smt.right.clone)
873
1022
 
874
- $fm.rep_sharp[statement.left] = search_refname(statement.left,"#")
1023
+ $fm.rep_sharp[statement.left] = search_refname(statement.left,"#")
875
1024
 
876
- $fm.fm_par["#{statement.left.to_verilog}"] = new_smt.left
877
- new_default.add_statement(new_smt.clone)
878
- else
879
- new_default.add_statement(statement.clone)
880
- end
1025
+ $fm.fm_par["#{smt.left.to_verilog}"] = yes_statement.left
1026
+ new_yes.add_statement(yes_statement)
881
1027
  else
882
- new_default.add_statement(statement.clone)
1028
+ new_yes.add_statement(smt.clone)
883
1029
  end
884
- end
885
- end
886
-
887
-
888
- new_statement = Case.new(statement.value.clone,statement.default ? new_default.clone : nil,[])
1030
+ end
889
1031
 
890
- statement.each_when do |whens|
1032
+ if statement.no.is_a? (Block) then
1033
+ rep_buckup = $fm.rep.dup
1034
+ $fm.rep.clear()
1035
+ no = statement.no.to_conversion(mode,false,false)
1036
+ $fm.rep.clear()
1037
+ rep_buckup.each_key do |key|
1038
+ $fm.rep[key] = rep_buckup[key]
1039
+ end
891
1040
 
892
- rep_buckup = $fm.rep.dup
893
- $fm.rep.clear()
894
- when_smt = whens.statement.to_conversion(mode,false,false)
895
- $fm.rep.clear()
896
- rep_buckup.each_key do |key|
897
- $fm.rep[key] = rep_buckup[key]
898
- end
1041
+ no.each_inner do |inner|
1042
+ unless (list.include?(inner.name.to_s)) then
1043
+ if (no.mode == :seq) || (inner.name.to_s.include? "#") then
1044
+ list << inner.name.to_s
1045
+ flat.add_inner(inner.clone) # It was new_block. why?
1046
+ end
1047
+ end
1048
+ end
899
1049
 
900
- new_when_smt = Block.new(when_smt.mode,"")
1050
+ no.each_statement do |smt|
1051
+ if(no.mode == :seq) then
1052
+ new_signal = att_signal(smt.left, "#")
901
1053
 
902
- when_smt.each_statement do |statement|
903
- # If statement is Transmit, it is an expression and should be processed.
904
- if statement.is_a?(Transmit) then
905
- # If you add a # to the one with 'on the left side, the shape of the formula will collapse and it will be removed.
906
- unless (res_name(statement.left).name.to_s.include? "'") || when_smt.mode == :par then
907
- # Prepare a new signal with the # on the variable on the left side using the att_signal method.
908
- new_signal = att_signal(statement.left, "#")
909
- # Check list and add new variables to inner if they do not duplicate.
910
1054
  unless (list.include?(new_signal.name.to_s)) then
911
1055
  list << new_signal.name.to_s
912
1056
  flat.add_inner(new_signal)
913
1057
  end
914
1058
 
915
- new_smt = Transmit.new(search_refname(statement.left,"#"),statement.right.clone)
1059
+ no_statement = Transmit.new(search_refname(smt.left,"#"),smt.right.clone)
916
1060
 
917
1061
  $fm.rep_sharp[statement.left] = search_refname(statement.left,"#")
918
1062
 
919
- $fm.fm_par["#{statement.left.to_verilog}"] = new_smt.left
920
- new_when_smt.add_statement(new_smt.clone)
1063
+ $fm.fm_par["#{smt.left.to_verilog}"] = no_statement.left
1064
+ new_no.add_statement(no_statement)
921
1065
  else
922
- new_when_smt.add_statement(statement.clone)
923
- end
924
- else
925
- new_when_smt.add_statement(statement.clone)
1066
+ new_no.add_statement(smt.clone)
1067
+ end
926
1068
  end
927
1069
  end
928
1070
 
929
- new_when = When.new(whens.match.clone,new_when_smt.clone)
930
- new_statement.add_when(new_when.clone)
931
- end
932
-
933
- elsif statement.is_a?(If) then
934
-
935
- rep_buckup = $fm.rep.dup
936
- $fm.rep.clear()
937
- yes = statement.yes.to_conversion(mode, false,false)
938
- $fm.rep.clear()
939
- rep_buckup.each_key do |key|
940
- $fm.rep[key] = rep_buckup[key]
941
- end
942
-
943
- yes.each_inner do |inner|
944
- unless (list.include?(inner.name.to_s)) then
945
- if (yes.mode == :seq) || (inner.name.to_s.include? "#") then
946
- list << inner.name.to_s
947
- flat.add_inner(inner.clone) # It was new_block. why?
948
- end
949
- end
950
- end
1071
+ new_statement = If.new(statement.condition.clone,new_yes.clone,statement.no ? new_no.clone : nil)
951
1072
 
952
- yes.each_statement do |smt|
953
- if(yes.mode == :seq) then
954
- new_signal = att_signal(smt.left, "#")
1073
+ statement.each_noif do |condition, block|
1074
+ rep_buckup = $fm.rep.dup
1075
+ $fm.rep.clear()
1076
+ noif = block.to_conversion(mode,false,false)
1077
+ $fm.rep.clear()
1078
+ rep_buckup.each_key do |key|
1079
+ $fm.rep[key] = rep_buckup[key]
1080
+ end
955
1081
 
956
- unless (list.include?(new_signal.name.to_s)) then
957
- list << new_signal.name.to_s
958
- flat.add_inner(new_signal)
1082
+ noif.each_inner do |inner|
1083
+ unless (list.include?(inner.name.to_s)) then
1084
+ if (noif.mode == :seq) || (inner.name.to_s.include? "#") then
1085
+ list << inner.name.to_s
1086
+ flat.add_inner(inner.clone) # It was new_block. why?
1087
+ end
1088
+ end
959
1089
  end
960
1090
 
961
- yes_statement = Transmit.new(search_refname(smt.left,"#"),smt.right.clone)
1091
+ noif.each_statement do |smt|
1092
+ if(noif.mode == :seq) then
1093
+ new_signal = att_signal(smt.left, "#")
962
1094
 
963
- $fm.rep_sharp[statement.left] = search_refname(statement.left,"#")
1095
+ unless (list.include?(new_signal.name.to_s)) then
1096
+ list << new_signal.name.to_s
1097
+ flat.add_inner(new_signal)
1098
+ end
964
1099
 
965
- $fm.fm_par["#{smt.left.to_verilog}"] = yes_statement.left
966
- new_yes.add_statement(yes_statement)
967
- else
968
- new_yes.add_statement(smt.clone)
969
- end
970
- end
1100
+ noif_statement = Transmit.new(search_refname(smt.left,"#"),smt.right.clone)
971
1101
 
972
- if statement.no.is_a? (Block) then
973
- rep_buckup = $fm.rep.dup
974
- $fm.rep.clear()
975
- no = statement.no.to_conversion(mode,false,false)
976
- $fm.rep.clear()
977
- rep_buckup.each_key do |key|
978
- $fm.rep[key] = rep_buckup[key]
979
- end
1102
+ $fm.rep_sharp[statement.left] = search_refname(statement.left,"#")
980
1103
 
981
- no.each_inner do |inner|
982
- unless (list.include?(inner.name.to_s)) then
983
- if (no.mode == :seq) || (inner.name.to_s.include? "#") then
984
- list << inner.name.to_s
985
- flat.add_inner(inner.clone) # It was new_block. why?
986
- end
1104
+ $fm.fm_par["#{smt.left.to_verilog}"] = noif_statement.left
1105
+ new_noif.add_statement(no_statement)
1106
+ else
1107
+ new_noif.add_statement(smt.clone)
1108
+ end
987
1109
  end
988
- end
989
1110
 
990
- no.each_statement do |smt|
991
- if(no.mode == :seq) then
992
- new_signal = att_signal(smt.left, "#")
1111
+ new_statement.add_noif(condition.clone,new_noif.clone)
1112
+ end
993
1113
 
994
- unless (list.include?(new_signal.name.to_s)) then
995
- list << new_signal.name.to_s
996
- flat.add_inner(new_signal)
1114
+ # Otherwise, it is necessary to process par-> seq or seq-> par.
1115
+ else
1116
+ # Make sure the right side is a formula (Binary).
1117
+ if statement.right.is_a?(Binary) then
1118
+ # Check the right side and the left side, and if they are variables, check the corresponding expressions and replace them.
1119
+ # If it is not a variable, it calls the method to be searched.
1120
+ if statement.right.left.is_a? (Ref) then
1121
+ if (mode == :par && self.mode == :seq) && $fm.fm_seq.has_key?(statement.right.left.to_verilog) then
1122
+ statement_left = $fm.fm_seq["#{statement.right.left.to_verilog}"]
1123
+ elsif (mode == :seq && self.mode == :par) && $fm.fm_par.has_key?(statement.right.left.to_verilog) then
1124
+ statement_left = $fm.fm_par["#{statement.right.left.to_verilog}"]
1125
+ else
1126
+ statement_left = statement.right.left.clone
997
1127
  end
998
-
999
- no_statement = Transmit.new(search_refname(smt.left,"#"),smt.right.clone)
1000
-
1001
- $fm.rep_sharp[statement.left] = search_refname(statement.left,"#")
1002
-
1003
- $fm.fm_par["#{smt.left.to_verilog}"] = no_statement.left
1004
- new_no.add_statement(no_statement)
1128
+ elsif statement.right.left.is_a? (Binary) then
1129
+ statement_left = statement.right.left.to_change(self.mode)
1005
1130
  else
1006
- new_no.add_statement(smt.clone)
1131
+ statement_left = statement.right.left.clone
1007
1132
  end
1008
- end
1009
- end
1010
-
1011
- new_statement = If.new(statement.condition.clone,new_yes.clone,statement.no ? new_no.clone : nil)
1012
1133
 
1013
- statement.each_noif do |condition, block|
1014
- rep_buckup = $fm.rep.dup
1015
- $fm.rep.clear()
1016
- noif = block.to_conversion(mode,false,false)
1017
- $fm.rep.clear()
1018
- rep_buckup.each_key do |key|
1019
- $fm.rep[key] = rep_buckup[key]
1020
- end
1021
-
1022
- noif.each_inner do |inner|
1023
- unless (list.include?(inner.name.to_s)) then
1024
- if (noif.mode == :seq) || (inner.name.to_s.include? "#") then
1025
- list << inner.name.to_s
1026
- flat.add_inner(inner.clone) # It was new_block. why?
1027
- end
1134
+ if statement.right.right.is_a? (Ref) then
1135
+ if (mode == :par && self.mode == :seq) && $fm.fm_seq.has_key?(statement.right.right.to_verilog) then
1136
+ statement_right = $fm.fm_seq["#{statement.right.right.to_verilog}"]
1137
+ elsif (mode == :seq && self.mode == :par) && $fm.fm_par.has_key?(statement.right.right.to_verilog) then
1138
+ statement_right = $fm.fm_par["#{statement.right.right.to_verilog}"]
1139
+ else
1140
+ statement_right = statement.right.right.clone
1141
+ end
1142
+ elsif statement.right.right.is_a? (Binary) then
1143
+ statement_right = statement.right.right.to_change(self.mode)
1144
+ else
1145
+ statement_right = statement.right.right.clone
1146
+ end
1147
+ new_right = Binary.new(statement.right.type,statement.right.operator,statement_left.clone,statement_right.clone)
1148
+ # Confirm whether it is a variable.
1149
+ elsif statement.right.is_a?(Ref) then
1150
+ if (mode == :par && self.mode == :seq) && $fm.fm_seq.has_key?(statement.right.to_verilog) then
1151
+ new_right = $fm.fm_seq["#{statement.right.to_verilog}"].clone
1152
+ elsif (mode == :seq && self.mode == :par) && $fm.fm_par.has_key?(statement.right.to_verilog) then
1153
+ new_right = $fm.fm_par["#{statement.right.to_verilog}"].clone
1154
+ else
1155
+ new_right = statement.right.clone
1028
1156
  end
1157
+ # Because it is not a number. Put it in as it is.
1158
+ else
1159
+ new_right = statement.right.clone
1029
1160
  end
1030
1161
 
1031
- noif.each_statement do |smt|
1032
- if(noif.mode == :seq) then
1033
- new_signal = att_signal(smt.left, "#")
1162
+ if (mode == :par && self.mode == :seq) then
1163
+ # Dock the existing left hand side and the replaced right hand side to create a new expression.
1164
+ # Record the expression after conversion to hash to continue seq-> par.
1165
+ new_statement = Transmit.new(statement.left.clone,new_right)
1166
+ $fm.fm_seq["#{statement.left.to_verilog}"] = new_right
1167
+ elsif (mode == :seq && self.mode == :par) && (rep) then
1168
+ unless (res_name(statement.left).name.to_s.include? "#")
1169
+ # Search the variable on the left side and give 'to the name.
1170
+ new_signal = att_signal(statement.left,"'")
1034
1171
 
1035
1172
  unless (list.include?(new_signal.name.to_s)) then
1036
1173
  list << new_signal.name.to_s
1037
1174
  flat.add_inner(new_signal)
1038
1175
  end
1039
1176
 
1040
- noif_statement = Transmit.new(search_refname(smt.left,"#"),smt.right.clone)
1041
-
1042
- $fm.rep_sharp[statement.left] = search_refname(statement.left,"#")
1177
+ new_statement = Transmit.new(search_refname(statement.left,"'"),new_right)
1043
1178
 
1044
- $fm.fm_par["#{smt.left.to_verilog}"] = noif_statement.left
1045
- new_noif.add_statement(no_statement)
1046
- else
1047
- new_noif.add_statement(smt.clone)
1179
+ $fm.rep[statement.left] = new_statement
1048
1180
  end
1049
- end
1050
-
1051
- new_statement.add_noif(condition.clone,new_noif.clone)
1052
- end
1053
-
1054
- # Otherwise, it is necessary to process par-> seq or seq-> par.
1055
- else
1056
- # Make sure the right side is a formula (Binary).
1057
- if statement.right.is_a?(Binary) then
1058
- # Check the right side and the left side, and if they are variables, check the corresponding expressions and replace them.
1059
- # If it is not a variable, it calls the method to be searched.
1060
- if statement.right.left.is_a? (Ref) then
1061
- if (mode == :par && self.mode == :seq) && $fm.fm_seq.has_key?(statement.right.left.to_verilog) then
1062
- statement_left = $fm.fm_seq["#{statement.right.left.to_verilog}"]
1063
- elsif (mode == :seq && self.mode == :par) && $fm.fm_par.has_key?(statement.right.left.to_verilog) then
1064
- statement_left = $fm.fm_par["#{statement.right.left.to_verilog}"]
1065
- else
1066
- statement_left = statement.right.left.clone
1067
- end
1068
- elsif statement.right.left.is_a? (Binary) then
1069
- statement_left = statement.right.left.to_change(self.mode)
1070
1181
  else
1071
- statement_left = statement.right.left.clone
1072
- end
1073
-
1074
- if statement.right.right.is_a? (Ref) then
1075
- if (mode == :par && self.mode == :seq) && $fm.fm_seq.has_key?(statement.right.right.to_verilog) then
1076
- statement_right = $fm.fm_seq["#{statement.right.right.to_verilog}"]
1077
- elsif (mode == :seq && self.mode == :par) && $fm.fm_par.has_key?(statement.right.right.to_verilog) then
1078
- statement_right = $fm.fm_par["#{statement.right.right.to_verilog}"]
1079
- else
1080
- statement_right = statement.right.right.clone
1081
- end
1082
- elsif statement.right.right.is_a? (Binary) then
1083
- statement_right = statement.right.right.to_change(self.mode)
1084
- else
1085
- statement_right = statement.right.right.clone
1086
- end
1087
- new_right = Binary.new(statement.right.type,statement.right.operator,statement_left.clone,statement_right.clone)
1088
- # Confirm whether it is a variable.
1089
- elsif statement.right.is_a?(Ref) then
1090
- if (mode == :par && self.mode == :seq) && $fm.fm_seq.has_key?(statement.right.to_verilog) then
1091
- new_right = $fm.fm_seq["#{statement.right.to_verilog}"].clone
1092
- elsif (mode == :seq && self.mode == :par) && $fm.fm_par.has_key?(statement.right.to_verilog) then
1093
- new_right = $fm.fm_par["#{statement.right.to_verilog}"].clone
1094
- else
1095
- new_right = statement.right.clone
1096
- end
1097
- # Because it is not a number. Put it in as it is.
1098
- else
1099
- new_right = statement.right.clone
1182
+ new_statement = Transmit.new(statement.left.clone,new_right)
1183
+ end
1100
1184
  end
1185
+ # Add the converted statement to flat (because par -> par or seq -> seq will be added until then).
1101
1186
 
1102
- if (mode == :par && self.mode == :seq) then
1103
- # Dock the existing left hand side and the replaced right hand side to create a new expression.
1104
- # Record the expression after conversion to hash to continue seq-> par.
1105
- new_statement = Transmit.new(statement.left.clone,new_right)
1106
- $fm.fm_seq["#{statement.left.to_verilog}"] = new_right
1107
- elsif (mode == :seq && self.mode == :par) && (rep) then
1108
- unless (res_name(statement.left).name.to_s.include? "#")
1109
- # Search the variable on the left side and give 'to the name.
1110
- new_signal = att_signal(statement.left,"'")
1111
-
1112
- unless (list.include?(new_signal.name.to_s)) then
1113
- list << new_signal.name.to_s
1114
- flat.add_inner(new_signal)
1115
- end
1116
-
1117
- new_statement = Transmit.new(search_refname(statement.left,"'"),new_right)
1118
-
1119
- $fm.rep[statement.left] = new_statement
1187
+ if new_statement.is_a?(Transmit) then
1188
+ unless (mode == :par && self.mode == :seq) && (res_name(new_statement.left).name.to_s.include? "'") then
1189
+ flat.add_statement(new_statement.clone)
1120
1190
  end
1121
1191
  else
1122
- new_statement = Transmit.new(statement.left.clone,new_right)
1123
- end
1124
- end
1125
- # Add the converted statement to flat (because par -> par or seq -> seq will be added until then).
1126
-
1127
- if new_statement.is_a?(Transmit) then
1128
- unless (mode == :par && self.mode == :seq) && (res_name(new_statement.left).name.to_s.include? "'") then
1129
1192
  flat.add_statement(new_statement.clone)
1130
1193
  end
1131
- else
1132
- flat.add_statement(new_statement.clone)
1133
- end
1134
1194
 
1135
- if (rep)
1136
- $fm.rep_sharp.each_key do |key|
1137
- new_smt = Transmit.new(key.clone,$fm.rep_sharp[key].clone)
1138
- flat.add_statement(new_smt.clone)
1195
+ if (rep)
1196
+ $fm.rep_sharp.each_key do |key|
1197
+ new_smt = Transmit.new(key.clone,$fm.rep_sharp[key].clone)
1198
+ flat.add_statement(new_smt.clone)
1199
+ end
1200
+ $fm.rep_sharp.clear() # Deactivate rep that has become obsolete.
1139
1201
  end
1140
- $fm.rep_sharp.clear() # Deactivate rep that has become obsolete.
1141
1202
  end
1142
- end
1143
- # Add an expression after paragraph based on rep.
1144
- # A complement expression like x = x '.
1145
- $fm.rep.each_key do |key|
1146
- new_statement = Transmit.new(key.clone,$fm.rep[key].left.clone)
1147
- flat.add_statement(new_statement.clone)
1148
- end
1149
- $fm.rep.clear() # Deactivate rep that has become obsolete.
1203
+ # Add an expression after paragraph based on rep.
1204
+ # A complement expression like x = x '.
1205
+ $fm.rep.each_key do |key|
1206
+ new_statement = Transmit.new(key.clone,$fm.rep[key].left.clone)
1207
+ flat.add_statement(new_statement.clone)
1208
+ end
1209
+ $fm.rep.clear() # Deactivate rep that has become obsolete.
1150
1210
 
1151
1211
 
1152
- # Since seq -> par is the end, fm_par is deleted.
1153
- if (mode == :par && self.mode == :seq) then
1154
- $fm.fm_seq.clear()
1155
- end
1212
+ # Since seq -> par is the end, fm_par is deleted.
1213
+ if (mode == :par && self.mode == :seq) then
1214
+ $fm.fm_seq.clear()
1215
+ end
1156
1216
 
1157
- # In case of if statement (when rst == false) you can not convert no or else if you delete the contents of fm_seq.
1158
- # Therefore, in this case restore the backup to restore.
1159
- # This means that it is necessary to erase fm_seq once obtained in the if statement once.
1160
- if(rst == false) then
1161
- $fm.fm_seq.clear()
1162
- fm_seq_backup.each_key do |key|
1163
- $fm.fm_seq[key] = fm_seq_backup[key]
1217
+ # In case of if statement (when rst == false) you can not convert no or else if you delete the contents of fm_seq.
1218
+ # Therefore, in this case restore the backup to restore.
1219
+ # This means that it is necessary to erase fm_seq once obtained in the if statement once.
1220
+ if(rst == false) then
1221
+ $fm.fm_seq.clear()
1222
+ fm_seq_backup.each_key do |key|
1223
+ $fm.fm_seq[key] = fm_seq_backup[key]
1224
+ end
1164
1225
  end
1165
- end
1166
1226
 
1167
- return flat # Return flat finished checking.
1168
- end
1227
+ return flat # Return flat finished checking.
1228
+ end
1169
1229
 
1170
1230
 
1171
- def change_branch(block)
1172
- flat = Block.new(self.mode,"") # Store the expression until if is found.
1173
- trans = Block.new(self.mode,"") # A block that stores the expression after if is found.
1174
- new_block = Block.new(self.mode,"") # Block storing each converted expression.
1231
+ def change_branch(block)
1232
+ flat = Block.new(self.mode,"") # Store the expression until if is found.
1233
+ trans = Block.new(self.mode,"") # A block that stores the expression after if is found.
1234
+ new_block = Block.new(self.mode,"") # Block storing each converted expression.
1175
1235
 
1176
- has_branch = false # It is true if there is an if in the block.
1177
- more_has_branch = false # It is true if there are two or more if in the block.
1236
+ has_branch = false # It is true if there is an if in the block.
1237
+ more_has_branch = false # It is true if there are two or more if in the block.
1178
1238
 
1179
- # Search each expression for if.
1180
- block.each_statement do |statement|
1181
- if (has_branch)
1182
- trans.add_statement(statement.clone)
1183
- if statement.is_a?(If) || statement.is_a?(Case) then
1184
- more_has_branch = true
1185
- end
1186
- else
1187
- if statement.is_a?(If) || statement.is_a?(Case) then
1188
- flat.add_statement(statement.clone)
1189
- has_branch = true
1239
+ # Search each expression for if.
1240
+ block.each_statement do |statement|
1241
+ if (has_branch)
1242
+ trans.add_statement(statement.clone)
1243
+ if statement.is_a?(If) || statement.is_a?(Case) then
1244
+ more_has_branch = true
1245
+ end
1190
1246
  else
1191
- flat.add_statement(statement.clone)
1247
+ if statement.is_a?(If) || statement.is_a?(Case) then
1248
+ flat.add_statement(statement.clone)
1249
+ has_branch = true
1250
+ else
1251
+ flat.add_statement(statement.clone)
1252
+ end
1192
1253
  end
1193
1254
  end
1194
- end
1195
1255
 
1196
- # If there are two or more if, recursively process if.
1197
- if(more_has_branch) then
1198
- conversion_block = change_branch(trans)
1199
- else
1200
- conversion_block = trans.clone
1201
- end
1256
+ # If there are two or more if, recursively process if.
1257
+ if(more_has_branch) then
1258
+ conversion_block = change_branch(trans)
1259
+ else
1260
+ conversion_block = trans.clone
1261
+ end
1202
1262
 
1203
- # Store "trans" contents for "if" and "case" in "flat".
1204
- flat.each_statement do |statement|
1205
- # Since case statements include defaulu and when, we store the expressions saved in each case.
1206
- if statement.is_a?(Case) then
1207
- if statement.default.is_a?(Block)
1208
- new_default = statement.default.clone
1209
- conversion_block.each_statement do |smt|
1210
- new_default.add_statement(smt.clone)
1211
- end
1212
- end
1263
+ # Store "trans" contents for "if" and "case" in "flat".
1264
+ flat.each_statement do |statement|
1265
+ # Since case statements include defaulu and when, we store the expressions saved in each case.
1266
+ if statement.is_a?(Case) then
1267
+ if statement.default.is_a?(Block)
1268
+ new_default = statement.default.clone
1269
+ conversion_block.each_statement do |smt|
1270
+ new_default.add_statement(smt.clone)
1271
+ end
1272
+ end
1273
+
1274
+ new_statement = Case.new(statement.value.clone,statement.default ? new_default.clone : nil,[])
1213
1275
 
1214
- new_statement = Case.new(statement.value.clone,statement.default ? new_default.clone : nil,[])
1276
+ statement.each_when do |whens|
1277
+ new_when = whens.clone
1215
1278
 
1216
- statement.each_when do |whens|
1217
- new_when = whens.clone
1279
+ conversion_block.each_statement do |smt|
1280
+ new_when.statement.add_statement(smt.clone)
1281
+ end
1282
+ new_statement.add_when(new_when.clone)
1283
+ end
1218
1284
 
1285
+ new_block.add_statement(new_statement.clone)
1286
+ # Because there are yes, no and noifs in the if statement, store the expression saved in each.
1287
+ elsif statement.is_a?(If) then
1288
+ new_yes = statement.yes.clone
1219
1289
  conversion_block.each_statement do |smt|
1220
- new_when.statement.add_statement(smt.clone)
1221
- end
1222
- new_statement.add_when(new_when.clone)
1223
- end
1224
-
1225
- new_block.add_statement(new_statement.clone)
1226
- # Because there are yes, no and noifs in the if statement, store the expression saved in each.
1227
- elsif statement.is_a?(If) then
1228
- new_yes = statement.yes.clone
1229
- conversion_block.each_statement do |smt|
1230
- new_yes.add_statement(smt.clone)
1231
- end
1290
+ new_yes.add_statement(smt.clone)
1291
+ end
1232
1292
 
1233
- if statement.no.is_a? (Block) then
1234
- new_no = statement.no.clone
1235
- conversion_block.each_statement do |smt|
1236
- new_no.add_statement(smt.clone)
1293
+ if statement.no.is_a? (Block) then
1294
+ new_no = statement.no.clone
1295
+ conversion_block.each_statement do |smt|
1296
+ new_no.add_statement(smt.clone)
1297
+ end
1237
1298
  end
1238
- end
1239
1299
 
1240
- # Make new if with converted yes and no.
1241
- new_statement = If.new(statement.condition.clone,new_yes.clone,statement.no ? new_no.clone : nil)
1300
+ # Make new if with converted yes and no.
1301
+ new_statement = If.new(statement.condition.clone,new_yes.clone,statement.no ? new_no.clone : nil)
1242
1302
 
1243
1303
 
1244
- statement.each_noif do |condition, block|
1245
- new_noif = block.clone
1246
- conversion_block.each_statement do |smt|
1247
- new_noif.add_statement(smt.clone)
1304
+ statement.each_noif do |condition, block|
1305
+ new_noif = block.clone
1306
+ conversion_block.each_statement do |smt|
1307
+ new_noif.add_statement(smt.clone)
1308
+ end
1309
+ new_statement.add_noif(condition.clone,new_noif.clone)
1248
1310
  end
1249
- new_statement.add_noif(condition.clone,new_noif.clone)
1311
+ # Add the new statement (if) created to flat.
1312
+ new_block.add_statement(new_statement.clone)
1313
+ else
1314
+ new_block.add_statement(statement.clone)
1250
1315
  end
1251
- # Add the new statement (if) created to flat.
1252
- new_block.add_statement(new_statement.clone)
1253
- else
1254
- new_block.add_statement(statement.clone)
1255
1316
  end
1256
- end
1257
-
1258
- return new_block # Return block after conversion.
1259
- end
1260
1317
 
1261
- # Generate a signal for the variable to which "'" or "#" is added.
1262
- def att_signal(left,att = "'")
1263
- this_name = res_name(left)
1264
- new_name = RefName.new(this_name.type, this_name.ref.clone, this_name.name.to_s + att)
1265
- new_signal = SignalI.new(new_name.name,new_name.type)
1318
+ return new_block # Return block after conversion.
1319
+ end
1266
1320
 
1267
- return new_signal
1268
- end
1321
+ # Generate a signal for the variable to which "'" or "#" is added.
1322
+ def att_signal(left,att = "'")
1323
+ this_name = res_name(left)
1324
+ new_name = RefName.new(this_name.type, this_name.ref.clone, this_name.name.to_s + att)
1325
+ new_signal = SignalI.new(new_name.name,new_name.type)
1269
1326
 
1270
- # A method that takes a variable from the sent left side and adds "att".
1271
- def att_sharp(left,att = "'")
1272
- #if left.is_a?(RefName) then
1273
- new_left = search_refname(left, att)
1274
- #elsif left.is_a?(RefIndex) then
1275
- # new_ref = search_refname(left, att)
1276
- # new_left = RefIndex.new(left.type, new_ref, left.index.clone)
1277
- #elsif left.is_a?(RefRange) then
1278
- # new_ref = search_refname(left, att)
1279
- # my_range = left.range
1280
- # new_left = RefRange.new(left.type, new_ref, my_range.first.clone..my_range.last.clone)
1281
- #end
1282
-
1283
- # Add new signal to hash.
1284
- # if(att == "#") then
1285
- # $fm.rep_sharp[left] = new_left
1286
- # end
1287
- return new_left
1288
- end
1327
+ return new_signal
1328
+ end
1289
1329
 
1330
+ # A method that takes a variable from the sent left side and adds "att".
1331
+ def att_sharp(left,att = "'")
1332
+ new_left = search_refname(left, att)
1290
1333
 
1291
- # Recursively search, add "att" to RefName and return.
1292
- def search_refname(me,att = "'")
1293
- if me.is_a? (RefName) then
1294
- return RefName.new(me.type, me.ref.clone, me.name.to_s + att)
1295
- elsif me.ref.is_a? (RefName) then
1296
- return RefName.new(me.ref.type, me.ref.ref.clone, me.ref.name.to_s + att)
1297
- elsif me.ref.is_a? (RefIndex) then
1298
- return RefIndex.new(me.ref.type, search_refname(me.ref), me.ref.index.clone)
1299
- elsif me.ref.is_a? (RefRange) then
1300
- my_range = me.ref.range
1301
- return RefRange.new(me.ref.type, search_refname(me.ref), my_range.first.clone..my_range.last.clone)
1334
+ return new_left
1302
1335
  end
1303
- end
1304
1336
 
1305
- # Recursively search, return Refname.
1306
- def res_name(me)
1307
- if me.is_a? (RefName) then
1308
- return me
1309
- else
1310
- if me.ref.is_a? (RefName) then
1311
- return RefName.new(me.ref.type, me.ref.ref.clone, me.ref.name.to_s)
1337
+
1338
+ # Recursively search, add "att" to RefName and return.
1339
+ def search_refname(me,att = "'")
1340
+ if me.is_a? (RefName) then
1341
+ return RefName.new(me.type, me.ref.clone, me.name.to_s + att)
1342
+ elsif me.ref.is_a? (RefName) then
1343
+ return RefName.new(me.ref.type, me.ref.ref.clone, me.ref.name.to_s + att)
1312
1344
  elsif me.ref.is_a? (RefIndex) then
1313
- return res_name(me.ref)
1345
+ return RefIndex.new(me.ref.type, search_refname(me.ref), me.ref.index.clone)
1314
1346
  elsif me.ref.is_a? (RefRange) then
1315
- return res_name(me.ref)
1347
+ my_range = me.ref.range
1348
+ return RefRange.new(me.ref.type, search_refname(me.ref), my_range.first.clone..my_range.last.clone)
1316
1349
  end
1317
1350
  end
1318
- end
1319
- end
1320
1351
 
1321
- # Used to display variable names.
1322
- # Enhance RefName with generation of verilog code.
1323
- class RefName
1324
- # Converts the system to Verilog code using +renamer+ for producing Verilog-compatible names.
1325
- def to_verilog
1326
- # return "#{self.name.to_s}"
1327
- return "#{name_to_verilog(self.name)}"
1352
+ # Recursively search, return Refname.
1353
+ def res_name(me)
1354
+ if me.is_a? (RefName) then
1355
+ return me
1356
+ else
1357
+ if me.ref.is_a? (RefName) then
1358
+ return RefName.new(me.ref.type, me.ref.ref.clone, me.ref.name.to_s)
1359
+ elsif me.ref.is_a? (RefIndex) then
1360
+ return res_name(me.ref)
1361
+ elsif me.ref.is_a? (RefRange) then
1362
+ return res_name(me.ref)
1363
+ end
1364
+ end
1365
+ end
1328
1366
  end
1329
1367
 
1330
- # Used for instantiation (emergency procedure).
1331
- def to_another_verilog
1332
- return "_#{self.name.to_s}"
1333
- end
1368
+ # Used to display variable names.
1369
+ # Enhance RefName with generation of verilog code.
1370
+ class RefName
1371
+ # Converts the system to Verilog code using +renamer+ for producing Verilog-compatible names.
1372
+ def to_verilog
1373
+ vname = name_to_verilog(self.name)
1374
+ self.properties[:verilog_name] = vname
1375
+ return "#{vname}"
1376
+ end
1377
+
1378
+ # Used for instantiation (emergency procedure).
1379
+ def to_another_verilog
1380
+ return "_#{self.name.to_s}"
1381
+ end
1334
1382
 
1335
- def ancestor(my)
1336
- if my.parent.parent.respond_to? (:mode) then
1337
- return ancestor(my.parent)
1338
- else
1339
- return "#{my.parent.mode.to_s}#{my.mode.to_s}"
1383
+ def ancestor(my)
1384
+ if my.parent.parent.respond_to? (:mode) then
1385
+ return ancestor(my.parent)
1386
+ else
1387
+ return "#{my.parent.mode.to_s}#{my.mode.to_s}"
1388
+ end
1340
1389
  end
1341
1390
  end
1342
- end
1343
1391
 
1344
- # Used to convert an array.
1345
- # Enhance RefIndex with generation of verilog code.
1346
- class RefIndex
1347
- # Converts the system to Verilog code.
1348
- def to_verilog
1349
- return "#{self.ref.to_verilog}[#{self.index.to_verilog}]"
1392
+ # Used to convert an array.
1393
+ # Enhance RefIndex with generation of verilog code.
1394
+ class RefIndex
1395
+ # Converts the system to Verilog code.
1396
+ def to_verilog
1397
+ return "#{self.ref.to_verilog}[#{self.index.to_verilog}]"
1398
+ end
1350
1399
  end
1351
- end
1352
1400
 
1353
1401
 
1354
- # Used to indicate the number of bits.
1355
- # Enhance TypeVector with generation of verilog code.
1356
- class TypeVector
1357
- # Converts the system to Verilog code.
1358
- def to_verilog
1359
- # if self.base.name.to_s != "bit"
1360
- if VERILOG_BASE_TYPES.include?(self.base.name.to_s)
1361
- return " #{self.base.name.to_s}[#{self.range.first}:#{self.range.last}]"
1402
+ # Used to indicate the number of bits.
1403
+ # Enhance TypeVector with generation of verilog code.
1404
+ class TypeVector
1405
+ # Converts the system to Verilog code.
1406
+ def to_verilog
1407
+ # if self.base.name.to_s != "bit"
1408
+ if VERILOG_BASE_TYPES.include?(self.base.name.to_s)
1409
+ return " #{self.base.name.to_s}[#{self.range.first}:#{self.range.last}]"
1410
+ end
1411
+ return " [#{self.range.first}:#{self.range.last}]"
1362
1412
  end
1363
- return " [#{self.range.first}:#{self.range.last}]"
1364
1413
  end
1365
- end
1366
1414
 
1367
- # Necessary for displaying bit width (eg, specify and assign).
1368
- class RefRange
1369
- # Converts the system to Verilog code.
1370
- def to_verilog(unknown = false)
1371
- return "#{self.ref.to_verilog}[#{self.range.first.to_getrange}:#{self.range.last.to_getrange}]"
1415
+ # Necessary for displaying bit width (eg, specify and assign).
1416
+ class RefRange
1417
+ # Converts the system to Verilog code.
1418
+ def to_verilog(unknown = false)
1419
+ return "#{self.ref.to_verilog}[#{self.range.first.to_getrange}:#{self.range.last.to_getrange}]"
1420
+ end
1372
1421
  end
1373
- end
1374
1422
 
1375
- # Use it when collecting references.
1376
- class RefConcat
1377
- def to_verilog
1378
- ref = self.each_ref.to_a
1423
+ # Use it when collecting references.
1424
+ class RefConcat
1425
+ def to_verilog
1426
+ ref = self.each_ref.to_a
1379
1427
 
1380
- result = "{"
1381
- ref[0..-2].each do |ref|
1382
- result << "#{ref.to_verilog},"
1383
- end
1384
- result << "#{ref.last.to_verilog}}"
1428
+ result = "{"
1429
+ ref[0..-2].each do |ref|
1430
+ result << "#{ref.to_verilog},"
1431
+ end
1432
+ result << "#{ref.last.to_verilog}}"
1385
1433
 
1386
- return result
1434
+ return result
1435
+ end
1387
1436
  end
1388
- end
1389
1437
 
1390
- # Used to output bitstring.
1391
- # Enhance HDLRuby with generation of verilog code.
1392
- class HDLRuby::BitString
1393
- # Converts the system to Verilog code.
1394
- def to_verilog
1395
- return "#{self.to_s}"
1438
+ # Used to output bitstring.
1439
+ # Enhance HDLRuby with generation of verilog code.
1440
+ class HDLRuby::BitString
1441
+ # Converts the system to Verilog code.
1442
+ def to_verilog
1443
+ return "#{self.to_s}"
1444
+ end
1396
1445
  end
1397
- end
1398
1446
 
1399
- # Used for connection using choice.
1400
- # Enhance Select with generation of verilog code.
1401
- class Select
1402
- # Converts the system to Verilog code.
1403
- def to_verilog
1404
- # Outputs the first and second choices (choice (0) and choice (1)).
1405
- return "#{self.select.to_verilog} == 1 #{self.operator} #{self.get_choice(0).to_verilog} : #{self.get_choice(1).to_verilog}"
1447
+ # Used for connection using choice.
1448
+ # Enhance Select with generation of verilog code.
1449
+ class Select
1450
+ # Converts the system to Verilog code.
1451
+ def to_verilog
1452
+ # Outputs the first and second choices (choice (0) and choice (1)).
1453
+ return "#{self.select.to_verilog} == 1 #{self.operator} #{self.get_choice(0).to_verilog} : #{self.get_choice(1).to_verilog}"
1454
+ end
1406
1455
  end
1407
- end
1408
1456
 
1409
- # Used to output numbers.
1410
- # Enhance Value with generation of verilog code.
1411
- class Value
1412
- # Converts the system to Verilog code.
1413
- # If it is bit, it is b, and if it is int, it is represented by d. (Example: 4'b0000, 32'd1)
1414
- def to_verilog(unknown = nil)
1415
- if self.type.base.name.to_s == "bit"
1416
- return "#{self.type.range.first + 1}'b#{self.content.to_verilog}"
1417
- elsif self.type.name.to_s == "integer"
1418
- str = self.content.to_verilog
1419
- if str[0] == "-" then
1420
- # Negative value.
1421
- return "-#{self.type.range.first + 1}'d#{str[1..-1]}"
1422
- else
1423
- return "#{self.type.range.first + 1}'d#{str}"
1457
+ # Used to output numbers.
1458
+ # Enhance Value with generation of verilog code.
1459
+ class Value
1460
+ # Converts the system to Verilog code.
1461
+ # If it is bit, it is b, and if it is int, it is represented by d. (Example: 4'b0000, 32'd1)
1462
+ def to_verilog(unknown = nil)
1463
+ if self.type.base.name.to_s == "bit"
1464
+ return "#{self.type.range.first + 1}'b#{self.content.to_verilog}"
1465
+ elsif self.type.name.to_s == "integer"
1466
+ str = self.content.to_verilog
1467
+ if str[0] == "-" then
1468
+ # Negative value.
1469
+ return "-#{self.type.range.first + 1}'d#{str[1..-1]}"
1470
+ else
1471
+ return "#{self.type.range.first + 1}'d#{str}"
1472
+ end
1424
1473
  end
1474
+ return "#{self.type.range.first + 1}'b#{self.content.to_verilog}"
1475
+ end
1476
+ # How to use when simply obtaining the width
1477
+ def to_getrange
1478
+ return "#{self.content.to_verilog}"
1425
1479
  end
1426
- return "#{self.type.range.first + 1}'b#{self.content.to_verilog}"
1427
- end
1428
- # How to use when simply obtaining the width
1429
- def to_getrange
1430
- return "#{self.content.to_verilog}"
1431
1480
  end
1432
- end
1433
1481
 
1434
- # Used to transrate if.
1435
- # Enhance If with generation of verilog code.
1436
- class If
1437
- # Converts the system to Verilog code.
1438
- def to_verilog(mode = nil)
1439
1482
 
1440
- $blocking = false
1483
+ # Used to transrate if.
1484
+ # Enhance If with generation of verilog code.
1485
+ class If
1486
+ # # Converts the system to Verilog code.
1487
+ # def to_verilog(mode = nil)
1488
+ # Converts to Verilog code, checking adding 'spc' spaces at the begining
1489
+ # of each line.
1490
+ def to_verilog(spc = 3)
1441
1491
 
1442
- if ($space_count == 0) then
1443
- result = " " * ($space_count) # Indented based on space_count.
1444
- else
1445
- result = ""
1446
- end
1447
- $space_count += 1 # Add count to be used for indentation.
1492
+ $blocking = false
1448
1493
 
1449
- result << "if (#{self.condition.to_verilog}) begin\n"
1494
+ result = " " * spc # Indented based on space_count.
1450
1495
 
1496
+ result << "if (#{self.condition.to_verilog}) "
1451
1497
 
1452
- # Check if there is yes (if) and output yes or less.
1453
- if self.respond_to? (:yes)
1454
- self.yes.each_statement do |statement|
1455
- result << "#{" " * $space_count} #{statement.to_verilog(mode)}"
1498
+
1499
+ # Check if there is yes (if) and output yes or less.
1500
+ if self.respond_to? (:yes)
1501
+ result << self.yes.to_verilog(spc)
1456
1502
  end
1457
- result << "#{" " * $space_count} end\n"
1458
- end
1459
1503
 
1460
- # If noif (else if) exists, it outputs it.
1461
- # Since noif is directly under, respond_to is unnecessary.
1462
- self.each_noif do |condition, block|
1463
- result << "#{" " * $space_count} else if (#{condition.to_verilog}) begin\n"
1464
- block.each_statement do |statement|
1465
- result << "#{" " * $space_count} #{statement.to_verilog(mode)}"
1504
+ # If noif (else if) exists, it outputs it.
1505
+ # Since noif is directly under, respond_to is unnecessary.
1506
+ self.each_noif do |condition, block|
1507
+ result << "\n#{" "*spc}else if (#{condition.to_verilog}) "
1508
+ result << block.to_verilog(spc)
1466
1509
  end
1467
- result << "#{" "* $space_count} end\n"
1468
- end
1469
1510
 
1470
- # Check if there is no (else) and output no or less.
1471
- if self.no.respond_to? (:mode)
1472
- result << "#{" " * $space_count} else begin\n"
1473
- self.no.each_statement do |statement|
1474
- result << "#{" " * $space_count} #{statement.to_verilog(mode)}"
1511
+ # Check if there is no (else) and output no or less.
1512
+ if self.no.respond_to?(:mode)
1513
+ result << "\n#{" " * spc}else "
1514
+ result << self.no.to_verilog(spc)
1475
1515
  end
1476
- result << "#{" " * $space_count} end\n"
1477
- end
1478
1516
 
1479
- $space_count -= 1 # Since the output ends, reduce the count.
1480
- return result
1517
+ return result
1518
+ end
1481
1519
  end
1482
- end
1483
1520
 
1484
- # Used to translate case
1485
- class Case
1486
- def to_verilog(mode = nil)
1521
+ # Used to translate case
1522
+ class Case
1523
+ # def to_verilog(mode = nil)
1524
+ #
1525
+ # Converts to Verilog code, checking if variables are register
1526
+ # or wire adding 'spc' spaces at the begining of each line.
1527
+ def to_verilog(spc = 3)
1528
+
1529
+ result = " " * spc # Indented based on space_count.
1487
1530
 
1488
- if ($space_count == 0) then
1489
- result = " " * ($space_count) # Indented based on space_count.
1490
- else
1491
1531
  result = ""
1492
- end
1493
- $space_count += 1 # Add count to be used for indentation.
1494
-
1495
- result = ""
1496
- result << "case(#{self.value.to_verilog})\n"
1497
-
1498
- # n the case statement, each branch is partitioned by when. Process each time when.
1499
- self.each_when do |whens|
1500
- # Reads and stores the numbers and expressions stored in when.
1501
- result << " " + " " *$space_count + "#{whens.match.to_verilog}: "
1502
- if whens.statement.each_statement.count > 1 then
1503
- result << "begin\n"
1504
- whens.statement.each_statement do |statement|
1505
- result << " "+ " " *$space_count +"#{statement.to_verilog}"
1506
- end
1507
- result << " " + " " *$space_count + "end\n"
1508
- elsif whens.statement.each_statement.count == 1 then
1509
- whens.statement.each_statement do |statement|
1510
- result << "#{statement.to_verilog}"
1532
+ result << "case(#{self.value.to_verilog})\n"
1533
+
1534
+ # n the case statement, each branch is partitioned by when. Process each time when.
1535
+ self.each_when do |whens|
1536
+ # Reads and stores the numbers and expressions stored in when.
1537
+ result << " " * (spc+3) + "#{whens.match.to_verilog}: "
1538
+
1539
+ if whens.statement.each_statement.count >= 1 then
1540
+ result << whens.statement.to_verilog(spc+3)
1541
+ else
1542
+ result << "\n"
1511
1543
  end
1512
- else
1513
- # Empty statement case.
1514
- result << "\n"
1515
1544
  end
1516
- end
1517
- # The default part is stored in default instead of when. Reads and processes in the same way as when.
1518
- if self.default then
1519
- if self.default.each_statement.count > 1 then
1520
- result << " " + " " *$space_count + "default: begin\n"
1521
- self.default.each_statement do |statement|
1522
- result << " " + " " *$space_count + "#{statement.to_verilog}"
1523
- end
1524
- result << " end\n"
1525
- elsif self.default.each_statement.count == 1 then
1526
- result << " " + " " *$space_count + "default: "
1527
- self.default.each_statement do |statement|
1528
- result << "#{statement.to_verilog}"
1545
+ if self.default then
1546
+ if self.default.each_statement.count >= 1 then
1547
+ result << self.default.each_statement.map do |stmnt|
1548
+ stmnt.to_verilog(spc+3)
1549
+ end.join("\n")
1550
+ else
1551
+ result << "\n"
1529
1552
  end
1530
- end
1531
- end
1532
- result << " " + " " *$space_count + "endcase\n" # Conclusion.
1533
-
1534
- $space_count -= 1 # Since the output ends, reduce the count.
1535
- return result # Return case after translation.
1536
- end
1537
- end
1553
+ end
1554
+ result << " " * spc + "endcase\n" # Conclusion.
1538
1555
 
1539
- # Translate expression of combination circuit.
1540
- # Enhance Connection with generation of verilog code.
1541
- class Connection
1542
- # Converts the system to Verilog code.
1543
-
1544
- # Method used for array.
1545
- def array_connection(left,right)
1546
- expression = right.each_expression.to_a
1547
- result = ""
1548
- expression[0..-2].each do |expression|
1549
- result << " assign #{left.to_verilog}[#{expression.content.to_s}] = #{expression.to_verilog};\n"
1556
+ return result # Return case after translation.
1550
1557
  end
1551
- result << " assign #{left.to_verilog}[#{expression.last.content.to_s}] = #{expression.last.to_verilog};\n"
1552
- return result
1553
1558
  end
1554
1559
 
1555
- def to_verilog
1556
- # Decide whether to assign to array by if.
1557
- # NOTICE: Now array assignment is done trough constant initialization, will be treated later.
1558
- # if self.right.respond_to? (:each_expression)
1559
- # array_connection(self.left,self.right);
1560
- # else
1561
- cnt = 0 # Use count.
1562
- bit = -2 # Used to determine the bit width. Since there are 0 and default, -2.
1563
-
1564
- # Measure the number of choices on the right side (case statement if it is 3 or more).
1565
- if self.right.respond_to? (:each_choice)
1566
- choice = self.right.each_choice.to_a
1567
- choice.each do |choice|
1568
- bit += 1
1569
- end
1570
- end
1560
+ # Translate expression of combination circuit.
1561
+ # Enhance Connection with generation of verilog code.
1562
+ class Connection
1563
+ # Converts the system to Verilog code.
1571
1564
 
1572
- # Three or more choices.
1573
- if (bit > 2)
1574
- # The bit width is obtained by converting the bit into a binary number and obtaining the size.
1575
- bit = bit.to_s(2).size
1576
-
1577
- # Create a case statement.
1578
- result = " begin\n"
1579
- result << " case(#{self.right.select.to_verilog})\n"
1580
- # Output other than the last one in order.
1581
- choice[0..-2].each do |choice|
1582
- result << " #{bit}'#{cnt}: #{self.left.to_verilog} = #{choice.to_verilog}\n"
1583
- cnt += 1
1565
+ # Method used for array.
1566
+ def array_connection(left,right)
1567
+ expression = right.each_expression.to_a
1568
+ result = ""
1569
+ expression[0..-2].each do |expression|
1570
+ result << " assign #{left.to_verilog}[#{expression.content.to_s}] = #{expression.to_verilog};\n"
1584
1571
  end
1585
- # At the end, it becomes default because it needs default.
1586
- result << " default: #{self.left.to_verilog} = #{choice.last.to_verilog}\n"
1587
- result << " endcase\n"
1588
- result << " end\n"
1572
+ result << " assign #{left.to_verilog}[#{expression.last.content.to_s}] = #{expression.last.to_verilog};\n"
1589
1573
  return result
1590
1574
  end
1591
1575
 
1592
- # It is not a case so call it normally.
1593
- return " assign #{self.left.to_verilog} = #{self.right.to_verilog};\n"
1594
- # end
1595
- end
1596
- end
1576
+ def to_verilog
1577
+ # Decide whether to assign to array by if.
1578
+ # NOTICE: Now array assignment is done trough constant initialization, will be treated later.
1579
+ # if self.right.respond_to? (:each_expression)
1580
+ # array_connection(self.left,self.right);
1581
+ # else
1582
+ cnt = 0 # Use count.
1583
+ bit = -2 # Used to determine the bit width. Since there are 0 and default, -2.
1584
+
1585
+ # Measure the number of choices on the right side (case statement if it is 3 or more).
1586
+ if self.right.respond_to? (:each_choice)
1587
+ choice = self.right.each_choice.to_a
1588
+ choice.each do |choice|
1589
+ bit += 1
1590
+ end
1591
+ end
1592
+
1593
+ # Three or more choices.
1594
+ if (bit > 2)
1595
+ # The bit width is obtained by converting the bit into a binary number and obtaining the size.
1596
+ bit = bit.to_s(2).size
1597
+
1598
+ # Create a case statement.
1599
+ result = " begin\n"
1600
+ result << " case(#{self.right.select.to_verilog})\n"
1601
+ # Output other than the last one in order.
1602
+ choice[0..-2].each do |choice|
1603
+ result << " #{bit}'#{cnt}: #{self.left.to_verilog} = #{choice.to_verilog}\n"
1604
+ cnt += 1
1605
+ end
1606
+ # At the end, it becomes default because it needs default.
1607
+ result << " default: #{self.left.to_verilog} = #{choice.last.to_verilog}\n"
1608
+ result << " endcase\n"
1609
+ result << " end\n"
1610
+ return result
1611
+ end
1597
1612
 
1598
- # It could be used for instantiation.
1599
- class RefThis
1600
- def to_another_verilog
1601
- return ""
1613
+ # It is not a case so call it normally.
1614
+ return " assign #{self.left.to_verilog} = #{self.right.to_verilog};\n"
1615
+ # end
1616
+ end
1602
1617
  end
1603
- end
1604
1618
 
1605
- # Used when using "~" for expressions.
1606
- class Unary
1607
- # Converts the system to Verilog code.
1608
- def to_verilog
1609
- return "#{self.operator[0]}#{self.child.to_verilog}"
1619
+ # It could be used for instantiation.
1620
+ class RefThis
1621
+ def to_another_verilog
1622
+ return ""
1623
+ end
1610
1624
  end
1611
- end
1612
1625
 
1613
- # Used when casting expressions.
1614
- class Cast
1615
- # Converts the system to Verilog code.
1616
- # NOTE: the cast is rounded up size bit-width cast is not supported
1617
- # by traditional verilog.
1618
- def to_verilog
1619
- # return "#{self.type.to_verilog}'(#{self.child.to_verilog})"
1620
- if self.child.is_a?(Value) then
1621
- return self.child.to_verilog
1626
+ # Used when using "~" for expressions.
1627
+ class Unary
1628
+ # Converts the system to Verilog code.
1629
+ def to_verilog
1630
+ return "#{self.operator[0]}#{self.child.to_verilog}"
1622
1631
  end
1623
- # Get the type widths, used for computing extensions or truncations.
1624
- cw = self.child.type.width
1625
- sw = self.type.width
1626
- if self.type.signed? then
1627
- # return "$signed(#{self.child.to_verilog})"
1628
- if (sw>cw) then
1629
- # Need to sign extend.
1630
- return "$signed({{#{sw-cw}{#{self.child.to_verilog}[#{cw-1}]}}," +
1631
- "#{self.child.to_verilog}})"
1632
- elsif (sw<cw) then
1633
- # Need to truncate
1634
- return "$signed(#{self.child.to_verilog}[#{sw-1}:0])"
1635
- else
1636
- # Only enforce signed.
1637
- return "$signed(#{self.child.to_verilog})"
1632
+ end
1633
+
1634
+ # Used when casting expressions.
1635
+ class Cast
1636
+ # Converts the system to Verilog code.
1637
+ # NOTE: the cast is rounded up size bit-width cast is not supported
1638
+ # by traditional verilog.
1639
+ def to_verilog
1640
+ if self.child.is_a?(Value) then
1641
+ return self.child.to_verilog
1638
1642
  end
1639
- else
1640
- # return "$unsigned(#{self.child.to_verilog})"
1641
- if (sw>cw) then
1642
- # Need to extend.
1643
- return "$unsigned({{#{sw-cw}{1'b0}},#{self.child.to_verilog}})"
1644
- elsif (sw<cw) then
1645
- # Need to truncate
1646
- return "$unsigned(#{self.child.to_verilog}[#{sw-1}:0])"
1643
+ # Get the type widths, used for computing extensions or truncations.
1644
+ cw = self.child.type.width
1645
+ sw = self.type.width
1646
+ if self.type.signed? then
1647
+ if (sw>cw) then
1648
+ # Need to sign extend.
1649
+ return "$signed({{#{sw-cw}{#{self.child.to_verilog}[#{cw-1}]}}," +
1650
+ "#{self.child.to_verilog}})"
1651
+ elsif (sw<cw) then
1652
+ # Need to truncate
1653
+ return "$signed(#{self.child.to_verilog}[#{sw-1}:0])"
1654
+ else
1655
+ # Only enforce signed.
1656
+ return "$signed(#{self.child.to_verilog})"
1657
+ end
1647
1658
  else
1648
- # Only enforce signed.
1649
- return "$unsigned(#{self.child.to_verilog})"
1659
+ if (sw>cw) then
1660
+ # Need to extend.
1661
+ return "$unsigned({{#{sw-cw}{1'b0}},#{self.child.to_verilog}})"
1662
+ elsif (sw<cw) then
1663
+ # Need to truncate
1664
+ return "$unsigned(#{self.child.to_verilog}[#{sw-1}:0])"
1665
+ else
1666
+ # Only enforce signed.
1667
+ return "$unsigned(#{self.child.to_verilog})"
1668
+ end
1650
1669
  end
1651
1670
  end
1652
1671
  end
1653
- end
1654
1672
 
1655
- # For declaring variables.
1656
- # Enhance SignalI with generation of verilog code.
1657
- class SignalI
1658
- # Converts the system to Verilog code.
1659
- def to_verilog
1660
- # Convert unusable characters and return them.
1661
- return "#{name_to_verilog(self.name)}"
1673
+ # For declaring variables.
1674
+ # Enhance SignalI with generation of verilog code.
1675
+ class SignalI
1676
+ # Converts the system to Verilog code.
1677
+ def to_verilog
1678
+ # Convert unusable characters and return them.
1679
+ vname = name_to_verilog(self.name)
1680
+ self.properties[:verilog_name] = vname
1681
+ return "#{vname}"
1682
+ end
1662
1683
  end
1663
- end
1664
1684
 
1665
- # If it is signed, it outputs signed.
1666
- # Enhance Type with generation of verilog code.
1667
- class Type
1668
- # Converts the type to Verilog code.
1669
- def to_verilog
1670
- return self.name == :signed ? "#{self.name.to_s} " : ""
1685
+ # If it is signed, it outputs signed.
1686
+ # Enhance Type with generation of verilog code.
1687
+ class Type
1688
+ # Converts the type to Verilog code.
1689
+ def to_verilog
1690
+ return self.name == :signed ? "#{self.name.to_s} " : ""
1691
+ end
1671
1692
  end
1672
- end
1673
1693
 
1674
- # Replace type by refered type.
1675
- class TypeDef
1676
- # Converts the type to verilog code.
1677
- def to_verilog
1678
- return self.def.to_verilog
1694
+ # Replace type by refered type.
1695
+ class TypeDef
1696
+ # Converts the type to verilog code.
1697
+ def to_verilog
1698
+ return self.def.to_verilog
1699
+ end
1679
1700
  end
1680
- end
1681
1701
 
1682
- # Use it when collecting.
1683
- class Concat
1684
- def to_verilog
1685
- expression = self.each_expression.to_a
1702
+ # Use it when collecting.
1703
+ class Concat
1704
+ def to_verilog
1705
+ expression = self.each_expression.to_a
1686
1706
 
1687
- result = "{"
1688
- expression[0..-2].each do |expression|
1689
- result << "#{expression.to_verilog},"
1690
- end
1691
- result << "#{expression.last.to_verilog}}"
1707
+ result = "{"
1708
+ expression[0..-2].each do |expression|
1709
+ result << "#{expression.to_verilog},"
1710
+ end
1711
+ result << "#{expression.last.to_verilog}}"
1692
1712
 
1693
- return result
1713
+ return result
1714
+ end
1694
1715
  end
1695
- end
1696
1716
 
1697
- # Look at the unit of time, convert the time to ps and output it.
1698
- # One of two people, TimeWait and Delay.
1699
- class TimeWait
1700
- def to_verilog(mode=nil)
1701
- return self.delay.to_verilog + "\n"
1717
+ # Look at the unit of time, convert the time to ps and output it.
1718
+ # One of two people, TimeWait and Delay.
1719
+ class TimeWait
1720
+ def to_verilog(spc = 3)
1721
+ return (" " * spc) + self.delay.to_verilog + "\n"
1722
+ end
1702
1723
  end
1703
- end
1704
- class Delay
1705
- def to_verilog
1706
- time = self.value.to_s
1707
- if(self.unit.to_s == "ps") then
1708
- return "##{time};"
1709
- elsif(self.unit.to_s == "ns")
1710
- return "##{time}000;"
1711
- elsif(self.unit.to_s == "us")
1712
- return "##{time}000000;"
1713
- elsif(self.unit.to_s == "ms")
1714
- return "##{time}000000000;"
1715
- elsif(self.unit.to_s == "s")
1716
- return "##{time}000000000000;"
1724
+ class Delay
1725
+ def to_verilog
1726
+ time = self.value.to_s
1727
+ if(self.unit.to_s == "ps") then
1728
+ return "##{time};"
1729
+ elsif(self.unit.to_s == "ns")
1730
+ return "##{time}000;"
1731
+ elsif(self.unit.to_s == "us")
1732
+ return "##{time}000000;"
1733
+ elsif(self.unit.to_s == "ms")
1734
+ return "##{time}000000000;"
1735
+ elsif(self.unit.to_s == "s")
1736
+ return "##{time}000000000000;"
1737
+ end
1717
1738
  end
1718
1739
  end
1719
- end
1720
1740
 
1721
- # Those who disappeared.
1722
- #class SystemI
1723
- #class TypeTuple
1724
- #class Event
1725
-
1726
- # Enhance SystemT with generation of verilog code.
1727
- class SystemT
1728
-
1729
- ## Tells if a connection is actually a port connection.
1730
- def port_output_connection?(connection)
1731
- return self.each_systemI.find do |systemI|
1732
- if connection.right.is_a?(RefName) &&
1733
- connection.right.ref.is_a?(RefName) &&
1734
- systemI.name == connection.right.ref.name
1735
- puts "port_connection for right=#{connection.right.name} and systemI=#{systemI.name}"
1736
- true
1737
- else
1738
- false
1741
+ # Those who disappeared.
1742
+ #class SystemI
1743
+ #class TypeTuple
1744
+ #class Event
1745
+
1746
+ # Enhance SystemT with generation of verilog code.
1747
+ class SystemT
1748
+
1749
+ ## Tells if a connection is actually a port connection.
1750
+ def port_output_connection?(connection)
1751
+ return self.each_systemI.find do |systemI|
1752
+ if connection.right.is_a?(RefName) &&
1753
+ connection.right.ref.is_a?(RefName) &&
1754
+ systemI.name == connection.right.ref.name
1755
+ puts "port_connection for right=#{connection.right.name} and systemI=#{systemI.name}"
1756
+ true
1757
+ else
1758
+ false
1759
+ end
1739
1760
  end
1740
1761
  end
1741
- end
1742
1762
 
1743
- ## Tells if an expression is a reference to port +systemI.signal+.
1744
- def port_assign?(expr, systemI, signal)
1745
- return expr.is_a?(RefName) && expr.name == signal.name &&
1746
- expr.ref.is_a?(RefName) && expr.ref.name == systemI.name
1747
- end
1763
+ ## Tells if an expression is a reference to port +systemI.signal+.
1764
+ def port_assign?(expr, systemI, signal)
1765
+ return expr.is_a?(RefName) && expr.name == signal.name &&
1766
+ expr.ref.is_a?(RefName) && expr.ref.name == systemI.name
1767
+ end
1748
1768
 
1749
- ## Extracts the assignments to port +systemI.signal+ and returns
1750
- # the resulting reference to a port wire.
1751
- #
1752
- # NOTE: assumes to_upper_space! and with_port! has been called.
1753
- def extract_port_assign!(systemI,signal)
1754
- # Extract the assignment.
1755
- assign = nil
1756
- self.each_connection.to_a.each do |connection|
1757
- if self.port_assign?(connection.left,systemI,signal) then
1758
- # The left is the port.
1759
- # Delete the connection.
1760
- self.scope.delete_connection!(connection)
1761
- # And return a copy of the right.
1762
- return connection.right.clone
1763
- elsif self.port_assign?(connection.right,systemI,signal) then
1764
- # The right is the port.
1765
- # Delete the connection.
1766
- self.scope.delete_connection!(connection)
1767
- # And return a copy of the left.
1768
- return connection.left.clone
1769
+ ## Extracts the assignments to port +systemI.signal+ and returns
1770
+ # the resulting reference to a port wire.
1771
+ #
1772
+ # NOTE: assumes to_upper_space! and with_port! has been called.
1773
+ def extract_port_assign!(systemI,signal)
1774
+ # Extract the assignment.
1775
+ assign = nil
1776
+ self.each_connection.to_a.each do |connection|
1777
+ if self.port_assign?(connection.left,systemI,signal) then
1778
+ # The left is the port.
1779
+ # Delete the connection.
1780
+ self.scope.delete_connection!(connection)
1781
+ # And return a copy of the right.
1782
+ return connection.right.clone
1783
+ elsif self.port_assign?(connection.right,systemI,signal) then
1784
+ # The right is the port.
1785
+ # Delete the connection.
1786
+ self.scope.delete_connection!(connection)
1787
+ # And return a copy of the left.
1788
+ return connection.left.clone
1789
+ end
1769
1790
  end
1791
+ # No port found, nothing to do
1792
+ return nil
1770
1793
  end
1771
- # No port found, nothing to do
1772
- return nil
1773
- end
1774
1794
 
1775
1795
 
1776
1796
 
1777
- # Converts the system to Verilog code.
1778
- def to_verilog
1779
- # Preprocessing
1780
- # Force seq block to par: ULTRA TEMPORARY! ICIICI
1781
- self.each_behavior do |behavior|
1782
- behavior.each_block_deep do |block|
1783
- block.set_mode!(:par) unless block.is_a?(TimeBlock)
1797
+ # Converts the system to Verilog code.
1798
+ def to_verilog
1799
+ # Detect the registers
1800
+ HDLRuby::Low::VERILOG_REGS.clear
1801
+ # The left values.
1802
+ self.each_behavior do |behavior|
1803
+ behavior.each_block_deep do |block|
1804
+ block.each_statement do |statement|
1805
+ if statement.is_a?(Transmit)
1806
+ HDLRuby::Low::VERILOG_REGS << statement.left.to_verilog
1807
+ end
1808
+ end
1809
+ end
1784
1810
  end
1785
- end
1786
- # Detect the registers
1787
- regs = []
1788
- # The left values.
1789
- self.each_behavior do |behavior|
1790
- # behavior.block.each_statement do |statement|
1791
- # regs << statement.left.to_verilog if statement.is_a?(Transmit)
1792
- # end
1793
- behavior.each_block_deep do |block|
1794
- block.each_statement do |statement|
1795
- regs << statement.left.to_verilog if statement.is_a?(Transmit)
1811
+ # And the initialized signals.
1812
+ self.each_output do |output|
1813
+ # regs << output.to_verilog if output.value
1814
+ HDLRuby::Low::VERILOG_REGS << output.to_verilog if output.value
1815
+ end
1816
+ self.each_inner do |inner|
1817
+ # regs << inner.to_verilog if inner.value
1818
+ HDLRuby::Low::VERILOG_REGS << inner.to_verilog if inner.value
1819
+ end
1820
+ # And the array types signals.
1821
+ self.each_signal do |sig|
1822
+ if sig.type.vector? && sig.type.base.vector? then
1823
+ HDLRuby::Low::VERILOG_REGS << sig.to_verilog
1824
+ end
1825
+ end
1826
+ self.each_inner do |sig|
1827
+ if sig.type.vector? && sig.type.base.vector? then
1828
+ HDLRuby::Low::VERILOG_REGS << sig.to_verilog
1796
1829
  end
1797
1830
  end
1798
- end
1799
- # # puts "regs has clk?: #{regs.include?("clk")}"
1800
- # # puts "for system #{self.name}"
1801
- # # Remove the left values of connection, they do not count.
1802
- # self.scope.each_connection do |connection|
1803
- # # Skip port connections.
1804
- # next if !self.port_output_connection?(connection)
1805
- # # puts "Not counting left in connection: #{connection.to_verilog}"
1806
- # # puts "i.e.: #{connection.left.to_verilog}"
1807
- # regs.delete(connection.left.to_verilog)
1808
- # end
1809
- # # puts "Now regs has clk?: #{regs.include?("clk")}"
1810
- # And the initialized signals.
1811
- self.each_output do |output|
1812
- regs << output.to_verilog if output.value
1813
- end
1814
- self.each_inner do |inner|
1815
- regs << inner.to_verilog if inner.value
1816
- end
1817
- # And the array types signals.
1818
- self.each_signal do |sig|
1819
- # regs << sig.to_verilog if sig.type.is_a?(TypeVector) && sig.type.base.is_a?(TypeVector)
1820
- regs << sig.to_verilog if sig.type.vector? && sig.type.base.vector?
1821
- end
1822
- self.each_inner do |sig|
1823
- # regs << sig.to_verilog if sig.type.is_a?(TypeVector) && sig.type.base.is_a?(TypeVector)
1824
- regs << sig.to_verilog if sig.type.vector? && sig.type.base.vector?
1825
- end
1826
1831
 
1827
- # Code generation
1828
- inputs = 0
1829
- outputs = 0
1830
- inout = 0
1832
+ # Code generation
1833
+ inputs = 0
1834
+ outputs = 0
1835
+ inout = 0
1831
1836
 
1832
- inputs = self.each_input.to_a
1833
- outputs = self.each_output.to_a
1834
- inout = self.each_inout.to_a
1837
+ inputs = self.each_input.to_a
1838
+ outputs = self.each_output.to_a
1839
+ inout = self.each_inout.to_a
1835
1840
 
1836
- # Spelling necessary for simulation.
1837
- code = "`timescale 1ps/1ps\n\n"
1838
- # Output the module name.
1839
- code << "module #{name_to_verilog(self.name)}("
1841
+ # Spelling necessary for simulation.
1842
+ code = "`timescale 1ps/1ps\n\n"
1840
1843
 
1841
- # Output the last two to the input.
1842
- inputs[0..-2].each do |input|
1843
- code << " #{input.to_verilog},"
1844
- end
1845
- # When only input is used, it is necessary to close (), so it branches with if.
1846
- if outputs.empty? && inout.empty? then
1847
- # code << " #{inputs.last.to_verilog} ); \n" unless inputs.empty?
1848
- if (inputs.empty?)
1849
- code << " ); \n"
1850
- end
1851
- else
1852
- code << " #{inputs.last.to_verilog}," unless inputs.empty?
1853
- end
1844
+ vname = name_to_verilog(self.name)
1845
+ self.properties[:verilog_name] = vname
1846
+ # Output the module name.
1847
+ code << "module #{vname}("
1854
1848
 
1855
- # Output the last two to the output.
1856
- outputs[0..-2].each do |output|
1857
- code << " #{output.to_verilog},"
1858
- end
1859
- # When only input and output are used, it is necessary to close (), so it branches with if.
1860
- if inout.empty? then
1861
- code << " #{outputs.last.to_verilog} ); \n" unless outputs.empty?
1862
- else
1863
- code << " #{outputs.last.to_verilog}," unless outputs.empty?
1864
- end
1849
+ # Output the last two to the input.
1850
+ inputs[0..-2].each do |input|
1851
+ code << " #{input.to_verilog},"
1852
+ end
1853
+ # When only input is used, it is necessary to close (), so it branches with if.
1854
+ if outputs.empty? && inout.empty? then
1855
+ if (inputs.empty?)
1856
+ code << " ); \n"
1857
+ end
1858
+ else
1859
+ code << " #{inputs.last.to_verilog}," unless inputs.empty?
1860
+ end
1865
1861
 
1866
- # Output the last two to the inout.
1867
- inout[0..-2].each do |inout|
1868
- code << " #{inout.to_verilog},"
1869
- end
1870
- # There is no comma as it is the last one
1871
- code << " #{inout.last.to_verilog} ); \n" unless inout.empty?
1872
-
1873
- # Declare "input"
1874
- self.each_input do |input|
1875
- if input.type.respond_to? (:each_type) then
1876
- $vector_reg = "#{input.to_verilog}"
1877
- $vector_cnt = 0
1878
- input.type.each_type do |type|
1879
- code << "input #{type.to_verilog} #{$vector_reg}:#{$vector_cnt};\n"
1880
- $vector_cnt += 1
1881
- end
1862
+ # Output the last two to the output.
1863
+ outputs[0..-2].each do |output|
1864
+ code << " #{output.to_verilog},"
1865
+ end
1866
+ # When only input and output are used, it is necessary to close (), so it branches with if.
1867
+ if inout.empty? then
1868
+ code << " #{outputs.last.to_verilog} ); \n" unless outputs.empty?
1882
1869
  else
1883
- code << " input#{input.type.to_verilog} #{input.to_verilog};\n"
1870
+ code << " #{outputs.last.to_verilog}," unless outputs.empty?
1884
1871
  end
1885
- end
1886
1872
 
1887
- # Declare "output"
1888
- self.each_output do |output|
1889
- if output.type.respond_to? (:each_type) then
1890
- $vector_reg = "#{output.to_verilog}"
1891
- $vector_cnt = 0
1892
- output.type.each_type do |type|
1893
- if regs.include?(type.name) then
1873
+ # Output the last two to the inout.
1874
+ inout[0..-2].each do |inout|
1875
+ code << " #{inout.to_verilog},"
1876
+ end
1877
+ # There is no comma as it is the last one
1878
+ code << " #{inout.last.to_verilog} ); \n" unless inout.empty?
1879
+
1880
+ # Declare "input"
1881
+ self.each_input do |input|
1882
+ if input.type.respond_to? (:each_type) then
1883
+ $vector_reg = "#{input.to_verilog}"
1884
+ $vector_cnt = 0
1885
+ input.type.each_type do |type|
1886
+ code << "input #{type.to_verilog} #{$vector_reg}:#{$vector_cnt};\n"
1887
+ $vector_cnt += 1
1888
+ end
1889
+ else
1890
+ code << " input#{input.type.to_verilog} #{input.to_verilog};\n"
1891
+ end
1892
+ end
1893
+
1894
+ # Declare "output"
1895
+ self.each_output do |output|
1896
+ if output.type.respond_to? (:each_type) then
1897
+ $vector_reg = "#{output.to_verilog}"
1898
+ $vector_cnt = 0
1899
+ output.type.each_type do |type|
1900
+ # if regs.include?(type.name) then
1901
+ if HDLRuby::Low::VERILOG_REGS.include?(type.name) then
1902
+ code << " output reg"
1903
+ else
1904
+ code << " output"
1905
+ end
1906
+ code << "#{type.to_verilog} #{$vector_reg}:#{$vector_cnt}"
1907
+ if output.value then
1908
+ # There is an initial value.
1909
+ code << " = #{output.value.to_verilog}"
1910
+ end
1911
+ code << ";\n"
1912
+ $vector_cnt += 1
1913
+ end
1914
+ else
1915
+ if HDLRuby::Low::VERILOG_REGS.include?(output.to_verilog) then
1894
1916
  code << " output reg"
1895
1917
  else
1896
1918
  code << " output"
1897
1919
  end
1898
- # code << "#{type.to_verilog} #{$vector_reg}:#{$vector_cnt};\n"
1899
- code << "#{type.to_verilog} #{$vector_reg}:#{$vector_cnt}"
1920
+ code << "#{output.type.to_verilog} #{output.to_verilog}"
1900
1921
  if output.value then
1901
1922
  # There is an initial value.
1902
1923
  code << " = #{output.value.to_verilog}"
1903
1924
  end
1904
1925
  code << ";\n"
1905
- $vector_cnt += 1
1906
- end
1907
- else
1908
- # if regs.include?(output.name) then
1909
- if regs.include?(output.to_verilog) then
1910
- code << " output reg"
1911
- else
1912
- code << " output"
1913
- end
1914
- # code << "#{output.type.to_verilog} #{output.to_verilog};\n"
1915
- code << "#{output.type.to_verilog} #{output.to_verilog}"
1916
- if output.value then
1917
- # There is an initial value.
1918
- code << " = #{output.value.to_verilog}"
1919
1926
  end
1920
- code << ";\n"
1921
- end
1922
- end
1923
-
1924
- # Declare "inout"
1925
- self.each_inout do |inout|
1926
- if inout.type.respond_to? (:each_type) then
1927
- $vector_reg = "#{inout.to_verilog}"
1928
- $vector_cnt = 0
1929
- inout.type.each_type do |type|
1930
- code << "inout #{type.to_verilog} #{$vector_reg}:#{$vector_cnt};\n"
1931
- $vector_cnt += 1
1932
- end
1933
- else
1934
- code << " inout#{inout.type.to_verilog} #{inout.to_verilog};\n"
1935
- end
1936
- end
1937
-
1938
- # Declare "inner".
1939
- self.each_inner do |inner|
1940
- # if regs.include?(inner.name) then
1941
- if regs.include?(inner.to_verilog) then
1942
- code << " reg"
1943
- else
1944
- code << " wire"
1945
1927
  end
1946
1928
 
1947
- if inner.type.base?
1948
- if inner.type.base.base?
1949
- # code << "#{inner.type.base.to_verilog} #{inner.to_verilog} #{inner.type.to_verilog};\n"
1950
- code << "#{inner.type.base.to_verilog} #{inner.to_verilog} #{inner.type.to_verilog}"
1929
+ # Declare "inout"
1930
+ self.each_inout do |inout|
1931
+ if inout.type.respond_to? (:each_type) then
1932
+ $vector_reg = "#{inout.to_verilog}"
1933
+ $vector_cnt = 0
1934
+ inout.type.each_type do |type|
1935
+ code << "inout #{type.to_verilog} #{$vector_reg}:#{$vector_cnt};\n"
1936
+ $vector_cnt += 1
1937
+ end
1951
1938
  else
1952
- # code << "#{inner.type.to_verilog} #{inner.to_verilog};\n"
1953
- code << "#{inner.type.to_verilog} #{inner.to_verilog}"
1939
+ code << " inout#{inout.type.to_verilog} #{inout.to_verilog};\n"
1954
1940
  end
1955
- else
1956
- # code << " #{inner.type.to_verilog}#{inner.to_verilog};\n"
1957
- code << " #{inner.type.to_verilog}#{inner.to_verilog}"
1958
- end
1959
- if inner.value then
1960
- # There is an initial value.
1961
- code << " = #{inner.value.to_verilog}"
1962
1941
  end
1963
- code << ";\n"
1964
- end
1965
1942
 
1966
- # If there is scope in scope, translate it.
1967
- self.each_scope do |scope|
1968
- scope.each_inner do |inner|
1969
- # if regs.include?(inner.name) then
1970
- if regs.include?(inner.to_verilog) then
1971
- code << " reg "
1943
+ # Declare "inner".
1944
+ self.each_inner do |inner|
1945
+ if HDLRuby::Low::VERILOG_REGS.include?(inner.to_verilog) then
1946
+ code << " reg"
1972
1947
  else
1973
- code << " wire "
1948
+ code << " wire"
1974
1949
  end
1975
1950
 
1976
- if inner.type.respond_to? (:base)
1977
- if inner.type.base.base?
1978
- # code << "#{inner.type.base.to_verilog} #{inner.to_verilog} #{inner.type.to_verilog};\n"
1951
+ if inner.type.base?
1952
+ if inner.type.base.base?
1979
1953
  code << "#{inner.type.base.to_verilog} #{inner.to_verilog} #{inner.type.to_verilog}"
1980
1954
  else
1981
- # code << "#{inner.type.to_verilog} #{inner.to_verilog};\n"
1982
1955
  code << "#{inner.type.to_verilog} #{inner.to_verilog}"
1983
1956
  end
1984
1957
  else
1985
- # code << "inner #{inner.type.to_verilog} #{inner.to_verilog};\n"
1986
- code << "inner #{inner.type.to_verilog} #{inner.to_verilog}"
1958
+ code << " #{inner.type.to_verilog}#{inner.to_verilog}"
1987
1959
  end
1988
1960
  if inner.value then
1989
1961
  # There is an initial value.
1990
1962
  code << " = #{inner.value.to_verilog}"
1991
1963
  end
1992
1964
  code << ";\n"
1993
- end
1994
-
1995
- scope.each_connection do |connection|
1996
- code << "\n"
1997
- code << "#{connection.to_verilog}"
1998
1965
  end
1999
- end
2000
1966
 
2001
- code << "\n"
2002
-
2003
- # puts "For system=#{self.name}"
2004
- # transliation of the instantiation part.
2005
- # Generate the instances connections.
2006
- self.each_systemI do |systemI|
2007
- # puts "Processing systemI = #{systemI.name}"
2008
- # Its Declaration.
2009
- code << " " * 3
2010
- systemT = systemI.systemT
2011
- code << name_to_verilog(systemT.name) << " "
2012
- code << name_to_verilog(systemI.name) << "("
2013
- # Its ports connections
2014
- # Inputs
2015
- systemT.each_input do |input|
2016
- ref = self.extract_port_assign!(systemI,input)
2017
- if ref then
2018
- code << "." << name_to_verilog(input.name) << "("
2019
- code << ref.to_verilog
2020
- code << "),"
1967
+ # If there is scope in scope, translate it.
1968
+ self.each_scope do |scope|
1969
+ scope.each_inner do |inner|
1970
+ if HDLRuby::Low::VERILOG_REGS.include?(inner.to_verilog) then
1971
+ code << " reg "
1972
+ else
1973
+ code << " wire "
1974
+ end
1975
+
1976
+ if inner.type.respond_to? (:base)
1977
+ if inner.type.base.base?
1978
+ code << "#{inner.type.base.to_verilog} #{inner.to_verilog} #{inner.type.to_verilog}"
1979
+ else
1980
+ code << "#{inner.type.to_verilog} #{inner.to_verilog}"
1981
+ end
1982
+ else
1983
+ code << "inner #{inner.type.to_verilog} #{inner.to_verilog}"
1984
+ end
1985
+ if inner.value then
1986
+ # There is an initial value.
1987
+ code << " = #{inner.value.to_verilog}"
1988
+ end
1989
+ code << ";\n"
1990
+ end
1991
+
1992
+ scope.each_connection do |connection|
1993
+ code << "\n"
1994
+ code << "#{connection.to_verilog}"
2021
1995
  end
2022
1996
  end
2023
- # Outputs
2024
- systemT.each_output do |output|
2025
- ref = self.extract_port_assign!(systemI,output)
2026
- if ref then
2027
- code << "." << name_to_verilog(output.name) << "("
2028
- code << ref.to_verilog
2029
- code << "),"
1997
+
1998
+ code << "\n"
1999
+
2000
+ # puts "For system=#{self.name}"
2001
+ # transliation of the instantiation part.
2002
+ # Generate the instances connections.
2003
+ self.each_systemI do |systemI|
2004
+ # puts "Processing systemI = #{systemI.name}"
2005
+ # Its Declaration.
2006
+ code << " " * 3
2007
+ systemT = systemI.systemT
2008
+ code << name_to_verilog(systemT.name) << " "
2009
+ vname = name_to_verilog(systemI.name)
2010
+ systemI.properties[:verilog_name] = vname
2011
+ code << vname << "("
2012
+ # Its ports connections
2013
+ # Inputs
2014
+ systemT.each_input do |input|
2015
+ ref = self.extract_port_assign!(systemI,input)
2016
+ if ref then
2017
+ code << "." << name_to_verilog(input.name) << "("
2018
+ code << ref.to_verilog
2019
+ code << "),"
2020
+ end
2030
2021
  end
2031
- end
2032
- # Inouts
2033
- systemT.each_inout do |inout|
2034
- ref = self.extract_port_assign!(systemI,inout)
2035
- if ref then
2036
- code << "." << name_to_verilog(inout.name) << "("
2037
- code << ref.to_verilog
2038
- code << "),"
2022
+ # Outputs
2023
+ systemT.each_output do |output|
2024
+ ref = self.extract_port_assign!(systemI,output)
2025
+ if ref then
2026
+ code << "." << name_to_verilog(output.name) << "("
2027
+ code << ref.to_verilog
2028
+ code << "),"
2029
+ end
2030
+ end
2031
+ # Inouts
2032
+ systemT.each_inout do |inout|
2033
+ ref = self.extract_port_assign!(systemI,inout)
2034
+ if ref then
2035
+ code << "." << name_to_verilog(inout.name) << "("
2036
+ code << ref.to_verilog
2037
+ code << "),"
2038
+ end
2039
2039
  end
2040
+ # Remove the last "," for conforming with Verilog syntax.
2041
+ # and close the port connection.
2042
+ code[-1] = ");\n"
2040
2043
  end
2041
- # Remove the last "," for conforming with Verilog syntax.
2042
- # and close the port connection.
2043
- code[-1] = ");\n"
2044
- end
2045
2044
 
2046
2045
 
2047
2046
 
2048
- # translation of the connection part (assigen).
2049
- self.each_connection do |connection|
2050
- code << "#{connection.to_verilog}\n"
2051
- end
2047
+ # translation of the connection part (assigen).
2048
+ self.each_connection do |connection|
2049
+ code << "#{connection.to_verilog}\n"
2050
+ end
2052
2051
 
2053
- # Translation of behavior part (always).
2054
- self.each_behavior do |behavior|
2055
- if behavior.block.is_a?(TimeBlock) then
2056
- # Extract and translate the TimeRepeat separately.
2057
- behavior.each_block_deep do |blk|
2058
- code << blk.repeat_to_verilog!
2059
- end
2060
- # And generate an initial block.
2061
- code << " initial begin\n"
2062
- else
2063
- # Generate a standard process.
2064
- code << " always @( "
2065
- # If there is no "always" condition, it is always @("*").
2066
- if behavior.each_event.to_a.empty? then
2067
- code << "*"
2052
+ # Translation of behavior part (always).
2053
+ self.each_behavior do |behavior|
2054
+ if behavior.block.is_a?(TimeBlock) then
2055
+ # Extract and translate the TimeRepeat separately.
2056
+ behavior.each_block_deep do |blk|
2057
+ code << blk.repeat_to_verilog!
2058
+ end
2059
+ # And generate an initial block.
2060
+ code << " initial "
2068
2061
  else
2069
- event = behavior.each_event.to_a
2070
- event[0..-2].each do |event|
2071
- # If "posedge" or "negedge" does not exist, the variable is set to condition.
2072
- if (event.type.to_s != "posedge" && event.type.to_s != "negedge") then
2073
- code << "#{event.ref.to_verilog}, "
2062
+ # Generate a standard process.
2063
+ code << " always @( "
2064
+ # If there is no "always" condition, it is always @("*").
2065
+ if behavior.each_event.to_a.empty? then
2066
+ code << "*"
2067
+ else
2068
+ event = behavior.each_event.to_a
2069
+ event[0..-2].each do |event|
2070
+ # If "posedge" or "negedge" does not exist, the variable is set to condition.
2071
+ if (event.type.to_s != "posedge" && event.type.to_s != "negedge") then
2072
+ code << "#{event.ref.to_verilog}, "
2073
+ else
2074
+ # Otherwise, it outputs "psoedge" or "negedge" as a condition.
2075
+ code << "#{event.type.to_s} #{event.ref.to_verilog}, "
2076
+ end
2077
+ end
2078
+ # Since no comma is necessary at the end, we try not to separate commas separately at the end.
2079
+ if (event.last.type.to_s != "posedge" && event.last.type.to_s != "negedge") then
2080
+ code << "#{event.last.ref.to_verilog}"
2074
2081
  else
2075
- # Otherwise, it outputs "psoedge" or "negedge" as a condition.
2076
- code << "#{event.type.to_s} #{event.ref.to_verilog}, "
2082
+ code << "#{event.last.type.to_s} #{event.last.ref.to_verilog}"
2077
2083
  end
2078
2084
  end
2079
- # Since no comma is necessary at the end, we try not to separate commas separately at the end.
2080
- if (event.last.type.to_s != "posedge" && event.last.type.to_s != "negedge") then
2081
- code << "#{event.last.ref.to_verilog}"
2082
- else
2083
- code << "#{event.last.type.to_s} #{event.last.ref.to_verilog}"
2084
- end
2085
+ code << " ) "
2085
2086
  end
2086
- code << " ) begin\n"
2087
- end
2088
2087
 
2089
- # Perform "scheduling" using the method "flatten".
2090
- block = behavior.block.flatten(behavior.block.mode.to_s)
2091
-
2092
- # Declaration of "inner" part within "always".
2093
- block.each_inner do |inner|
2094
- # if regs.include?(inner.name) then
2095
- if regs.include?(inner.to_verilog) then
2096
- code << " reg"
2097
- else
2098
- code << " wire"
2099
- end
2088
+ code << behavior.block.to_verilog
2100
2089
 
2101
- # Variable has "base", but if there is width etc, it is not in "base".
2102
- # It is determined by an if.
2103
- if inner.type.base?
2104
- if inner.type.base.base?
2105
- # code << "#{inner.type.base.to_verilog} #{inner.to_verilog} #{inner.type.to_verilog};\n"
2106
- code << "#{inner.type.base.to_verilog} #{inner.to_verilog} #{inner.type.to_verilog}"
2107
- else
2108
- # code << "#{inner.type.to_verilog} #{inner.to_verilog};\n"
2109
- code << "#{inner.type.to_verilog} #{inner.to_verilog}"
2110
- end
2111
- else
2112
- # code << " #{inner.type.to_verilog}#{inner.to_verilog};\n"
2113
- code << " #{inner.type.to_verilog}#{inner.to_verilog}"
2114
- end
2115
- if inner.value then
2116
- # There is an initial value.
2117
- code << " = #{inner.value.to_verilog}"
2118
- end
2119
- code << ";\n"
2120
2090
  end
2121
2091
 
2122
- # Translate the block that finished scheduling.
2123
- block.each_statement do |statement|
2124
- code << "\n #{statement.to_verilog(behavior.block.mode.to_s)}"
2125
- end
2092
+ # Conclusion.
2093
+ code << "\nendmodule"
2094
+ return code
2095
+ end
2096
+ end
2126
2097
 
2127
- $fm.fm_par.clear()
2128
2098
 
2129
- code << "\n end\n\n"
2099
+ # Enhance StringE with generation of verilog code.
2100
+ class StringE
2101
+ # Converts the system to Verilog code.
2102
+ def to_verilog(spc = 3)
2103
+ code = "\"#{Low.v_string(self.content)}" +
2104
+ "#{self.each_arg.map do |arg|
2105
+ to.to_verilog
2106
+ end.join(",")}\""
2107
+ return code
2130
2108
  end
2131
-
2132
- # Conclusion.
2133
- code << "endmodule"
2134
- return code
2135
2109
  end
2136
- end
2137
2110
 
2138
2111
  end
2139
2112