HDLRuby 2.11.10 → 2.11.12
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +55 -18
- data/ext/hruby_sim/hruby_rcsim_build.c +110 -83
- data/ext/hruby_sim/hruby_sim.h +3 -0
- data/ext/hruby_sim/hruby_sim_calc.c +14 -6
- data/ext/hruby_sim/hruby_sim_core.c +20 -7
- data/ext/hruby_sim/hruby_sim_list.c +1 -1
- data/ext/hruby_sim/hruby_sim_stack_calc.c +3 -2
- data/ext/hruby_sim/hruby_sim_tree_calc.c +8 -1
- data/ext/hruby_sim/hruby_sim_vcd.c +24 -7
- data/ext/hruby_sim/hruby_sim_vizualize.c +9 -1
- data/lib/HDLRuby/hdr_samples/constant_in_function.rb +3 -1
- data/lib/HDLRuby/hdr_samples/counter_dff_bench.rb +3 -1
- data/lib/HDLRuby/hdr_samples/huge_rom.rb +1 -1
- data/lib/HDLRuby/hdr_samples/mei8.rb +11 -11
- data/lib/HDLRuby/hdr_samples/mei8_bench.rb +11 -11
- data/lib/HDLRuby/hdr_samples/neg_arith_bench.rb +4 -4
- data/lib/HDLRuby/hdr_samples/rom_nest.rb +1 -1
- data/lib/HDLRuby/hdr_samples/ruby_fir_hw.rb +4 -4
- data/lib/HDLRuby/hdr_samples/struct.rb +44 -10
- data/lib/HDLRuby/hdr_samples/with_bram.rb +45 -0
- data/lib/HDLRuby/hdr_samples/with_casts.rb +3 -3
- data/lib/HDLRuby/hdr_samples/with_concat.rb +6 -6
- data/lib/HDLRuby/hdr_samples/with_connector_memory.rb +2 -2
- data/lib/HDLRuby/hdr_samples/with_def.rb +10 -3
- data/lib/HDLRuby/hdr_samples/with_define_operator.rb +44 -0
- data/lib/HDLRuby/hdr_samples/with_fixpoint.rb +12 -12
- data/lib/HDLRuby/hdr_samples/with_init.rb +3 -3
- data/lib/HDLRuby/hdr_samples/with_leftright.rb +21 -0
- data/lib/HDLRuby/hdr_samples/with_reduce.rb +13 -13
- data/lib/HDLRuby/hdr_samples/with_ref_array.rb +6 -6
- data/lib/HDLRuby/hdr_samples/with_subsums.rb +3 -3
- data/lib/HDLRuby/hdr_samples/with_terminate.rb +3 -3
- data/lib/HDLRuby/hdr_samples/with_to_a.rb +10 -10
- data/lib/HDLRuby/hdr_samples/with_values.rb +3 -3
- data/lib/HDLRuby/hdrcc.rb +14 -1
- data/lib/HDLRuby/hruby_bstr.rb +10 -5
- data/lib/HDLRuby/hruby_high.rb +114 -27
- data/lib/HDLRuby/hruby_low.rb +187 -16
- data/lib/HDLRuby/hruby_low2c.rb +71 -11
- data/lib/HDLRuby/hruby_low2vhd.rb +2 -1
- data/lib/HDLRuby/hruby_low_fix_types.rb +1 -0
- data/lib/HDLRuby/hruby_low_mutable.rb +30 -1
- data/lib/HDLRuby/hruby_low_resolve.rb +15 -2
- data/lib/HDLRuby/hruby_low_without_concat.rb +28 -8
- data/lib/HDLRuby/hruby_low_without_parinseq.rb +14 -4
- data/lib/HDLRuby/hruby_low_without_select.rb +2 -2
- data/lib/HDLRuby/hruby_low_without_subsignals.rb +279 -0
- data/lib/HDLRuby/hruby_rcsim.rb +99 -87
- data/lib/HDLRuby/hruby_rsim.rb +132 -7
- data/lib/HDLRuby/hruby_rsim_vcd.rb +99 -27
- data/lib/HDLRuby/hruby_values.rb +35 -31
- data/lib/HDLRuby/std/bram.rb +22 -0
- data/lib/HDLRuby/std/fixpoint.rb +2 -2
- data/lib/HDLRuby/std/fsm.rb +20 -3
- data/lib/HDLRuby/std/function_generator.rb +2 -2
- data/lib/HDLRuby/version.rb +1 -1
- metadata +7 -3
- data/lib/HDLRuby/hdr_samples/sumprod.rb +0 -29
@@ -94,9 +94,10 @@ module HDLRuby::High
|
|
94
94
|
|
95
95
|
## Gets the VCD variables with their long name.
|
96
96
|
def get_vars_with_fullname(vars_with_fullname = {})
|
97
|
-
#
|
97
|
+
# Recurse on the signals.
|
98
98
|
self.each_signal do |sig|
|
99
|
-
|
99
|
+
sig.get_vars_with_fullname(vars_with_fullname)
|
100
|
+
# vars_with_fullname[sig] = HDLRuby::High.vcd_name(sig.fullname)
|
100
101
|
end
|
101
102
|
# Recurse on the scope.
|
102
103
|
return self.scope.get_vars_with_fullname(vars_with_fullname)
|
@@ -104,9 +105,13 @@ module HDLRuby::High
|
|
104
105
|
|
105
106
|
## Gets the VCD variables with their id string.
|
106
107
|
def get_vars_with_idstr(vars_with_idstr = {})
|
107
|
-
# Adds the signals of the interface of the system.
|
108
|
+
# # Adds the signals of the interface of the system.
|
109
|
+
# self.each_signal do |sig|
|
110
|
+
# vars_with_idstr[sig] = HDLRuby::High.vcd_idstr(sig)
|
111
|
+
# end
|
112
|
+
# Recurse on the signals.
|
108
113
|
self.each_signal do |sig|
|
109
|
-
|
114
|
+
sig.get_vars_with_idstr(vars_with_idstr)
|
110
115
|
end
|
111
116
|
# Recurse on the scope.
|
112
117
|
return self.scope.get_vars_with_idstr(vars_with_idstr)
|
@@ -119,11 +124,11 @@ module HDLRuby::High
|
|
119
124
|
vcdout << "$scope module #{HDLRuby::High.vcd_name(self.name)} $end\n"
|
120
125
|
# Shows the interface signals.
|
121
126
|
self.each_signal do |sig|
|
122
|
-
|
123
|
-
|
124
|
-
# vcdout << "#{
|
125
|
-
vcdout << "#{HDLRuby::High.vcd_idstr(sig)} "
|
126
|
-
vcdout << "#{HDLRuby::High.vcd_name(sig.name)} $end\n"
|
127
|
+
sig.show_hierarchy(vcdout)
|
128
|
+
# # puts "showing signal #{HDLRuby::High.vcd_name(sig.fullname)}"
|
129
|
+
# vcdout << "$var wire #{sig.type.width} "
|
130
|
+
# vcdout << "#{HDLRuby::High.vcd_idstr(sig)} "
|
131
|
+
# vcdout << "#{HDLRuby::High.vcd_name(sig.name)} $end\n"
|
127
132
|
end
|
128
133
|
# Recurse on the scope.
|
129
134
|
self.scope.show_hierarchy(vcdout)
|
@@ -170,11 +175,12 @@ module HDLRuby::High
|
|
170
175
|
end
|
171
176
|
# Shows the inner signals.
|
172
177
|
self.each_inner do |sig|
|
173
|
-
|
174
|
-
|
175
|
-
# vcdout << "#{
|
176
|
-
vcdout << "#{HDLRuby::High.
|
177
|
-
vcdout << "#{HDLRuby::High.
|
178
|
+
sig.show_hierarchy(vcdout)
|
179
|
+
# # puts "showing inner signal #{HDLRuby::High.vcd_name(sig.fullname)}"
|
180
|
+
# vcdout << "$var wire #{sig.type.width} "
|
181
|
+
# # vcdout << "#{HDLRuby::High.vcd_name(sig.fullname)} "
|
182
|
+
# vcdout << "#{HDLRuby::High.vcd_idstr(sig)} "
|
183
|
+
# vcdout << "#{HDLRuby::High.vcd_name(sig.name)} $end\n"
|
178
184
|
end
|
179
185
|
# Recurse on the behaviors' blocks
|
180
186
|
self.each_behavior do |beh|
|
@@ -196,9 +202,14 @@ module HDLRuby::High
|
|
196
202
|
|
197
203
|
## Gets the VCD variables with their long name.
|
198
204
|
def get_vars_with_fullname(vars_with_fullname = {})
|
199
|
-
# Adds the inner signals.
|
205
|
+
# # Adds the inner signals.
|
206
|
+
# self.each_inner do |sig|
|
207
|
+
# vars_with_fullname[sig] = HDLRuby::High.vcd_name(sig.fullname)
|
208
|
+
# end
|
209
|
+
# Recurse on the inner signals.
|
200
210
|
self.each_inner do |sig|
|
201
|
-
|
211
|
+
sig.get_vars_with_fullname(vars_with_fullname)
|
212
|
+
# vars_with_fullname[sig] = HDLRuby::High.vcd_name(sig.fullname)
|
202
213
|
end
|
203
214
|
# Recurse on the behaviors' blocks
|
204
215
|
self.each_behavior do |beh|
|
@@ -217,9 +228,13 @@ module HDLRuby::High
|
|
217
228
|
|
218
229
|
## Gets the VCD variables with their id string.
|
219
230
|
def get_vars_with_idstr(vars_with_idstr = {})
|
220
|
-
# Adds the inner signals.
|
231
|
+
# # Adds the inner signals.
|
232
|
+
# self.each_inner do |sig|
|
233
|
+
# vars_with_idstr[sig] = HDLRuby::High.vcd_idstr(sig)
|
234
|
+
# end
|
235
|
+
# Recurse on the inner signals.
|
221
236
|
self.each_inner do |sig|
|
222
|
-
|
237
|
+
sig.get_vars_with_idstr(vars_with_idstr)
|
223
238
|
end
|
224
239
|
# Recurse on the behaviors' blocks
|
225
240
|
self.each_behavior do |beh|
|
@@ -237,6 +252,53 @@ module HDLRuby::High
|
|
237
252
|
end
|
238
253
|
end
|
239
254
|
|
255
|
+
##
|
256
|
+
# Enhance the signals class with VCD support.
|
257
|
+
module SimSignal
|
258
|
+
## Shows the hierarchy of the variables.
|
259
|
+
def show_hierarchy(vcdout)
|
260
|
+
# puts "show_hierarcy for signal=#{self.name}"
|
261
|
+
if self.each_signal.any? then
|
262
|
+
# The signal is hierarchical, recurse on the sub signals.
|
263
|
+
vcdout << "$scope module #{HDLRuby::High.vcd_name(self.name)} $end\n"
|
264
|
+
self.each_signal { |sig| sig.show_hierarchy(vcdout) }
|
265
|
+
vcdout << "$upscope $end\n"
|
266
|
+
else
|
267
|
+
# This is a signal to show.
|
268
|
+
vcdout << "$var wire #{self.type.width} "
|
269
|
+
vcdout << "#{HDLRuby::High.vcd_idstr(self)} "
|
270
|
+
vcdout << "#{HDLRuby::High.vcd_name(self.name)} $end\n"
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
274
|
+
## Gets the VCD variables with their long name.
|
275
|
+
def get_vars_with_fullname(vars_with_fullname = {})
|
276
|
+
if self.each_signal.any? then
|
277
|
+
# There are sub signals, recurse on them.
|
278
|
+
self.each_signal do |sig|
|
279
|
+
sig.get_vars_with_fullname(vars_with_fullname)
|
280
|
+
end
|
281
|
+
else
|
282
|
+
# No add the current signal.
|
283
|
+
vars_with_fullname[self] = HDLRuby::High.vcd_name(self.fullname)
|
284
|
+
end
|
285
|
+
return vars_with_full_name
|
286
|
+
end
|
287
|
+
|
288
|
+
## Gets the VCD variables with their id string.
|
289
|
+
def get_vars_with_idstr(vars_with_idstr = {})
|
290
|
+
if self.each_signal.any? then
|
291
|
+
# There are sub signals, recurse on them.
|
292
|
+
self.each_signal do |sig|
|
293
|
+
sig.get_vars_with_idstr(vars_with_idstr)
|
294
|
+
end
|
295
|
+
else
|
296
|
+
# No add the current signal.
|
297
|
+
vars_with_idstr[self] = HDLRuby::High.vcd_idstr(self)
|
298
|
+
end
|
299
|
+
return vars_with_idstr
|
300
|
+
end
|
301
|
+
end
|
240
302
|
|
241
303
|
##
|
242
304
|
# Enhance the Transmit class with VCD support.
|
@@ -329,11 +391,12 @@ module HDLRuby::High
|
|
329
391
|
end
|
330
392
|
# Shows the inner signals.
|
331
393
|
self.each_inner do |sig|
|
332
|
-
|
333
|
-
|
334
|
-
# vcdout << "#{
|
335
|
-
vcdout << "#{HDLRuby::High.
|
336
|
-
vcdout << "#{HDLRuby::High.
|
394
|
+
sig.show_hierarchy(vcdout)
|
395
|
+
# # puts "showing inner signal #{HDLRuby::High.vcd_name(sig.fullname)}"
|
396
|
+
# vcdout << "$var wire #{sig.type.width} "
|
397
|
+
# # vcdout << "#{HDLRuby::High.vcd_name(sig.fullname)} "
|
398
|
+
# vcdout << "#{HDLRuby::High.vcd_idstr(sig)} "
|
399
|
+
# vcdout << "#{HDLRuby::High.vcd_name(sig.name)} $end\n"
|
337
400
|
end
|
338
401
|
# Recurse on the statements
|
339
402
|
self.each_statement do |stmnt|
|
@@ -347,9 +410,14 @@ module HDLRuby::High
|
|
347
410
|
|
348
411
|
## Gets the VCD variables with their long name.
|
349
412
|
def get_vars_with_fullname(vars_with_fullname = {})
|
350
|
-
# Adds the inner signals.
|
413
|
+
# # Adds the inner signals.
|
414
|
+
# self.each_inner do |sig|
|
415
|
+
# vars_with_fullname[sig] = HDLRuby::High.vcd_name(sig.fullname)
|
416
|
+
# end
|
417
|
+
# Recurse on the inner signals.
|
351
418
|
self.each_inner do |sig|
|
352
|
-
|
419
|
+
sig.get_vars_with_fullname(vars_with_fullname)
|
420
|
+
# vars_with_fullname[sig] = HDLRuby::High.vcd_name(sig.fullname)
|
353
421
|
end
|
354
422
|
# Recurse on the statements.
|
355
423
|
self.each_statement do |stmnt|
|
@@ -360,9 +428,13 @@ module HDLRuby::High
|
|
360
428
|
|
361
429
|
## Gets the VCD variables with their id string.
|
362
430
|
def get_vars_with_idstr(vars_with_idstr = {})
|
363
|
-
# Adds the inner signals.
|
431
|
+
# # Adds the inner signals.
|
432
|
+
# self.each_inner do |sig|
|
433
|
+
# vars_with_idstr[sig] = HDLRuby::High.vcd_idstr(sig)
|
434
|
+
# end
|
435
|
+
# Recurse on the inner signals.
|
364
436
|
self.each_inner do |sig|
|
365
|
-
|
437
|
+
sif.get_vars_with_idstr(vars_with_idstr)
|
366
438
|
end
|
367
439
|
# Recurse on the statements.
|
368
440
|
self.each_statement do |stmnt|
|
data/lib/HDLRuby/hruby_values.rb
CHANGED
@@ -13,6 +13,9 @@ module HDLRuby
|
|
13
13
|
|
14
14
|
# Truncs integer +val+ to +width+
|
15
15
|
def trunc(val,width)
|
16
|
+
if val.is_a?(BitString) then
|
17
|
+
return val[(width-1)..0]
|
18
|
+
end
|
16
19
|
if val.bit_length > width then
|
17
20
|
if val >= 0 then
|
18
21
|
# return val & (2**width-1)
|
@@ -38,8 +41,9 @@ module HDLRuby
|
|
38
41
|
unless val.to_value? then
|
39
42
|
# Not computable, use the former method that generates
|
40
43
|
# HDLRuby code.
|
41
|
-
return self.send(orig_operator(op),
|
44
|
+
return self.send(orig_operator(op),val)
|
42
45
|
end
|
46
|
+
val = val.to_value unless val.is_a?(Value)
|
43
47
|
# Handle Numeric op BitString case.
|
44
48
|
if self.content.is_a?(Numeric) && val.content.is_a?(BitString)
|
45
49
|
if val.content.specified? then
|
@@ -80,27 +84,29 @@ module HDLRuby
|
|
80
84
|
return self.send(orig_operator(op),val)
|
81
85
|
end
|
82
86
|
# Process left.
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
87
|
+
if left.is_a?(Value) then
|
88
|
+
left = left.content
|
89
|
+
if left.is_a?(BitString) && !left.specified? then
|
90
|
+
return self.class.new(self.type.base,
|
91
|
+
BitString::UNKNOWN.clone)
|
92
|
+
end
|
93
|
+
# left = left.to_i
|
94
|
+
left = self.trunc(left.to_i,val.first.type.width)
|
95
|
+
else
|
96
|
+
left = left.to_i
|
90
97
|
end
|
91
|
-
# left = left.to_i
|
92
|
-
left = self.trunc(left.to_i,val.first.type.width)
|
93
98
|
# Process right.
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
99
|
+
if right.is_a?(Value) then
|
100
|
+
right = right.content
|
101
|
+
if right.is_a?(BitString) && !right.specified? then
|
102
|
+
return self.class.new(self.type.base,
|
103
|
+
BitString::UNKNOWN.clone)
|
104
|
+
end
|
105
|
+
# right = right.to_i
|
106
|
+
right = self.trunc(right.to_i,val.last.type.width)
|
107
|
+
else
|
108
|
+
right = right.to_i
|
101
109
|
end
|
102
|
-
# right = right.to_i
|
103
|
-
right = self.trunc(right.to_i,val.last.type.width)
|
104
110
|
# Generate the resulting type.
|
105
111
|
res_type = self.type.base[(left-right+1).abs]
|
106
112
|
# Generate the resulting value.
|
@@ -124,18 +130,16 @@ module HDLRuby
|
|
124
130
|
return self.send(orig_operator(op),val)
|
125
131
|
end
|
126
132
|
# Process val.
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
133
|
+
if val.is_a?(Value) then
|
134
|
+
index = val.content
|
135
|
+
if index.is_a?(BitString) && !index.specified? then
|
136
|
+
return self.class.new(self.type.base,
|
137
|
+
BitString::UNKNOWN.clone)
|
138
|
+
end
|
139
|
+
index = self.trunc(index.to_i,val.type.width)
|
140
|
+
else
|
141
|
+
index = val.to_i
|
131
142
|
end
|
132
|
-
index = self.trunc(index.to_i,val.type.width)
|
133
|
-
# index = index.to_i
|
134
|
-
# if index >= self.type.size then
|
135
|
-
# # puts "index=#{index}"
|
136
|
-
# index %= self.type.size
|
137
|
-
# # puts "now index=#{index}"
|
138
|
-
# end
|
139
143
|
# Generate the resulting type.
|
140
144
|
res_type = self.type.base
|
141
145
|
# Generate the resulting value.
|
@@ -308,7 +312,7 @@ module HDLRuby
|
|
308
312
|
break if count == width
|
309
313
|
end
|
310
314
|
if count < width then
|
311
|
-
res_content.concat(res_content[-1] * (width-count))
|
315
|
+
res_content.concat([res_content[-1]] * (width-count))
|
312
316
|
end
|
313
317
|
else
|
314
318
|
width.times do |p|
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module HDLRuby::High::Std
|
2
|
+
|
3
|
+
# Describe a RAM compatibile with BRAM of FPGAs.
|
4
|
+
# - 'widthA': address bit width
|
5
|
+
# - 'widthD': data bit width
|
6
|
+
system :bram do |widthA, widthD|
|
7
|
+
input :clk, :rwb
|
8
|
+
[widthA].input :addr
|
9
|
+
[widthD].input :din
|
10
|
+
[widthD].output :dout
|
11
|
+
|
12
|
+
# puts "widthA=#{widthA} widthD=#{widthD}"
|
13
|
+
|
14
|
+
bit[widthD][-2**widthA].inner mem: [ :"_b#{"0"*widthD}".to_value ] * 2**widthA
|
15
|
+
|
16
|
+
par(clk.negedge) do
|
17
|
+
hif(rwb == 1) { mem[addr] <= din }
|
18
|
+
dout <= mem[addr]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
data/lib/HDLRuby/std/fixpoint.rb
CHANGED
@@ -55,14 +55,14 @@ module HDLRuby::High::Std
|
|
55
55
|
if (typ.signed?) then
|
56
56
|
(left.as(signed[isize+fsize*2])*right) >> fsize
|
57
57
|
else
|
58
|
-
(left.as([isize+fsize*2])*right) >> fsize
|
58
|
+
(left.as(bit[isize+fsize*2])*right) >> fsize
|
59
59
|
end
|
60
60
|
end
|
61
61
|
typ.define_operator(:/) do |left,right|
|
62
62
|
if (typ.signed?) then
|
63
63
|
(left.as(signed[isize+fsize*2]) << fsize) / right
|
64
64
|
else
|
65
|
-
(left.as([isize+fsize*2]) << fsize) / right
|
65
|
+
(left.as(bit[isize+fsize*2]) << fsize) / right
|
66
66
|
end
|
67
67
|
end
|
68
68
|
# Define the removal of the point.
|
data/lib/HDLRuby/std/fsm.rb
CHANGED
@@ -38,7 +38,8 @@ module HDLRuby::High::Std
|
|
38
38
|
@name = name.to_sym
|
39
39
|
# Check and set the type of fsm depending of the options.
|
40
40
|
@dual = false
|
41
|
-
@type = :sync
|
41
|
+
@type = :sync # By default, the FSM is synchronous.
|
42
|
+
@sequential = true # By default, the default next state is the next one in the list.
|
42
43
|
options.each do |opt|
|
43
44
|
case opt
|
44
45
|
when :sync,:synchronous then
|
@@ -47,6 +48,8 @@ module HDLRuby::High::Std
|
|
47
48
|
@type = :async
|
48
49
|
when :dual then
|
49
50
|
@dual = true
|
51
|
+
when :static then
|
52
|
+
@sequential = false
|
50
53
|
else
|
51
54
|
raise AnyError, "Invalid option for a fsm: :#{type}"
|
52
55
|
end
|
@@ -112,6 +115,7 @@ module HDLRuby::High::Std
|
|
112
115
|
mk_rst = @mk_rst
|
113
116
|
type = @type
|
114
117
|
dual = @dual
|
118
|
+
sequential = @sequential
|
115
119
|
extra_syncs = @extra_syncs
|
116
120
|
extra_asyncs = @extra_asyncs
|
117
121
|
default_codes = @default_codes
|
@@ -238,8 +242,10 @@ module HDLRuby::High::Std
|
|
238
242
|
else
|
239
243
|
# No gotos, by default the next step is
|
240
244
|
# current + 1
|
241
|
-
# this.next_state_sig <=
|
242
|
-
|
245
|
+
# this.next_state_sig <= this.cur_state_sig + 1
|
246
|
+
if sequential then
|
247
|
+
this.next_state_sig <= this.cur_state_sig + 1
|
248
|
+
end
|
243
249
|
end
|
244
250
|
end
|
245
251
|
end
|
@@ -406,6 +412,17 @@ module HDLRuby::High::Std
|
|
406
412
|
return result
|
407
413
|
end
|
408
414
|
|
415
|
+
# Get a state by +name+.
|
416
|
+
def get_state(name)
|
417
|
+
name = name.to_sym
|
418
|
+
(@states.detect { |st| st.name == name }).value
|
419
|
+
end
|
420
|
+
|
421
|
+
# Sets the next state by +name+.
|
422
|
+
def next_state(name)
|
423
|
+
@next_state_sig <= get_state(name)
|
424
|
+
end
|
425
|
+
|
409
426
|
# Sets the next state. Arguments can be:
|
410
427
|
#
|
411
428
|
# +name+: the name of the next state.
|
@@ -75,7 +75,7 @@ module HDLRuby::High::Std
|
|
75
75
|
base <= lut[address]
|
76
76
|
|
77
77
|
# Assign the next_data discrete value.
|
78
|
-
next_data <= lut[address+
|
78
|
+
next_data <= lut[address+_b1.as(address.type)]
|
79
79
|
end
|
80
80
|
|
81
81
|
|
@@ -107,7 +107,7 @@ module HDLRuby::High::Std
|
|
107
107
|
end
|
108
108
|
|
109
109
|
# Make the interpolation.
|
110
|
-
|
110
|
+
seq do
|
111
111
|
diff <= (next_data-base).as(diff.type) * remaining
|
112
112
|
if(otyp.signed?) then
|
113
113
|
interpolated_value <= base +
|
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.11.
|
4
|
+
version: 2.11.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lovic Gauthier
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-01-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -158,13 +158,13 @@ files:
|
|
158
158
|
- lib/HDLRuby/hdr_samples/seqpar_bench.rb
|
159
159
|
- lib/HDLRuby/hdr_samples/simple_counter_bench.rb
|
160
160
|
- lib/HDLRuby/hdr_samples/struct.rb
|
161
|
-
- lib/HDLRuby/hdr_samples/sumprod.rb
|
162
161
|
- lib/HDLRuby/hdr_samples/sw_encrypt_bench.rb
|
163
162
|
- lib/HDLRuby/hdr_samples/sw_encrypt_cpu_bench.rb
|
164
163
|
- lib/HDLRuby/hdr_samples/sw_encrypt_cpusim_bench.rb
|
165
164
|
- lib/HDLRuby/hdr_samples/system_open.rb
|
166
165
|
- lib/HDLRuby/hdr_samples/tuple.rb
|
167
166
|
- lib/HDLRuby/hdr_samples/type_minmax_bench.rb
|
167
|
+
- lib/HDLRuby/hdr_samples/with_bram.rb
|
168
168
|
- lib/HDLRuby/hdr_samples/with_casts.rb
|
169
169
|
- lib/HDLRuby/hdr_samples/with_channel.rb
|
170
170
|
- lib/HDLRuby/hdr_samples/with_channel_other.rb
|
@@ -174,6 +174,7 @@ files:
|
|
174
174
|
- lib/HDLRuby/hdr_samples/with_connector_memory.rb
|
175
175
|
- lib/HDLRuby/hdr_samples/with_decoder.rb
|
176
176
|
- lib/HDLRuby/hdr_samples/with_def.rb
|
177
|
+
- lib/HDLRuby/hdr_samples/with_define_operator.rb
|
177
178
|
- lib/HDLRuby/hdr_samples/with_delay.rb
|
178
179
|
- lib/HDLRuby/hdr_samples/with_fixpoint.rb
|
179
180
|
- lib/HDLRuby/hdr_samples/with_fsm.rb
|
@@ -181,6 +182,7 @@ files:
|
|
181
182
|
- lib/HDLRuby/hdr_samples/with_handshake.rb
|
182
183
|
- lib/HDLRuby/hdr_samples/with_init.rb
|
183
184
|
- lib/HDLRuby/hdr_samples/with_instance.rb
|
185
|
+
- lib/HDLRuby/hdr_samples/with_leftright.rb
|
184
186
|
- lib/HDLRuby/hdr_samples/with_linear.rb
|
185
187
|
- lib/HDLRuby/hdr_samples/with_loop.rb
|
186
188
|
- lib/HDLRuby/hdr_samples/with_memory.rb
|
@@ -287,6 +289,7 @@ files:
|
|
287
289
|
- lib/HDLRuby/hruby_low_without_outread.rb
|
288
290
|
- lib/HDLRuby/hruby_low_without_parinseq.rb
|
289
291
|
- lib/HDLRuby/hruby_low_without_select.rb
|
292
|
+
- lib/HDLRuby/hruby_low_without_subsignals.rb
|
290
293
|
- lib/HDLRuby/hruby_rcsim.rb
|
291
294
|
- lib/HDLRuby/hruby_rsim.rb
|
292
295
|
- lib/HDLRuby/hruby_rsim_mute.rb
|
@@ -339,6 +342,7 @@ files:
|
|
339
342
|
- lib/HDLRuby/low_samples/with_seq.yaml
|
340
343
|
- lib/HDLRuby/low_samples/yaml2hdr.rb
|
341
344
|
- lib/HDLRuby/low_samples/yaml2vhd.rb
|
345
|
+
- lib/HDLRuby/std/bram.rb
|
342
346
|
- lib/HDLRuby/std/channel.rb
|
343
347
|
- lib/HDLRuby/std/clocks.rb
|
344
348
|
- lib/HDLRuby/std/connector.rb
|
@@ -1,29 +0,0 @@
|
|
1
|
-
system :sumprod do |typ,coefs|
|
2
|
-
typ[coefs.size].input :ins
|
3
|
-
typ.output :o
|
4
|
-
|
5
|
-
o <= coefs.each_with_index.reduce(_0) do |sum,(coef,i)|
|
6
|
-
sum + ins[i]*coef
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
|
11
|
-
typedef :sat do |width, max|
|
12
|
-
signed[width]
|
13
|
-
end
|
14
|
-
|
15
|
-
|
16
|
-
sat.define_operator(:+) do |width,max, x,y|
|
17
|
-
[width].inner :res
|
18
|
-
seq do
|
19
|
-
res <= x + y
|
20
|
-
( res <= max ).hif(res > max)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
system :sumprod_sat_16_1000, sumprod(sat(16,1000),
|
27
|
-
[3,78,43,246, 3,67,1,8, 47,82,99,13, 5,77,2,4]) do
|
28
|
-
end
|
29
|
-
|