HDLRuby 2.4.27 → 2.6.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/HDLRuby/drivers/xcd.rb +79 -0
- data/lib/HDLRuby/drivers/xcd/dummy.xcd +4 -0
- data/lib/HDLRuby/hdr_samples/adder.rb +1 -1
- data/lib/HDLRuby/hdr_samples/adder_bench.rb +1 -1
- data/lib/HDLRuby/hdr_samples/adder_gen.rb +1 -1
- data/lib/HDLRuby/hdr_samples/constant_in_function.rb +27 -0
- data/lib/HDLRuby/hdr_samples/dff_properties.rb +19 -0
- data/lib/HDLRuby/hdr_samples/dff_unit.rb +54 -0
- data/lib/HDLRuby/hdr_samples/huge_rom.rb +25 -0
- data/lib/HDLRuby/hdr_samples/logic_bench.rb +21 -0
- data/lib/HDLRuby/hdr_samples/mei8_bench.rb +1 -1
- data/lib/HDLRuby/hdr_samples/music.rb +79 -0
- data/lib/HDLRuby/hdr_samples/named_sub.rb +42 -0
- data/lib/HDLRuby/hdr_samples/rom.rb +16 -0
- data/lib/HDLRuby/hdr_samples/seqpar_bench.rb +59 -0
- data/lib/HDLRuby/hdr_samples/with_function_generator.rb +25 -0
- data/lib/HDLRuby/hdrcc.rb +140 -24
- data/lib/HDLRuby/hruby_decorator.rb +250 -0
- data/lib/HDLRuby/hruby_high.rb +468 -91
- data/lib/HDLRuby/hruby_low.rb +913 -45
- data/lib/HDLRuby/hruby_low2c.rb +189 -168
- data/lib/HDLRuby/hruby_low2hdr.rb +738 -0
- data/lib/HDLRuby/hruby_low2high.rb +331 -549
- data/lib/HDLRuby/hruby_low2vhd.rb +39 -2
- data/lib/HDLRuby/hruby_low_bool2select.rb +29 -0
- data/lib/HDLRuby/hruby_low_casts_without_expression.rb +27 -0
- data/lib/HDLRuby/hruby_low_fix_types.rb +25 -0
- data/lib/HDLRuby/hruby_low_mutable.rb +70 -0
- data/lib/HDLRuby/hruby_low_resolve.rb +28 -0
- data/lib/HDLRuby/hruby_low_without_connection.rb +6 -3
- data/lib/HDLRuby/hruby_low_without_namespace.rb +7 -4
- data/lib/HDLRuby/hruby_low_without_parinseq.rb +151 -0
- data/lib/HDLRuby/hruby_low_without_select.rb +13 -0
- data/lib/HDLRuby/hruby_tools.rb +11 -1
- data/lib/HDLRuby/hruby_verilog.rb +1602 -1629
- data/lib/HDLRuby/sim/hruby_sim.h +25 -2
- data/lib/HDLRuby/sim/hruby_sim_calc.c +63 -6
- data/lib/HDLRuby/sim/hruby_sim_vcd.c +5 -1
- data/lib/HDLRuby/sim/hruby_sim_vizualize.c +22 -6
- data/lib/HDLRuby/std/fixpoint.rb +9 -0
- data/lib/HDLRuby/std/function_generator.rb +139 -0
- data/lib/HDLRuby/std/hruby_unit.rb +75 -0
- data/lib/HDLRuby/template_expander.rb +61 -0
- data/lib/HDLRuby/version.rb +1 -1
- metadata +22 -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)
|
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)
|
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.
|
@@ -0,0 +1,151 @@
|
|
1
|
+
require 'HDLRuby'
|
2
|
+
require 'HDLRuby/hruby_tools'
|
3
|
+
require 'HDLRuby/hruby_low_mutable'
|
4
|
+
|
5
|
+
|
6
|
+
module HDLRuby::Low
|
7
|
+
|
8
|
+
|
9
|
+
##
|
10
|
+
# Converts par blocks within seq blocks to seq blocks.
|
11
|
+
# For matching the executing model of Verilog.
|
12
|
+
#
|
13
|
+
########################################################################
|
14
|
+
|
15
|
+
|
16
|
+
## Extends the SystemT class with functionality for converting par blocks
|
17
|
+
# within seq blocks to seq blocks.
|
18
|
+
class SystemT
|
19
|
+
|
20
|
+
# Converts par blocks within seq blocks to seq blocks.
|
21
|
+
def par_in_seq2seq!
|
22
|
+
self.scope.par_in_seq2seq!
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
## Extends the Scope class with functionality for breaking assingments
|
27
|
+
# to concats.
|
28
|
+
class Scope
|
29
|
+
# Converts par blocks within seq blocks to seq blocks.
|
30
|
+
def par_in_seq2seq!
|
31
|
+
# Recruse on the sub scopes.
|
32
|
+
self.each_scope(&:par_in_seq2seq!)
|
33
|
+
# Recurse on the block.
|
34
|
+
self.each_behavior do |behavior|
|
35
|
+
behavior.block.par_in_seq2seq!
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
## Extends the Statement class with functionality for breaking assingments
|
42
|
+
# to concats.
|
43
|
+
class Statement
|
44
|
+
# Converts par blocks within seq blocks to seq blocks.
|
45
|
+
def par_in_seq2seq!
|
46
|
+
# By default nothing to do.
|
47
|
+
return self
|
48
|
+
end
|
49
|
+
|
50
|
+
# Convert the block to seq.
|
51
|
+
def to_seq!
|
52
|
+
# By default nothing to do.
|
53
|
+
return self
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
## Extends the If class with functionality for breaking assingments
|
59
|
+
# to concats.
|
60
|
+
class If
|
61
|
+
# Converts par blocks within seq blocks to seq blocks.
|
62
|
+
def par_in_seq2seq!
|
63
|
+
self.yes.par_in_seq2seq!
|
64
|
+
self.each_noif do |cond,blk|
|
65
|
+
blk.par_in_seq2seq!
|
66
|
+
end
|
67
|
+
self.no.par_in_seq2seq! if self.no
|
68
|
+
end
|
69
|
+
|
70
|
+
# Convert the block to seq.
|
71
|
+
def to_seq!
|
72
|
+
self.to_seq!
|
73
|
+
self.each_noif do |cond,blk|
|
74
|
+
blk.to_seq!
|
75
|
+
end
|
76
|
+
self.no.to_seq! if self.no
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
|
81
|
+
## Extends the Case class with functionality for breaking assingments
|
82
|
+
# to concats.
|
83
|
+
class Case
|
84
|
+
# Converts par blocks within seq blocks to seq blocks.
|
85
|
+
def par_in_seq2seq!
|
86
|
+
self.each_when do |w|
|
87
|
+
w.statement.par_in_seq2seq!
|
88
|
+
end
|
89
|
+
self.default.par_in_seq2seq! if self.default
|
90
|
+
end
|
91
|
+
|
92
|
+
# Convert the block to seq.
|
93
|
+
def to_seq!
|
94
|
+
self.each_when do |w|
|
95
|
+
w.statement.to_seq!
|
96
|
+
end
|
97
|
+
self.default.to_seq! if self.default
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
## Extends the Block class with functionality for breaking assingments
|
103
|
+
# to concats.
|
104
|
+
class Block
|
105
|
+
# Converts par blocks within seq blocks to seq blocks.
|
106
|
+
def par_in_seq2seq!
|
107
|
+
# Recurse on the sub blocks.
|
108
|
+
self.each_statement(&:par_in_seq2seq!)
|
109
|
+
# Is the current block a seq block?
|
110
|
+
if self.mode == :seq then
|
111
|
+
# Yes, convert its inner par blocks to seq blocks.
|
112
|
+
self.each_statement do |statement|
|
113
|
+
if (statement.is_a?(Block)) then
|
114
|
+
statement.to_seq! if statement.mode == :par
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
return self
|
119
|
+
end
|
120
|
+
|
121
|
+
# Convert the block to seq.
|
122
|
+
def to_seq!
|
123
|
+
if self.mode == :par then
|
124
|
+
# Need to convert.
|
125
|
+
# First recurse on the sub blocks.
|
126
|
+
self.each_statement(&:to_seq!)
|
127
|
+
# Now replace each left value by a new signal for
|
128
|
+
# differed assingment in seq.
|
129
|
+
differeds = []
|
130
|
+
self.each_statement do |statement|
|
131
|
+
left = statement.left
|
132
|
+
if statement.is_a?(Transmit) then
|
133
|
+
sig = SignalI.new(HDLRuby.uniq_name,left.type)
|
134
|
+
self.add_inner(sig)
|
135
|
+
diff = RefName.new(left.type,RefThis.new,sig.name)
|
136
|
+
differeds << [left,diff]
|
137
|
+
statement.set_left!(diff)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
# Adds the differed assignments.
|
141
|
+
differeds.each do |left,diff|
|
142
|
+
self.add_statement(Transmit.new(left.clone,diff.clone))
|
143
|
+
end
|
144
|
+
# Change the mode.
|
145
|
+
self.set_mode!(:seq)
|
146
|
+
end
|
147
|
+
return self
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
end
|