HDLRuby 3.0.0 → 3.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/HDLRuby.gemspec +1 -0
- data/README.md +149 -79
- data/ext/hruby_sim/hruby_rcsim_build.c +2 -0
- data/ext/hruby_sim/hruby_sim_calc.c +33 -6
- data/ext/hruby_sim/hruby_sim_tree_calc.c +111 -22
- data/lib/HDLRuby/hdr_samples/comparison_bench.rb +2 -2
- data/lib/HDLRuby/hdr_samples/constant_in_function.rb +2 -1
- data/lib/HDLRuby/hdr_samples/counter_bench.rb +1 -1
- data/lib/HDLRuby/hdr_samples/counter_dff_bench.rb +8 -7
- data/lib/HDLRuby/hdr_samples/dff_properties.rb +2 -0
- data/lib/HDLRuby/hdr_samples/enum_as_param.rb +52 -0
- data/lib/HDLRuby/hdr_samples/linear_test.rb +2 -0
- data/lib/HDLRuby/hdr_samples/logic_bench.rb +6 -0
- data/lib/HDLRuby/hdr_samples/mei8.rb +6 -6
- data/lib/HDLRuby/hdr_samples/mei8_bench.rb +6 -6
- data/lib/HDLRuby/hdr_samples/memory_test.rb +2 -0
- data/lib/HDLRuby/hdr_samples/named_sub.rb +9 -5
- data/lib/HDLRuby/hdr_samples/ram.rb +7 -6
- data/lib/HDLRuby/hdr_samples/ruby_fir_hw.rb +2 -0
- data/lib/HDLRuby/hdr_samples/struct.rb +15 -3
- data/lib/HDLRuby/hdr_samples/with_bram.rb +1 -1
- data/lib/HDLRuby/hdr_samples/with_bram_frame_stack.rb +1 -1
- data/lib/HDLRuby/hdr_samples/with_bram_stack.rb +1 -1
- data/lib/HDLRuby/hdr_samples/with_channel.rb +2 -0
- data/lib/HDLRuby/hdr_samples/with_channel_other.rb +2 -0
- data/lib/HDLRuby/hdr_samples/with_class.rb +3 -1
- data/lib/HDLRuby/hdr_samples/with_connector.rb +2 -0
- data/lib/HDLRuby/hdr_samples/with_connector_memory.rb +2 -0
- data/lib/HDLRuby/hdr_samples/with_fixpoint.rb +6 -0
- data/lib/HDLRuby/hdr_samples/with_fixpoint_adv.rb +73 -0
- data/lib/HDLRuby/hdr_samples/with_leftright.rb +1 -1
- data/lib/HDLRuby/hdr_samples/with_ref_expr.rb +30 -0
- data/lib/HDLRuby/hdr_samples/with_sequencer.rb +49 -37
- data/lib/HDLRuby/hdr_samples/with_sequencer_channel.rb +58 -0
- data/lib/HDLRuby/hdr_samples/with_sequencer_enumerable.rb +113 -69
- data/lib/HDLRuby/hdr_samples/with_sequencer_enumerator.rb +28 -14
- data/lib/HDLRuby/hdr_samples/with_sequencer_func.rb +63 -0
- data/lib/HDLRuby/hdr_samples/with_sequencer_sync.rb +2 -1
- data/lib/HDLRuby/hdrcc.rb +13 -1
- data/lib/HDLRuby/hruby_high.rb +105 -31
- data/lib/HDLRuby/hruby_low.rb +127 -3
- data/lib/HDLRuby/hruby_low2programs.rb +47 -0
- data/lib/HDLRuby/hruby_low_resolve.rb +3 -2
- data/lib/HDLRuby/hruby_low_without_namespace.rb +133 -5
- data/lib/HDLRuby/hruby_low_without_subsignals.rb +51 -12
- data/lib/HDLRuby/hruby_rcsim.rb +24 -1
- data/lib/HDLRuby/hruby_serializer.rb +2 -1
- data/lib/HDLRuby/hruby_types.rb +5 -5
- data/lib/HDLRuby/hruby_values.rb +7 -7
- data/lib/HDLRuby/hruby_verilog.rb +193 -35
- data/lib/HDLRuby/hruby_verilog_name.rb +35 -42
- data/lib/HDLRuby/std/fixpoint.rb +2 -2
- data/lib/HDLRuby/std/fsm.rb +10 -1
- data/lib/HDLRuby/std/function_generator.rb +1 -1
- data/lib/HDLRuby/std/linear.rb +7 -7
- data/lib/HDLRuby/std/sequencer.rb +538 -60
- data/lib/HDLRuby/std/sequencer_channel.rb +90 -0
- data/lib/HDLRuby/std/sequencer_func.rb +546 -0
- data/lib/HDLRuby/std/std.rb +2 -0
- data/lib/HDLRuby/version.rb +1 -1
- data/tuto/tutorial_sw.md +267 -61
- metadata +25 -4
- data/lib/HDLRuby/hdr_samples/with_register_stack.rb +0 -150
@@ -122,10 +122,17 @@ module HDLRuby::Low
|
|
122
122
|
# Extract the connections of the sub scopes.
|
123
123
|
cnxs = self.each_scope.map(&:extract_connections!).flatten
|
124
124
|
# Reinsert them to self.
|
125
|
-
cnxs.each { |
|
125
|
+
cnxs.each { |cnx| self.add_connection(cnx) }
|
126
|
+
|
127
|
+
# The fix the RefName using sub scopes since their target have
|
128
|
+
# been deplaced to current scope and renamed.
|
129
|
+
self_scopes = self.each_scope.to_a
|
130
|
+
self.each_behavior { |beh| beh.fix_scope_refnames!(self_scopes) }
|
131
|
+
self.each_connection { |cnx| cnx.fix_scope_refnames!(self_scopes) }
|
126
132
|
|
127
133
|
# Now can delete the sub scopes since they are empty.
|
128
|
-
self.each_scope.to_a.each { |scope| self.delete_scope!(scope) }
|
134
|
+
# self.each_scope.to_a.each { |scope| self.delete_scope!(scope) }
|
135
|
+
self_scopes.each { |scope| self.delete_scope!(scope) }
|
129
136
|
end
|
130
137
|
|
131
138
|
# Extract the behaviors from the scope and returns them into an array.
|
@@ -219,9 +226,10 @@ module HDLRuby::Low
|
|
219
226
|
# in the internals.
|
220
227
|
def replace_names_subs!(former,nname)
|
221
228
|
# puts "replace_names_subs! for #{self} with former=#{former} and nname=#{nname}"
|
222
|
-
|
223
|
-
|
224
|
-
|
229
|
+
# No need?
|
230
|
+
# self.each_type do |type|
|
231
|
+
# type.replace_names!(former,nname)
|
232
|
+
# end
|
225
233
|
self.each_systemT do |systemT|
|
226
234
|
systemT.replace_names!(former,nname)
|
227
235
|
end
|
@@ -460,6 +468,13 @@ module HDLRuby::Low
|
|
460
468
|
# Recurse on the block.
|
461
469
|
self.block.replace_names!(former,nname)
|
462
470
|
end
|
471
|
+
|
472
|
+
# Fix the references names using scopes given in +scopes + list (they
|
473
|
+
# are marked to be deleted).
|
474
|
+
def fix_scope_refnames!(scopes)
|
475
|
+
self.block.fix_scope_refnames!(scopes)
|
476
|
+
return self
|
477
|
+
end
|
463
478
|
end
|
464
479
|
|
465
480
|
|
@@ -498,6 +513,34 @@ module HDLRuby::Low
|
|
498
513
|
node.break_types!(types)
|
499
514
|
end
|
500
515
|
end
|
516
|
+
|
517
|
+
# Fix the references names using scopes given in +scopes + list (they
|
518
|
+
# are marked to be deleted).
|
519
|
+
def fix_scope_refnames!(scopes)
|
520
|
+
# By default, does nothing.
|
521
|
+
return self
|
522
|
+
end
|
523
|
+
end
|
524
|
+
|
525
|
+
|
526
|
+
class Transmit
|
527
|
+
# Fix the references names using scopes given in +scopes + list (they
|
528
|
+
# are marked to be deleted).
|
529
|
+
def fix_scope_refnames!(scopes)
|
530
|
+
self.set_left!(self.left.fix_scope_refnames!(scopes))
|
531
|
+
self.set_right!(self.right.fix_scope_refnames!(scopes))
|
532
|
+
return self
|
533
|
+
end
|
534
|
+
end
|
535
|
+
|
536
|
+
class Connection
|
537
|
+
# Fix the references names using scopes given in +scopes + list (they
|
538
|
+
# are marked to be deleted).
|
539
|
+
def fix_scope_refnames!(scopes)
|
540
|
+
self.set_left!(self.left.fix_scope_refnames!(scopes))
|
541
|
+
self.set_right!(self.right.fix_scope_refnames!(scopes))
|
542
|
+
return self
|
543
|
+
end
|
501
544
|
end
|
502
545
|
|
503
546
|
|
@@ -527,6 +570,16 @@ module HDLRuby::Low
|
|
527
570
|
end
|
528
571
|
end
|
529
572
|
end
|
573
|
+
|
574
|
+
# Fix the references names using scopes given in +scopes + list (they
|
575
|
+
# are marked to be deleted).
|
576
|
+
def fix_scope_refnames!(scopes)
|
577
|
+
# By default: recurse.
|
578
|
+
self.map_nodes! do |node|
|
579
|
+
node.fix_scope_refnames!(scopes)
|
580
|
+
end
|
581
|
+
return self
|
582
|
+
end
|
530
583
|
end
|
531
584
|
|
532
585
|
|
@@ -578,6 +631,24 @@ module HDLRuby::Low
|
|
578
631
|
# Recurse on the no if any.
|
579
632
|
self.no.replace_names!(former,nname) if self.no
|
580
633
|
end
|
634
|
+
|
635
|
+
# Fix the references names using scopes given in +scopes + list (they
|
636
|
+
# are marked to be deleted).
|
637
|
+
def fix_scope_refnames!(scopes)
|
638
|
+
# Fix the condition.
|
639
|
+
self.set_condition!(self.condition.fix_scope_refnames!(scopes))
|
640
|
+
# Recurse on the yes.
|
641
|
+
self.yes.fix_scope_refnames!(scopes)
|
642
|
+
# Recurse on the alternate ifs.
|
643
|
+
self.map_noifs! do |cond,stmnt|
|
644
|
+
cond = cond.fix_scope_refnames!(scopes)
|
645
|
+
stmnt = stmnt.fix_scope_refnames!(scopes)
|
646
|
+
[cond,stmnt]
|
647
|
+
end
|
648
|
+
# Recruse on the no if any.
|
649
|
+
self.no.fix_scope_refnames!(scopes) if self.no
|
650
|
+
return self
|
651
|
+
end
|
581
652
|
end
|
582
653
|
|
583
654
|
|
@@ -618,6 +689,16 @@ module HDLRuby::Low
|
|
618
689
|
end
|
619
690
|
end
|
620
691
|
end
|
692
|
+
|
693
|
+
# Fix the references names using scopes given in +scopes + list (they
|
694
|
+
# are marked to be deleted).
|
695
|
+
def fix_scope_refnames!(scopes)
|
696
|
+
# Fix the match.
|
697
|
+
self.set_match!(self.match.fix_scope_refnames!(scopes))
|
698
|
+
# Recurse on the statement.
|
699
|
+
self.statement.fix_scope_refnames!(scopes)
|
700
|
+
return self
|
701
|
+
end
|
621
702
|
end
|
622
703
|
|
623
704
|
|
@@ -655,6 +736,18 @@ module HDLRuby::Low
|
|
655
736
|
# Recurse on the default.
|
656
737
|
self.default.replace_names!(former,nname) if self.default
|
657
738
|
end
|
739
|
+
|
740
|
+
# Fix the references names using scopes given in +scopes + list (they
|
741
|
+
# are marked to be deleted).
|
742
|
+
def fix_scope_refnames!(scopes)
|
743
|
+
# Fix the value.
|
744
|
+
self.set_value!(self.value.fix_scope_refnames!(scopes))
|
745
|
+
# Recurse on the whens.
|
746
|
+
self.each_when {|w| w.fix_scope_refnames!(scopes) }
|
747
|
+
# Recurse on the default.
|
748
|
+
self.default.fix_scope_refnames!(scopes) if self.default
|
749
|
+
return self
|
750
|
+
end
|
658
751
|
end
|
659
752
|
|
660
753
|
|
@@ -681,6 +774,14 @@ module HDLRuby::Low
|
|
681
774
|
# Recurse on the statement.
|
682
775
|
self.statement.replace_names!(former,nname)
|
683
776
|
end
|
777
|
+
|
778
|
+
# Fix the references names using scopes given in +scopes + list (they
|
779
|
+
# are marked to be deleted).
|
780
|
+
def fix_scope_refnames!(scopes)
|
781
|
+
# Recurse on the statement.
|
782
|
+
self.statement.fix_scope_refnames!(scopes)
|
783
|
+
return self
|
784
|
+
end
|
684
785
|
end
|
685
786
|
|
686
787
|
|
@@ -738,6 +839,33 @@ module HDLRuby::Low
|
|
738
839
|
# Recurse on the sub scopes and behaviors.
|
739
840
|
replace_names_subs!(former,nname)
|
740
841
|
end
|
842
|
+
|
843
|
+
# Fix the references names using scopes given in +scopes + list (they
|
844
|
+
# are marked to be deleted).
|
845
|
+
def fix_scope_refnames!(scopes)
|
846
|
+
self.each_statement {|stmnt| stmnt.fix_scope_refnames!(scopes) }
|
847
|
+
return self
|
848
|
+
end
|
849
|
+
end
|
850
|
+
|
851
|
+
|
852
|
+
class RefName
|
853
|
+
include ForceName
|
854
|
+
|
855
|
+
# Fix the references names using scopes given in +scopes + list (they
|
856
|
+
# are marked to be deleted).
|
857
|
+
def fix_scope_refnames!(scopes)
|
858
|
+
return self unless self.ref.is_a?(RefName)
|
859
|
+
# puts "fix_scope_refnames! with self.name=#{name} and self.ref=#{self.ref}"
|
860
|
+
# Recurse on the ref.
|
861
|
+
self.set_ref!(self.ref.fix_scope_refnames!(scopes))
|
862
|
+
# Rename and curt the subref if referening to one of the scopes.
|
863
|
+
if scopes.find {|scope| scope.name == self.ref.name } then
|
864
|
+
self.ref.extend_name!(self)
|
865
|
+
self.set_ref!(RefThis.new)
|
866
|
+
end
|
867
|
+
return self
|
868
|
+
end
|
741
869
|
end
|
742
870
|
|
743
871
|
end
|
@@ -18,10 +18,24 @@ module HDLRuby::Low
|
|
18
18
|
## Extends the SystemT class with functionality for decomposing the
|
19
19
|
# hierachical signals in the statements.
|
20
20
|
|
21
|
+
# # Decompose the hierarchical signals in the statements.
|
22
|
+
# def signal2subs!
|
23
|
+
# self.scope.signal2subs!
|
24
|
+
# end
|
25
|
+
|
21
26
|
# Decompose the hierarchical signals in the statements.
|
22
|
-
|
27
|
+
# If +decompose_vec2d+ is true then also decompose 2 dimension vectors
|
28
|
+
# (e.g., for Verilog HDL that does not support handling such signals
|
29
|
+
# as usual expressions).
|
30
|
+
def signal2subs!(decompose_vec2d = false)
|
31
|
+
@@decompose_vec2d = decompose_vec2d == true
|
23
32
|
self.scope.signal2subs!
|
24
33
|
end
|
34
|
+
|
35
|
+
## Tell if 2d vector signals must be decomposed too.
|
36
|
+
def self.decompose_vec2d?
|
37
|
+
@@decompose_vec2d
|
38
|
+
end
|
25
39
|
end
|
26
40
|
|
27
41
|
|
@@ -229,17 +243,41 @@ module HDLRuby::Low
|
|
229
243
|
# Flatten a reference to a list of reference to leaf signals
|
230
244
|
# from signal +sig+ and add to result to +subrefs+
|
231
245
|
def flatten_to(sig,subrefs)
|
232
|
-
#
|
233
|
-
#
|
234
|
-
sig.
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
246
|
+
# Shall we decompose 2d vectors, and is the current signal
|
247
|
+
# for one of them?
|
248
|
+
if SystemT.decompose_vec2d? and sig.type.is_a?(TypeVector) and
|
249
|
+
sig.type.base.is_a?(TypeVector) then
|
250
|
+
# Is the reference used other than for a memory access?
|
251
|
+
unless self.parent.is_a?(RefIndex) then
|
252
|
+
# Yes, do the decomposition.
|
253
|
+
# Selects the direction.
|
254
|
+
rng = sig.type.range
|
255
|
+
if rng.first > rng.last then
|
256
|
+
itr = (rng.last..rng.first).each
|
257
|
+
else
|
258
|
+
itr = rng.reverse_each
|
259
|
+
end
|
260
|
+
# Iterate on each element.
|
261
|
+
itr.each do |i|
|
262
|
+
# Create a reference fo the sub.
|
263
|
+
subref = RefIndex.new(sig.type.base,self.clone,
|
264
|
+
Value.new(TypeUnsigned.new(:""),i))
|
265
|
+
# Add it.
|
266
|
+
subrefs << subref
|
267
|
+
end
|
268
|
+
end
|
269
|
+
else
|
270
|
+
# Work on the sub signals if any.
|
271
|
+
sig.each_signal do |sub|
|
272
|
+
# Create a reference for the sub.
|
273
|
+
subref = RefName.new(sub.type,self.clone,sub.name)
|
274
|
+
# Recurse on it.
|
275
|
+
subref.flatten_to(sub,subrefs)
|
276
|
+
# Was it a leaf?
|
277
|
+
unless sub.each_signal.any? then
|
278
|
+
# Yes, add its new ref to the list of subs.
|
279
|
+
subrefs << subref
|
280
|
+
end
|
243
281
|
end
|
244
282
|
end
|
245
283
|
end
|
@@ -255,6 +293,7 @@ module HDLRuby::Low
|
|
255
293
|
# Decompose the hierarchical signals in the statements.
|
256
294
|
def signal2subs!
|
257
295
|
# puts "signal2subs! for RefName: #{self.name}"
|
296
|
+
return self if self.type == void # Not a singal anyway.
|
258
297
|
# Decompose it to a list of reference to each leaf sub signal.
|
259
298
|
subrefs = []
|
260
299
|
self.flatten_to(self.resolve,subrefs)
|
data/lib/HDLRuby/hruby_rcsim.rb
CHANGED
@@ -1000,7 +1000,30 @@ module HDLRuby::High
|
|
1000
1000
|
|
1001
1001
|
class RefName
|
1002
1002
|
## Extends the RefName class for hybrid Ruby-C simulation.
|
1003
|
-
#
|
1003
|
+
# Converted to RefRange.
|
1004
|
+
|
1005
|
+
# Generate the C description of the reference range (not ref name!).
|
1006
|
+
def to_rcsim
|
1007
|
+
# Convert the base to a bit vector.
|
1008
|
+
type_base = Bit[self.ref.type.width]
|
1009
|
+
# self.ref.parent = nil
|
1010
|
+
# bit_base = Cast.new(type_base,self.ref)
|
1011
|
+
bit_base = RCSim.rcsim_make_cast(type_base.to_rcsim,self.ref.to_rcsim)
|
1012
|
+
# Compute range in bits of the field.
|
1013
|
+
last = 0
|
1014
|
+
self.ref.type.each.detect do |name,typ|
|
1015
|
+
last += typ.width
|
1016
|
+
name == self.name
|
1017
|
+
end
|
1018
|
+
first = last-self.type.width
|
1019
|
+
last -= 1
|
1020
|
+
# puts "name=#{self.name} first=#{first} last=#{last}"
|
1021
|
+
type_int = Bit[type_base.width.width]
|
1022
|
+
return RCSim.rcsim_make_refRange(self.type.to_rcsim,
|
1023
|
+
Value.new(type_int,last).to_rcsim,
|
1024
|
+
Value.new(type_int,first).to_rcsim,
|
1025
|
+
bit_base)
|
1026
|
+
end
|
1004
1027
|
end
|
1005
1028
|
|
1006
1029
|
|
@@ -23,7 +23,8 @@ module HDLRuby
|
|
23
23
|
Low::TypeSigned, Low::TypeUnsigned, Low::TypeFloat,
|
24
24
|
Low::TypeTuple, Low::TypeStruct,
|
25
25
|
Low::Behavior, Low::TimeBehavior,
|
26
|
-
Low::Event, Low::Block, Low::TimeBlock,
|
26
|
+
Low::Event, Low::Block, Low::TimeBlock,
|
27
|
+
Low::Program, Low::Code,
|
27
28
|
Low::SignalI, Low::SignalC,
|
28
29
|
Low::SystemI, Low::Connection,
|
29
30
|
Low::Transmit, Low::If, Low::Case, Low::When, Low::Cast,
|
data/lib/HDLRuby/hruby_types.rb
CHANGED
@@ -42,13 +42,13 @@ module HDLRuby
|
|
42
42
|
elsif type.float? then
|
43
43
|
return type
|
44
44
|
elsif self.signed? then
|
45
|
-
|
45
|
+
if type.signed? then
|
46
|
+
return self.width >= type.width ? self : type
|
47
|
+
else
|
48
|
+
return self
|
49
|
+
end
|
46
50
|
elsif type.signed? then
|
47
51
|
return type
|
48
|
-
elsif self.unsigned? then
|
49
|
-
return self
|
50
|
-
elsif type.unsigned? then
|
51
|
-
return type
|
52
52
|
elsif self.width >= type.width then
|
53
53
|
return self
|
54
54
|
else
|
data/lib/HDLRuby/hruby_values.rb
CHANGED
@@ -253,6 +253,7 @@ module HDLRuby
|
|
253
253
|
# Cast to +type+.
|
254
254
|
# NOTE: nodir tells if the direction is to be ignored.
|
255
255
|
def cast(type,nodir = false)
|
256
|
+
# puts "cast with content=#{self.content} type.signed=#{type.signed?} type.width=#{type.width}"
|
256
257
|
# Handle the direction.
|
257
258
|
if !nodir && type.direction != self.type.direction then
|
258
259
|
if self.content.is_a?(Numeric) then
|
@@ -281,19 +282,18 @@ module HDLRuby
|
|
281
282
|
res_content.positive!
|
282
283
|
end
|
283
284
|
end
|
284
|
-
if type.signed && res_content.is_a?(Numeric) && res_content >= (1 << (type.width-1)) then
|
285
|
+
if type.signed? && res_content.is_a?(Numeric) && res_content >= (1 << (type.width-1)) then
|
285
286
|
res_content = (-1 << type.width) + res_content
|
286
287
|
end
|
287
|
-
# # truncs to the right size if necessary.
|
288
|
-
# if res_content.is_a?(BitString) then
|
289
|
-
# res_content.trunc!(type.width)
|
290
|
-
# else
|
291
|
-
# res_content = self.trunc(res_content,type.width)
|
292
|
-
# end
|
293
288
|
# Generate the resulting value.
|
289
|
+
# puts "res_content=#{res_content}"
|
294
290
|
return self.class.new(type,res_content)
|
295
291
|
end
|
296
292
|
|
293
|
+
def as(typ)
|
294
|
+
return self.cast(typ)
|
295
|
+
end
|
296
|
+
|
297
297
|
# Concat the content of +vals+.
|
298
298
|
def self.concat(*vals)
|
299
299
|
# Compute the resulting type.
|