HDLRuby 2.4.29 → 2.6.4

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