HDLRuby 2.6.8 → 2.6.18
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/neg_arith_bench.rb +11 -0
- data/lib/HDLRuby/hdrcc.rb +64 -34
- data/lib/HDLRuby/hruby_high.rb +130 -114
- data/lib/HDLRuby/hruby_low.rb +27 -27
- data/lib/HDLRuby/hruby_low2c.rb +3 -1
- data/lib/HDLRuby/hruby_low_resolve.rb +24 -0
- data/lib/HDLRuby/hruby_low_without_namespace.rb +6 -2
- data/lib/HDLRuby/hruby_tools.rb +24 -0
- data/lib/HDLRuby/hruby_verilog.rb +5 -5
- data/lib/HDLRuby/hruby_verilog_name.rb +50 -32
- data/lib/HDLRuby/sim/hruby_sim_calc.c +168 -8
- data/lib/HDLRuby/std/function_generator.rb +9 -7
- data/lib/HDLRuby/version.rb +1 -1
- metadata +2 -2
@@ -165,6 +165,30 @@ module HDLRuby::Low
|
|
165
165
|
return false
|
166
166
|
end
|
167
167
|
|
168
|
+
## Gets the systemI the reference comes from if any.
|
169
|
+
def get_systemI
|
170
|
+
# Look for the owner from the name hierarchy.
|
171
|
+
if self.ref.is_a?(RefName) then
|
172
|
+
# Look in the parent hierachy for the sub reference name.
|
173
|
+
parent = self.parent
|
174
|
+
# puts "self.ref.name=#{self.ref.name}"
|
175
|
+
while parent
|
176
|
+
# puts "parent=#{parent}"
|
177
|
+
if parent.respond_to?(:get_by_name) then
|
178
|
+
found = parent.get_by_name(self.ref.name)
|
179
|
+
# puts "found is a :#{found.class}"
|
180
|
+
return found if found.is_a?(SystemI)
|
181
|
+
end
|
182
|
+
parent = parent.parent
|
183
|
+
end
|
184
|
+
# Not found, look further in the reference hierarchy.
|
185
|
+
return self.ref.get_systemI
|
186
|
+
end
|
187
|
+
# Not from a systemI.
|
188
|
+
# puts "Not from systemI for #{self.name}"
|
189
|
+
return nil
|
190
|
+
end
|
191
|
+
|
168
192
|
|
169
193
|
## Resolves the name of the reference and return the
|
170
194
|
# corresponding object.
|
@@ -44,8 +44,10 @@ module HDLRuby::Low
|
|
44
44
|
def to_global_systemTs!
|
45
45
|
# Force a name if not.
|
46
46
|
self.force_name!
|
47
|
+
# puts "to_global_systemTs! for #{self.name}"
|
47
48
|
# For each local systemT
|
48
49
|
self.scope.each_systemT.to_a.each do |systemT|
|
50
|
+
# puts "Processing system: #{systemT}"
|
49
51
|
# Rename it for globalization.
|
50
52
|
former = systemT.name
|
51
53
|
self.extend_name!(systemT)
|
@@ -211,6 +213,7 @@ module HDLRuby::Low
|
|
211
213
|
# Replaces recursively +former+ name by +nname+ until it is redeclared
|
212
214
|
# in the internals.
|
213
215
|
def replace_names_subs!(former,nname)
|
216
|
+
# puts "replace_names_subs! for #{self} with former=#{former} and nname=#{nname}"
|
214
217
|
self.each_type do |type|
|
215
218
|
type.replace_names!(former,nname)
|
216
219
|
end
|
@@ -416,8 +419,9 @@ module HDLRuby::Low
|
|
416
419
|
if self.name == former then
|
417
420
|
self.set_name!(nname)
|
418
421
|
end
|
419
|
-
#
|
420
|
-
|
422
|
+
# Not needed since treated through scope and systemT.
|
423
|
+
# # Recurse on the system type.
|
424
|
+
# self.systemT.replace_names!(former,nname)
|
421
425
|
end
|
422
426
|
end
|
423
427
|
|
data/lib/HDLRuby/hruby_tools.rb
CHANGED
@@ -50,4 +50,28 @@ module HDLRuby
|
|
50
50
|
|
51
51
|
end
|
52
52
|
|
53
|
+
|
54
|
+
# Display some messages depending on the verbosity mode.
|
55
|
+
@@verbosity = 1 # The verbosity level: default 1, only critical messages.
|
56
|
+
|
57
|
+
# Sets the verbosity.
|
58
|
+
def self.verbosity=(val)
|
59
|
+
@@verbosity = val.to_i
|
60
|
+
end
|
61
|
+
|
62
|
+
# Display a critical message.
|
63
|
+
def self.show!(*args)
|
64
|
+
puts(*args) if @@verbosity > 0
|
65
|
+
end
|
66
|
+
|
67
|
+
# Display a common message.
|
68
|
+
def self.show(*args)
|
69
|
+
puts(*args) if @@verbosity > 1
|
70
|
+
end
|
71
|
+
|
72
|
+
# Display a minor message.
|
73
|
+
def self.show?(*args)
|
74
|
+
puts(*args) if @@verbosity > 2
|
75
|
+
end
|
76
|
+
|
53
77
|
end
|
@@ -134,7 +134,7 @@ module HDLRuby::Low
|
|
134
134
|
if self.name && !self.name.empty? then
|
135
135
|
vname = name_to_verilog(self.name)
|
136
136
|
code << " : #{vname}"
|
137
|
-
self.properties[:verilog_name] = vname
|
137
|
+
# self.properties[:verilog_name] = vname
|
138
138
|
end
|
139
139
|
code << "\n" if block.each_inner.any?
|
140
140
|
# Declaration of "inner" part within "always".
|
@@ -1371,7 +1371,7 @@ module HDLRuby::Low
|
|
1371
1371
|
# Converts the system to Verilog code using +renamer+ for producing Verilog-compatible names.
|
1372
1372
|
def to_verilog
|
1373
1373
|
vname = name_to_verilog(self.name)
|
1374
|
-
self.properties[:verilog_name] = vname
|
1374
|
+
# self.properties[:verilog_name] = vname
|
1375
1375
|
return "#{vname}"
|
1376
1376
|
end
|
1377
1377
|
|
@@ -1677,7 +1677,7 @@ module HDLRuby::Low
|
|
1677
1677
|
def to_verilog
|
1678
1678
|
# Convert unusable characters and return them.
|
1679
1679
|
vname = name_to_verilog(self.name)
|
1680
|
-
self.properties[:verilog_name] = vname
|
1680
|
+
# self.properties[:verilog_name] = vname
|
1681
1681
|
return "#{vname}"
|
1682
1682
|
end
|
1683
1683
|
end
|
@@ -1842,7 +1842,7 @@ module HDLRuby::Low
|
|
1842
1842
|
code = "`timescale 1ps/1ps\n\n"
|
1843
1843
|
|
1844
1844
|
vname = name_to_verilog(self.name)
|
1845
|
-
self.properties[:verilog_name] = vname
|
1845
|
+
# self.properties[:verilog_name] = vname
|
1846
1846
|
# Output the module name.
|
1847
1847
|
code << "module #{vname}("
|
1848
1848
|
|
@@ -2007,7 +2007,7 @@ module HDLRuby::Low
|
|
2007
2007
|
systemT = systemI.systemT
|
2008
2008
|
code << name_to_verilog(systemT.name) << " "
|
2009
2009
|
vname = name_to_verilog(systemI.name)
|
2010
|
-
systemI.properties[:verilog_name] = vname
|
2010
|
+
# systemI.properties[:verilog_name] = vname
|
2011
2011
|
code << vname << "("
|
2012
2012
|
# Its ports connections
|
2013
2013
|
# Inputs
|
@@ -10,41 +10,59 @@ module HDLRuby::Verilog
|
|
10
10
|
|
11
11
|
# Since it is possible to use $ and numbers other than the beginning of the character string, it is divided.
|
12
12
|
def name_to_verilog(name)
|
13
|
-
ref = "" # For storing the converted character.
|
14
|
-
name = name.to_s # Ensure name is a string
|
15
|
-
|
16
|
-
if (name[0] =~ /[a-zA-Z]/) then
|
17
|
-
|
18
|
-
|
19
|
-
elsif (name[0] == "_") then
|
20
|
-
|
21
|
-
# If it does not satisfy the above, it is another character.
|
22
|
-
# In that case, convert it to UTF-8 and convert it to a usable character string.
|
23
|
-
else
|
24
|
-
|
13
|
+
# ref = "" # For storing the converted character.
|
14
|
+
# name = name.to_s # Ensure name is a string
|
15
|
+
#
|
16
|
+
# if (name[0] =~ /[a-zA-Z]/) then
|
17
|
+
# ref << name[0]
|
18
|
+
# # _ To convert it to __.
|
19
|
+
# elsif (name[0] == "_") then
|
20
|
+
# ref << "__"
|
21
|
+
# # If it does not satisfy the above, it is another character.
|
22
|
+
# # In that case, convert it to UTF-8 and convert it to a usable character string.
|
23
|
+
# else
|
24
|
+
# l = name[0].bytes.map{|v| v.to_s(16)}.join # Conversion to UTF-8 hexadecimal number.
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
end
|
26
|
+
# ref << "_" + l.rjust(6,"0") # Add an underscore indicating conversion.
|
27
|
+
# # The remainder of 6 digits is filled with 0.
|
28
|
+
# end
|
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
|
+
|
29
49
|
|
30
|
-
|
31
|
-
#
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
# The remainder of 6 digits is filled with 0.
|
50
|
+
name = name.to_s
|
51
|
+
# Convert special characters.
|
52
|
+
name = name.each_char.map do |c|
|
53
|
+
if c=~ /[a-z0-9]/ then
|
54
|
+
c
|
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
|
45
64
|
end
|
46
|
-
|
47
|
-
return ref
|
65
|
+
return name
|
48
66
|
end
|
49
67
|
|
50
68
|
#puts ref
|
@@ -697,7 +697,27 @@ static Value greater_value_defined_bitstring(Value src0, Value src1, Value dst)
|
|
697
697
|
dst->numeric = 1;
|
698
698
|
|
699
699
|
/* Perform the comparison. */
|
700
|
-
|
700
|
+
if (src0->type->flags.sign) {
|
701
|
+
if (src1->type->flags.sign) {
|
702
|
+
dst->data_int =
|
703
|
+
((signed long long)value2integer(src0) >
|
704
|
+
(signed long long)value2integer(src1));
|
705
|
+
} else {
|
706
|
+
dst->data_int =
|
707
|
+
((signed long long)value2integer(src0) >
|
708
|
+
(unsigned long long)value2integer(src1));
|
709
|
+
}
|
710
|
+
} else {
|
711
|
+
if (src1->type->flags.sign) {
|
712
|
+
dst->data_int =
|
713
|
+
((unsigned long long)value2integer(src0) >
|
714
|
+
(signed long long)value2integer(src1));
|
715
|
+
} else {
|
716
|
+
dst->data_int =
|
717
|
+
((unsigned long long)value2integer(src0) >
|
718
|
+
(unsigned long long)value2integer(src1));
|
719
|
+
}
|
720
|
+
}
|
701
721
|
return dst;
|
702
722
|
}
|
703
723
|
|
@@ -712,7 +732,27 @@ static Value lesser_value_defined_bitstring(Value src0, Value src1, Value dst) {
|
|
712
732
|
dst->numeric = 1;
|
713
733
|
|
714
734
|
/* Perform the comparison. */
|
715
|
-
|
735
|
+
if (src0->type->flags.sign) {
|
736
|
+
if (src1->type->flags.sign) {
|
737
|
+
dst->data_int =
|
738
|
+
((signed long long)value2integer(src0) <
|
739
|
+
(signed long long)value2integer(src1));
|
740
|
+
} else {
|
741
|
+
dst->data_int =
|
742
|
+
((signed long long)value2integer(src0) <
|
743
|
+
(unsigned long long)value2integer(src1));
|
744
|
+
}
|
745
|
+
} else {
|
746
|
+
if (src1->type->flags.sign) {
|
747
|
+
dst->data_int =
|
748
|
+
((unsigned long long)value2integer(src0) <
|
749
|
+
(signed long long)value2integer(src1));
|
750
|
+
} else {
|
751
|
+
dst->data_int =
|
752
|
+
((unsigned long long)value2integer(src0) <
|
753
|
+
(unsigned long long)value2integer(src1));
|
754
|
+
}
|
755
|
+
}
|
716
756
|
return dst;
|
717
757
|
}
|
718
758
|
|
@@ -727,7 +767,27 @@ static Value greater_equal_value_defined_bitstring(Value src0, Value src1, Value
|
|
727
767
|
dst->numeric = 1;
|
728
768
|
|
729
769
|
/* Perform the comparison. */
|
730
|
-
|
770
|
+
if (src0->type->flags.sign) {
|
771
|
+
if (src1->type->flags.sign) {
|
772
|
+
dst->data_int =
|
773
|
+
((signed long long)value2integer(src0) >=
|
774
|
+
(signed long long)value2integer(src1));
|
775
|
+
} else {
|
776
|
+
dst->data_int =
|
777
|
+
((signed long long)value2integer(src0) >=
|
778
|
+
(unsigned long long)value2integer(src1));
|
779
|
+
}
|
780
|
+
} else {
|
781
|
+
if (src1->type->flags.sign) {
|
782
|
+
dst->data_int =
|
783
|
+
((unsigned long long)value2integer(src0) >=
|
784
|
+
(signed long long)value2integer(src1));
|
785
|
+
} else {
|
786
|
+
dst->data_int =
|
787
|
+
((unsigned long long)value2integer(src0) >=
|
788
|
+
(unsigned long long)value2integer(src1));
|
789
|
+
}
|
790
|
+
}
|
731
791
|
return dst;
|
732
792
|
}
|
733
793
|
|
@@ -742,7 +802,27 @@ static Value lesser_equal_value_defined_bitstring(Value src0, Value src1, Value
|
|
742
802
|
dst->numeric = 1;
|
743
803
|
|
744
804
|
/* Perform the comparison. */
|
745
|
-
|
805
|
+
if (src0->type->flags.sign) {
|
806
|
+
if (src1->type->flags.sign) {
|
807
|
+
dst->data_int =
|
808
|
+
((signed long long)value2integer(src0) <=
|
809
|
+
(signed long long)value2integer(src1));
|
810
|
+
} else {
|
811
|
+
dst->data_int =
|
812
|
+
((signed long long)value2integer(src0) <=
|
813
|
+
(unsigned long long)value2integer(src1));
|
814
|
+
}
|
815
|
+
} else {
|
816
|
+
if (src1->type->flags.sign) {
|
817
|
+
dst->data_int =
|
818
|
+
((unsigned long long)value2integer(src0) <=
|
819
|
+
(signed long long)value2integer(src1));
|
820
|
+
} else {
|
821
|
+
dst->data_int =
|
822
|
+
((unsigned long long)value2integer(src0) <=
|
823
|
+
(unsigned long long)value2integer(src1));
|
824
|
+
}
|
825
|
+
}
|
746
826
|
return dst;
|
747
827
|
}
|
748
828
|
|
@@ -1810,7 +1890,27 @@ static Value greater_value_numeric(Value src0, Value src1, Value dst) {
|
|
1810
1890
|
dst->numeric = 1;
|
1811
1891
|
|
1812
1892
|
/* Perform the greater. */
|
1813
|
-
|
1893
|
+
if (src0->type->flags.sign) {
|
1894
|
+
if (src1->type->flags.sign) {
|
1895
|
+
dst->data_int =
|
1896
|
+
((signed long long)src0->data_int >
|
1897
|
+
(signed long long)src1->data_int);
|
1898
|
+
} else {
|
1899
|
+
dst->data_int =
|
1900
|
+
((signed long long)src0->data_int >
|
1901
|
+
(unsigned long long)src1->data_int);
|
1902
|
+
}
|
1903
|
+
} else {
|
1904
|
+
if (src1->type->flags.sign) {
|
1905
|
+
dst->data_int =
|
1906
|
+
((unsigned long long)src0->data_int >
|
1907
|
+
(signed long long)src1->data_int);
|
1908
|
+
} else {
|
1909
|
+
dst->data_int =
|
1910
|
+
((unsigned long long)src0->data_int >
|
1911
|
+
(unsigned long long)src1->data_int);
|
1912
|
+
}
|
1913
|
+
}
|
1814
1914
|
return dst;
|
1815
1915
|
}
|
1816
1916
|
|
@@ -1825,7 +1925,27 @@ static Value lesser_value_numeric(Value src0, Value src1, Value dst) {
|
|
1825
1925
|
dst->numeric = 1;
|
1826
1926
|
|
1827
1927
|
/* Perform the lesser. */
|
1828
|
-
|
1928
|
+
if (src0->type->flags.sign) {
|
1929
|
+
if (src1->type->flags.sign) {
|
1930
|
+
dst->data_int =
|
1931
|
+
((signed long long)src0->data_int <
|
1932
|
+
(signed long long)src1->data_int);
|
1933
|
+
} else {
|
1934
|
+
dst->data_int =
|
1935
|
+
((signed long long)src0->data_int <
|
1936
|
+
(unsigned long long)src1->data_int);
|
1937
|
+
}
|
1938
|
+
} else {
|
1939
|
+
if (src1->type->flags.sign) {
|
1940
|
+
dst->data_int =
|
1941
|
+
((unsigned long long)src0->data_int <
|
1942
|
+
(signed long long)src1->data_int);
|
1943
|
+
} else {
|
1944
|
+
dst->data_int =
|
1945
|
+
((unsigned long long)src0->data_int <
|
1946
|
+
(unsigned long long)src1->data_int);
|
1947
|
+
}
|
1948
|
+
}
|
1829
1949
|
return dst;
|
1830
1950
|
}
|
1831
1951
|
|
@@ -1840,7 +1960,27 @@ static Value greater_equal_value_numeric(Value src0, Value src1, Value dst) {
|
|
1840
1960
|
dst->numeric = 1;
|
1841
1961
|
|
1842
1962
|
/* Perform the greater or equal. */
|
1843
|
-
|
1963
|
+
if (src0->type->flags.sign) {
|
1964
|
+
if (src1->type->flags.sign) {
|
1965
|
+
dst->data_int =
|
1966
|
+
((signed long long)src0->data_int >=
|
1967
|
+
(signed long long)src1->data_int);
|
1968
|
+
} else {
|
1969
|
+
dst->data_int =
|
1970
|
+
((signed long long)src0->data_int >=
|
1971
|
+
(unsigned long long)src1->data_int);
|
1972
|
+
}
|
1973
|
+
} else {
|
1974
|
+
if (src1->type->flags.sign) {
|
1975
|
+
dst->data_int =
|
1976
|
+
((unsigned long long)src0->data_int >=
|
1977
|
+
(signed long long)src1->data_int);
|
1978
|
+
} else {
|
1979
|
+
dst->data_int =
|
1980
|
+
((unsigned long long)src0->data_int >=
|
1981
|
+
(unsigned long long)src1->data_int);
|
1982
|
+
}
|
1983
|
+
}
|
1844
1984
|
return dst;
|
1845
1985
|
}
|
1846
1986
|
|
@@ -1855,7 +1995,27 @@ static Value lesser_equal_value_numeric(Value src0, Value src1, Value dst) {
|
|
1855
1995
|
dst->numeric = 1;
|
1856
1996
|
|
1857
1997
|
/* Perform the lesser or equal. */
|
1858
|
-
|
1998
|
+
if (src0->type->flags.sign) {
|
1999
|
+
if (src1->type->flags.sign) {
|
2000
|
+
dst->data_int =
|
2001
|
+
((signed long long)src0->data_int <=
|
2002
|
+
(signed long long)src1->data_int);
|
2003
|
+
} else {
|
2004
|
+
dst->data_int =
|
2005
|
+
((signed long long)src0->data_int <=
|
2006
|
+
(unsigned long long)src1->data_int);
|
2007
|
+
}
|
2008
|
+
} else {
|
2009
|
+
if (src1->type->flags.sign) {
|
2010
|
+
dst->data_int =
|
2011
|
+
((unsigned long long)src0->data_int <=
|
2012
|
+
(signed long long)src1->data_int);
|
2013
|
+
} else {
|
2014
|
+
dst->data_int =
|
2015
|
+
((unsigned long long)src0->data_int <=
|
2016
|
+
(unsigned long long)src1->data_int);
|
2017
|
+
}
|
2018
|
+
}
|
1859
2019
|
return dst;
|
1860
2020
|
}
|
1861
2021
|
|
@@ -107,13 +107,15 @@ module HDLRuby::High::Std
|
|
107
107
|
end
|
108
108
|
|
109
109
|
# Make the interpolation.
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
110
|
+
par do
|
111
|
+
diff <= (next_data-base).as(diff.type) * remaining
|
112
|
+
if(otyp.signed?) then
|
113
|
+
interpolated_value <= base +
|
114
|
+
([[diff[diff.type.width-1]]*shift_bits,
|
115
|
+
diff[diff.type.width-1..shift_bits]]).to_expr
|
116
|
+
else
|
117
|
+
interpolated_value <= base + (diff >> shift_bits)
|
118
|
+
end
|
117
119
|
end
|
118
120
|
end
|
119
121
|
|
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.18
|
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-10-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|