HDLRuby 2.6.19 → 2.6.25

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 752424361455f2bd949a8f90c9802337f3ce1d853ebff6bfa44bbe25ebeda369
4
- data.tar.gz: f9c2dd84c0c875c423a94211948beaea44b54bfe234c01d6f35716b7df26053c
3
+ metadata.gz: a207f3222cab832d2b846f9658ea0cf9426e77afd14196c2db8cb6832bd4ebda
4
+ data.tar.gz: 490c8a6400d6faac77cec5ab1e49caa3abd94d4d0961521ec14d485cad640b72
5
5
  SHA512:
6
- metadata.gz: cc71caee7a2435e579b533b4cbba22c6bc9ca9e8e75be4e57d4a629b7a467ac28a2a302f6d53cf7552a1c1f115e17f5ec7b7648eadc482ab62bc2fdff1319cc6
7
- data.tar.gz: 4053a2050e82212db5901c7cb4756b21bca3465ec9ee4d08cd2875d8b57e5c53cd05df0405e2f5b249ec96b28271f514c8707fbb43b8e69db901ff9713a9b1f4
6
+ metadata.gz: '08196d385fb34444cc7387f6b4982063c38e98e10e51e3b58551b0a6b62dac6921fcbb9c7a89aaccabea055ecab0d2da0543667f688d52bd7ea6b875d9db5ebd'
7
+ data.tar.gz: c22296c840a2a7a52b8f4bd8bc34dc38c53f571feba0a01f1bb17a2f548c2965947916fcf47b95b33f2293f1481d8b91653d855c21708a746245cebffebc72f4
@@ -0,0 +1,30 @@
1
+ # Test the comparison operators.
2
+
3
+ # A benchmark for the case statement.
4
+ system :if_bench do
5
+ [8].inner :x, :y
6
+
7
+ par do
8
+ hcase(x)
9
+ hwhen(0) { y <= _10000000 }
10
+ hwhen(1) { y <= _10000001 }
11
+ hwhen(2) { y <= _10000010 }
12
+ hwhen(3) { y <= _10000011 }
13
+ helse { y <= _00000000 }
14
+ end
15
+
16
+ timed do
17
+ x <= 0
18
+ !10.ns
19
+ x <= 1
20
+ !10.ns
21
+ x <= 2
22
+ !10.ns
23
+ x <= 3
24
+ !10.ns
25
+ x <= 4
26
+ !10.ns
27
+ x <= 5
28
+ !10.ns
29
+ end
30
+ end
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
  function :func do |addr|
5
- bit[4][-4].constant tbl: [ _0000, _0001, _0010, _0011 ]
5
+ bit[4][-4].constant tbl: [ _1000, _1001, _1010, _1011 ]
6
6
 
7
7
  tbl[addr]
8
8
  end
@@ -0,0 +1,24 @@
1
+ # Test the comparison operators.
2
+
3
+ # A benchmark for the if statement.
4
+ system :if_bench do
5
+ [8].inner :x, :y, :z
6
+
7
+ par do
8
+ hif(x == y) { z <= 1 }
9
+ helsif(x < y) { z <= 2 }
10
+ helse { z <= 3 }
11
+ end
12
+
13
+ timed do
14
+ x <= 0
15
+ y <= 0
16
+ !10.ns
17
+ x <= 1
18
+ !10.ns
19
+ y <= 2
20
+ !10.ns
21
+ x <= 2
22
+ !10.ns
23
+ end
24
+ end
@@ -0,0 +1,37 @@
1
+ # Test the comparison operators.
2
+
3
+ # A benchmark for the index access..
4
+ system :if_bench do
5
+ [8].inner :x
6
+ inner :b0,:b1,:b2,:b3,:b4,:b5,:b6,:b7
7
+
8
+ par do
9
+ b0 <= x[0]
10
+ b1 <= x[1]
11
+ b2 <= x[2]
12
+ b3 <= x[3]
13
+ b4 <= x[4]
14
+ b5 <= x[5]
15
+ b6 <= x[6]
16
+ b7 <= x[7]
17
+ end
18
+
19
+ timed do
20
+ x <= 0
21
+ !10.ns
22
+ x <= 1
23
+ !10.ns
24
+ x <= 2
25
+ !10.ns
26
+ x <= 3
27
+ !10.ns
28
+ x <= 4
29
+ !10.ns
30
+ x <= 5
31
+ !10.ns
32
+ x[7] <= 1
33
+ !10.ns
34
+ x[6] <= 1
35
+ !10.ns
36
+ end
37
+ end
@@ -0,0 +1,47 @@
1
+ # Test the comparison operators.
2
+
3
+ # A benchmark for the index access..
4
+ system :if_bench do
5
+ [8].inner :x
6
+ [2].inner :r0,:r1,:r2,:r3
7
+
8
+ par do
9
+ r0 <= x[1..0]
10
+ r1 <= x[3..2]
11
+ r2 <= x[5..4]
12
+ r3 <= x[7..6]
13
+ end
14
+
15
+ timed do
16
+ x <= 0
17
+ !10.ns
18
+ x <= 1
19
+ !10.ns
20
+ x <= 2
21
+ !10.ns
22
+ x <= 3
23
+ !10.ns
24
+ x <= 4
25
+ !10.ns
26
+ x <= 5
27
+ !10.ns
28
+ x <= 6
29
+ !10.ns
30
+ x <= 7
31
+ !10.ns
32
+ x <= 8
33
+ !10.ns
34
+ x <= 81
35
+ !10.ns
36
+ x <= 123
37
+ !10.ns
38
+ x <= 0
39
+ !10.ns
40
+ x[7..6] <= 3
41
+ !10.ns
42
+ x[5..4] <= 2
43
+ !10.ns
44
+ x[3..2] <= 1
45
+ !10.ns
46
+ end
47
+ end
@@ -0,0 +1,30 @@
1
+
2
+ # A benchmark for testing the casts.
3
+ system :with_cast do
4
+ [8].inner :count
5
+ [8].inner :val0,:val1
6
+ [9].inner :val2,:val3
7
+
8
+ timed do
9
+ val0 <= _11111111
10
+ val1 <= _00000010
11
+ val3 <= _000000000
12
+ count <= 0
13
+ !10.ns
14
+ count <= 1
15
+ val2 <= val0 + val1
16
+ val3 <= val3 + 1
17
+ !10.ns
18
+ count <= 2
19
+ val2 <= val0.as(bit[9]) + val1
20
+ val3 <= val3.as(bit[10]) + 1
21
+ !10.ns
22
+ count <= 3
23
+ val2 <= (val0 + val1).as(bit[9])
24
+ val3 <= (val3 + 1).as(bit[10])
25
+ !10.ns
26
+ count <= 4
27
+ val2 <= (val0 + val1).as(bit[8])
28
+ !10.ns
29
+ end
30
+ end
@@ -0,0 +1,26 @@
1
+
2
+ # A benchmark for testing the concat.
3
+ system :with_concat do
4
+ [8].inner :count
5
+ [4].inner :val0,:val1
6
+ [8].inner :val2
7
+ [12].inner :val3
8
+
9
+ val2 <= [val0,val1]
10
+ val3 <= [val2,val0]
11
+
12
+ timed do
13
+ val0 <= _1111
14
+ val1 <= _0000
15
+ count <= 0
16
+ !10.ns
17
+ val0 <= _1001
18
+ val1 <= _0110
19
+ count <= 1
20
+ !10.ns
21
+ val0 <= _1010
22
+ val1 <= _0101
23
+ count <= 2
24
+ !10.ns
25
+ end
26
+ end
@@ -0,0 +1,38 @@
1
+
2
+
3
+ # A benchmark for testing the enumarable properties of expression (reduce).
4
+ system :with_reduce_bench do
5
+ [8].inner :val,:res
6
+ [64].inner :val64
7
+
8
+ timed do
9
+ val <= _01101010
10
+ res <= val.reduce(_00000000,:+)
11
+ !10.ns
12
+ val <= _01010010
13
+ res <= val.reduce(_00000000,:+)
14
+ !10.ns
15
+ val <= _01101111
16
+ res <= val.reduce(_00000000,:+)
17
+ !10.ns
18
+ val64 <= _0110101001101010011010100110101001101010011010100110101001101010
19
+ res <= val64.reduce(_00000000,:+)
20
+ !10.ns
21
+ res <= val64[7..0]
22
+ !10.ns
23
+ res <= res.reduce(_00000000,:+)
24
+ !10.ns
25
+ res <= val64[63..60]
26
+ !10.ns
27
+ res <= res.reduce(_00000000,:+)
28
+ !10.ns
29
+ val64 <= ~(val64 ^ val64)
30
+ res <= val64.reduce(_00000000,:+)
31
+ !10.ns
32
+ val64[0] <= _0
33
+ val64[3] <= _0
34
+ val64[63] <= _0
35
+ res <= val64.reduce(_00000000,:+)
36
+ !10.ns
37
+ end
38
+ end
@@ -0,0 +1,14 @@
1
+
2
+
3
+ # A benchmark for testing conversion of strings to values.
4
+ system :with_str2value_bench do
5
+ [8].inner :val
6
+ [64].inner :val64
7
+
8
+ timed do
9
+ val <= "01010011".to_value
10
+ !10.ns
11
+ val64 <= ("01010011" * 8).to_value
12
+ !10.ns
13
+ end
14
+ end
@@ -0,0 +1,90 @@
1
+
2
+ system :four2eight do
3
+ [4].input :four
4
+ output :o0, :o1, :o2, :o3, :o4, :o5, :o6, :o7
5
+
6
+ o0 <= four[0]; o1 <= four[1]; o2 <= four[2]; o3 <= four[3]
7
+ o4 <= four[0]; o5 <= four[1]; o6 <= four[2]; o7 <= four[3]
8
+ end
9
+
10
+ system :four2sixfour do
11
+ [4].input :four
12
+ output :o00, :o01, :o02, :o03, :o04, :o05, :o06, :o07,
13
+ :o08, :o09, :o0A, :o0B, :o0C, :o0D, :o0E, :o0F,
14
+ :o10, :o11, :o12, :o13, :o14, :o15, :o16, :o17,
15
+ :o18, :o19, :o1A, :o1B, :o1C, :o1D, :o1E, :o1F,
16
+ :o20, :o21, :o22, :o23, :o24, :o25, :o26, :o27,
17
+ :o28, :o29, :o2A, :o2B, :o2C, :o2D, :o2E, :o2F,
18
+ :o30, :o31, :o32, :o33, :o34, :o35, :o36, :o37,
19
+ :o38, :o39, :o3A, :o3B, :o3C, :o3D, :o3E, :o3F
20
+
21
+
22
+ o00 <= four[0]; o01 <= four[1]; o02 <= four[2]; o03 <= four[3]
23
+ o04 <= four[0]; o05 <= four[1]; o06 <= four[2]; o07 <= four[3]
24
+ o08 <= four[0]; o09 <= four[1]; o0A <= four[2]; o0B <= four[3]
25
+ o0C <= four[0]; o0D <= four[1]; o0E <= four[2]; o0F <= four[3]
26
+ o10 <= four[0]; o11 <= four[1]; o12 <= four[2]; o13 <= four[3]
27
+ o14 <= four[0]; o15 <= four[1]; o16 <= four[2]; o17 <= four[3]
28
+ o18 <= four[0]; o19 <= four[1]; o1A <= four[2]; o1B <= four[3]
29
+ o1C <= four[0]; o1D <= four[1]; o1E <= four[2]; o1F <= four[3]
30
+ o20 <= four[0]; o21 <= four[1]; o22 <= four[2]; o23 <= four[3]
31
+ o24 <= four[0]; o25 <= four[1]; o26 <= four[2]; o27 <= four[3]
32
+ o28 <= four[0]; o29 <= four[1]; o2A <= four[2]; o2B <= four[3]
33
+ o2C <= four[0]; o2D <= four[1]; o2E <= four[2]; o2F <= four[3]
34
+ o30 <= four[0]; o31 <= four[1]; o32 <= four[2]; o33 <= four[3]
35
+ o34 <= four[0]; o35 <= four[1]; o36 <= four[2]; o37 <= four[3]
36
+ o38 <= four[0]; o39 <= four[1]; o3A <= four[2]; o3B <= four[3]
37
+ o3C <= four[0]; o3D <= four[1]; o3E <= four[2]; o3F <= four[3]
38
+ end
39
+
40
+
41
+
42
+ # A benchmark for testing some enumarable properties of expression (to_a).
43
+ system :with_to_a_bench do
44
+ [4].inner :four
45
+ [8].inner :val, :res, :eight
46
+ [64].inner :val64, :res64, :sixfour
47
+
48
+ vals = val.to_a
49
+ val64s = val64.to_a
50
+
51
+ four2eight(:my_four2eight).(four,*(eight.to_a.reverse))
52
+ four2sixfour(:my_four2sixfour).(four,*(sixfour.to_a.reverse))
53
+
54
+ timed do
55
+ val <= _01101010
56
+ res <= vals.reverse
57
+ !10.ns
58
+ val64 <= _0110101001101010011010100110101001101010011010100110101001101010
59
+ res64 <= val64s.reverse
60
+ !10.ns
61
+ val <= _00000000
62
+ val64 <= _0000000000000000000000000000000000000000000000000000000000000000
63
+ !10.ns
64
+ vals.each.with_index do |v,i|
65
+ v <= (i/2) & _1
66
+ end
67
+ res <= val
68
+ !10.ns
69
+ val64s.each.with_index do |v,i|
70
+ v <= (i/2) & _1
71
+ end
72
+ res64 <= val64
73
+ !10.ns
74
+ val <= _01010011
75
+ !10.ns
76
+ 8.times do |i|
77
+ val64s[i] <= val[i]
78
+ val64s[i+32] <= val[i]
79
+ val64s[i+56] <= val[i]
80
+ end
81
+ res64 <= val64
82
+ !10.ns
83
+ four <= _0000
84
+ !10.ns
85
+ four <= _0001
86
+ !10.ns
87
+ four <= _1100
88
+ !10.ns
89
+ end
90
+ end
data/lib/HDLRuby/hdrcc.rb CHANGED
@@ -486,6 +486,8 @@ if $options[:syntax] then
486
486
  $output << $loader.show_all
487
487
  exit
488
488
  end
489
+ HDLRuby.show Time.now
490
+ HDLRuby.show "##### Starting parser #####"
489
491
 
490
492
  if $options[:debug] then
491
493
  # Debug mode, no error management.
@@ -608,26 +610,29 @@ elsif $options[:clang] then
608
610
  $outfile = File.open($hname,"w")
609
611
  # Adds the generated globals
610
612
  $top_system.each_systemT_deep do |systemT|
611
- # For the h file.
612
- # hname = $output + "/" +
613
- # HDLRuby::Low::Low2C.c_name(systemT.name) +
614
- # ".h"
615
- # hnames << File.basename(hname)
616
- # # Open the file for current systemT
617
- # output = File.open(hname,"w")
613
+ # # For the h file.
614
+ # # hname = $output + "/" +
615
+ # # HDLRuby::Low::Low2C.c_name(systemT.name) +
616
+ # # ".h"
617
+ # # hnames << File.basename(hname)
618
+ # # # Open the file for current systemT
619
+ # # output = File.open(hname,"w")
618
620
  # Generate the H code in to.
619
- $outfile << systemT.to_ch
620
- # # Close the file.
621
- # output.close
622
- # # Clears the name.
623
- # hname = nil
621
+ # $outfile << systemT.to_ch
622
+ systemT.to_ch($outfile)
623
+ # # # Close the file.
624
+ # # output.close
625
+ # # # Clears the name.
626
+ # # hname = nil
624
627
  end
625
628
  # Adds the globals from the non-HDLRuby code
626
629
  $non_hdlruby.each do |code|
627
630
  code.each_chunk do |chunk|
628
631
  if chunk.name == :sim then
629
- $outfile << "extern " +
630
- HDLRuby::Low::Low2C.prototype(chunk.to_c)
632
+ # $outfile << "extern " +
633
+ # HDLRuby::Low::Low2C.prototype(chunk.to_c)
634
+ $outfile << "extern "
635
+ $outfile << HDLRuby::Low::Low2C.prototype(chunk.to_c(""))
631
636
  end
632
637
  end
633
638
  end
@@ -659,7 +664,8 @@ elsif $options[:clang] then
659
664
  # Open the file for current systemT
660
665
  outfile = File.open(name,"w")
661
666
  # Generate the C code in to.
662
- outfile << systemT.to_c(0,*$hnames)
667
+ # outfile << systemT.to_c(0,*$hnames)
668
+ systemT.to_c(outfile,0,*$hnames)
663
669
  # Close the file.
664
670
  outfile.close
665
671
  # Clears the name.
@@ -668,8 +674,10 @@ elsif $options[:clang] then
668
674
  else
669
675
  # Single file generation mode.
670
676
  $top_system.each_systemT_deep.reverse_each do |systemT|
671
- $output << systemT.to_ch
672
- $output << systemT.to_c
677
+ # $output << systemT.to_ch
678
+ systemT.to_ch($output)
679
+ # $output << systemT.to_c
680
+ systemT.to_c($output)
673
681
  end
674
682
  # Adds the main code.
675
683
  $output << HDLRuby::Low::Low2C.main(top_system,
@@ -709,17 +717,19 @@ elsif $options[:verilog] then
709
717
  # top_system = $top_system
710
718
  # Make description compatible with verilog generation.
711
719
  $top_system.each_systemT_deep do |systemT|
712
- HDLRuby.show "casts_without_expression! step..."
713
- systemT.casts_without_expression!
714
- HDLRuby.show Time.now
720
+ # HDLRuby.show "casts_without_expression! step..."
721
+ # systemT.casts_without_expression!
722
+ # HDLRuby.show Time.now
715
723
  HDLRuby.show "to_upper_space! step..."
716
724
  systemT.to_upper_space!
717
725
  HDLRuby.show Time.now
718
- HDLRuby.show "to_global_space! step..."
719
- systemT.to_global_systemTs!
720
- HDLRuby.show Time.now
721
- # systemT.break_types!
722
- # systemT.expand_types!
726
+ end
727
+ HDLRuby.show "to_global_space! step (global)..."
728
+ $top_system.to_global_systemTs!
729
+ HDLRuby.show Time.now
730
+ $top_system.each_systemT_deep do |systemT|
731
+ ## systemT.break_types!
732
+ ## systemT.expand_types!
723
733
  HDLRuby.show "par_in_seq2seq! step..."
724
734
  systemT.par_in_seq2seq!
725
735
  HDLRuby.show Time.now
@@ -818,6 +828,9 @@ elsif $options[:vhdl] then
818
828
  end
819
829
  end
820
830
 
831
+ HDLRuby.show "##### Code generated #####"
832
+ HDLRuby.show Time.now
833
+
821
834
  # # Apply the post drivers if any.
822
835
  # Hdecorator.each_with_property(:post_driver) do |obj, value|
823
836
  # # Load the driver.
@@ -1960,6 +1960,9 @@ module HDLRuby::High
1960
1960
  &ruby_block)
1961
1961
  # ruby_block.call(*args)
1962
1962
  end
1963
+ # sub do
1964
+ # ruby_block.call(*args,*other_block)
1965
+ # end
1963
1966
  end
1964
1967
  else
1965
1968
  define_method(name.to_sym) do |*args,&other_block|
@@ -1968,6 +1971,9 @@ module HDLRuby::High
1968
1971
  HDLRuby::High.top_user.instance_exec(*args,*other_block,
1969
1972
  &ruby_block)
1970
1973
  end
1974
+ # sub do
1975
+ # ruby_block.call(*args,*other_block)
1976
+ # end
1971
1977
  end
1972
1978
  end
1973
1979
  end
@@ -2499,7 +2505,11 @@ module HDLRuby::High
2499
2505
 
2500
2506
  # Casts as +type+.
2501
2507
  def as(type)
2502
- return Cast.new(type.to_type,self.to_expr)
2508
+ if (self.parent)
2509
+ return Cast.new(type.to_type,self.to_expr)
2510
+ else
2511
+ return Cast.new(type.to_type,self)
2512
+ end
2503
2513
  end
2504
2514
 
2505
2515
  # Casts to a bit vector type.
@@ -63,6 +63,17 @@ module HDLRuby::Low
63
63
  cur = cur.parent until cur.is_a?(Scope)
64
64
  return cur
65
65
  end
66
+
67
+ # Get the full parents hierachy.
68
+ def hierarchy
69
+ res = []
70
+ cur = self
71
+ while(cur) do
72
+ res << cur
73
+ cur = cur.parent
74
+ end
75
+ return res
76
+ end
66
77
  end
67
78
 
68
79