HDLRuby 2.6.18 → 2.6.24
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 +4 -4
- data/lib/HDLRuby/hdr_samples/with_reduce.rb +38 -0
- data/lib/HDLRuby/hdr_samples/with_str2value.rb +14 -0
- data/lib/HDLRuby/hdr_samples/with_to_a.rb +90 -0
- data/lib/HDLRuby/hruby_high.rb +5 -1
- data/lib/HDLRuby/hruby_low2c.rb +7 -5
- data/lib/HDLRuby/hruby_low_casts_without_expression.rb +78 -55
- data/lib/HDLRuby/hruby_low_mutable.rb +21 -0
- data/lib/HDLRuby/hruby_verilog_name.rb +24 -52
- data/lib/HDLRuby/sim/hruby_sim.h +4 -2
- data/lib/HDLRuby/sim/hruby_sim_calc.c +8 -4
- data/lib/HDLRuby/sim/hruby_sim_core.c +5 -3
- data/lib/HDLRuby/version.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 935f56ddd3e2db8f8cd72ae2d8156af2dbf9c1961be139a1b2c4f27b2e0d483c
|
4
|
+
data.tar.gz: 5a6d8a611f8cf6e0e9ae859721a26b2940c569436479f74f01cced46b741d810
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c2df833c800000df44afdd2178414f6a282b4f597ec6d6b000a26e15ddff990f3ad0784e8d93d1dc75c4948f638824ea12a731340e896c8eb976ad83a61ff6eb
|
7
|
+
data.tar.gz: 84b29e842be879ed848aeb475f80cc34654a31d0ca0fbfa45093082374dca6a90ad8dce3b1774ae339d1c962fcf63a81e5821bddd924ea6be84f2a6f8b566e84
|
@@ -0,0 +1,38 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
# A benchmark for testing the enumarable properties of expression (reduce).
|
4
|
+
system :with_reduce_bench do
|
5
|
+
[8].inner :val,:res
|
6
|
+
[64].inner :val64
|
7
|
+
|
8
|
+
timed do
|
9
|
+
val <= _01101010
|
10
|
+
res <= val.reduce(_00000000,:+)
|
11
|
+
!10.ns
|
12
|
+
val <= _01010010
|
13
|
+
res <= val.reduce(_00000000,:+)
|
14
|
+
!10.ns
|
15
|
+
val <= _01101111
|
16
|
+
res <= val.reduce(_00000000,:+)
|
17
|
+
!10.ns
|
18
|
+
val64 <= _0110101001101010011010100110101001101010011010100110101001101010
|
19
|
+
res <= val64.reduce(_00000000,:+)
|
20
|
+
!10.ns
|
21
|
+
res <= val64[7..0]
|
22
|
+
!10.ns
|
23
|
+
res <= res.reduce(_00000000,:+)
|
24
|
+
!10.ns
|
25
|
+
res <= val64[63..60]
|
26
|
+
!10.ns
|
27
|
+
res <= res.reduce(_00000000,:+)
|
28
|
+
!10.ns
|
29
|
+
val64 <= ~(val64 ^ val64)
|
30
|
+
res <= val64.reduce(_00000000,:+)
|
31
|
+
!10.ns
|
32
|
+
val64[0] <= _0
|
33
|
+
val64[3] <= _0
|
34
|
+
val64[63] <= _0
|
35
|
+
res <= val64.reduce(_00000000,:+)
|
36
|
+
!10.ns
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
|
2
|
+
system :four2eight do
|
3
|
+
[4].input :four
|
4
|
+
output :o0, :o1, :o2, :o3, :o4, :o5, :o6, :o7
|
5
|
+
|
6
|
+
o0 <= four[0]; o1 <= four[1]; o2 <= four[2]; o3 <= four[3]
|
7
|
+
o4 <= four[0]; o5 <= four[1]; o6 <= four[2]; o7 <= four[3]
|
8
|
+
end
|
9
|
+
|
10
|
+
system :four2sixfour do
|
11
|
+
[4].input :four
|
12
|
+
output :o00, :o01, :o02, :o03, :o04, :o05, :o06, :o07,
|
13
|
+
:o08, :o09, :o0A, :o0B, :o0C, :o0D, :o0E, :o0F,
|
14
|
+
:o10, :o11, :o12, :o13, :o14, :o15, :o16, :o17,
|
15
|
+
:o18, :o19, :o1A, :o1B, :o1C, :o1D, :o1E, :o1F,
|
16
|
+
:o20, :o21, :o22, :o23, :o24, :o25, :o26, :o27,
|
17
|
+
:o28, :o29, :o2A, :o2B, :o2C, :o2D, :o2E, :o2F,
|
18
|
+
:o30, :o31, :o32, :o33, :o34, :o35, :o36, :o37,
|
19
|
+
:o38, :o39, :o3A, :o3B, :o3C, :o3D, :o3E, :o3F
|
20
|
+
|
21
|
+
|
22
|
+
o00 <= four[0]; o01 <= four[1]; o02 <= four[2]; o03 <= four[3]
|
23
|
+
o04 <= four[0]; o05 <= four[1]; o06 <= four[2]; o07 <= four[3]
|
24
|
+
o08 <= four[0]; o09 <= four[1]; o0A <= four[2]; o0B <= four[3]
|
25
|
+
o0C <= four[0]; o0D <= four[1]; o0E <= four[2]; o0F <= four[3]
|
26
|
+
o10 <= four[0]; o11 <= four[1]; o12 <= four[2]; o13 <= four[3]
|
27
|
+
o14 <= four[0]; o15 <= four[1]; o16 <= four[2]; o17 <= four[3]
|
28
|
+
o18 <= four[0]; o19 <= four[1]; o1A <= four[2]; o1B <= four[3]
|
29
|
+
o1C <= four[0]; o1D <= four[1]; o1E <= four[2]; o1F <= four[3]
|
30
|
+
o20 <= four[0]; o21 <= four[1]; o22 <= four[2]; o23 <= four[3]
|
31
|
+
o24 <= four[0]; o25 <= four[1]; o26 <= four[2]; o27 <= four[3]
|
32
|
+
o28 <= four[0]; o29 <= four[1]; o2A <= four[2]; o2B <= four[3]
|
33
|
+
o2C <= four[0]; o2D <= four[1]; o2E <= four[2]; o2F <= four[3]
|
34
|
+
o30 <= four[0]; o31 <= four[1]; o32 <= four[2]; o33 <= four[3]
|
35
|
+
o34 <= four[0]; o35 <= four[1]; o36 <= four[2]; o37 <= four[3]
|
36
|
+
o38 <= four[0]; o39 <= four[1]; o3A <= four[2]; o3B <= four[3]
|
37
|
+
o3C <= four[0]; o3D <= four[1]; o3E <= four[2]; o3F <= four[3]
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
|
42
|
+
# A benchmark for testing some enumarable properties of expression (to_a).
|
43
|
+
system :with_to_a_bench do
|
44
|
+
[4].inner :four
|
45
|
+
[8].inner :val, :res, :eight
|
46
|
+
[64].inner :val64, :res64, :sixfour
|
47
|
+
|
48
|
+
vals = val.to_a
|
49
|
+
val64s = val64.to_a
|
50
|
+
|
51
|
+
four2eight(:my_four2eight).(four,*(eight.to_a.reverse))
|
52
|
+
four2sixfour(:my_four2sixfour).(four,*(sixfour.to_a.reverse))
|
53
|
+
|
54
|
+
timed do
|
55
|
+
val <= _01101010
|
56
|
+
res <= vals.reverse
|
57
|
+
!10.ns
|
58
|
+
val64 <= _0110101001101010011010100110101001101010011010100110101001101010
|
59
|
+
res64 <= val64s.reverse
|
60
|
+
!10.ns
|
61
|
+
val <= _00000000
|
62
|
+
val64 <= _0000000000000000000000000000000000000000000000000000000000000000
|
63
|
+
!10.ns
|
64
|
+
vals.each.with_index do |v,i|
|
65
|
+
v <= (i/2) & _1
|
66
|
+
end
|
67
|
+
res <= val
|
68
|
+
!10.ns
|
69
|
+
val64s.each.with_index do |v,i|
|
70
|
+
v <= (i/2) & _1
|
71
|
+
end
|
72
|
+
res64 <= val64
|
73
|
+
!10.ns
|
74
|
+
val <= _01010011
|
75
|
+
!10.ns
|
76
|
+
8.times do |i|
|
77
|
+
val64s[i] <= val[i]
|
78
|
+
val64s[i+32] <= val[i]
|
79
|
+
val64s[i+56] <= val[i]
|
80
|
+
end
|
81
|
+
res64 <= val64
|
82
|
+
!10.ns
|
83
|
+
four <= _0000
|
84
|
+
!10.ns
|
85
|
+
four <= _0001
|
86
|
+
!10.ns
|
87
|
+
four <= _1100
|
88
|
+
!10.ns
|
89
|
+
end
|
90
|
+
end
|
data/lib/HDLRuby/hruby_high.rb
CHANGED
@@ -2499,7 +2499,11 @@ module HDLRuby::High
|
|
2499
2499
|
|
2500
2500
|
# Casts as +type+.
|
2501
2501
|
def as(type)
|
2502
|
-
|
2502
|
+
if (self.parent)
|
2503
|
+
return Cast.new(type.to_type,self.to_expr)
|
2504
|
+
else
|
2505
|
+
return Cast.new(type.to_type,self)
|
2506
|
+
end
|
2503
2507
|
end
|
2504
2508
|
|
2505
2509
|
# Casts to a bit vector type.
|
data/lib/HDLRuby/hruby_low2c.rb
CHANGED
@@ -1575,9 +1575,10 @@ module HDLRuby::Low
|
|
1575
1575
|
if str =~ /^[01]+$/ && str.length <= 64 then
|
1576
1576
|
# Yes, generate a numeral value.
|
1577
1577
|
res << " " * (level+1)*3
|
1578
|
-
res << "static unsigned long long data[] = { "
|
1578
|
+
# res << "static unsigned long long data[] = { "
|
1579
|
+
res << "static unsigned int data[] = { "
|
1579
1580
|
res << str.scan(/.{1,#{Low2C.int_width}}/m).map do |sub|
|
1580
|
-
sub.to_i(2).to_s + "ULL"
|
1581
|
+
sub.to_i(2).to_s # + "ULL"
|
1581
1582
|
end.join(",")
|
1582
1583
|
res << " };\n"
|
1583
1584
|
# Create the value.
|
@@ -1930,11 +1931,10 @@ module HDLRuby::Low
|
|
1930
1931
|
res << "ref = #{self.ref.to_c(level+2)};\n"
|
1931
1932
|
# Compute the index.
|
1932
1933
|
res << (" " * ((level+1)*3))
|
1933
|
-
# res << "idx = read64(#{self.index.to_c(level+2)});\n"
|
1934
1934
|
res << "idx = value2integer(#{self.index.to_c(level+2)});\n"
|
1935
1935
|
# Make the access.
|
1936
1936
|
res << (" " * ((level+1)*3))
|
1937
|
-
#
|
1937
|
+
# puts "self.type.width=#{self.type.width}"
|
1938
1938
|
res << "dst = read_range(ref,idx,idx,#{self.type.to_c(level)},dst);\n"
|
1939
1939
|
# Restore the state of the value pool.
|
1940
1940
|
res << (" " * ((level+1)*3))
|
@@ -1947,7 +1947,9 @@ module HDLRuby::Low
|
|
1947
1947
|
# Generates the C text for reference as left value to a signal.
|
1948
1948
|
# +level+ is the hierarchical level of the object.
|
1949
1949
|
def to_c_signal(level = 0)
|
1950
|
+
# puts "to_c_signal for RefIndex"
|
1950
1951
|
return "make_ref_rangeS(#{self.ref.to_c_signal(level)}," +
|
1952
|
+
"#{self.type.to_c(level)}," +
|
1951
1953
|
"value2integer(#{self.index.to_c(level)}),value2integer(#{self.index.to_c(level)}))"
|
1952
1954
|
end
|
1953
1955
|
end
|
@@ -1985,7 +1987,7 @@ module HDLRuby::Low
|
|
1985
1987
|
# Make the access.
|
1986
1988
|
res << (" " * ((level+1)*3))
|
1987
1989
|
# res << "dst = #{command}_range(ref,first,last,#{self.ref.type.base.to_c(level)},dst);\n"
|
1988
|
-
# puts "
|
1990
|
+
# puts "#{command}_range with first=#{self.range.first} and last=#{self.range.last}"
|
1989
1991
|
res << "dst = #{command}_range(ref,first,last,#{self.type.base.to_c(level)},dst);\n"
|
1990
1992
|
# Restore the state of the value pool.
|
1991
1993
|
res << (" " * ((level+1)*3))
|
@@ -56,9 +56,9 @@ module HDLRuby::Low
|
|
56
56
|
# Extracts the expressions from the casts.
|
57
57
|
def casts_without_expression!
|
58
58
|
# Apply on the left value.
|
59
|
-
self.set_left!(self.left.casts_without_expression)
|
59
|
+
self.set_left!(self.left.casts_without_expression!)
|
60
60
|
# Apply on the right value.
|
61
|
-
self.set_right!(self.right.casts_without_expression)
|
61
|
+
self.set_right!(self.right.casts_without_expression!)
|
62
62
|
return self
|
63
63
|
end
|
64
64
|
end
|
@@ -71,7 +71,7 @@ module HDLRuby::Low
|
|
71
71
|
# Extracts the expressions from the casts.
|
72
72
|
def casts_without_expression!
|
73
73
|
# Apply on the arguments.
|
74
|
-
self.map_args!(&:casts_without_expression)
|
74
|
+
self.map_args!(&:casts_without_expression!)
|
75
75
|
return self
|
76
76
|
end
|
77
77
|
end
|
@@ -84,12 +84,12 @@ module HDLRuby::Low
|
|
84
84
|
# Extracts the expressions from the casts.
|
85
85
|
def casts_without_expression!
|
86
86
|
# Apply on the condition.
|
87
|
-
self.set_condition!(self.condition.casts_without_expression)
|
87
|
+
self.set_condition!(self.condition.casts_without_expression!)
|
88
88
|
# Apply on the yes.
|
89
89
|
self.yes.casts_without_expression!
|
90
90
|
# Apply on the noifs.
|
91
91
|
@noifs.map! do |cond,stmnt|
|
92
|
-
[cond.casts_without_expression
|
92
|
+
[cond.casts_without_expression!,stmnt.casts_without_expression!]
|
93
93
|
end
|
94
94
|
# Apply on the no if any.
|
95
95
|
self.no.casts_without_expression! if self.no
|
@@ -104,7 +104,7 @@ module HDLRuby::Low
|
|
104
104
|
# Extracts the expressions from the casts.
|
105
105
|
def casts_without_expression!
|
106
106
|
# Apply on the match.
|
107
|
-
self.set_match!(self.match.casts_without_expression)
|
107
|
+
self.set_match!(self.match.casts_without_expression!)
|
108
108
|
# Apply on the statement.
|
109
109
|
self.statement.casts_without_expression!
|
110
110
|
return self
|
@@ -120,7 +120,7 @@ module HDLRuby::Low
|
|
120
120
|
def casts_without_expression!
|
121
121
|
# No need to apply on the value!
|
122
122
|
# Apply on the value.
|
123
|
-
self.set_value!(self.value.casts_without_expression)
|
123
|
+
self.set_value!(self.value.casts_without_expression!)
|
124
124
|
# Apply on the whens.
|
125
125
|
self.each_when(&:casts_without_expression!)
|
126
126
|
# Apply on the default if any.
|
@@ -169,9 +169,10 @@ module HDLRuby::Low
|
|
169
169
|
# expressions from cast.
|
170
170
|
class Value
|
171
171
|
# Extracts the expressions from the casts.
|
172
|
-
def casts_without_expression
|
173
|
-
# Simple clones.
|
174
|
-
return self.clone
|
172
|
+
def casts_without_expression!
|
173
|
+
# # Simple clones.
|
174
|
+
# return self.clone
|
175
|
+
return self
|
175
176
|
end
|
176
177
|
end
|
177
178
|
|
@@ -180,9 +181,10 @@ module HDLRuby::Low
|
|
180
181
|
# expressions from cast.
|
181
182
|
class Cast
|
182
183
|
# Extracts the expressions from the casts.
|
183
|
-
def casts_without_expression
|
184
|
+
def casts_without_expression!
|
184
185
|
# Recurse on the child.
|
185
|
-
nchild = self.child.casts_without_expression
|
186
|
+
nchild = self.child.casts_without_expression!
|
187
|
+
nchild.parent = nil
|
186
188
|
# Process the cast.
|
187
189
|
unless (nchild.is_a?(Ref)) then
|
188
190
|
# Need to extract the child.
|
@@ -221,10 +223,11 @@ module HDLRuby::Low
|
|
221
223
|
class Unary
|
222
224
|
|
223
225
|
# Extracts the expressions from the casts.
|
224
|
-
def casts_without_expression
|
225
|
-
# Recurse on the sub node.
|
226
|
-
return Unary.new(self.type,self.operator,
|
227
|
-
|
226
|
+
def casts_without_expression!
|
227
|
+
# # Recurse on the sub node.
|
228
|
+
# return Unary.new(self.type,self.operator,
|
229
|
+
# self.child.casts_without_expression)
|
230
|
+
self.set_child!(self.child.casts_without_expression!)
|
228
231
|
return self
|
229
232
|
end
|
230
233
|
end
|
@@ -235,11 +238,14 @@ module HDLRuby::Low
|
|
235
238
|
class Binary
|
236
239
|
|
237
240
|
# Extracts the expressions from the casts.
|
238
|
-
def casts_without_expression
|
239
|
-
# Recurse on the sub nodes.
|
240
|
-
return Binary.new(self.type,self.operator,
|
241
|
-
|
242
|
-
|
241
|
+
def casts_without_expression!
|
242
|
+
# # Recurse on the sub nodes.
|
243
|
+
# return Binary.new(self.type,self.operator,
|
244
|
+
# self.left.casts_without_expression,
|
245
|
+
# self.right.casts_without_expression)
|
246
|
+
self.set_left!(self.left.casts_without_expression!)
|
247
|
+
self.set_right!(self.right.casts_without_expression!)
|
248
|
+
return self
|
243
249
|
end
|
244
250
|
end
|
245
251
|
|
@@ -250,13 +256,15 @@ module HDLRuby::Low
|
|
250
256
|
class Select
|
251
257
|
|
252
258
|
# Extracts the expressions from the casts.
|
253
|
-
def casts_without_expression
|
259
|
+
def casts_without_expression!
|
254
260
|
# Recurse on the sub node.
|
255
|
-
return Select.new(self.type,"?",
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
261
|
+
# return Select.new(self.type,"?",
|
262
|
+
# self.select.casts_without_expression,
|
263
|
+
# *self.each_choice.map do |choice|
|
264
|
+
# choice.casts_without_expression
|
265
|
+
# end )
|
266
|
+
self.set_select!(self.select.casts_without_expression!)
|
267
|
+
sef.map_choices! { |choice| choice.casts_without_expression! }
|
260
268
|
return self
|
261
269
|
end
|
262
270
|
end
|
@@ -266,11 +274,13 @@ module HDLRuby::Low
|
|
266
274
|
# in assignments to select operators.
|
267
275
|
class Concat
|
268
276
|
# Extracts the expressions from the casts.
|
269
|
-
def casts_without_expression
|
277
|
+
def casts_without_expression!
|
270
278
|
# Recurse on the sub expressions.
|
271
|
-
return Concat.new(self.type,self.each_expression.map do |expr|
|
272
|
-
|
273
|
-
end )
|
279
|
+
# return Concat.new(self.type,self.each_expression.map do |expr|
|
280
|
+
# expr.casts_without_expression
|
281
|
+
# end )
|
282
|
+
self.map_expressions! {|expr| expr.casts_without_expression! }
|
283
|
+
return self
|
274
284
|
end
|
275
285
|
end
|
276
286
|
|
@@ -279,11 +289,13 @@ module HDLRuby::Low
|
|
279
289
|
# in assignments to select operators.
|
280
290
|
class RefConcat
|
281
291
|
# Extracts the expressions from the casts.
|
282
|
-
def casts_without_expression
|
283
|
-
# Recurse on the sub references.
|
284
|
-
return RefConcat.new(self.type,self.each_expression.map do |expr|
|
285
|
-
|
286
|
-
end )
|
292
|
+
def casts_without_expression!
|
293
|
+
# # Recurse on the sub references.
|
294
|
+
# return RefConcat.new(self.type,self.each_expression.map do |expr|
|
295
|
+
# expr.casts_without_expression
|
296
|
+
# end )
|
297
|
+
self.map_expressions! {|expr| expr.casts_without_expression! }
|
298
|
+
return self
|
287
299
|
end
|
288
300
|
end
|
289
301
|
|
@@ -292,11 +304,14 @@ module HDLRuby::Low
|
|
292
304
|
# in assignments to select operators.
|
293
305
|
class RefIndex
|
294
306
|
# Extracts the expressions from the casts.
|
295
|
-
def casts_without_expression
|
307
|
+
def casts_without_expression!
|
296
308
|
# Recurse on the sub references.
|
297
|
-
return RefIndex.new(self.type,
|
298
|
-
|
299
|
-
|
309
|
+
# return RefIndex.new(self.type,
|
310
|
+
# self.ref.casts_without_expression,
|
311
|
+
# self.index.casts_without_expression)
|
312
|
+
self.set_ref!(self.ref.casts_without_expression!)
|
313
|
+
self.set_index!(self.index.casts_without_expression!)
|
314
|
+
return self
|
300
315
|
end
|
301
316
|
end
|
302
317
|
|
@@ -305,12 +320,16 @@ module HDLRuby::Low
|
|
305
320
|
# in assignments to select operators.
|
306
321
|
class RefRange
|
307
322
|
# Extracts the expressions from the casts.
|
308
|
-
def casts_without_expression
|
323
|
+
def casts_without_expression!
|
309
324
|
# Recurse on the sub references.
|
310
|
-
return RefRange.new(self.type,
|
311
|
-
|
312
|
-
|
313
|
-
|
325
|
+
# return RefRange.new(self.type,
|
326
|
+
# self.ref.casts_without_expression,
|
327
|
+
# self.range.first.casts_without_expression ..
|
328
|
+
# self.range.last.casts_without_expression)
|
329
|
+
self.set_ref!(self.ref.casts_without_expression!)
|
330
|
+
self.set_range!(self.range.first.casts_without_expression! ..
|
331
|
+
self.range.last.casts_without_expression!)
|
332
|
+
return self
|
314
333
|
end
|
315
334
|
end
|
316
335
|
|
@@ -319,11 +338,13 @@ module HDLRuby::Low
|
|
319
338
|
# in assignments to select operators.
|
320
339
|
class RefName
|
321
340
|
# Extracts the expressions from the casts.
|
322
|
-
def casts_without_expression
|
341
|
+
def casts_without_expression!
|
323
342
|
# Recurse on the sub references.
|
324
|
-
return RefName.new(self.type,
|
325
|
-
|
326
|
-
|
343
|
+
# return RefName.new(self.type,
|
344
|
+
# self.ref.casts_without_expression,
|
345
|
+
# self.name)
|
346
|
+
self.set_ref!(self.ref.casts_without_expression!)
|
347
|
+
return self
|
327
348
|
end
|
328
349
|
end
|
329
350
|
|
@@ -332,9 +353,10 @@ module HDLRuby::Low
|
|
332
353
|
# in assignments to select operators.
|
333
354
|
class RefThis
|
334
355
|
# Extracts the expressions from the casts.
|
335
|
-
def casts_without_expression
|
336
|
-
# Simply clone.
|
337
|
-
return self.clone
|
356
|
+
def casts_without_expression!
|
357
|
+
# # Simply clone.
|
358
|
+
# return self.clone
|
359
|
+
return self
|
338
360
|
end
|
339
361
|
end
|
340
362
|
|
@@ -344,9 +366,10 @@ module HDLRuby::Low
|
|
344
366
|
class StringE
|
345
367
|
|
346
368
|
# Extracts the expressions from the casts.
|
347
|
-
def casts_without_expression
|
348
|
-
return StringE.new(self.content,
|
349
|
-
|
369
|
+
def casts_without_expression!
|
370
|
+
# return StringE.new(self.content,
|
371
|
+
# *self.each_arg.map(&:casts_without_expression))
|
372
|
+
self.map_args! {|arg| arg.casts_without_expression! }
|
350
373
|
return self
|
351
374
|
end
|
352
375
|
end
|
@@ -1959,4 +1959,25 @@ module HDLRuby::Low
|
|
1959
1959
|
# Nothing to do.
|
1960
1960
|
end
|
1961
1961
|
end
|
1962
|
+
|
1963
|
+
##
|
1964
|
+
# Describes a string.
|
1965
|
+
#
|
1966
|
+
# NOTE: This is not synthesizable!
|
1967
|
+
class StringE
|
1968
|
+
|
1969
|
+
# Maps on the arguments.
|
1970
|
+
def map_args!(&ruby_block)
|
1971
|
+
@args.map! do |arg|
|
1972
|
+
arg = ruby_block.call(arg)
|
1973
|
+
arg.parent = self unless arg.parent
|
1974
|
+
arg
|
1975
|
+
end
|
1976
|
+
end
|
1977
|
+
|
1978
|
+
# Maps on the children.
|
1979
|
+
def map_nodes!(&ruby_block)
|
1980
|
+
self.map_args!(&ruby_block)
|
1981
|
+
end
|
1982
|
+
end
|
1962
1983
|
end
|
@@ -6,63 +6,35 @@ module HDLRuby::Verilog
|
|
6
6
|
# This is sample.
|
7
7
|
# n = "abc_ABC_いろは"
|
8
8
|
# puts n
|
9
|
-
# name = n.split("")
|
9
|
+
# name = n.split("")
|
10
|
+
|
11
|
+
@@hdr2verilog = {}
|
10
12
|
|
11
13
|
# Since it is possible to use $ and numbers other than the beginning of the character string, it is divided.
|
12
14
|
def name_to_verilog(name)
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
#
|
30
|
-
# name[1..-1].each_char do |c|
|
31
|
-
# # Confirmation of characters in array.
|
32
|
-
# # If it is a-zA-Z 0 - 9, it is added to ref as it is.
|
33
|
-
# if (c =~ /[a-zA-Z0-9]|\$/) then
|
34
|
-
# ref << c
|
35
|
-
# # _ To convert it to __.
|
36
|
-
# elsif (c == "_") then
|
37
|
-
# ref << "__"
|
38
|
-
# # If it does not satisfy the above, it is another character.
|
39
|
-
# # In that case, convert it to UTF-8 and convert it to a usable character string.
|
40
|
-
# else
|
41
|
-
# l = c.bytes.map{|v| v.to_s(16)}.join # Conversion to UTF-8 hexadecimal number.
|
42
|
-
#
|
43
|
-
# ref << "_" + l.rjust(6,"0") # Add an underscore indicating conversion.
|
44
|
-
# # The remainder of 6 digits is filled with 0.
|
45
|
-
# end
|
46
|
-
# end
|
47
|
-
# return ref
|
48
|
-
|
49
|
-
|
15
|
+
# name = name.to_s
|
16
|
+
# # Convert special characters.
|
17
|
+
# name = name.each_char.map do |c|
|
18
|
+
# if c=~ /[a-z0-9]/ then
|
19
|
+
# c
|
20
|
+
# elsif c == "_" then
|
21
|
+
# "__"
|
22
|
+
# else
|
23
|
+
# "_" + c.ord.to_s
|
24
|
+
# end
|
25
|
+
# end.join
|
26
|
+
# # First character: only letter is possible.
|
27
|
+
# unless name[0] =~ /[a-z_]/ then
|
28
|
+
# name = "_" + name
|
29
|
+
# end
|
30
|
+
# return name
|
50
31
|
name = name.to_s
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
elsif c == "_" then
|
56
|
-
"__"
|
57
|
-
else
|
58
|
-
"_" + c.ord.to_s
|
59
|
-
end
|
60
|
-
end.join
|
61
|
-
# First character: only letter is possible.
|
62
|
-
unless name[0] =~ /[a-z_]/ then
|
63
|
-
name = "_" + name
|
32
|
+
vname = @@hdr2verilog[name]
|
33
|
+
unless vname then
|
34
|
+
vname = "_v#{@@hdr2verilog.size}_#{name.split(/[^a-zA-Z_0-9]/)[-1]}"
|
35
|
+
@@hdr2verilog[name] = vname
|
64
36
|
end
|
65
|
-
return
|
37
|
+
return vname
|
66
38
|
end
|
67
39
|
|
68
40
|
#puts ref
|
data/lib/HDLRuby/sim/hruby_sim.h
CHANGED
@@ -101,6 +101,7 @@ typedef struct ValueS_ {
|
|
101
101
|
/* The tructure of a reference to a range in a value. */
|
102
102
|
typedef struct RefRangeS_ {
|
103
103
|
SignalI signal; /* The refered signal. */
|
104
|
+
Type type; /* The tyep of the elements. */
|
104
105
|
unsigned long long first; /* The first index in the range. */
|
105
106
|
unsigned long long last; /* The last index in the range. */
|
106
107
|
} RefRangeS;
|
@@ -308,11 +309,12 @@ extern int same_content_value_range(Value value0, unsigned long long first,
|
|
308
309
|
|
309
310
|
/** Creates a reference to a range inside a signal.
|
310
311
|
* @param signal the signal to refer
|
312
|
+
* @param typ the type of the elements.
|
311
313
|
* @param first the start index of the range
|
312
314
|
* @param last the end index of the range
|
313
315
|
* @return the resulting reference */
|
314
|
-
extern RefRangeS make_ref_rangeS(SignalI signal,
|
315
|
-
unsigned long long last);
|
316
|
+
extern RefRangeS make_ref_rangeS(SignalI signal, Type typ,
|
317
|
+
unsigned long long first, unsigned long long last);
|
316
318
|
|
317
319
|
|
318
320
|
/* The interface for the lists. */
|
@@ -2171,7 +2171,8 @@ Value read_range_numeric(Value value, long long first, long long last,
|
|
2171
2171
|
/* Compute the read mask. */
|
2172
2172
|
// unsigned long long mask = ((-1LL) << first) & (~((-1LL) << (last+1)));
|
2173
2173
|
/* NOTE: once again, << 64 does not work like expected. */
|
2174
|
-
unsigned long long mask =
|
2174
|
+
unsigned long long mask = last+bw < 64 ? (~((-1LL) << (last+bw))) : -1LL;
|
2175
|
+
// printf("mask=%llx\n",mask);
|
2175
2176
|
/* Performs the read. */
|
2176
2177
|
unsigned long long data = (value->data_int & mask) >> first;
|
2177
2178
|
/* Write it to the destination. */
|
@@ -2216,7 +2217,9 @@ Value write_range_numeric(Value src, long long first, long long last,
|
|
2216
2217
|
/* Copy from the source. */
|
2217
2218
|
unsigned long long src_data = src->data_int & ~((-1LL) << (last-first+1));
|
2218
2219
|
/* Cleans the destination where to place the data. */
|
2219
|
-
unsigned long long mask
|
2220
|
+
unsigned long long mask;
|
2221
|
+
if (last<63) mask = ~(((-1LL) << first) & ~((-1LL) << (last+1)));
|
2222
|
+
else mask = ~((-1LL)<<first);
|
2220
2223
|
unsigned long long dst_data = dst->data_int & mask;
|
2221
2224
|
// printf("src_data=%llx mask=%llx dst_data=%llx\n",src_data,mask,dst_data);
|
2222
2225
|
/* Write the data. */
|
@@ -2947,12 +2950,13 @@ int same_content_value_range(Value value0,
|
|
2947
2950
|
|
2948
2951
|
/** Creates a reference to a range inside a signal.
|
2949
2952
|
* @param signal the signal to refer
|
2953
|
+
* @param typ the type of the elements
|
2950
2954
|
* @param first the start index of the range
|
2951
2955
|
* @param last the end index of the range
|
2952
2956
|
* @return the resulting reference */
|
2953
|
-
RefRangeS make_ref_rangeS(SignalI signal, unsigned long long first,
|
2957
|
+
RefRangeS make_ref_rangeS(SignalI signal, Type typ, unsigned long long first,
|
2954
2958
|
unsigned long long last) {
|
2955
|
-
RefRangeS result = { signal, first, last };
|
2959
|
+
RefRangeS result = { signal, typ, first, last };
|
2956
2960
|
return result;
|
2957
2961
|
}
|
2958
2962
|
|
@@ -586,12 +586,14 @@ void transmit_to_signal_range_seq(Value value, RefRangeS ref) {
|
|
586
586
|
SignalI signal = ref.signal;
|
587
587
|
unsigned long long first = ref.first;
|
588
588
|
unsigned long long last = ref.last;
|
589
|
-
// printf("Tansmit to signal range: %s(%p)\n",signal->name,signal);
|
589
|
+
// printf("Tansmit to signal range: %s(%p) [%llu,%llu]\n",signal->name,signal,first,last);
|
590
590
|
/* Can transmit, copy the content. */
|
591
591
|
if (signal->fading)
|
592
|
-
write_range(value,first,last,signal->f_value->type,signal->f_value);
|
592
|
+
// write_range(value,first,last,signal->f_value->type,signal->f_value);
|
593
|
+
write_range(value,first,last,ref.type,signal->f_value);
|
593
594
|
else
|
594
|
-
write_range_no_z(value,first,last,signal->f_value->type,signal->f_value);
|
595
|
+
// write_range_no_z(value,first,last,signal->f_value->type,signal->f_value);
|
596
|
+
write_range_no_z(value,first,last,ref.type,signal->f_value);
|
595
597
|
/* And touch the signal. */
|
596
598
|
touch_signal_seq(signal);
|
597
599
|
}
|
data/lib/HDLRuby/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: HDLRuby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.6.
|
4
|
+
version: 2.6.24
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lovic Gauthier
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-11-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -150,6 +150,9 @@ files:
|
|
150
150
|
- lib/HDLRuby/hdr_samples/with_memory_rom.rb
|
151
151
|
- lib/HDLRuby/hdr_samples/with_multi_channels.rb
|
152
152
|
- lib/HDLRuby/hdr_samples/with_reconf.rb
|
153
|
+
- lib/HDLRuby/hdr_samples/with_reduce.rb
|
154
|
+
- lib/HDLRuby/hdr_samples/with_str2value.rb
|
155
|
+
- lib/HDLRuby/hdr_samples/with_to_a.rb
|
153
156
|
- lib/HDLRuby/hdr_samples/with_to_array.rb
|
154
157
|
- lib/HDLRuby/hdrcc.rb
|
155
158
|
- lib/HDLRuby/high_samples/_adder_fault.rb
|