HDLRuby 2.10.3 → 2.11.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 +8 -4
- data/Rakefile +8 -0
- data/{lib/HDLRuby/sim/Makefile → ext/hruby_sim/Makefile_csim} +0 -0
- data/ext/hruby_sim/extconf.rb +13 -0
- data/ext/hruby_sim/hruby_rcsim_build.c +1188 -0
- data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim.h +255 -16
- data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_calc.c +310 -181
- data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_core.c +34 -17
- data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_list.c +0 -0
- data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_stack_calc.c +4 -1
- data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_stack_calc.c.sav +0 -0
- data/ext/hruby_sim/hruby_sim_tree_calc.c +375 -0
- data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_vcd.c +5 -5
- data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_vizualize.c +2 -2
- data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_value_pool.c +4 -1
- data/lib/HDLRuby/hdr_samples/bstr_bench.rb +2 -0
- data/lib/HDLRuby/hdr_samples/case_bench.rb +2 -2
- data/lib/HDLRuby/hdr_samples/counter_bench.rb +0 -1
- data/lib/HDLRuby/hdr_samples/counter_dff_bench.rb +46 -0
- data/lib/HDLRuby/hdr_samples/dff_bench.rb +4 -1
- data/lib/HDLRuby/hdr_samples/dff_override.rb +76 -0
- data/lib/HDLRuby/hdr_samples/print_bench.rb +62 -0
- data/lib/HDLRuby/hdr_samples/rom.rb +5 -3
- data/lib/HDLRuby/hdr_samples/simple_counter_bench.rb +43 -0
- data/lib/HDLRuby/hdr_samples/with_values.rb +14 -0
- data/lib/HDLRuby/hdrcc.rb +84 -21
- data/lib/HDLRuby/hruby_bstr.rb +1175 -917
- data/lib/HDLRuby/hruby_high.rb +267 -97
- data/lib/HDLRuby/hruby_high_fullname.rb +82 -0
- data/lib/HDLRuby/hruby_low.rb +110 -71
- data/lib/HDLRuby/hruby_low2c.rb +7 -0
- data/lib/HDLRuby/hruby_low_mutable.rb +1 -1
- data/lib/HDLRuby/hruby_low_without_namespace.rb +2 -1
- data/lib/HDLRuby/hruby_rcsim.rb +978 -0
- data/lib/HDLRuby/hruby_rsim.rb +1134 -0
- data/lib/HDLRuby/hruby_rsim_vcd.rb +322 -0
- data/lib/HDLRuby/hruby_values.rb +362 -18
- data/lib/HDLRuby/hruby_verilog.rb +21 -3
- data/lib/HDLRuby/std/handshakes.rb +1 -1
- data/lib/HDLRuby/version.rb +1 -1
- metadata +25 -13
@@ -225,7 +225,7 @@ Value make_value(Type type, int numeric) {
|
|
225
225
|
* @note do not change the type of the value, only its capacity.
|
226
226
|
* @praam value the value to change
|
227
227
|
* @param size the size to match */
|
228
|
-
void resize_value(Value value,
|
228
|
+
void resize_value(Value value, unsigned long long size) {
|
229
229
|
if (value->capacity < size) {
|
230
230
|
/* Resizing required, to limit frequent resize, double the
|
231
231
|
* required new capacity. */
|
@@ -303,6 +303,9 @@ fix_numeric_type(Type type, unsigned long long val);
|
|
303
303
|
* @param dst the destination value
|
304
304
|
* @return dst */
|
305
305
|
Value copy_value(Value src, Value dst) {
|
306
|
+
// printf("copy_value with src=%p and dst=%p\n",src,dst);
|
307
|
+
// printf("src->type=%p dst->type=%p\n",src->type,dst->type);
|
308
|
+
// printf("src->numeric=%i dst->numeric=%i\n",src->numeric,dst->numeric);
|
306
309
|
/* set the status of the destination from the source. */
|
307
310
|
if (dst->type == NULL)
|
308
311
|
dst->type = src->type;
|
@@ -696,27 +699,42 @@ static Value greater_value_defined_bitstring(Value src0, Value src1, Value dst)
|
|
696
699
|
dst->type = src0->type;
|
697
700
|
dst->numeric = 1;
|
698
701
|
|
702
|
+
// /* Perform the comparison. */
|
703
|
+
// if (src0->type->flags.sign) {
|
704
|
+
// if (src1->type->flags.sign) {
|
705
|
+
// dst->data_int =
|
706
|
+
// ((signed long long)value2integer(src0) >
|
707
|
+
// (signed long long)value2integer(src1));
|
708
|
+
// } else {
|
709
|
+
// dst->data_int =
|
710
|
+
// ((signed long long)value2integer(src0) >
|
711
|
+
// (unsigned long long)value2integer(src1));
|
712
|
+
// }
|
713
|
+
// } else {
|
714
|
+
// if (src1->type->flags.sign) {
|
715
|
+
// dst->data_int =
|
716
|
+
// ((unsigned long long)value2integer(src0) >
|
717
|
+
// (signed long long)value2integer(src1));
|
718
|
+
// } else {
|
719
|
+
// dst->data_int =
|
720
|
+
// ((unsigned long long)value2integer(src0) >
|
721
|
+
// (unsigned long long)value2integer(src1));
|
722
|
+
// }
|
723
|
+
// }
|
724
|
+
/* Converts the values to integers. */
|
725
|
+
unsigned long long src0i = value2integer(src0);
|
726
|
+
unsigned long long src1i = value2integer(src1);
|
699
727
|
/* Perform the comparison. */
|
700
728
|
if (src0->type->flags.sign) {
|
701
|
-
if (src1->type->flags.sign)
|
702
|
-
dst->data_int =
|
703
|
-
|
704
|
-
|
705
|
-
} else {
|
706
|
-
dst->data_int =
|
707
|
-
((signed long long)value2integer(src0) >
|
708
|
-
(unsigned long long)value2integer(src1));
|
709
|
-
}
|
729
|
+
if (src1->type->flags.sign)
|
730
|
+
dst->data_int = (signed long long)src0i > (signed long long)src1i;
|
731
|
+
else
|
732
|
+
dst->data_int = (signed long long)src0i >= 0 ? src0i > src1i : 0;
|
710
733
|
} else {
|
711
|
-
if (src1->type->flags.sign)
|
712
|
-
dst->data_int =
|
713
|
-
|
714
|
-
|
715
|
-
} else {
|
716
|
-
dst->data_int =
|
717
|
-
((unsigned long long)value2integer(src0) >
|
718
|
-
(unsigned long long)value2integer(src1));
|
719
|
-
}
|
734
|
+
if (src1->type->flags.sign)
|
735
|
+
dst->data_int = (signed long long)src1i >= 0 ? src0i > src1i : 1;
|
736
|
+
else
|
737
|
+
dst->data_int = src0i > src1i;
|
720
738
|
}
|
721
739
|
return dst;
|
722
740
|
}
|
@@ -731,27 +749,42 @@ static Value lesser_value_defined_bitstring(Value src0, Value src1, Value dst) {
|
|
731
749
|
dst->type = src0->type;
|
732
750
|
dst->numeric = 1;
|
733
751
|
|
752
|
+
// /* Perform the comparison. */
|
753
|
+
// if (src0->type->flags.sign) {
|
754
|
+
// if (src1->type->flags.sign) {
|
755
|
+
// dst->data_int =
|
756
|
+
// ((signed long long)value2integer(src0) <
|
757
|
+
// (signed long long)value2integer(src1));
|
758
|
+
// } else {
|
759
|
+
// dst->data_int =
|
760
|
+
// ((signed long long)value2integer(src0) <
|
761
|
+
// (unsigned long long)value2integer(src1));
|
762
|
+
// }
|
763
|
+
// } else {
|
764
|
+
// if (src1->type->flags.sign) {
|
765
|
+
// dst->data_int =
|
766
|
+
// ((unsigned long long)value2integer(src0) <
|
767
|
+
// (signed long long)value2integer(src1));
|
768
|
+
// } else {
|
769
|
+
// dst->data_int =
|
770
|
+
// ((unsigned long long)value2integer(src0) <
|
771
|
+
// (unsigned long long)value2integer(src1));
|
772
|
+
// }
|
773
|
+
// }
|
774
|
+
/* Converts the values to integers. */
|
775
|
+
unsigned long long src0i = value2integer(src0);
|
776
|
+
unsigned long long src1i = value2integer(src1);
|
734
777
|
/* Perform the comparison. */
|
735
778
|
if (src0->type->flags.sign) {
|
736
|
-
if (src1->type->flags.sign)
|
737
|
-
dst->data_int =
|
738
|
-
|
739
|
-
|
740
|
-
} else {
|
741
|
-
dst->data_int =
|
742
|
-
((signed long long)value2integer(src0) <
|
743
|
-
(unsigned long long)value2integer(src1));
|
744
|
-
}
|
779
|
+
if (src1->type->flags.sign)
|
780
|
+
dst->data_int = (signed long long)src0i < (signed long long)src1i;
|
781
|
+
else
|
782
|
+
dst->data_int = (signed long long)src0i >= 0 ? src0i < src1i : 1;
|
745
783
|
} else {
|
746
|
-
if (src1->type->flags.sign)
|
747
|
-
dst->data_int =
|
748
|
-
|
749
|
-
|
750
|
-
} else {
|
751
|
-
dst->data_int =
|
752
|
-
((unsigned long long)value2integer(src0) <
|
753
|
-
(unsigned long long)value2integer(src1));
|
754
|
-
}
|
784
|
+
if (src1->type->flags.sign)
|
785
|
+
dst->data_int = (signed long long)src1i >= 0 ? src0i < src1i : 0;
|
786
|
+
else
|
787
|
+
dst->data_int = src0i < src1i;
|
755
788
|
}
|
756
789
|
return dst;
|
757
790
|
}
|
@@ -766,27 +799,42 @@ static Value greater_equal_value_defined_bitstring(Value src0, Value src1, Value
|
|
766
799
|
dst->type = src0->type;
|
767
800
|
dst->numeric = 1;
|
768
801
|
|
802
|
+
// /* Perform the comparison. */
|
803
|
+
// if (src0->type->flags.sign) {
|
804
|
+
// if (src1->type->flags.sign) {
|
805
|
+
// dst->data_int =
|
806
|
+
// ((signed long long)value2integer(src0) >=
|
807
|
+
// (signed long long)value2integer(src1));
|
808
|
+
// } else {
|
809
|
+
// dst->data_int =
|
810
|
+
// ((signed long long)value2integer(src0) >=
|
811
|
+
// (unsigned long long)value2integer(src1));
|
812
|
+
// }
|
813
|
+
// } else {
|
814
|
+
// if (src1->type->flags.sign) {
|
815
|
+
// dst->data_int =
|
816
|
+
// ((unsigned long long)value2integer(src0) >=
|
817
|
+
// (signed long long)value2integer(src1));
|
818
|
+
// } else {
|
819
|
+
// dst->data_int =
|
820
|
+
// ((unsigned long long)value2integer(src0) >=
|
821
|
+
// (unsigned long long)value2integer(src1));
|
822
|
+
// }
|
823
|
+
// }
|
824
|
+
/* Converts the values to integers. */
|
825
|
+
unsigned long long src0i = value2integer(src0);
|
826
|
+
unsigned long long src1i = value2integer(src1);
|
769
827
|
/* Perform the comparison. */
|
770
828
|
if (src0->type->flags.sign) {
|
771
|
-
if (src1->type->flags.sign)
|
772
|
-
dst->data_int =
|
773
|
-
|
774
|
-
|
775
|
-
} else {
|
776
|
-
dst->data_int =
|
777
|
-
((signed long long)value2integer(src0) >=
|
778
|
-
(unsigned long long)value2integer(src1));
|
779
|
-
}
|
829
|
+
if (src1->type->flags.sign)
|
830
|
+
dst->data_int = (signed long long)src0i >= (signed long long)src1i;
|
831
|
+
else
|
832
|
+
dst->data_int = (signed long long)src0i >= 0 ? src0i >= src1i : 0;
|
780
833
|
} else {
|
781
|
-
if (src1->type->flags.sign)
|
782
|
-
dst->data_int =
|
783
|
-
|
784
|
-
|
785
|
-
} else {
|
786
|
-
dst->data_int =
|
787
|
-
((unsigned long long)value2integer(src0) >=
|
788
|
-
(unsigned long long)value2integer(src1));
|
789
|
-
}
|
834
|
+
if (src1->type->flags.sign)
|
835
|
+
dst->data_int = (signed long long)src1i >= 0 ? src0i >= src1i : 1;
|
836
|
+
else
|
837
|
+
dst->data_int = src0i >= src1i;
|
790
838
|
}
|
791
839
|
return dst;
|
792
840
|
}
|
@@ -801,27 +849,42 @@ static Value lesser_equal_value_defined_bitstring(Value src0, Value src1, Value
|
|
801
849
|
dst->type = src0->type;
|
802
850
|
dst->numeric = 1;
|
803
851
|
|
852
|
+
// /* Perform the comparison. */
|
853
|
+
// if (src0->type->flags.sign) {
|
854
|
+
// if (src1->type->flags.sign) {
|
855
|
+
// dst->data_int =
|
856
|
+
// ((signed long long)value2integer(src0) <=
|
857
|
+
// (signed long long)value2integer(src1));
|
858
|
+
// } else {
|
859
|
+
// dst->data_int =
|
860
|
+
// ((signed long long)value2integer(src0) <=
|
861
|
+
// (unsigned long long)value2integer(src1));
|
862
|
+
// }
|
863
|
+
// } else {
|
864
|
+
// if (src1->type->flags.sign) {
|
865
|
+
// dst->data_int =
|
866
|
+
// ((unsigned long long)value2integer(src0) <=
|
867
|
+
// (signed long long)value2integer(src1));
|
868
|
+
// } else {
|
869
|
+
// dst->data_int =
|
870
|
+
// ((unsigned long long)value2integer(src0) <=
|
871
|
+
// (unsigned long long)value2integer(src1));
|
872
|
+
// }
|
873
|
+
// }
|
874
|
+
/* Converts the values to integers. */
|
875
|
+
unsigned long long src0i = value2integer(src0);
|
876
|
+
unsigned long long src1i = value2integer(src1);
|
804
877
|
/* Perform the comparison. */
|
805
878
|
if (src0->type->flags.sign) {
|
806
|
-
if (src1->type->flags.sign)
|
807
|
-
dst->data_int =
|
808
|
-
|
809
|
-
|
810
|
-
} else {
|
811
|
-
dst->data_int =
|
812
|
-
((signed long long)value2integer(src0) <=
|
813
|
-
(unsigned long long)value2integer(src1));
|
814
|
-
}
|
879
|
+
if (src1->type->flags.sign)
|
880
|
+
dst->data_int = (signed long long)src0i <= (signed long long)src1i;
|
881
|
+
else
|
882
|
+
dst->data_int = (signed long long)src0i >= 0 ? src0i <= src1i : 1;
|
815
883
|
} else {
|
816
|
-
if (src1->type->flags.sign)
|
817
|
-
dst->data_int =
|
818
|
-
|
819
|
-
|
820
|
-
} else {
|
821
|
-
dst->data_int =
|
822
|
-
((unsigned long long)value2integer(src0) <=
|
823
|
-
(unsigned long long)value2integer(src1));
|
824
|
-
}
|
884
|
+
if (src1->type->flags.sign)
|
885
|
+
dst->data_int = (signed long long)src1i >= 0 ? src0i <= src1i : 0;
|
886
|
+
else
|
887
|
+
dst->data_int = src0i <= src1i;
|
825
888
|
}
|
826
889
|
return dst;
|
827
890
|
}
|
@@ -1351,10 +1414,10 @@ static Value select_value_bitstring(Value cond, Value dst, unsigned int num,
|
|
1351
1414
|
* @param dst the destination value
|
1352
1415
|
* @param args the values to concat
|
1353
1416
|
* @return dst */
|
1354
|
-
static Value concat_value_bitstring_array(int num, int dir,
|
1417
|
+
static Value concat_value_bitstring_array(unsigned int num, int dir,
|
1355
1418
|
Value dst, Value* args) {
|
1356
1419
|
unsigned long long pos = 0; /* Current position in the resulting value.*/
|
1357
|
-
unsigned
|
1420
|
+
unsigned int i;
|
1358
1421
|
// printf("concat_value_bitstring with dir=%d\n",dir);
|
1359
1422
|
|
1360
1423
|
/* Compute the size of the destination. */
|
@@ -1508,7 +1571,8 @@ static int same_content_value_range_bitstring(Value value0,
|
|
1508
1571
|
* @param base the type of the elements
|
1509
1572
|
* @param dst the destination value
|
1510
1573
|
* @return dst */
|
1511
|
-
Value read_range_bitstring(Value src,
|
1574
|
+
Value read_range_bitstring(Value src,
|
1575
|
+
unsigned long long first, unsigned long long last,
|
1512
1576
|
Type base, Value dst) {
|
1513
1577
|
// printf("read_range_bitstring with first=%lld last=%lld src=%s\n",first,last,src->data_str);
|
1514
1578
|
/* Ensure first is the smaller. */
|
@@ -1547,7 +1611,8 @@ Value read_range_bitstring(Value src, long long first, long long last,
|
|
1547
1611
|
* @param base the type of the elements
|
1548
1612
|
* @param dst the destination value
|
1549
1613
|
* @return dst */
|
1550
|
-
Value write_range_bitstring(Value src,
|
1614
|
+
Value write_range_bitstring(Value src,
|
1615
|
+
unsigned long long first, unsigned long long last,
|
1551
1616
|
Type base, Value dst) {
|
1552
1617
|
unsigned long long i;
|
1553
1618
|
/* Ensure first is the smaller. */
|
@@ -1586,7 +1651,8 @@ Value write_range_bitstring(Value src, long long first, long long last,
|
|
1586
1651
|
* @param base the type of the elements
|
1587
1652
|
* @param dst the destination value
|
1588
1653
|
* @return dst */
|
1589
|
-
Value write_range_bitstring_no_z(Value src,
|
1654
|
+
Value write_range_bitstring_no_z(Value src,
|
1655
|
+
unsigned long long first, unsigned long long last,
|
1590
1656
|
Type base, Value dst) {
|
1591
1657
|
unsigned long long i;
|
1592
1658
|
/* Ensure first is the smaller. */
|
@@ -1627,7 +1693,7 @@ Value write_range_bitstring_no_z(Value src, long long first, long long last,
|
|
1627
1693
|
static unsigned long long
|
1628
1694
|
fix_numeric_type(Type type, unsigned long long val) {
|
1629
1695
|
/* Get the width of the type. */
|
1630
|
-
|
1696
|
+
unsigned long long width = type_width(type);
|
1631
1697
|
/* Compute the base mask. */
|
1632
1698
|
// unsigned long long mask = ((unsigned long long)(-1)) << width;
|
1633
1699
|
/* NOTE: (ull)-1 << 64 becomes (ull)-1 on Intel processors, this is
|
@@ -1873,9 +1939,9 @@ static Value equal_value_numeric(Value src0, Value src1, Value dst) {
|
|
1873
1939
|
|
1874
1940
|
/* Perform the comparison. */
|
1875
1941
|
dst->data_int = (src0->data_int == src1->data_int) ? 1 : 0;
|
1876
|
-
printf("scr0->data_int=%lld\n",src0->data_int);
|
1877
|
-
printf("scr1->data_int=%lld\n",src1->data_int);
|
1878
|
-
printf("dst->data_int=%lld\n",dst->data_int);
|
1942
|
+
// printf("scr0->data_int=%lld\n",src0->data_int);
|
1943
|
+
// printf("scr1->data_int=%lld\n",src1->data_int);
|
1944
|
+
// printf("dst->data_int=%lld\n",dst->data_int);
|
1879
1945
|
return dst;
|
1880
1946
|
}
|
1881
1947
|
|
@@ -1890,27 +1956,41 @@ static Value greater_value_numeric(Value src0, Value src1, Value dst) {
|
|
1890
1956
|
dst->type = src0->type;
|
1891
1957
|
dst->numeric = 1;
|
1892
1958
|
|
1893
|
-
/* Perform the greater. */
|
1959
|
+
// /* Perform the greater. */
|
1960
|
+
// if (src0->type->flags.sign) {
|
1961
|
+
// if (src1->type->flags.sign) {
|
1962
|
+
// dst->data_int =
|
1963
|
+
// ((signed long long)src0->data_int >
|
1964
|
+
// (signed long long)src1->data_int);
|
1965
|
+
// } else {
|
1966
|
+
// dst->data_int =
|
1967
|
+
// ((signed long long)src0->data_int >
|
1968
|
+
// (unsigned long long)src1->data_int);
|
1969
|
+
// }
|
1970
|
+
// } else {
|
1971
|
+
// if (src1->type->flags.sign) {
|
1972
|
+
// dst->data_int =
|
1973
|
+
// ((unsigned long long)src0->data_int >
|
1974
|
+
// (signed long long)src1->data_int);
|
1975
|
+
// } else {
|
1976
|
+
// dst->data_int =
|
1977
|
+
// ((unsigned long long)src0->data_int >
|
1978
|
+
// (unsigned long long)src1->data_int);
|
1979
|
+
// }
|
1980
|
+
// }
|
1981
|
+
unsigned long long src0i = src0->data_int;
|
1982
|
+
unsigned long long src1i = src1->data_int;
|
1983
|
+
/* Perform the comparison. */
|
1894
1984
|
if (src0->type->flags.sign) {
|
1895
|
-
if (src1->type->flags.sign)
|
1896
|
-
dst->data_int =
|
1897
|
-
|
1898
|
-
|
1899
|
-
} else {
|
1900
|
-
dst->data_int =
|
1901
|
-
((signed long long)src0->data_int >
|
1902
|
-
(unsigned long long)src1->data_int);
|
1903
|
-
}
|
1985
|
+
if (src1->type->flags.sign)
|
1986
|
+
dst->data_int = (signed long long)src0i > (signed long long)src1i;
|
1987
|
+
else
|
1988
|
+
dst->data_int = (signed long long)src0i >= 0 ? src0i > src1i : 0;
|
1904
1989
|
} else {
|
1905
|
-
if (src1->type->flags.sign)
|
1906
|
-
dst->data_int =
|
1907
|
-
|
1908
|
-
|
1909
|
-
} else {
|
1910
|
-
dst->data_int =
|
1911
|
-
((unsigned long long)src0->data_int >
|
1912
|
-
(unsigned long long)src1->data_int);
|
1913
|
-
}
|
1990
|
+
if (src1->type->flags.sign)
|
1991
|
+
dst->data_int = (signed long long)src1i >= 0 ? src0i > src1i : 1;
|
1992
|
+
else
|
1993
|
+
dst->data_int = src0i > src1i;
|
1914
1994
|
}
|
1915
1995
|
return dst;
|
1916
1996
|
}
|
@@ -1925,27 +2005,41 @@ static Value lesser_value_numeric(Value src0, Value src1, Value dst) {
|
|
1925
2005
|
dst->type = src0->type;
|
1926
2006
|
dst->numeric = 1;
|
1927
2007
|
|
1928
|
-
/* Perform the lesser. */
|
2008
|
+
// /* Perform the lesser. */
|
2009
|
+
// if (src0->type->flags.sign) {
|
2010
|
+
// if (src1->type->flags.sign) {
|
2011
|
+
// dst->data_int =
|
2012
|
+
// ((signed long long)src0->data_int <
|
2013
|
+
// (signed long long)src1->data_int);
|
2014
|
+
// } else {
|
2015
|
+
// dst->data_int =
|
2016
|
+
// ((signed long long)src0->data_int <
|
2017
|
+
// (unsigned long long)src1->data_int);
|
2018
|
+
// }
|
2019
|
+
// } else {
|
2020
|
+
// if (src1->type->flags.sign) {
|
2021
|
+
// dst->data_int =
|
2022
|
+
// ((unsigned long long)src0->data_int <
|
2023
|
+
// (signed long long)src1->data_int);
|
2024
|
+
// } else {
|
2025
|
+
// dst->data_int =
|
2026
|
+
// ((unsigned long long)src0->data_int <
|
2027
|
+
// (unsigned long long)src1->data_int);
|
2028
|
+
// }
|
2029
|
+
// }
|
2030
|
+
unsigned long long src0i = src0->data_int;
|
2031
|
+
unsigned long long src1i = src1->data_int;
|
2032
|
+
/* Perform the comparison. */
|
1929
2033
|
if (src0->type->flags.sign) {
|
1930
|
-
if (src1->type->flags.sign)
|
1931
|
-
dst->data_int =
|
1932
|
-
|
1933
|
-
|
1934
|
-
} else {
|
1935
|
-
dst->data_int =
|
1936
|
-
((signed long long)src0->data_int <
|
1937
|
-
(unsigned long long)src1->data_int);
|
1938
|
-
}
|
2034
|
+
if (src1->type->flags.sign)
|
2035
|
+
dst->data_int = (signed long long)src0i < (signed long long)src1i;
|
2036
|
+
else
|
2037
|
+
dst->data_int = (signed long long)src0i >= 0 ? src0i < src1i : 1;
|
1939
2038
|
} else {
|
1940
|
-
if (src1->type->flags.sign)
|
1941
|
-
dst->data_int =
|
1942
|
-
|
1943
|
-
|
1944
|
-
} else {
|
1945
|
-
dst->data_int =
|
1946
|
-
((unsigned long long)src0->data_int <
|
1947
|
-
(unsigned long long)src1->data_int);
|
1948
|
-
}
|
2039
|
+
if (src1->type->flags.sign)
|
2040
|
+
dst->data_int = (signed long long)src1i >= 0 ? src0i < src1i : 0;
|
2041
|
+
else
|
2042
|
+
dst->data_int = src0i < src1i;
|
1949
2043
|
}
|
1950
2044
|
return dst;
|
1951
2045
|
}
|
@@ -1960,27 +2054,41 @@ static Value greater_equal_value_numeric(Value src0, Value src1, Value dst) {
|
|
1960
2054
|
dst->type = src0->type;
|
1961
2055
|
dst->numeric = 1;
|
1962
2056
|
|
1963
|
-
/* Perform the greater or equal. */
|
2057
|
+
// /* Perform the greater or equal. */
|
2058
|
+
// if (src0->type->flags.sign) {
|
2059
|
+
// if (src1->type->flags.sign) {
|
2060
|
+
// dst->data_int =
|
2061
|
+
// ((signed long long)src0->data_int >=
|
2062
|
+
// (signed long long)src1->data_int);
|
2063
|
+
// } else {
|
2064
|
+
// dst->data_int =
|
2065
|
+
// ((signed long long)src0->data_int >=
|
2066
|
+
// (unsigned long long)src1->data_int);
|
2067
|
+
// }
|
2068
|
+
// } else {
|
2069
|
+
// if (src1->type->flags.sign) {
|
2070
|
+
// dst->data_int =
|
2071
|
+
// ((unsigned long long)src0->data_int >=
|
2072
|
+
// (signed long long)src1->data_int);
|
2073
|
+
// } else {
|
2074
|
+
// dst->data_int =
|
2075
|
+
// ((unsigned long long)src0->data_int >=
|
2076
|
+
// (unsigned long long)src1->data_int);
|
2077
|
+
// }
|
2078
|
+
// }
|
2079
|
+
unsigned long long src0i = src0->data_int;
|
2080
|
+
unsigned long long src1i = src1->data_int;
|
2081
|
+
/* Perform the comparison. */
|
1964
2082
|
if (src0->type->flags.sign) {
|
1965
|
-
if (src1->type->flags.sign)
|
1966
|
-
dst->data_int =
|
1967
|
-
|
1968
|
-
|
1969
|
-
} else {
|
1970
|
-
dst->data_int =
|
1971
|
-
((signed long long)src0->data_int >=
|
1972
|
-
(unsigned long long)src1->data_int);
|
1973
|
-
}
|
2083
|
+
if (src1->type->flags.sign)
|
2084
|
+
dst->data_int = (signed long long)src0i >= (signed long long)src1i;
|
2085
|
+
else
|
2086
|
+
dst->data_int = (signed long long)src0i >= 0 ? src0i >= src1i : 0;
|
1974
2087
|
} else {
|
1975
|
-
if (src1->type->flags.sign)
|
1976
|
-
dst->data_int =
|
1977
|
-
|
1978
|
-
|
1979
|
-
} else {
|
1980
|
-
dst->data_int =
|
1981
|
-
((unsigned long long)src0->data_int >=
|
1982
|
-
(unsigned long long)src1->data_int);
|
1983
|
-
}
|
2088
|
+
if (src1->type->flags.sign)
|
2089
|
+
dst->data_int = (signed long long)src1i >= 0 ? src0i >= src1i : 1;
|
2090
|
+
else
|
2091
|
+
dst->data_int = src0i >= src1i;
|
1984
2092
|
}
|
1985
2093
|
return dst;
|
1986
2094
|
}
|
@@ -1995,27 +2103,41 @@ static Value lesser_equal_value_numeric(Value src0, Value src1, Value dst) {
|
|
1995
2103
|
dst->type = src0->type;
|
1996
2104
|
dst->numeric = 1;
|
1997
2105
|
|
1998
|
-
/* Perform the lesser or equal. */
|
2106
|
+
// /* Perform the lesser or equal. */
|
2107
|
+
// if (src0->type->flags.sign) {
|
2108
|
+
// if (src1->type->flags.sign) {
|
2109
|
+
// dst->data_int =
|
2110
|
+
// ((signed long long)src0->data_int <=
|
2111
|
+
// (signed long long)src1->data_int);
|
2112
|
+
// } else {
|
2113
|
+
// dst->data_int =
|
2114
|
+
// ((signed long long)src0->data_int <=
|
2115
|
+
// (unsigned long long)src1->data_int);
|
2116
|
+
// }
|
2117
|
+
// } else {
|
2118
|
+
// if (src1->type->flags.sign) {
|
2119
|
+
// dst->data_int =
|
2120
|
+
// ((unsigned long long)src0->data_int <=
|
2121
|
+
// (signed long long)src1->data_int);
|
2122
|
+
// } else {
|
2123
|
+
// dst->data_int =
|
2124
|
+
// ((unsigned long long)src0->data_int <=
|
2125
|
+
// (unsigned long long)src1->data_int);
|
2126
|
+
// }
|
2127
|
+
// }
|
2128
|
+
unsigned long long src0i = src0->data_int;
|
2129
|
+
unsigned long long src1i = src1->data_int;
|
2130
|
+
/* Perform the comparison. */
|
1999
2131
|
if (src0->type->flags.sign) {
|
2000
|
-
if (src1->type->flags.sign)
|
2001
|
-
dst->data_int =
|
2002
|
-
|
2003
|
-
|
2004
|
-
} else {
|
2005
|
-
dst->data_int =
|
2006
|
-
((signed long long)src0->data_int <=
|
2007
|
-
(unsigned long long)src1->data_int);
|
2008
|
-
}
|
2132
|
+
if (src1->type->flags.sign)
|
2133
|
+
dst->data_int = (signed long long)src0i <= (signed long long)src1i;
|
2134
|
+
else
|
2135
|
+
dst->data_int = (signed long long)src0i >= 0 ? src0i <= src1i : 1;
|
2009
2136
|
} else {
|
2010
|
-
if (src1->type->flags.sign)
|
2011
|
-
dst->data_int =
|
2012
|
-
|
2013
|
-
|
2014
|
-
} else {
|
2015
|
-
dst->data_int =
|
2016
|
-
((unsigned long long)src0->data_int <=
|
2017
|
-
(unsigned long long)src1->data_int);
|
2018
|
-
}
|
2137
|
+
if (src1->type->flags.sign)
|
2138
|
+
dst->data_int = (signed long long)src1i >= 0 ? src0i <= src1i : 0;
|
2139
|
+
else
|
2140
|
+
dst->data_int = src0i <= src1i;
|
2019
2141
|
}
|
2020
2142
|
return dst;
|
2021
2143
|
}
|
@@ -2048,7 +2170,7 @@ static Value select_value_numeric(Value cond, Value dst, unsigned int num,
|
|
2048
2170
|
* @param dir the direction of the concatenation.
|
2049
2171
|
* @param dst the destination value
|
2050
2172
|
* @return dst */
|
2051
|
-
static Value concat_value_numeric_array(int num, int dir,
|
2173
|
+
static Value concat_value_numeric_array(unsigned int num, int dir,
|
2052
2174
|
Value dst, Value* args) {
|
2053
2175
|
unsigned int i,pos;
|
2054
2176
|
/* Compute the bit width of the destination. */
|
@@ -2146,7 +2268,8 @@ static int same_content_value_range_numeric(Value value0,
|
|
2146
2268
|
* @param base the type of the elements
|
2147
2269
|
* @param dst the destination value
|
2148
2270
|
* @return dst */
|
2149
|
-
Value read_range_numeric(Value value,
|
2271
|
+
Value read_range_numeric(Value value,
|
2272
|
+
unsigned long long first, unsigned long long last,
|
2150
2273
|
Type base, Value dst) {
|
2151
2274
|
/* printf("read_range_numeric with value=%llx and first=%llu and last=%llu\n",value->data_int,first,last); */
|
2152
2275
|
/* Ensure first is the smaller. */
|
@@ -2159,6 +2282,7 @@ Value read_range_numeric(Value value, long long first, long long last,
|
|
2159
2282
|
long long length = last-first+1;
|
2160
2283
|
/* Compute the elements size. */
|
2161
2284
|
unsigned long long bw = type_width(base);
|
2285
|
+
// printf("bw=%llu\n",bw);
|
2162
2286
|
/* Scale the range according to the base type. */
|
2163
2287
|
first *= bw;
|
2164
2288
|
last *= bw;
|
@@ -2191,7 +2315,8 @@ Value read_range_numeric(Value value, long long first, long long last,
|
|
2191
2315
|
* @param base the type of the elements
|
2192
2316
|
* @param dst the destination value
|
2193
2317
|
* @return dst */
|
2194
|
-
Value write_range_numeric(Value src,
|
2318
|
+
Value write_range_numeric(Value src,
|
2319
|
+
unsigned long long first, unsigned long long last,
|
2195
2320
|
Type base, Value dst) {
|
2196
2321
|
// printf("write_range_numeric\n");
|
2197
2322
|
/* Ensure first is the smaller. */
|
@@ -2329,7 +2454,7 @@ Value mul_value(Value src0, Value src1, Value dst) {
|
|
2329
2454
|
// printf("src0->numeric=%d src1->numeric=%d\n",src0->numeric,src1->numeric);
|
2330
2455
|
// printf("is_defined_value(src0)=%d is_defined_value(src1)=%d\n",is_defined_value(src0),is_defined_value(src1));
|
2331
2456
|
/* Might allocate a new value so save the current pool state. */
|
2332
|
-
unsigned int pos = get_value_pos();
|
2457
|
+
// unsigned int pos = get_value_pos();
|
2333
2458
|
/* Do a numeric computation if possible, otherwise fallback to bitstring
|
2334
2459
|
* computation. */
|
2335
2460
|
if (src0->numeric) {
|
@@ -2377,7 +2502,7 @@ Value mul_value(Value src0, Value src1, Value dst) {
|
|
2377
2502
|
* @return dst */
|
2378
2503
|
Value div_value(Value src0, Value src1, Value dst) {
|
2379
2504
|
/* Might allocate a new value so save the current pool state. */
|
2380
|
-
unsigned int pos = get_value_pos();
|
2505
|
+
// unsigned int pos = get_value_pos();
|
2381
2506
|
/* Do a numeric computation if possible, otherwise fallback to bitstring
|
2382
2507
|
* computation. */
|
2383
2508
|
if (src0->numeric && src1->numeric) {
|
@@ -2404,7 +2529,7 @@ Value div_value(Value src0, Value src1, Value dst) {
|
|
2404
2529
|
* @return dst */
|
2405
2530
|
Value mod_value(Value src0, Value src1, Value dst) {
|
2406
2531
|
/* Might allocate a new value so save the current pool state. */
|
2407
|
-
unsigned int pos = get_value_pos();
|
2532
|
+
// unsigned int pos = get_value_pos();
|
2408
2533
|
/* Do a numeric computation if possible, otherwise fallback to bitstring
|
2409
2534
|
* computation. */
|
2410
2535
|
if (src0->numeric && src1->numeric) {
|
@@ -2688,7 +2813,7 @@ Value not_equal_value_c(Value src0, Value src1, Value dst) {
|
|
2688
2813
|
* @return dst */
|
2689
2814
|
Value greater_value(Value src0, Value src1, Value dst) {
|
2690
2815
|
/* Might allocate a new value so save the current pool state. */
|
2691
|
-
unsigned int pos = get_value_pos();
|
2816
|
+
// unsigned int pos = get_value_pos();
|
2692
2817
|
/* Do a numeric computation if possible, otherwise fallback to bitstring
|
2693
2818
|
* computation. */
|
2694
2819
|
if (src0->numeric && src1->numeric) {
|
@@ -2715,7 +2840,7 @@ Value greater_value(Value src0, Value src1, Value dst) {
|
|
2715
2840
|
* @return dst */
|
2716
2841
|
Value lesser_value(Value src0, Value src1, Value dst) {
|
2717
2842
|
/* Might allocate a new value so save the current pool state. */
|
2718
|
-
unsigned int pos = get_value_pos();
|
2843
|
+
// unsigned int pos = get_value_pos();
|
2719
2844
|
/* Do a numeric computation if possible, otherwise fallback to bitstring
|
2720
2845
|
* computation. */
|
2721
2846
|
if (src0->numeric && src1->numeric) {
|
@@ -2742,7 +2867,7 @@ Value lesser_value(Value src0, Value src1, Value dst) {
|
|
2742
2867
|
* @return dst */
|
2743
2868
|
Value greater_equal_value(Value src0, Value src1, Value dst) {
|
2744
2869
|
/* Might allocate a new value so save the current pool state. */
|
2745
|
-
unsigned int pos = get_value_pos();
|
2870
|
+
// unsigned int pos = get_value_pos();
|
2746
2871
|
/* Do a numeric computation if possible, otherwise fallback to bitstring
|
2747
2872
|
* computation. */
|
2748
2873
|
if (src0->numeric && src1->numeric) {
|
@@ -2768,7 +2893,7 @@ Value greater_equal_value(Value src0, Value src1, Value dst) {
|
|
2768
2893
|
* @return dst */
|
2769
2894
|
Value lesser_equal_value(Value src0, Value src1, Value dst) {
|
2770
2895
|
/* Might allocate a new value so save the current pool state. */
|
2771
|
-
unsigned int pos = get_value_pos();
|
2896
|
+
// unsigned int pos = get_value_pos();
|
2772
2897
|
/* Do a numeric computation if possible, otherwise fallback to bitstring
|
2773
2898
|
* computation. */
|
2774
2899
|
if (src0->numeric && src1->numeric) {
|
@@ -2813,9 +2938,10 @@ Value select_value(Value cond, Value dst, unsigned int num, ...) {
|
|
2813
2938
|
* @param num the number of values to concat
|
2814
2939
|
* @param dst the destination value
|
2815
2940
|
* @return dst */
|
2816
|
-
Value concat_valueP(int num, int dir, Value dst, Value* values) {
|
2941
|
+
Value concat_valueP(unsigned int num, int dir, Value dst, Value* values) {
|
2817
2942
|
unsigned long long width = 0;
|
2818
|
-
int numeric = 1
|
2943
|
+
int numeric = 1;
|
2944
|
+
unsigned int i;
|
2819
2945
|
/* check if all the sub values are numeric. */
|
2820
2946
|
for(i=0; i<num; ++i) {
|
2821
2947
|
if (!values[i]->numeric) {
|
@@ -2849,8 +2975,8 @@ Value concat_valueP(int num, int dir, Value dst, Value* values) {
|
|
2849
2975
|
}
|
2850
2976
|
return dst;
|
2851
2977
|
}
|
2852
|
-
Value concat_valueV(int num, int dir, Value dst, va_list args) {
|
2853
|
-
int i;
|
2978
|
+
Value concat_valueV(unsigned int num, int dir, Value dst, va_list args) {
|
2979
|
+
unsigned int i;
|
2854
2980
|
Value* values = alloca(num*sizeof(Value)); /* The values to concatenate. */
|
2855
2981
|
/* Copy the arguments to values for easier processing. */
|
2856
2982
|
for(i=0; i<num; ++i) {
|
@@ -2858,7 +2984,7 @@ Value concat_valueV(int num, int dir, Value dst, va_list args) {
|
|
2858
2984
|
}
|
2859
2985
|
return concat_valueP(num,dir,dst,values);
|
2860
2986
|
}
|
2861
|
-
Value concat_value(int num, int dir, Value dst, ...) {
|
2987
|
+
Value concat_value(unsigned int num, int dir, Value dst, ...) {
|
2862
2988
|
va_list args;
|
2863
2989
|
va_start(args,dst);
|
2864
2990
|
dst = concat_valueV(num,dir,dst,args);
|
@@ -2984,8 +3110,8 @@ int same_content_value_range(Value value0,
|
|
2984
3110
|
* @param first the start index of the range
|
2985
3111
|
* @param last the end index of the range
|
2986
3112
|
* @return the resulting reference */
|
2987
|
-
RefRangeS make_ref_rangeS(SignalI signal, Type typ,
|
2988
|
-
unsigned long long last) {
|
3113
|
+
RefRangeS make_ref_rangeS(SignalI signal, Type typ,
|
3114
|
+
unsigned long long first, unsigned long long last) {
|
2989
3115
|
RefRangeS result = { signal, typ, first, last };
|
2990
3116
|
return result;
|
2991
3117
|
}
|
@@ -3075,8 +3201,9 @@ unsigned long long value2integer(Value value) {
|
|
3075
3201
|
* @param base the type of the elements
|
3076
3202
|
* @param dst the destination value
|
3077
3203
|
* @return dst */
|
3078
|
-
Value read_range(Value value,
|
3079
|
-
|
3204
|
+
Value read_range(Value value,
|
3205
|
+
unsigned long long first, unsigned long long last,
|
3206
|
+
Type base, Value dst) {
|
3080
3207
|
/* Is the value numeric? */
|
3081
3208
|
if (value->numeric) {
|
3082
3209
|
/* Yes, do a numeric range read. */
|
@@ -3152,8 +3279,9 @@ Value read_range(Value value, long long first, long long last, Type base,
|
|
3152
3279
|
* @param base the type of the elements
|
3153
3280
|
* @param dst the destination value
|
3154
3281
|
* @return dst */
|
3155
|
-
Value write_range(Value src,
|
3156
|
-
|
3282
|
+
Value write_range(Value src,
|
3283
|
+
unsigned long long first, unsigned long long last,
|
3284
|
+
Type base, Value dst) {
|
3157
3285
|
// printf("write_range\n");
|
3158
3286
|
/* Is the value numeric? */
|
3159
3287
|
if ((src->numeric) && (dst->numeric)) {
|
@@ -3182,8 +3310,9 @@ Value write_range(Value src, long long first, long long last, Type base,
|
|
3182
3310
|
* @param base the type of the elements
|
3183
3311
|
* @param dst the destination value
|
3184
3312
|
* @return dst */
|
3185
|
-
Value write_range_no_z(Value src,
|
3186
|
-
|
3313
|
+
Value write_range_no_z(Value src,
|
3314
|
+
unsigned long long first, unsigned long long last,
|
3315
|
+
Type base, Value dst) {
|
3187
3316
|
// printf("write_range_no_z\n");
|
3188
3317
|
/* Is the value numeric? */
|
3189
3318
|
if ((src->numeric) && (dst->numeric)) {
|