HDLRuby 2.6.5 → 2.6.16
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/comparison_bench.rb +40 -0
- data/lib/HDLRuby/hdr_samples/neg_arith_bench.rb +11 -0
- data/lib/HDLRuby/hdr_samples/type_minmax_bench.rb +37 -0
- data/lib/HDLRuby/hdr_samples/with_to_array.rb +29 -0
- data/lib/HDLRuby/hdrcc.rb +49 -24
- data/lib/HDLRuby/hruby_high.rb +136 -117
- data/lib/HDLRuby/hruby_low.rb +58 -27
- data/lib/HDLRuby/hruby_low2c.rb +3 -1
- data/lib/HDLRuby/hruby_low_resolve.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.h +16 -2
- data/lib/HDLRuby/sim/hruby_sim_calc.c +293 -18
- data/lib/HDLRuby/std/function_generator.rb +9 -7
- data/lib/HDLRuby/version.rb +1 -1
- metadata +5 -2
@@ -686,6 +686,41 @@ static Value mod_value_defined_bitstring(Value src0, Value src1, Value dst) {
|
|
686
686
|
}
|
687
687
|
|
688
688
|
|
689
|
+
/** Computes the greater comparision of two defined bitstring values.
|
690
|
+
* @param src0 the first source value of the addition
|
691
|
+
* @param src1 the second source value of the addition
|
692
|
+
* @param dst the destination value
|
693
|
+
* @return dst */
|
694
|
+
static Value greater_value_defined_bitstring(Value src0, Value src1, Value dst) {
|
695
|
+
/* Sets state of the destination using the first source. */
|
696
|
+
dst->type = src0->type;
|
697
|
+
dst->numeric = 1;
|
698
|
+
|
699
|
+
/* Perform the comparison. */
|
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
|
+
}
|
721
|
+
return dst;
|
722
|
+
}
|
723
|
+
|
689
724
|
/** Computes the lesser comparision of two defined bitstring values.
|
690
725
|
* @param src0 the first source value of the addition
|
691
726
|
* @param src1 the second source value of the addition
|
@@ -697,23 +732,97 @@ static Value lesser_value_defined_bitstring(Value src0, Value src1, Value dst) {
|
|
697
732
|
dst->numeric = 1;
|
698
733
|
|
699
734
|
/* Perform the comparison. */
|
700
|
-
|
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
|
+
}
|
701
756
|
return dst;
|
702
757
|
}
|
703
758
|
|
759
|
+
/** Computes the greater or equal comparision of two defined bitstring values.
|
760
|
+
* @param src0 the first source value of the addition
|
761
|
+
* @param src1 the second source value of the addition
|
762
|
+
* @param dst the destination value
|
763
|
+
* @return dst */
|
764
|
+
static Value greater_equal_value_defined_bitstring(Value src0, Value src1, Value dst) {
|
765
|
+
/* Sets state of the destination using the first source. */
|
766
|
+
dst->type = src0->type;
|
767
|
+
dst->numeric = 1;
|
704
768
|
|
705
|
-
|
769
|
+
/* Perform the comparison. */
|
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
|
+
}
|
791
|
+
return dst;
|
792
|
+
}
|
793
|
+
|
794
|
+
/** Computes the lesser or equal comparision of two defined bitstring values.
|
706
795
|
* @param src0 the first source value of the addition
|
707
796
|
* @param src1 the second source value of the addition
|
708
797
|
* @param dst the destination value
|
709
798
|
* @return dst */
|
710
|
-
static Value
|
799
|
+
static Value lesser_equal_value_defined_bitstring(Value src0, Value src1, Value dst) {
|
711
800
|
/* Sets state of the destination using the first source. */
|
712
801
|
dst->type = src0->type;
|
713
802
|
dst->numeric = 1;
|
714
803
|
|
715
804
|
/* Perform the comparison. */
|
716
|
-
|
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
|
+
}
|
717
826
|
return dst;
|
718
827
|
}
|
719
828
|
|
@@ -1762,13 +1871,49 @@ static Value equal_value_numeric(Value src0, Value src1, Value dst) {
|
|
1762
1871
|
dst->type = src0->type;
|
1763
1872
|
dst->numeric = 1;
|
1764
1873
|
|
1765
|
-
/* Perform the !XOR. */
|
1766
|
-
// dst->data_int = (src0->data_int
|
1767
|
-
|
1874
|
+
// /* Perform the !XOR. */
|
1875
|
+
// dst->data_int = ~(src0->data_int ^ src1->data_int);
|
1876
|
+
/* Perform the comparison. */
|
1877
|
+
dst->data_int = (src0->data_int == src1->data_int) ? 1 : 0;
|
1768
1878
|
return dst;
|
1769
1879
|
}
|
1770
1880
|
|
1771
1881
|
|
1882
|
+
/** Computes the greater comparision of two numeric values.
|
1883
|
+
* @param src0 the first source value of the addition
|
1884
|
+
* @param src1 the second source value of the addition
|
1885
|
+
* @param dst the destination value
|
1886
|
+
* @return the destination value */
|
1887
|
+
static Value greater_value_numeric(Value src0, Value src1, Value dst) {
|
1888
|
+
/* Sets state of the destination using the first source. */
|
1889
|
+
dst->type = src0->type;
|
1890
|
+
dst->numeric = 1;
|
1891
|
+
|
1892
|
+
/* Perform the greater. */
|
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
|
+
}
|
1914
|
+
return dst;
|
1915
|
+
}
|
1916
|
+
|
1772
1917
|
/** Computes the lesser comparision of two numeric values.
|
1773
1918
|
* @param src0 the first source value of the addition
|
1774
1919
|
* @param src1 the second source value of the addition
|
@@ -1780,22 +1925,97 @@ static Value lesser_value_numeric(Value src0, Value src1, Value dst) {
|
|
1780
1925
|
dst->numeric = 1;
|
1781
1926
|
|
1782
1927
|
/* Perform the lesser. */
|
1783
|
-
|
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
|
+
}
|
1784
1949
|
return dst;
|
1785
1950
|
}
|
1786
1951
|
|
1787
|
-
/** Computes the greater comparision of two numeric values.
|
1952
|
+
/** Computes the greater or equal comparision of two numeric values.
|
1788
1953
|
* @param src0 the first source value of the addition
|
1789
1954
|
* @param src1 the second source value of the addition
|
1790
1955
|
* @param dst the destination value
|
1791
1956
|
* @return the destination value */
|
1792
|
-
static Value
|
1957
|
+
static Value greater_equal_value_numeric(Value src0, Value src1, Value dst) {
|
1793
1958
|
/* Sets state of the destination using the first source. */
|
1794
1959
|
dst->type = src0->type;
|
1795
1960
|
dst->numeric = 1;
|
1796
1961
|
|
1797
|
-
/* Perform the
|
1798
|
-
|
1962
|
+
/* Perform the greater or equal. */
|
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
|
+
}
|
1984
|
+
return dst;
|
1985
|
+
}
|
1986
|
+
|
1987
|
+
/** Computes the lesser or equal comparision of two numeric values.
|
1988
|
+
* @param src0 the first source value of the addition
|
1989
|
+
* @param src1 the second source value of the addition
|
1990
|
+
* @param dst the destination value
|
1991
|
+
* @return the destination value */
|
1992
|
+
static Value lesser_equal_value_numeric(Value src0, Value src1, Value dst) {
|
1993
|
+
/* Sets state of the destination using the first source. */
|
1994
|
+
dst->type = src0->type;
|
1995
|
+
dst->numeric = 1;
|
1996
|
+
|
1997
|
+
/* Perform the lesser or equal. */
|
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
|
+
}
|
1799
2019
|
return dst;
|
1800
2020
|
}
|
1801
2021
|
|
@@ -2434,6 +2654,34 @@ Value equal_value(Value src0, Value src1, Value dst) {
|
|
2434
2654
|
}
|
2435
2655
|
|
2436
2656
|
|
2657
|
+
|
2658
|
+
/** Computes the greater comparision of two general values.
|
2659
|
+
* @param src0 the first source value of the addition
|
2660
|
+
* @param src1 the second source value of the addition
|
2661
|
+
* @param dst the destination value
|
2662
|
+
* @return dst */
|
2663
|
+
Value greater_value(Value src0, Value src1, Value dst) {
|
2664
|
+
/* Might allocate a new value so save the current pool state. */
|
2665
|
+
unsigned int pos = get_value_pos();
|
2666
|
+
/* Do a numeric computation if possible, otherwise fallback to bitstring
|
2667
|
+
* computation. */
|
2668
|
+
if (src0->numeric && src1->numeric) {
|
2669
|
+
/* Both sources are numeric. */
|
2670
|
+
return greater_value_numeric(src0,src1,dst);
|
2671
|
+
} else if (is_defined_value(src0) && is_defined_value(src1)) {
|
2672
|
+
/* Both sources can be converted to numeric values. */
|
2673
|
+
return greater_value_defined_bitstring(src0,src1,dst);
|
2674
|
+
} else {
|
2675
|
+
/* Cannot compute (for now), simply undefines the destination. */
|
2676
|
+
/* First ensure dst has the right shape. */
|
2677
|
+
copy_value(src0,dst);
|
2678
|
+
/* Then make it undefined. */
|
2679
|
+
set_undefined_bitstring(dst);
|
2680
|
+
}
|
2681
|
+
return dst;
|
2682
|
+
}
|
2683
|
+
|
2684
|
+
|
2437
2685
|
/** Computes the lesser comparision of two general values.
|
2438
2686
|
* @param src0 the first source value of the addition
|
2439
2687
|
* @param src1 the second source value of the addition
|
@@ -2461,22 +2709,22 @@ Value lesser_value(Value src0, Value src1, Value dst) {
|
|
2461
2709
|
}
|
2462
2710
|
|
2463
2711
|
|
2464
|
-
/** Computes the greater comparision of two
|
2465
|
-
* @param src0 the first source value of the
|
2466
|
-
* @param src1 the second source value of the
|
2712
|
+
/** Computes the greater or equal comparision of two values.
|
2713
|
+
* @param src0 the first source value of the comparison
|
2714
|
+
* @param src1 the second source value of the comparison
|
2467
2715
|
* @param dst the destination value
|
2468
2716
|
* @return dst */
|
2469
|
-
Value
|
2717
|
+
Value greater_equal_value(Value src0, Value src1, Value dst) {
|
2470
2718
|
/* Might allocate a new value so save the current pool state. */
|
2471
2719
|
unsigned int pos = get_value_pos();
|
2472
2720
|
/* Do a numeric computation if possible, otherwise fallback to bitstring
|
2473
2721
|
* computation. */
|
2474
2722
|
if (src0->numeric && src1->numeric) {
|
2475
2723
|
/* Both sources are numeric. */
|
2476
|
-
return
|
2724
|
+
return greater_equal_value_numeric(src0,src1,dst);
|
2477
2725
|
} else if (is_defined_value(src0) && is_defined_value(src1)) {
|
2478
2726
|
/* Both sources can be converted to numeric values. */
|
2479
|
-
return
|
2727
|
+
return greater_equal_value_defined_bitstring(src0,src1,dst);
|
2480
2728
|
} else {
|
2481
2729
|
/* Cannot compute (for now), simply undefines the destination. */
|
2482
2730
|
/* First ensure dst has the right shape. */
|
@@ -2487,6 +2735,33 @@ Value greater_value(Value src0, Value src1, Value dst) {
|
|
2487
2735
|
return dst;
|
2488
2736
|
}
|
2489
2737
|
|
2738
|
+
/** Computes the lesser or equal comparision of two values.
|
2739
|
+
* @param src0 the first source value of the comparison
|
2740
|
+
* @param src1 the second source value of the comparison
|
2741
|
+
* @param dst the destination value
|
2742
|
+
* @return dst */
|
2743
|
+
Value lesser_equal_value(Value src0, Value src1, Value dst) {
|
2744
|
+
/* Might allocate a new value so save the current pool state. */
|
2745
|
+
unsigned int pos = get_value_pos();
|
2746
|
+
/* Do a numeric computation if possible, otherwise fallback to bitstring
|
2747
|
+
* computation. */
|
2748
|
+
if (src0->numeric && src1->numeric) {
|
2749
|
+
/* Both sources are numeric. */
|
2750
|
+
return lesser_equal_value_numeric(src0,src1,dst);
|
2751
|
+
} else if (is_defined_value(src0) && is_defined_value(src1)) {
|
2752
|
+
/* Both sources can be converted to numeric values. */
|
2753
|
+
return lesser_equal_value_defined_bitstring(src0,src1,dst);
|
2754
|
+
} else {
|
2755
|
+
/* Cannot compute (for now), simply undefines the destination. */
|
2756
|
+
/* First ensure dst has the right shape. */
|
2757
|
+
copy_value(src0,dst);
|
2758
|
+
/* Then make it undefined. */
|
2759
|
+
set_undefined_bitstring(dst);
|
2760
|
+
}
|
2761
|
+
return dst;
|
2762
|
+
}
|
2763
|
+
|
2764
|
+
|
2490
2765
|
|
2491
2766
|
/** Selects a value depending on a general condition.
|
2492
2767
|
* @param cond the condition to use for selecting a value
|
@@ -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.16
|
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-09-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -83,6 +83,7 @@ files:
|
|
83
83
|
- lib/HDLRuby/hdr_samples/alu.rb
|
84
84
|
- lib/HDLRuby/hdr_samples/bstr_bench.rb
|
85
85
|
- lib/HDLRuby/hdr_samples/calculator.rb
|
86
|
+
- lib/HDLRuby/hdr_samples/comparison_bench.rb
|
86
87
|
- lib/HDLRuby/hdr_samples/constant_in_function.rb
|
87
88
|
- lib/HDLRuby/hdr_samples/counter_bench.rb
|
88
89
|
- lib/HDLRuby/hdr_samples/dff.rb
|
@@ -134,6 +135,7 @@ files:
|
|
134
135
|
- lib/HDLRuby/hdr_samples/sw_encrypt_cpusim_bench.rb
|
135
136
|
- lib/HDLRuby/hdr_samples/system_open.rb
|
136
137
|
- lib/HDLRuby/hdr_samples/tuple.rb
|
138
|
+
- lib/HDLRuby/hdr_samples/type_minmax_bench.rb
|
137
139
|
- lib/HDLRuby/hdr_samples/with_channel.rb
|
138
140
|
- lib/HDLRuby/hdr_samples/with_class.rb
|
139
141
|
- lib/HDLRuby/hdr_samples/with_connector.rb
|
@@ -148,6 +150,7 @@ files:
|
|
148
150
|
- lib/HDLRuby/hdr_samples/with_memory_rom.rb
|
149
151
|
- lib/HDLRuby/hdr_samples/with_multi_channels.rb
|
150
152
|
- lib/HDLRuby/hdr_samples/with_reconf.rb
|
153
|
+
- lib/HDLRuby/hdr_samples/with_to_array.rb
|
151
154
|
- lib/HDLRuby/hdrcc.rb
|
152
155
|
- lib/HDLRuby/high_samples/_adder_fault.rb
|
153
156
|
- lib/HDLRuby/high_samples/_generic_transmission2.rb
|