HDLRuby 2.0.8
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.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.travis.yml +5 -0
- data/.yardopts +1 -0
- data/Gemfile +4 -0
- data/HDLRuby.gemspec +36 -0
- data/LICENSE.txt +21 -0
- data/README.md +2774 -0
- data/README.pdf +0 -0
- data/Rakefile +10 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/exe/hdrcc +3 -0
- data/lib/HDLRuby/alcc.rb +137 -0
- data/lib/HDLRuby/backend/hruby_allocator.rb +69 -0
- data/lib/HDLRuby/backend/hruby_c_allocator.rb +76 -0
- data/lib/HDLRuby/hdr_samples/adder.rb +7 -0
- data/lib/HDLRuby/hdr_samples/adder_assign_error.rb +11 -0
- data/lib/HDLRuby/hdr_samples/adder_bench.rb +27 -0
- data/lib/HDLRuby/hdr_samples/adder_gen.rb +7 -0
- data/lib/HDLRuby/hdr_samples/adder_nodef_error.rb +7 -0
- data/lib/HDLRuby/hdr_samples/addsub.rb +19 -0
- data/lib/HDLRuby/hdr_samples/addsubz.rb +22 -0
- data/lib/HDLRuby/hdr_samples/alu.rb +47 -0
- data/lib/HDLRuby/hdr_samples/calculator.rb +48 -0
- data/lib/HDLRuby/hdr_samples/counter_bench.rb +83 -0
- data/lib/HDLRuby/hdr_samples/dff.rb +9 -0
- data/lib/HDLRuby/hdr_samples/dff_bench.rb +66 -0
- data/lib/HDLRuby/hdr_samples/dff_counter.rb +20 -0
- data/lib/HDLRuby/hdr_samples/include.rb +14 -0
- data/lib/HDLRuby/hdr_samples/instance_open.rb +23 -0
- data/lib/HDLRuby/hdr_samples/mei8.rb +256 -0
- data/lib/HDLRuby/hdr_samples/mei8_bench.rb +309 -0
- data/lib/HDLRuby/hdr_samples/multer_gen.rb +8 -0
- data/lib/HDLRuby/hdr_samples/multer_seq.rb +29 -0
- data/lib/HDLRuby/hdr_samples/neural/a.rb +9 -0
- data/lib/HDLRuby/hdr_samples/neural/a_sub.rb +5 -0
- data/lib/HDLRuby/hdr_samples/neural/bw.rb +23 -0
- data/lib/HDLRuby/hdr_samples/neural/counter.rb +16 -0
- data/lib/HDLRuby/hdr_samples/neural/dadz.rb +9 -0
- data/lib/HDLRuby/hdr_samples/neural/dadz_sub.rb +4 -0
- data/lib/HDLRuby/hdr_samples/neural/forward.rb +153 -0
- data/lib/HDLRuby/hdr_samples/neural/forward_sub.rb +62 -0
- data/lib/HDLRuby/hdr_samples/neural/forward_sub_rand.rb +41 -0
- data/lib/HDLRuby/hdr_samples/neural/forward_sub_rand_typedef.rb +47 -0
- data/lib/HDLRuby/hdr_samples/neural/mem.rb +30 -0
- data/lib/HDLRuby/hdr_samples/neural/random.rb +23 -0
- data/lib/HDLRuby/hdr_samples/neural/selector.rb +29 -0
- data/lib/HDLRuby/hdr_samples/neural/sigmoid.rb +20 -0
- data/lib/HDLRuby/hdr_samples/neural/z.rb +33 -0
- data/lib/HDLRuby/hdr_samples/prog.obj +256 -0
- data/lib/HDLRuby/hdr_samples/ram.rb +18 -0
- data/lib/HDLRuby/hdr_samples/register_with_code_bench.rb +98 -0
- data/lib/HDLRuby/hdr_samples/rom.rb +10 -0
- data/lib/HDLRuby/hdr_samples/struct.rb +14 -0
- data/lib/HDLRuby/hdr_samples/sumprod.rb +29 -0
- data/lib/HDLRuby/hdr_samples/sw_encrypt_bench.rb +103 -0
- data/lib/HDLRuby/hdr_samples/sw_encrypt_cpu_bench.rb +261 -0
- data/lib/HDLRuby/hdr_samples/sw_encrypt_cpusim_bench.rb +302 -0
- data/lib/HDLRuby/hdr_samples/system_open.rb +11 -0
- data/lib/HDLRuby/hdr_samples/tuple.rb +16 -0
- data/lib/HDLRuby/hdr_samples/with_channel.rb +118 -0
- data/lib/HDLRuby/hdr_samples/with_class.rb +199 -0
- data/lib/HDLRuby/hdr_samples/with_decoder.rb +17 -0
- data/lib/HDLRuby/hdr_samples/with_fsm.rb +34 -0
- data/lib/HDLRuby/hdr_samples/with_reconf.rb +103 -0
- data/lib/HDLRuby/hdrcc.rb +623 -0
- data/lib/HDLRuby/high_samples/_adder_fault.rb +23 -0
- data/lib/HDLRuby/high_samples/_generic_transmission2.rb +146 -0
- data/lib/HDLRuby/high_samples/adder.rb +21 -0
- data/lib/HDLRuby/high_samples/adder_common_errors.rb +25 -0
- data/lib/HDLRuby/high_samples/addsub.rb +33 -0
- data/lib/HDLRuby/high_samples/addsubz.rb +37 -0
- data/lib/HDLRuby/high_samples/after.rb +28 -0
- data/lib/HDLRuby/high_samples/all_signals.rb +29 -0
- data/lib/HDLRuby/high_samples/alu.rb +61 -0
- data/lib/HDLRuby/high_samples/anonymous.rb +41 -0
- data/lib/HDLRuby/high_samples/before.rb +28 -0
- data/lib/HDLRuby/high_samples/blockblock.rb +26 -0
- data/lib/HDLRuby/high_samples/bugs/dadz.rb +22 -0
- data/lib/HDLRuby/high_samples/bugs/misample_instan.rb +20 -0
- data/lib/HDLRuby/high_samples/bugs/misample_updown.rb +22 -0
- data/lib/HDLRuby/high_samples/bugs/sample_add.rb +16 -0
- data/lib/HDLRuby/high_samples/bugs/sample_barrel.rb +13 -0
- data/lib/HDLRuby/high_samples/bugs/sample_daice.rb +57 -0
- data/lib/HDLRuby/high_samples/bugs/sample_kumiawase.rb +52 -0
- data/lib/HDLRuby/high_samples/bugs/sample_multi.rb +18 -0
- data/lib/HDLRuby/high_samples/bugs/sample_sub.rb +14 -0
- data/lib/HDLRuby/high_samples/bugs/z2.rb +32 -0
- data/lib/HDLRuby/high_samples/case.rb +32 -0
- data/lib/HDLRuby/high_samples/case2.rb +30 -0
- data/lib/HDLRuby/high_samples/change.rb +23 -0
- data/lib/HDLRuby/high_samples/clocks.rb +35 -0
- data/lib/HDLRuby/high_samples/comparer.rb +21 -0
- data/lib/HDLRuby/high_samples/conditionals.rb +29 -0
- data/lib/HDLRuby/high_samples/dff.rb +23 -0
- data/lib/HDLRuby/high_samples/each.rb +28 -0
- data/lib/HDLRuby/high_samples/exporter.rb +42 -0
- data/lib/HDLRuby/high_samples/functions.rb +60 -0
- data/lib/HDLRuby/high_samples/if_seq.rb +26 -0
- data/lib/HDLRuby/high_samples/inherit_as_dff.rb +32 -0
- data/lib/HDLRuby/high_samples/inherit_dff.rb +36 -0
- data/lib/HDLRuby/high_samples/instance.rb +37 -0
- data/lib/HDLRuby/high_samples/memory.rb +64 -0
- data/lib/HDLRuby/high_samples/multi_file.rb +27 -0
- data/lib/HDLRuby/high_samples/overload.rb +32 -0
- data/lib/HDLRuby/high_samples/paper_after.rb +49 -0
- data/lib/HDLRuby/high_samples/ram.rb +27 -0
- data/lib/HDLRuby/high_samples/registers.rb +139 -0
- data/lib/HDLRuby/high_samples/rom.rb +23 -0
- data/lib/HDLRuby/high_samples/scopeblockname.rb +37 -0
- data/lib/HDLRuby/high_samples/scopescope.rb +26 -0
- data/lib/HDLRuby/high_samples/shift.rb +31 -0
- data/lib/HDLRuby/high_samples/shift2.rb +40 -0
- data/lib/HDLRuby/high_samples/simple_instance.rb +31 -0
- data/lib/HDLRuby/high_samples/test_all.sh +10 -0
- data/lib/HDLRuby/high_samples/typedef.rb +24 -0
- data/lib/HDLRuby/high_samples/values.rb +70 -0
- data/lib/HDLRuby/high_samples/vector.rb +22 -0
- data/lib/HDLRuby/high_samples/with_decoder.rb +30 -0
- data/lib/HDLRuby/high_samples/with_fsm.rb +46 -0
- data/lib/HDLRuby/high_samples/with_pipe.rb +43 -0
- data/lib/HDLRuby/high_samples/with_seq.rb +25 -0
- data/lib/HDLRuby/hruby_bstr.rb +1085 -0
- data/lib/HDLRuby/hruby_check.rb +317 -0
- data/lib/HDLRuby/hruby_db.rb +432 -0
- data/lib/HDLRuby/hruby_error.rb +44 -0
- data/lib/HDLRuby/hruby_high.rb +4103 -0
- data/lib/HDLRuby/hruby_low.rb +4735 -0
- data/lib/HDLRuby/hruby_low2c.rb +1986 -0
- data/lib/HDLRuby/hruby_low2high.rb +738 -0
- data/lib/HDLRuby/hruby_low2seq.rb +248 -0
- data/lib/HDLRuby/hruby_low2sym.rb +126 -0
- data/lib/HDLRuby/hruby_low2vhd.rb +1437 -0
- data/lib/HDLRuby/hruby_low_bool2select.rb +295 -0
- data/lib/HDLRuby/hruby_low_cleanup.rb +193 -0
- data/lib/HDLRuby/hruby_low_fix_types.rb +437 -0
- data/lib/HDLRuby/hruby_low_mutable.rb +1803 -0
- data/lib/HDLRuby/hruby_low_resolve.rb +165 -0
- data/lib/HDLRuby/hruby_low_skeleton.rb +129 -0
- data/lib/HDLRuby/hruby_low_with_bool.rb +141 -0
- data/lib/HDLRuby/hruby_low_with_port.rb +167 -0
- data/lib/HDLRuby/hruby_low_with_var.rb +302 -0
- data/lib/HDLRuby/hruby_low_without_bit2vector.rb +88 -0
- data/lib/HDLRuby/hruby_low_without_concat.rb +162 -0
- data/lib/HDLRuby/hruby_low_without_connection.rb +113 -0
- data/lib/HDLRuby/hruby_low_without_namespace.rb +718 -0
- data/lib/HDLRuby/hruby_low_without_outread.rb +107 -0
- data/lib/HDLRuby/hruby_low_without_select.rb +206 -0
- data/lib/HDLRuby/hruby_serializer.rb +398 -0
- data/lib/HDLRuby/hruby_tools.rb +37 -0
- data/lib/HDLRuby/hruby_types.rb +239 -0
- data/lib/HDLRuby/hruby_values.rb +64 -0
- data/lib/HDLRuby/hruby_verilog.rb +1888 -0
- data/lib/HDLRuby/hruby_verilog_name.rb +52 -0
- data/lib/HDLRuby/low_samples/adder.yaml +97 -0
- data/lib/HDLRuby/low_samples/after.yaml +228 -0
- data/lib/HDLRuby/low_samples/before.yaml +223 -0
- data/lib/HDLRuby/low_samples/blockblock.yaml +48 -0
- data/lib/HDLRuby/low_samples/bugs/sample_add.yaml +97 -0
- data/lib/HDLRuby/low_samples/bugs/sample_daice.yaml +444 -0
- data/lib/HDLRuby/low_samples/bugs/sample_kumiawase.yaml +332 -0
- data/lib/HDLRuby/low_samples/bugs/sample_sub.yaml +97 -0
- data/lib/HDLRuby/low_samples/bugs/seqpar.yaml +184 -0
- data/lib/HDLRuby/low_samples/case.yaml +327 -0
- data/lib/HDLRuby/low_samples/change.yaml +135 -0
- data/lib/HDLRuby/low_samples/clocks.yaml +674 -0
- data/lib/HDLRuby/low_samples/cloner.rb +22 -0
- data/lib/HDLRuby/low_samples/comparer.yaml +85 -0
- data/lib/HDLRuby/low_samples/conditionals.yaml +133 -0
- data/lib/HDLRuby/low_samples/dff.yaml +107 -0
- data/lib/HDLRuby/low_samples/each.yaml +1328 -0
- data/lib/HDLRuby/low_samples/exporter.yaml +226 -0
- data/lib/HDLRuby/low_samples/functions.yaml +298 -0
- data/lib/HDLRuby/low_samples/generic_transmission.yaml +597 -0
- data/lib/HDLRuby/low_samples/inherit_as_dff.yaml +125 -0
- data/lib/HDLRuby/low_samples/inherit_dff.yaml +107 -0
- data/lib/HDLRuby/low_samples/load_yaml.rb +11 -0
- data/lib/HDLRuby/low_samples/memory.yaml +678 -0
- data/lib/HDLRuby/low_samples/namespace_extractor.rb +23 -0
- data/lib/HDLRuby/low_samples/overload.yaml +226 -0
- data/lib/HDLRuby/low_samples/paper_after.yaml +431 -0
- data/lib/HDLRuby/low_samples/port_maker.rb +14 -0
- data/lib/HDLRuby/low_samples/ram.yaml +207 -0
- data/lib/HDLRuby/low_samples/registers.yaml +228 -0
- data/lib/HDLRuby/low_samples/rom.yaml +2950 -0
- data/lib/HDLRuby/low_samples/shift.yaml +230 -0
- data/lib/HDLRuby/low_samples/shift2.yaml +2095 -0
- data/lib/HDLRuby/low_samples/simple_instance.yaml +102 -0
- data/lib/HDLRuby/low_samples/test_all.sh +43 -0
- data/lib/HDLRuby/low_samples/typedef.yaml +115 -0
- data/lib/HDLRuby/low_samples/values.yaml +577 -0
- data/lib/HDLRuby/low_samples/variable_maker.rb +14 -0
- data/lib/HDLRuby/low_samples/vector.yaml +56 -0
- data/lib/HDLRuby/low_samples/with_seq.yaml +188 -0
- data/lib/HDLRuby/low_samples/yaml2hdr.rb +10 -0
- data/lib/HDLRuby/low_samples/yaml2vhd.rb +19 -0
- data/lib/HDLRuby/sim/Makefile +19 -0
- data/lib/HDLRuby/sim/hruby_sim.h +590 -0
- data/lib/HDLRuby/sim/hruby_sim_calc.c +2362 -0
- data/lib/HDLRuby/sim/hruby_sim_core.c +589 -0
- data/lib/HDLRuby/sim/hruby_sim_list.c +93 -0
- data/lib/HDLRuby/sim/hruby_sim_vizualize.c +91 -0
- data/lib/HDLRuby/sim/hruby_value_pool.c +64 -0
- data/lib/HDLRuby/std/channel.rb +354 -0
- data/lib/HDLRuby/std/clocks.rb +165 -0
- data/lib/HDLRuby/std/counters.rb +82 -0
- data/lib/HDLRuby/std/decoder.rb +214 -0
- data/lib/HDLRuby/std/fsm.rb +516 -0
- data/lib/HDLRuby/std/pipeline.rb +220 -0
- data/lib/HDLRuby/std/reconf.rb +309 -0
- data/lib/HDLRuby/test_hruby_bstr.rb +2259 -0
- data/lib/HDLRuby/test_hruby_high.rb +594 -0
- data/lib/HDLRuby/test_hruby_high_low.rb +99 -0
- data/lib/HDLRuby/test_hruby_low.rb +934 -0
- data/lib/HDLRuby/v_samples/adder.v +10 -0
- data/lib/HDLRuby/v_samples/dff.v +12 -0
- data/lib/HDLRuby/v_samples/ram.v +20 -0
- data/lib/HDLRuby/v_samples/rom.v +270 -0
- data/lib/HDLRuby/version.rb +3 -0
- data/lib/HDLRuby.rb +11 -0
- data/makedoc +1 -0
- data/metadata.yaml +4 -0
- metadata +299 -0
|
@@ -0,0 +1,248 @@
|
|
|
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 to seq blocks.
|
|
11
|
+
# Also provides detection of mixed par and seq blocks.
|
|
12
|
+
#
|
|
13
|
+
########################################################################
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
## Extends the SystemT class with functionality for converting par block
|
|
17
|
+
# to seq.
|
|
18
|
+
class SystemT
|
|
19
|
+
|
|
20
|
+
# Converts the par sub blocks to seq.
|
|
21
|
+
def blocks2seq!
|
|
22
|
+
# Recurse on the scope.
|
|
23
|
+
self.scope.to_seq!
|
|
24
|
+
return self
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Converts the par sub blocks to seq if they are not full par.
|
|
28
|
+
def mixblocks2seq!
|
|
29
|
+
# Recurse on the scope.
|
|
30
|
+
self.scope.mixblocks2seq!
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
## Extends the Scope class with functionality for converting par block
|
|
36
|
+
# to seq.
|
|
37
|
+
|
|
38
|
+
class Scope
|
|
39
|
+
|
|
40
|
+
# Converts the par sub blocks to seq.
|
|
41
|
+
def blocks2seq!
|
|
42
|
+
# Recurse on the behaviors.
|
|
43
|
+
self.each_behavior { |beh| beh.blocks2seq! }
|
|
44
|
+
return self
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Converts the par sub blocks to seq if they are not full par.
|
|
48
|
+
def mixblocks2seq!
|
|
49
|
+
# Recurse on the behaviors.
|
|
50
|
+
self.each_behavior { |beh| beh.mixblocs2seq! }
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
## Extends the Behavior class with functionality for converting par block
|
|
57
|
+
# to seq.
|
|
58
|
+
|
|
59
|
+
class Behavior
|
|
60
|
+
|
|
61
|
+
# Converts the par sub blocks to seq.
|
|
62
|
+
def blocks2seq!
|
|
63
|
+
# Converts the block to seq.
|
|
64
|
+
self.block.to_seq!
|
|
65
|
+
return self
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Converts the par sub blocks to seq if they are not full par.
|
|
69
|
+
def mixblocks2seq!
|
|
70
|
+
# Is the block mix?
|
|
71
|
+
return unless block.mix?
|
|
72
|
+
# Mixed, do convert.
|
|
73
|
+
# Converts the block to seq.
|
|
74
|
+
self.block.to_seq!
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
## Extends the Statement class with functionality for converting par block
|
|
80
|
+
# to seq.
|
|
81
|
+
class Statement
|
|
82
|
+
|
|
83
|
+
# Converts the par sub blocks to seq.
|
|
84
|
+
def blocks2seq!
|
|
85
|
+
# By default, nothing to do.
|
|
86
|
+
return self
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Tell if there is a mix block.
|
|
90
|
+
# +mode+ is the mode of the upper block.
|
|
91
|
+
def mix?(mode = nil)
|
|
92
|
+
# By default, no mix block.
|
|
93
|
+
return false
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
## Extends the If class with functionality for converting par block
|
|
98
|
+
# to seq.
|
|
99
|
+
class If
|
|
100
|
+
|
|
101
|
+
# Converts the par sub blocks to seq.
|
|
102
|
+
def blocks2seq!
|
|
103
|
+
# Convert each sub block.
|
|
104
|
+
# If block.
|
|
105
|
+
self.yes.blocks2seq!
|
|
106
|
+
# Elsif blocks
|
|
107
|
+
self.each_noif do |cond, stmnt|
|
|
108
|
+
stmnt.blocks2seq!
|
|
109
|
+
end
|
|
110
|
+
# Else block if any.
|
|
111
|
+
self.no.blocks2seq! if self.no
|
|
112
|
+
return self
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# Tell if there is a mix block.
|
|
116
|
+
# +mode+ is the mode of the upper block.
|
|
117
|
+
def mix?(mode = nil)
|
|
118
|
+
# Check each sub block.
|
|
119
|
+
# If block.
|
|
120
|
+
return true if self.yes.mix?(mode)
|
|
121
|
+
# Elsif blocks
|
|
122
|
+
self.each_noif do |cond, stmnt|
|
|
123
|
+
return true if stmnt.mix?(mode)
|
|
124
|
+
end
|
|
125
|
+
# Else block if any.
|
|
126
|
+
true if self.no && self.no.mix?(mode)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
## Extends the When class with functionality for converting par block
|
|
132
|
+
# to seq.
|
|
133
|
+
class When
|
|
134
|
+
# Converts the par sub blocks to seq.
|
|
135
|
+
def blocks2seq!
|
|
136
|
+
# Convert the statement.
|
|
137
|
+
self.statement.blocks2seq!
|
|
138
|
+
return self
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
# Tell if there is a mix block.
|
|
142
|
+
# +mode+ is the mode of the upper block.
|
|
143
|
+
def mix?(mode = nil)
|
|
144
|
+
# Check the statement.
|
|
145
|
+
return statement.mix?(mode)
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
## Extends the When class with functionality for converting par block
|
|
151
|
+
# to seq.
|
|
152
|
+
class Case
|
|
153
|
+
# Converts the par sub blocks to seq.
|
|
154
|
+
def blocks2seq!
|
|
155
|
+
# Recurse on the whens.
|
|
156
|
+
self.each_when(&:blocks2seq!)
|
|
157
|
+
# Converts the default if any.
|
|
158
|
+
self.default.blocks2seq! if self.default
|
|
159
|
+
return self
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
# Tell if there is a mix block.
|
|
163
|
+
# +mode+ is the mode of the upper block.
|
|
164
|
+
def mix?(mode = nil)
|
|
165
|
+
# Recuse on the whens.
|
|
166
|
+
return true if self.each_when.any? { |w| w.mix?(mode) }
|
|
167
|
+
# Check the default if any.
|
|
168
|
+
return self.default.mix?(mode)
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
## Extends the TimeRepeat class with functionality for converting par block
|
|
174
|
+
# to seq.
|
|
175
|
+
class TimeRepeat
|
|
176
|
+
|
|
177
|
+
# Converts the par sub blocks to seq.
|
|
178
|
+
def blocks2seq!
|
|
179
|
+
# Converts the statement.
|
|
180
|
+
self.statement.blocks2seq!
|
|
181
|
+
return self
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
# Tell if there is a mix block.
|
|
185
|
+
# +mode+ is the mode of the upper block.
|
|
186
|
+
def mix?(mode = nil)
|
|
187
|
+
# Check the statement.
|
|
188
|
+
return self.statement.mix?(mode)
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
## Extends the Block class with functionality for converting par block
|
|
194
|
+
# to seq.
|
|
195
|
+
class Block
|
|
196
|
+
|
|
197
|
+
# Converts the par sub blocks to seq.
|
|
198
|
+
def blocks2seq!
|
|
199
|
+
# First recurse on each statement.
|
|
200
|
+
self.each_statement { |stmnt| stmnt.blocks2seq! }
|
|
201
|
+
# If the block is already seq, nothing more to do.
|
|
202
|
+
return self if self.mode == :seq
|
|
203
|
+
# IF the block contains one or less transmit statement,
|
|
204
|
+
# simply change its mode.
|
|
205
|
+
if self.each_statement.count { |stmnt| stmnt.is_a?(Transmit) } <= 1
|
|
206
|
+
self.set_mode!(:par)
|
|
207
|
+
return self
|
|
208
|
+
end
|
|
209
|
+
# Gather the left values of the assignments.
|
|
210
|
+
lvalues = self.each_statement.select do |stmnt|
|
|
211
|
+
stmnt.is_a?(Transmit)
|
|
212
|
+
end.map { |trans| trans.left }
|
|
213
|
+
# Gather the right values inside the whole block.
|
|
214
|
+
rvalues = self.each_node_deep.select do |node|
|
|
215
|
+
node.is_a?(Expression) and node.rightvalue?
|
|
216
|
+
end
|
|
217
|
+
# Keep the left value that are reused.
|
|
218
|
+
lvalues = lvalues & rvalues
|
|
219
|
+
# Create new inner variable for replacing them.
|
|
220
|
+
nvalues = []
|
|
221
|
+
lvalues.each do |lvalue|
|
|
222
|
+
# Create the replacing variable.
|
|
223
|
+
nvalues << nvalue = self.add_inner(
|
|
224
|
+
SignalI.new(HDLRuby.uniq_name,lvalue.type))
|
|
225
|
+
# Replace it.
|
|
226
|
+
ref = RefName.new(lvalue.type, RefThis.new, nvalues[-1].name)
|
|
227
|
+
lvalue.parent.set_left!(ref)
|
|
228
|
+
# And reassign it at the end of the block.
|
|
229
|
+
lvalue.parent = nil
|
|
230
|
+
assign = Transmit.new(lvalue,ref.clone)
|
|
231
|
+
self.add_statement(assign)
|
|
232
|
+
end
|
|
233
|
+
return self
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
# Tell if there is a mix block.
|
|
237
|
+
# +mode+ is the mode of the upper block.
|
|
238
|
+
def mix?(mode = nil)
|
|
239
|
+
# Check if different from mode block if any.
|
|
240
|
+
return true if mode && self.type != mode
|
|
241
|
+
# No difference with the upper block, maybe there is one within.
|
|
242
|
+
# Check each statement.
|
|
243
|
+
self.each_statement.any? { |stmt| stmnt.mix?(mode) }
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
end
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
require 'HDLRuby'
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
module HDLRuby
|
|
5
|
+
|
|
6
|
+
# The new field symbol_equiv is not to be dumped.
|
|
7
|
+
FIELDS_TO_EXCLUDE.default << :@_symbol_equiv
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
module HDLRuby::Low
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
##
|
|
14
|
+
# Converts a HDLRuby::Low description to a uniq symbol and vice versa.
|
|
15
|
+
#
|
|
16
|
+
########################################################################
|
|
17
|
+
|
|
18
|
+
##
|
|
19
|
+
# Module adding the conversion to symbol feature to HDLRuby objects.
|
|
20
|
+
module Low2Symbol
|
|
21
|
+
|
|
22
|
+
# The correspondance tables between HDLRuby objects and symbols.
|
|
23
|
+
Low2SymbolTable = {}
|
|
24
|
+
Symbol2LowTable = {}
|
|
25
|
+
|
|
26
|
+
# The prefix used when building symbols.
|
|
27
|
+
Low2SymbolPrefix = "`"
|
|
28
|
+
|
|
29
|
+
# Converts to a symbol.
|
|
30
|
+
def to_sym
|
|
31
|
+
# Get the associated symbol if any.
|
|
32
|
+
@_symbol_equiv ||= Low2SymbolTable[self]
|
|
33
|
+
unless @_symbol_equiv then
|
|
34
|
+
# No symbol yet, create it.
|
|
35
|
+
@_symbol_equiv =
|
|
36
|
+
(Low2SymbolPrefix + Symbol2LowTable.size.to_s).to_sym
|
|
37
|
+
# And regiter it.
|
|
38
|
+
Symbol2LowTable[@_symbol_equiv] = self
|
|
39
|
+
Low2SymbolTable[self] = @_symbol_equiv
|
|
40
|
+
end
|
|
41
|
+
# Now there is a symbol, return it.
|
|
42
|
+
return @_symbol_equiv
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
## Extends the Symbol class with of equivalent HDLRuby object.
|
|
47
|
+
class ::Symbol
|
|
48
|
+
# Convert to the equivalent HDLRuby object if any, returns nil if not.
|
|
49
|
+
def to_hdr
|
|
50
|
+
return Low2Symbol::Symbol2LowTable[self]
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
## Extends the SystemT class with conversion to symbol.
|
|
56
|
+
class SystemT
|
|
57
|
+
include Low2Symbol
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
## Extends the Scope class with conversion to symbol.
|
|
62
|
+
class Scope
|
|
63
|
+
include Low2Symbol
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
## Extends the Type class with conversion to symbol.
|
|
68
|
+
class Type
|
|
69
|
+
include Low2Symbol
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
## Extends the Behavior class with conversion to symbol.
|
|
74
|
+
class Behavior
|
|
75
|
+
include Low2Symbol
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
## Extends the Event class with conversion to symbol.
|
|
80
|
+
class Event
|
|
81
|
+
include Low2Symbol
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
## Extends the SignalI class with conversion to symbol.
|
|
86
|
+
class SignalI
|
|
87
|
+
include Low2Symbol
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
## Extends the SystemI class with conversion to symbol.
|
|
92
|
+
class SystemI
|
|
93
|
+
include Low2Symbol
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
## Extends the Statement class with conversion to symbol.
|
|
98
|
+
class Statement
|
|
99
|
+
include Low2Symbol
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
## Extends the When class with conversion to symbol.
|
|
104
|
+
class When
|
|
105
|
+
include Low2Symbol
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
## Extends the Delay class with conversion to symbol.
|
|
110
|
+
class Delay
|
|
111
|
+
include Low2Symbol
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
## Extends the Code class with conversion to symbol.
|
|
116
|
+
class Code
|
|
117
|
+
include Low2Symbol
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
## Extends the Expression class with conversion to symbol.
|
|
122
|
+
class Expression
|
|
123
|
+
include Low2Symbol
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
end
|