HDLRuby 2.7.5 → 2.7.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/HDLRuby/hdr_samples/parseq_bench.rb +61 -0
- data/lib/HDLRuby/hdr_samples/range_bench.rb +4 -1
- data/lib/HDLRuby/hdr_samples/rom_nest.rb +27 -0
- data/lib/HDLRuby/hdr_samples/with_channel_other.rb +128 -0
- data/lib/HDLRuby/hruby_high.rb +61 -23
- data/lib/HDLRuby/hruby_low.rb +2 -0
- data/lib/HDLRuby/hruby_low2c.rb +83 -51
- data/lib/HDLRuby/hruby_low_resolve.rb +30 -1
- data/lib/HDLRuby/hruby_tools.rb +1 -0
- data/lib/HDLRuby/sim/hruby_sim_core.c +5 -2
- 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: 2c66f2d8f552623dabccc43ea54a7246d49eb42a6aaf0f6b8a1977e7675221ca
|
4
|
+
data.tar.gz: 10f9b15022166b3fdb90a9a026653f3fec8b5a05f807e468dfed2d1c97d9adf7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3c56c51a83e75ddd03d34d0c305a17595c362077010213e299baf60e8a7e0b52e745c6b8f9ada7db3c4931b99809376ffdc54f3f4bbb122e002a82419f39e7fb
|
7
|
+
data.tar.gz: 3f056bd7523dea35b03188aa689a232afeadb7c24f7608f3207fc2479503081e1e1ce0a55c2ad3cc805721b60e7d559d464d9fa89a6f79f3f962388254eac6e7
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# Check of various par and seq.
|
2
|
+
|
3
|
+
# A benchmark for the dff.
|
4
|
+
system :parseq_bench do
|
5
|
+
[4].inner :x0, :x1, :x2, :x3
|
6
|
+
[4].inner :y0, :y1, :y2, :y3
|
7
|
+
[4].inner :z00, :z01
|
8
|
+
[4].inner :z10, :z11
|
9
|
+
[4].inner :z20, :z21
|
10
|
+
[4].inner :z30, :z31
|
11
|
+
[4].inner :u0, :u1, :u2, :u3
|
12
|
+
bit[4][-16].constant mem: 16.times.to_a
|
13
|
+
|
14
|
+
par(x0) do
|
15
|
+
z00 <= x0 + y0
|
16
|
+
z01 <= z00 + 1
|
17
|
+
u0 <= mem[z00]
|
18
|
+
end
|
19
|
+
|
20
|
+
seq(y1) do
|
21
|
+
z10 <= x1 + y1
|
22
|
+
z11 <= z10 + 1
|
23
|
+
u1 <= mem[z10]
|
24
|
+
end
|
25
|
+
|
26
|
+
seq(x2,y2) do
|
27
|
+
z20 <= x2 + y2
|
28
|
+
z21 <= z20 + 1
|
29
|
+
u2 <= mem[z20]
|
30
|
+
end
|
31
|
+
|
32
|
+
par do
|
33
|
+
bit[4].constant inc: 1
|
34
|
+
z30 <= x3 + y3
|
35
|
+
z31 <= z30 + inc
|
36
|
+
u3 <= mem[z30]
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
timed do
|
41
|
+
x0 <= 1
|
42
|
+
x1 <= 1
|
43
|
+
x2 <= 1
|
44
|
+
x3 <= 1
|
45
|
+
!10.ns
|
46
|
+
y0 <= 2
|
47
|
+
y1 <= 2
|
48
|
+
y2 <= 2
|
49
|
+
y3 <= 2
|
50
|
+
!10.ns
|
51
|
+
x0 <= 3
|
52
|
+
x1 <= 3
|
53
|
+
x2 <= 3
|
54
|
+
x3 <= 3
|
55
|
+
y0 <= 4
|
56
|
+
y1 <= 4
|
57
|
+
y2 <= 4
|
58
|
+
y3 <= 4
|
59
|
+
!10.ns
|
60
|
+
end
|
61
|
+
end
|
@@ -3,13 +3,16 @@
|
|
3
3
|
# A benchmark for the index access..
|
4
4
|
system :if_bench do
|
5
5
|
[8].inner :x
|
6
|
-
[2].inner :r0,:r1,:r2,:r3
|
6
|
+
[2].inner :r0,:r1,:r2,:r3, :r4
|
7
|
+
inner :r5
|
7
8
|
|
8
9
|
par do
|
9
10
|
r0 <= x[1..0]
|
10
11
|
r1 <= x[3..2]
|
11
12
|
r2 <= x[5..4]
|
12
13
|
r3 <= x[7..6]
|
14
|
+
r4 <= x[-1..-2]
|
15
|
+
r5 <= x[-1]
|
13
16
|
end
|
14
17
|
|
15
18
|
timed do
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# Rom access generator, def case.
|
2
|
+
def rom_gen(addr,&func)
|
3
|
+
bit[8][-8].constant tbl? => 8.times.map {|i| func.(i).to_i }
|
4
|
+
tbl![addr]
|
5
|
+
end
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
system :test_rom do
|
10
|
+
[2..0].inner :addr
|
11
|
+
[7..0].inner :data0, :data1, :data2, :data3
|
12
|
+
|
13
|
+
data0 <= rom_gen(addr) { |i| i*i }
|
14
|
+
data1 <= rom_gen(addr) { |i| i*i }
|
15
|
+
|
16
|
+
par do
|
17
|
+
data2 <= rom_gen(addr) { |i| i*i }
|
18
|
+
data3 <= rom_gen(addr) { |i| i*i }
|
19
|
+
end
|
20
|
+
|
21
|
+
timed do
|
22
|
+
8.times do |i|
|
23
|
+
addr <= i
|
24
|
+
!10.ns
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
require 'std/channel.rb'
|
2
|
+
require 'std/hruby_unit.rb'
|
3
|
+
|
4
|
+
include HDLRuby::High::Std
|
5
|
+
|
6
|
+
# A clocked handshake channel for testing purpuse.
|
7
|
+
channel(:handshake) do |typ,clk|
|
8
|
+
inner has_data: 0
|
9
|
+
inner :set_data
|
10
|
+
inner :get_data
|
11
|
+
typ.inner :data, :data_val
|
12
|
+
|
13
|
+
writer_input :has_data
|
14
|
+
writer_output :set_data, :data_val
|
15
|
+
reader_input :has_data, :data
|
16
|
+
reader_output :get_data
|
17
|
+
|
18
|
+
par(clk.negedge) do
|
19
|
+
hif(set_data) do
|
20
|
+
data <= data_val
|
21
|
+
has_data <= 1
|
22
|
+
end
|
23
|
+
helsif(get_data) do
|
24
|
+
has_data <= 0
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# The writer.
|
29
|
+
writer do |blk,target|
|
30
|
+
hif(~has_data) do
|
31
|
+
set_data <= 1
|
32
|
+
data_val <= target
|
33
|
+
blk.call if blk
|
34
|
+
end
|
35
|
+
helse { set_data <= 0 }
|
36
|
+
end
|
37
|
+
|
38
|
+
# The reader
|
39
|
+
reader do |blk,target|
|
40
|
+
hif(has_data) do
|
41
|
+
target <= data
|
42
|
+
get_data <= 1
|
43
|
+
blk.call if blk
|
44
|
+
end
|
45
|
+
helse { get_data <= 0 }
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
# A system writing indefinitely to a channel.
|
52
|
+
# Checking usage of channel without declaring a port.
|
53
|
+
system :producer8 do |channel|
|
54
|
+
# Inputs of the producer: clock and reset.
|
55
|
+
input :clk, :rst
|
56
|
+
# Inner 8-bit counter for generating values.
|
57
|
+
[8].inner :counter
|
58
|
+
|
59
|
+
# The value production process
|
60
|
+
par(clk.posedge) do
|
61
|
+
hif(rst) { counter <= 0 }
|
62
|
+
helse do
|
63
|
+
channel.write(counter) { counter <= counter + 1 }
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# A system reading indefinitely from a channel.
|
69
|
+
system :consummer8 do |channel|
|
70
|
+
# Input of the consummer: a clock is enough.
|
71
|
+
input :clk
|
72
|
+
# # Instantiate the channel ports
|
73
|
+
# channel.input :ch
|
74
|
+
# Inner buffer for storing the cunsummed value.
|
75
|
+
[8].inner :buf
|
76
|
+
|
77
|
+
# The value consumption process
|
78
|
+
par(clk.posedge) do
|
79
|
+
channel.read(buf)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
# A system testing the handshaker.
|
85
|
+
Unit.system :hs_test do
|
86
|
+
inner :clk,:rst
|
87
|
+
|
88
|
+
# Declares two handshakers
|
89
|
+
handshake(bit[8],clk).(:hs)
|
90
|
+
|
91
|
+
# For the first handshake
|
92
|
+
|
93
|
+
# Instantiate the producer.
|
94
|
+
producer8(hs).(:producerI).(clk,rst)
|
95
|
+
|
96
|
+
# Instantiate the consummer.
|
97
|
+
consummer8(hs).(:consummerI).(clk)
|
98
|
+
|
99
|
+
test do
|
100
|
+
clk <= 0
|
101
|
+
rst <= 0
|
102
|
+
!10.ns
|
103
|
+
clk <= 1
|
104
|
+
!10.ns
|
105
|
+
clk <= 0
|
106
|
+
rst <= 1
|
107
|
+
!10.ns
|
108
|
+
clk <= 1
|
109
|
+
!10.ns
|
110
|
+
clk <= 0
|
111
|
+
!10.ns
|
112
|
+
!10.ns
|
113
|
+
clk <= 1
|
114
|
+
!10.ns
|
115
|
+
clk <= 0
|
116
|
+
rst <= 0
|
117
|
+
!10.ns
|
118
|
+
clk <= 1
|
119
|
+
!10.ns
|
120
|
+
10.times do
|
121
|
+
clk <= 0
|
122
|
+
!10.ns
|
123
|
+
clk <= 1
|
124
|
+
!10.ns
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
data/lib/HDLRuby/hruby_high.rb
CHANGED
@@ -133,6 +133,8 @@ module HDLRuby::High
|
|
133
133
|
module Hmissing
|
134
134
|
High = HDLRuby::High
|
135
135
|
|
136
|
+
NAMES = { }
|
137
|
+
|
136
138
|
# Missing methods may be immediate values, if not, they are looked up
|
137
139
|
# in the upper level of the namespace if any.
|
138
140
|
def method_missing(m, *args, &ruby_block)
|
@@ -140,6 +142,20 @@ module HDLRuby::High
|
|
140
142
|
# Is the missing method an immediate value?
|
141
143
|
value = m.to_value
|
142
144
|
return value if value and args.empty?
|
145
|
+
# Or is it a uniq name generator?
|
146
|
+
if (m[-1] == '?') then
|
147
|
+
# Yes
|
148
|
+
m = m[0..-2]
|
149
|
+
return NAMES[m] = HDLRuby.uniq_name(m)
|
150
|
+
end
|
151
|
+
# Is in a previous uniq name?
|
152
|
+
if (m[-1] == '!') then
|
153
|
+
pm = m[0..-2]
|
154
|
+
if NAMES.key?(pm) then
|
155
|
+
# Yes, returns the current corresponding uniq name.
|
156
|
+
return self.send(NAMES[pm],*args,&ruby_block)
|
157
|
+
end
|
158
|
+
end
|
143
159
|
# No, is there an upper namespace, i.e. is the current object
|
144
160
|
# present in the space?
|
145
161
|
if High.space_index(self) then
|
@@ -832,8 +848,7 @@ module HDLRuby::High
|
|
832
848
|
# Initialize the set of included systems.
|
833
849
|
@includes = {}
|
834
850
|
|
835
|
-
# Builds the scope if a ruby block is provided
|
836
|
-
# (which means the scope is not the top of a system).
|
851
|
+
# Builds the scope if a ruby block is provided.
|
837
852
|
self.build(&ruby_block) if block_given?
|
838
853
|
end
|
839
854
|
|
@@ -944,18 +959,20 @@ module HDLRuby::High
|
|
944
959
|
# Set the namespace for buidling the scope.
|
945
960
|
High.space_push(@namespace)
|
946
961
|
# Build the scope.
|
947
|
-
|
948
|
-
res = High.top_user.instance_eval(&ruby_block)
|
962
|
+
@return_value = High.top_user.instance_eval(&ruby_block)
|
963
|
+
# res = High.top_user.instance_eval(&ruby_block)
|
949
964
|
High.space_pop
|
950
|
-
# Now gain access to the result within the sub scope.
|
951
|
-
if (res.is_a?(HRef)) then
|
952
|
-
|
953
|
-
|
954
|
-
|
955
|
-
|
956
|
-
|
957
|
-
|
958
|
-
|
965
|
+
# # Now gain access to the result within the sub scope.
|
966
|
+
# # if (res.is_a?(HRef)) then
|
967
|
+
# if (res.is_a?(HExpression)) then
|
968
|
+
# High.space_push(@namespace)
|
969
|
+
# @return_value = res.type.inner(HDLRuby.uniq_name)
|
970
|
+
# @return_value <= res
|
971
|
+
# High.space_pop
|
972
|
+
# @return_value = RefObject.new(self,@return_value)
|
973
|
+
# else
|
974
|
+
# @return_value = res
|
975
|
+
# end
|
959
976
|
# This will be the return value.
|
960
977
|
@return_value
|
961
978
|
end
|
@@ -1087,10 +1104,12 @@ module HDLRuby::High
|
|
1087
1104
|
# Declares a sub scope with possible +name+ and built from +ruby_block+.
|
1088
1105
|
def sub(name = :"", &ruby_block)
|
1089
1106
|
# Creates the new scope.
|
1090
|
-
scope = Scope.new(name,&ruby_block)
|
1091
|
-
|
1107
|
+
# scope = Scope.new(name,&ruby_block)
|
1108
|
+
scope = Scope.new(name)
|
1092
1109
|
# Add it
|
1093
1110
|
self.add_scope(scope)
|
1111
|
+
# Build it.
|
1112
|
+
scope.build(&ruby_block)
|
1094
1113
|
# puts "self=#{self}"
|
1095
1114
|
# puts "self scopes=#{self.each_scope.to_a.join(",")}"
|
1096
1115
|
# Use its return value
|
@@ -1965,9 +1984,6 @@ module HDLRuby::High
|
|
1965
1984
|
&ruby_block)
|
1966
1985
|
# ruby_block.call(*args)
|
1967
1986
|
end
|
1968
|
-
# sub do
|
1969
|
-
# ruby_block.call(*args,*other_block)
|
1970
|
-
# end
|
1971
1987
|
end
|
1972
1988
|
else
|
1973
1989
|
define_method(name.to_sym) do |*args,&other_block|
|
@@ -1975,10 +1991,8 @@ module HDLRuby::High
|
|
1975
1991
|
sub(HDLRuby.uniq_name(name)) do
|
1976
1992
|
HDLRuby::High.top_user.instance_exec(*args,*other_block,
|
1977
1993
|
&ruby_block)
|
1994
|
+
# ruby_block.call(*args,*other_block)
|
1978
1995
|
end
|
1979
|
-
# sub do
|
1980
|
-
# ruby_block.call(*args,*other_block)
|
1981
|
-
# end
|
1982
1996
|
end
|
1983
1997
|
end
|
1984
1998
|
end
|
@@ -2671,6 +2685,20 @@ module HDLRuby::High
|
|
2671
2685
|
#
|
2672
2686
|
# NOTE: +rng+ can be a single expression in which case it is an index.
|
2673
2687
|
def [](rng)
|
2688
|
+
if rng.is_a?(::Range) then
|
2689
|
+
first = rng.first
|
2690
|
+
if (first.is_a?(::Integer)) then
|
2691
|
+
first = self.type.size+first if first < 0
|
2692
|
+
end
|
2693
|
+
last = rng.last
|
2694
|
+
if (last.is_a?(::Integer)) then
|
2695
|
+
last = self.type.size+last if last < 0
|
2696
|
+
end
|
2697
|
+
rng = first..last
|
2698
|
+
end
|
2699
|
+
if rng.is_a?(::Integer) && rng < 0 then
|
2700
|
+
rng = self.type.size+rng
|
2701
|
+
end
|
2674
2702
|
if rng.respond_to?(:to_expr) then
|
2675
2703
|
# Number range: convert it to an expression.
|
2676
2704
|
rng = rng.to_expr
|
@@ -3007,6 +3035,7 @@ module HDLRuby::High
|
|
3007
3035
|
|
3008
3036
|
# Creates a new reference from a +base+ reference and named +object+.
|
3009
3037
|
def initialize(base,object)
|
3038
|
+
# puts "New RefObjet with base=#{base}, object=#{object.name}"
|
3010
3039
|
if object.respond_to?(:type) then
|
3011
3040
|
# Typed object, so typed reference.
|
3012
3041
|
super(object.type)
|
@@ -3043,7 +3072,7 @@ module HDLRuby::High
|
|
3043
3072
|
|
3044
3073
|
# Converts the name reference to a HDLRuby::Low::RefName.
|
3045
3074
|
def to_low
|
3046
|
-
# puts "to_low with base=#{@base} @object=#{@object}"
|
3075
|
+
# puts "to_low with base=#{@base} @object=#{@object.name}"
|
3047
3076
|
refNameL = HDLRuby::Low::RefName.new(self.type.to_low,
|
3048
3077
|
@base.to_ref.to_low,@object.name)
|
3049
3078
|
# # For debugging: set the source high object
|
@@ -3608,6 +3637,15 @@ module HDLRuby::High
|
|
3608
3637
|
High.space_push(@namespace)
|
3609
3638
|
@return_value = High.top_user.instance_eval(&ruby_block)
|
3610
3639
|
High.space_pop
|
3640
|
+
# if @return_value.is_a?(HExpression) then
|
3641
|
+
# res = @return_value
|
3642
|
+
# High.space_push(@namespace)
|
3643
|
+
# @return_value = res.type.inner(HDLRuby.uniq_name)
|
3644
|
+
# puts "@return_value name=#{@return_value.name}"
|
3645
|
+
# @return_value <= res
|
3646
|
+
# High.space_pop
|
3647
|
+
# @return_value = RefObject.new(self,@return_value)
|
3648
|
+
# end
|
3611
3649
|
@return_value
|
3612
3650
|
end
|
3613
3651
|
|
@@ -3797,7 +3835,7 @@ module HDLRuby::High
|
|
3797
3835
|
# Converts the block to HDLRuby::Low.
|
3798
3836
|
def to_low
|
3799
3837
|
# Create the resulting block
|
3800
|
-
blockL = HDLRuby::Low::Block.new(self.mode)
|
3838
|
+
blockL = HDLRuby::Low::Block.new(self.mode,self.name)
|
3801
3839
|
# # For debugging: set the source high object
|
3802
3840
|
# blockL.properties[:low2high] = self.hdr_id
|
3803
3841
|
# self.properties[:high2low] = blockL
|
data/lib/HDLRuby/hruby_low.rb
CHANGED
@@ -4058,6 +4058,7 @@ module HDLRuby::Low
|
|
4058
4058
|
|
4059
4059
|
# Adds inner signal +signal+.
|
4060
4060
|
def add_inner(signal)
|
4061
|
+
# puts "add inner=#{signal.name} in block=#{self}"
|
4061
4062
|
# Check and add the signal.
|
4062
4063
|
unless signal.is_a?(SignalI)
|
4063
4064
|
raise AnyError,
|
@@ -4087,6 +4088,7 @@ module HDLRuby::Low
|
|
4087
4088
|
|
4088
4089
|
## Gets an inner signal by +name+.
|
4089
4090
|
def get_inner(name)
|
4091
|
+
# puts "name=#{name}, inners=#{@inners.each_key.to_a}"
|
4090
4092
|
return @inners[name.to_sym]
|
4091
4093
|
end
|
4092
4094
|
alias_method :get_signal, :get_inner
|
data/lib/HDLRuby/hruby_low2c.rb
CHANGED
@@ -356,8 +356,13 @@ module HDLRuby::Low
|
|
356
356
|
end
|
357
357
|
self.scope.each_block_deep do |block|
|
358
358
|
block.each_inner do |signal|
|
359
|
-
#
|
360
|
-
|
359
|
+
# signal.value.to_ch(res) if signal.value
|
360
|
+
if signal.value then
|
361
|
+
signal.value.each_node_deep do |node|
|
362
|
+
# res << node.to_ch if node.is_a?(Value)
|
363
|
+
node.to_ch(res) if node.is_a?(Value)
|
364
|
+
end
|
365
|
+
end
|
361
366
|
end
|
362
367
|
block.each_node_deep do |node|
|
363
368
|
# res << node.to_ch if node.is_a?(Value)
|
@@ -702,6 +707,10 @@ module HDLRuby::Low
|
|
702
707
|
end.to_a
|
703
708
|
# Keep only one ref per signal.
|
704
709
|
refs.uniq! { |node| node.full_name }
|
710
|
+
# Remove the inner signals from the list.
|
711
|
+
self.block.each_inner do |inner|
|
712
|
+
refs.delete_if {|r| r.name == inner.name }
|
713
|
+
end
|
705
714
|
# Generate the event.
|
706
715
|
events = refs.map {|ref| Event.new(:anyedge,ref.clone) }
|
707
716
|
# Add them to the behavior for further processing.
|
@@ -891,11 +900,12 @@ module HDLRuby::Low
|
|
891
900
|
if self.value then
|
892
901
|
# There is an initial value.
|
893
902
|
res << " " * (level+1)*3
|
894
|
-
# res << "copy_value(
|
895
|
-
#
|
903
|
+
# res << "copy_value("
|
904
|
+
# self.value.to_c_expr(res,level+2)
|
905
|
+
# res << ",signalI->c_value);\n"
|
896
906
|
res << "copy_value("
|
897
907
|
self.value.to_c_expr(res,level+2)
|
898
|
-
res << ",signalI->
|
908
|
+
res << ",signalI->f_value);\n"
|
899
909
|
end
|
900
910
|
|
901
911
|
# Initially the signal can be overwritten by anything.
|
@@ -1893,6 +1903,16 @@ module HDLRuby::Low
|
|
1893
1903
|
# Should never be here.
|
1894
1904
|
raise AnyError, "Internal error: to_c should be implemented in class :#{self.class}"
|
1895
1905
|
end
|
1906
|
+
|
1907
|
+
## Generates the C text for an expression access to the expression,
|
1908
|
+
# default case.
|
1909
|
+
# +level+ is the hierachical level of the object.
|
1910
|
+
def to_c_expr(res,level = 0)
|
1911
|
+
res << "({"
|
1912
|
+
self.to_c(res,level+1)
|
1913
|
+
res << (" " * ((level+1)*3))
|
1914
|
+
res << "pop();})"
|
1915
|
+
end
|
1896
1916
|
end
|
1897
1917
|
|
1898
1918
|
|
@@ -2455,46 +2475,64 @@ module HDLRuby::Low
|
|
2455
2475
|
return res
|
2456
2476
|
end
|
2457
2477
|
|
2458
|
-
# Generates the C text of expression for the equivalent HDLRuby code.
|
2459
|
-
# +level+ is the hierachical level of the object.
|
2460
|
-
def to_c_expr(res,level = 0)
|
2461
|
-
|
2462
|
-
|
2463
|
-
|
2464
|
-
|
2465
|
-
|
2466
|
-
|
2467
|
-
|
2468
|
-
|
2469
|
-
|
2470
|
-
|
2471
|
-
|
2472
|
-
|
2473
|
-
|
2474
|
-
|
2475
|
-
|
2476
|
-
|
2477
|
-
|
2478
|
-
|
2479
|
-
|
2480
|
-
|
2481
|
-
|
2482
|
-
|
2483
|
-
|
2484
|
-
|
2485
|
-
|
2486
|
-
|
2487
|
-
|
2488
|
-
|
2489
|
-
|
2490
|
-
|
2491
|
-
|
2492
|
-
|
2493
|
-
|
2494
|
-
|
2495
|
-
|
2496
|
-
|
2497
|
-
end
|
2478
|
+
# # # Generates the C text of expression for the equivalent HDLRuby code.
|
2479
|
+
# # # +level+ is the hierachical level of the object.
|
2480
|
+
# # def to_c_expr(res,level = 0)
|
2481
|
+
# # # Gather the content to concat.
|
2482
|
+
# # expressions = self.each_expression.to_a
|
2483
|
+
# # # Create the resulting string.
|
2484
|
+
# # res << "({\n"
|
2485
|
+
# # # Overrides the upper src0, src1, ..., and dst...
|
2486
|
+
# # # And allocates a new value for dst.
|
2487
|
+
# # res << (" " * ((level+1)*3))
|
2488
|
+
# # res << "Value "
|
2489
|
+
# # res << expressions.size.times.map do |i|
|
2490
|
+
# # "src#{i}"
|
2491
|
+
# # end.join(",")
|
2492
|
+
# # res << ";\n"
|
2493
|
+
# # res << (" " * ((level+1)*3))
|
2494
|
+
# # res << "Value dst = get_value();\n"
|
2495
|
+
# # # Save the value pool state.
|
2496
|
+
# # res << (" " * (level*3)) << "SV;\n"
|
2497
|
+
# # # Compute each sub expression.
|
2498
|
+
# # expressions.each_with_index do |expr,i|
|
2499
|
+
# # res << (" " * ((level+1)*3))
|
2500
|
+
# # res << "src#{i} = "
|
2501
|
+
# # expr.to_c_expr(res,level+2)
|
2502
|
+
# # res << ";\n"
|
2503
|
+
# # end
|
2504
|
+
# # # Compute the direction.
|
2505
|
+
# # # Compute the resulting concatenation.
|
2506
|
+
# # res << (" " * ((level+1)*3))
|
2507
|
+
# # res << "concat_value(#{expressions.size},"
|
2508
|
+
# # res << "#{self.type.direction == :little ? 1 : 0},dst,"
|
2509
|
+
# # res << expressions.size.times.map { |i| "src#{i}" }.join(",")
|
2510
|
+
# # res << ");\n"
|
2511
|
+
# # # Save the value pool state.
|
2512
|
+
# # res << (" " * (level*3)) << "SV;\n"
|
2513
|
+
# # # Close the computation.
|
2514
|
+
# # res << (" " * (level*3))
|
2515
|
+
# # res << "dst; })"
|
2516
|
+
# # return res
|
2517
|
+
# # end
|
2518
|
+
# def to_c_expr(res,level = 0)
|
2519
|
+
# # Save the value pool state.
|
2520
|
+
# res << "({ PV;"
|
2521
|
+
# # Gather the content to concat.
|
2522
|
+
# expressions = self.each_expression.to_a
|
2523
|
+
# # Compute each sub expression.
|
2524
|
+
# expressions.each_with_index do |expr,i|
|
2525
|
+
# expr.to_c(res,level+2)
|
2526
|
+
# end
|
2527
|
+
# # Compute the resulting concatenation.
|
2528
|
+
# res << (" " * ((level+1)*3))
|
2529
|
+
# res << "sconcat(#{expressions.size},"
|
2530
|
+
# res << (self.type.direction == :little ? "1" : "0")
|
2531
|
+
# res << ");\n"
|
2532
|
+
# # Restore the value pool state.
|
2533
|
+
# res << "RV; pop();})"
|
2534
|
+
# return res
|
2535
|
+
# end
|
2498
2536
|
end
|
2499
2537
|
|
2500
2538
|
|
@@ -2778,17 +2816,11 @@ module HDLRuby::Low
|
|
2778
2816
|
# +left+ tells if it is a left value or not.
|
2779
2817
|
# def to_c(level = 0, left = false)
|
2780
2818
|
def to_c(res,level = 0, left = false)
|
2781
|
-
# # puts "RefName to_c for #{self.name}"
|
2782
|
-
# self.resolve.to_c_signal(res,level+1)
|
2783
|
-
# res << "->" << (left ? "f_value" : "c_value")
|
2784
|
-
# return res
|
2785
2819
|
# puts "RefName to_c for #{self.name}"
|
2786
2820
|
res << (" " * (level*3))
|
2787
|
-
# res << "d="
|
2788
2821
|
res << "push("
|
2789
2822
|
self.resolve.to_c_signal(res,level+1)
|
2790
2823
|
res << "->" << (left ? "f_value" : "c_value")
|
2791
|
-
# res << ";\n"
|
2792
2824
|
res << ");\n"
|
2793
2825
|
return res
|
2794
2826
|
end
|
@@ -50,9 +50,25 @@ module HDLRuby::Low
|
|
50
50
|
return found if found
|
51
51
|
# Maybe it is a sub scope.
|
52
52
|
return self.each_scope.find { |scope| scope.name == name }
|
53
|
+
# Maybe it in the behavior.
|
54
|
+
return self.behavior.get_by_name
|
53
55
|
end
|
54
56
|
end
|
55
57
|
|
58
|
+
##
|
59
|
+
# Extends Behavior with the capability of finding one of its inner object
|
60
|
+
# by name.
|
61
|
+
class Behavior
|
62
|
+
|
63
|
+
## Find an inner object by +name+.
|
64
|
+
# NOTE: return nil if not found.
|
65
|
+
def get_by_name(name)
|
66
|
+
if (self.block.name == name.to_sym) then
|
67
|
+
return self.block
|
68
|
+
end
|
69
|
+
return self.block.get_by_name(name)
|
70
|
+
end
|
71
|
+
end
|
56
72
|
|
57
73
|
##
|
58
74
|
# Extends SystemI with the capability of finding one of its inner object
|
@@ -79,7 +95,16 @@ module HDLRuby::Low
|
|
79
95
|
# Ensure the name is a symbol.
|
80
96
|
name = name.to_sym
|
81
97
|
# Look in the signals.
|
82
|
-
|
98
|
+
found = self.get_inner(name)
|
99
|
+
return found if found
|
100
|
+
# Check the sub blocks names.
|
101
|
+
self.each_block do |block|
|
102
|
+
# puts "block=#{block.name}"
|
103
|
+
if (block.name == name) then
|
104
|
+
return block
|
105
|
+
end
|
106
|
+
end
|
107
|
+
return nil
|
83
108
|
end
|
84
109
|
end
|
85
110
|
|
@@ -199,6 +224,7 @@ module HDLRuby::Low
|
|
199
224
|
if self.ref.is_a?(RefName) then
|
200
225
|
# puts "ref name=#{self.ref.name}"
|
201
226
|
obj = self.ref.resolve
|
227
|
+
# puts "obj=#{obj}"
|
202
228
|
# Look into the object for the name.
|
203
229
|
return obj.get_by_name(self.name)
|
204
230
|
else
|
@@ -208,12 +234,15 @@ module HDLRuby::Low
|
|
208
234
|
while parent
|
209
235
|
# puts "parent=#{parent}"
|
210
236
|
if parent.respond_to?(:get_by_name) then
|
237
|
+
# puts "get_by_name"
|
211
238
|
found = parent.get_by_name(self.name)
|
239
|
+
# puts "found" if found
|
212
240
|
return found if found
|
213
241
|
end
|
214
242
|
parent = parent.parent
|
215
243
|
end
|
216
244
|
# Not found.
|
245
|
+
# puts "Not found!"
|
217
246
|
return nil
|
218
247
|
end
|
219
248
|
end
|
data/lib/HDLRuby/hruby_tools.rb
CHANGED
@@ -108,7 +108,7 @@ void register_signal(SignalI signal) {
|
|
108
108
|
/** Recursively update the signals until no (untimed) behavior are
|
109
109
|
* activated. */
|
110
110
|
void hruby_sim_update_signals() {
|
111
|
-
|
111
|
+
// printf("hruby_sim_update_signals...\n");
|
112
112
|
/* As long as the list of touched signals is not empty go on computing. */
|
113
113
|
while(!empty_list(touched_signals) || !empty_list(touched_signals_seq)) {
|
114
114
|
// printf("## Checking touched signals.\n");
|
@@ -121,7 +121,6 @@ void hruby_sim_update_signals() {
|
|
121
121
|
/* Is there a change? */
|
122
122
|
if (same_content_value(sig->c_value,sig->f_value)) continue;
|
123
123
|
/* Yes, process the signal. */
|
124
|
-
// println_signal(sig);
|
125
124
|
printer.print_signal(sig);
|
126
125
|
// printf("c_value="); printer.print_value(sig->c_value);
|
127
126
|
// printf("\nf_value="); printer.print_value(sig->f_value); printf("\n");
|
@@ -441,6 +440,10 @@ void hruby_sim_core(char* name, void (*init_vizualizer)(char*),
|
|
441
440
|
/* Update the signal values (recursively executing blocks locked
|
442
441
|
* on the signals). */
|
443
442
|
hruby_sim_update_signals();
|
443
|
+
if (hruby_sim_time == 0) {
|
444
|
+
/* Initially touch all the signals. */
|
445
|
+
each_all_signal(&touch_signal);
|
446
|
+
}
|
444
447
|
if (num_run_behaviors <= 0) break;
|
445
448
|
/* Advance time to next timestep. */
|
446
449
|
hruby_sim_advance_time();
|
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.7.
|
4
|
+
version: 2.7.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lovic Gauthier
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-03-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -125,11 +125,13 @@ files:
|
|
125
125
|
- lib/HDLRuby/hdr_samples/neural/selector.rb
|
126
126
|
- lib/HDLRuby/hdr_samples/neural/sigmoid.rb
|
127
127
|
- lib/HDLRuby/hdr_samples/neural/z.rb
|
128
|
+
- lib/HDLRuby/hdr_samples/parseq_bench.rb
|
128
129
|
- lib/HDLRuby/hdr_samples/prog.obj
|
129
130
|
- lib/HDLRuby/hdr_samples/ram.rb
|
130
131
|
- lib/HDLRuby/hdr_samples/range_bench.rb
|
131
132
|
- lib/HDLRuby/hdr_samples/register_with_code_bench.rb
|
132
133
|
- lib/HDLRuby/hdr_samples/rom.rb
|
134
|
+
- lib/HDLRuby/hdr_samples/rom_nest.rb
|
133
135
|
- lib/HDLRuby/hdr_samples/ruby_fir_hw.rb
|
134
136
|
- lib/HDLRuby/hdr_samples/seqpar_bench.rb
|
135
137
|
- lib/HDLRuby/hdr_samples/struct.rb
|
@@ -142,6 +144,7 @@ files:
|
|
142
144
|
- lib/HDLRuby/hdr_samples/type_minmax_bench.rb
|
143
145
|
- lib/HDLRuby/hdr_samples/with_casts.rb
|
144
146
|
- lib/HDLRuby/hdr_samples/with_channel.rb
|
147
|
+
- lib/HDLRuby/hdr_samples/with_channel_other.rb
|
145
148
|
- lib/HDLRuby/hdr_samples/with_class.rb
|
146
149
|
- lib/HDLRuby/hdr_samples/with_concat.rb
|
147
150
|
- lib/HDLRuby/hdr_samples/with_connector.rb
|