HDLRuby 2.6.25 → 2.7.1

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: a207f3222cab832d2b846f9658ea0cf9426e77afd14196c2db8cb6832bd4ebda
4
- data.tar.gz: 490c8a6400d6faac77cec5ab1e49caa3abd94d4d0961521ec14d485cad640b72
3
+ metadata.gz: 4ca0e2aba73e7ceb55e145dd22286398ae7605d04d46212f870ba895d3f983d9
4
+ data.tar.gz: 434ae3eb4d974a00ea1510b0e23d66dc51d5f6ac5ef0e4b79af288b5d05f6985
5
5
  SHA512:
6
- metadata.gz: '08196d385fb34444cc7387f6b4982063c38e98e10e51e3b58551b0a6b62dac6921fcbb9c7a89aaccabea055ecab0d2da0543667f688d52bd7ea6b875d9db5ebd'
7
- data.tar.gz: c22296c840a2a7a52b8f4bd8bc34dc38c53f571feba0a01f1bb17a2f548c2965947916fcf47b95b33f2293f1481d8b91653d855c21708a746245cebffebc72f4
6
+ metadata.gz: d097cbd7793ef60fd94c70f7a8acb2e49b13915fd799b7618523c1ba57300195a9ca8a7a61d6e50a8f89779ce6bf64a484bdf5267de93b3159f61186f40e6a82
7
+ data.tar.gz: 27db7c7e988abe14635a515572c2774e8a76d44e7f0e85bfb6ec8b1c9dfed85f61ef49e1f597c59fc9b725b6aacc53b976f73a3b49f816820c5ca9691e253559
@@ -0,0 +1,26 @@
1
+
2
+ # A benchmark for testing array references.
3
+ system :with_concat do
4
+ [8].inner :count
5
+ [8].inner :val0,:val1
6
+ [3].inner :val2
7
+ [8].inner :val3
8
+
9
+ val2 <= val0[4..2]
10
+ val3[6..3] <= val1[7..4]
11
+
12
+ timed do
13
+ val0 <= _00001111
14
+ val1 <= _11000011
15
+ count <= 0
16
+ !10.ns
17
+ val0 <= _11110000
18
+ val1 <= _00111100
19
+ count <= 1
20
+ !10.ns
21
+ val0 <= _10101010
22
+ val1 <= _01010101
23
+ count <= 2
24
+ !10.ns
25
+ end
26
+ end
@@ -0,0 +1,33 @@
1
+
2
+ # A benchmark for sum of sub parts of a vector.
3
+ system :with_concat do
4
+ [8].inner :count
5
+ [16].inner :val0, :val1, :val2, :val3, :val4, :val5, :val6
6
+ bs = []
7
+ 10.times do |i|
8
+ bs << [16].inner(:"b#{i}")
9
+ end
10
+
11
+ vals = [val1,val2,val3,val4]
12
+ par do
13
+ vals.each.with_index { |val,i| val <= val0[(i*4+3)..i*4] }
14
+ end
15
+ val5 <= vals.reduce(:+)
16
+
17
+ par do
18
+ bs.each.with_index { |b,i| b <= val0[i..i] }
19
+ end
20
+ val6 <= bs.reduce(:+)
21
+
22
+ timed do
23
+ val0 <= _1111000011110000
24
+ count <= 0
25
+ !10.ns
26
+ val0 <= _0000111100001111
27
+ count <= 1
28
+ !10.ns
29
+ val0 <= _1010101010101010
30
+ count <= 2
31
+ !10.ns
32
+ end
33
+ end
@@ -0,0 +1,58 @@
1
+
2
+ # A benchmark for testing the literal values.
3
+ system :with_values do
4
+ inner :v1
5
+ [8].inner :v8
6
+ [16].inner :v16
7
+ [32].inner :v32
8
+ [56].inner :v56
9
+ [64].inner :v64
10
+ [96].inner :v96
11
+
12
+
13
+ timed do
14
+ v1 <= 0
15
+ v8 <= 0
16
+ v16 <= 0
17
+ v32 <= 0
18
+ v56 <= 0
19
+ v64 <= 0
20
+ v96 <= 0
21
+ !10.ns
22
+ v1 <= 1
23
+ v8 <= 1
24
+ v16 <= 1
25
+ v32 <= 1
26
+ v56 <= 1
27
+ v64 <= 1
28
+ v96 <= 1
29
+ !10.ns
30
+ v8 <= 128
31
+ v16 <= 128
32
+ v32 <= 128
33
+ v56 <= 128
34
+ v64 <= 128
35
+ v96 <= 128
36
+ !10.ns
37
+ v16 <= 0x1000
38
+ v32 <= 0x1000
39
+ v56 <= 0x1000
40
+ v64 <= 0x1000
41
+ v96 <= 0x1000
42
+ !10.ns
43
+ v32 <= 0x10000000
44
+ v56 <= 0x10000000
45
+ v64 <= 0x10000000
46
+ v96 <= 0x10000000
47
+ !10.ns
48
+ v56 <= 0x10000000000000
49
+ v64 <= 0x10000000000000
50
+ v96 <= 0x10000000000000
51
+ !10.ns
52
+ v64 <= 0x1000000000000000
53
+ v96 <= 0x1000000000000000
54
+ !10.ns
55
+ v96 <= 0x1000000000000000000
56
+ !10.ns
57
+ end
58
+ end
@@ -1360,7 +1360,7 @@ module HDLRuby::Low
1360
1360
  # def to_c(level = 0)
1361
1361
  def to_c(res,level = 0)
1362
1362
  # Save the value pool state.
1363
- res << (" " * (level*3)) << "SV;\n"
1363
+ res << (" " * (level*3)) << "PV;\n"
1364
1364
  # Generate the print for each argument.
1365
1365
  self.each_arg do |arg|
1366
1366
  if (arg.is_a?(StringE)) then
@@ -1981,7 +1981,7 @@ module HDLRuby::Low
1981
1981
  res << " " * (level+1)*3
1982
1982
  # res << "static unsigned long long data[] = { "
1983
1983
  res << "static unsigned int data[] = { "
1984
- res << str.scan(/.{1,#{Low2C.int_width}}/m).map do |sub|
1984
+ res << str.scan(/.{1,#{Low2C.int_width}}/m).reverse.map do |sub|
1985
1985
  sub.to_i(2).to_s # + "ULL"
1986
1986
  end.join(",")
1987
1987
  res << " };\n"
@@ -2056,7 +2056,7 @@ module HDLRuby::Low
2056
2056
  # def to_c(level = 0)
2057
2057
  def to_c(res,level = 0)
2058
2058
  # Save the value pool state.
2059
- res << (" " * (level*3)) << "SV;\n"
2059
+ res << (" " * (level*3)) << "PV;\n"
2060
2060
  # Generate the child.
2061
2061
  self.child.to_c(res,level)
2062
2062
  res << (" " * (level*3))
@@ -2144,7 +2144,7 @@ module HDLRuby::Low
2144
2144
  end
2145
2145
  # Some computation required.
2146
2146
  # Save the value pool state.
2147
- res << (" " * (level*3)) << "SV;\n"
2147
+ res << (" " * (level*3)) << "PV;\n"
2148
2148
  # Generate the child.
2149
2149
  self.child.to_c(res,level)
2150
2150
  res << (" " * (level*3))
@@ -2256,7 +2256,7 @@ module HDLRuby::Low
2256
2256
  # def to_c(level = 0)
2257
2257
  def to_c(res, level = 0)
2258
2258
  # Save the value pool state.
2259
- res << (" " * (level*3)) << "SV;\n"
2259
+ res << (" " * (level*3)) << "PV;\n"
2260
2260
  # Generate the left computation.
2261
2261
  self.left.to_c(res,level)
2262
2262
  # Generate the right computation.
@@ -2375,7 +2375,7 @@ module HDLRuby::Low
2375
2375
  # +level+ is the hierachical level of the object.
2376
2376
  def to_c(res,level = 0)
2377
2377
  # Save the value pool state.
2378
- res << (" " * (level*3)) << "SV;\n"
2378
+ res << (" " * (level*3)) << "PV;\n"
2379
2379
  # Gather the possible selection choices.
2380
2380
  expressions = self.each_choice.to_a
2381
2381
  # Create the resulting string.
@@ -2444,7 +2444,7 @@ module HDLRuby::Low
2444
2444
  # +level+ is the hierachical level of the object.
2445
2445
  def to_c(res,level = 0)
2446
2446
  # Save the value pool state.
2447
- res << (" " * (level*3)) << "SV;\n"
2447
+ res << (" " * (level*3)) << "PV;\n"
2448
2448
  # Gather the content to concat.
2449
2449
  expressions = self.each_expression.to_a
2450
2450
  # Compute each sub expression.
@@ -2604,7 +2604,7 @@ module HDLRuby::Low
2604
2604
  # +left+ tells if it is a left value or not.
2605
2605
  def to_c(res,level = 0, left = false)
2606
2606
  # Save the value pool state.
2607
- res << (" " * (level*3)) << "SV;\n"
2607
+ res << (" " * (level*3)) << "PV;\n"
2608
2608
  # Compute the reference.
2609
2609
  self.ref.to_c(res,level)
2610
2610
  # Compute the index.
@@ -2718,7 +2718,7 @@ module HDLRuby::Low
2718
2718
  # end
2719
2719
  def to_c(res,level = 0, left = false)
2720
2720
  # Save the value pool state.
2721
- res << (" " * (level*3)) << "SV;\n"
2721
+ res << (" " * (level*3)) << "PV;\n"
2722
2722
  # Compute the reference.
2723
2723
  self.ref.to_c(res,level)
2724
2724
  # res << (" " * (level*3))
@@ -410,7 +410,8 @@ extern void save_value_pos();
410
410
  extern void restore_value_pos();
411
411
 
412
412
  /** Macros for short control of the pool of values. */
413
- #define SV get_value();save_value_pos();
413
+ #define SV save_value_pos();
414
+ #define PV push(get_value());save_value_pos();
414
415
  #define RV restore_value_pos();
415
416
 
416
417
 
@@ -757,6 +758,10 @@ extern void push(Value val);
757
758
  * @return the value. */
758
759
  extern Value pop();
759
760
 
761
+ /** Access the top value of the stack without removing it.
762
+ * @return the value. */
763
+ extern Value peek();
764
+
760
765
  /** Unary calculation.
761
766
  * @param oper the operator function
762
767
  * @return the destination
@@ -38,6 +38,17 @@ Value pop() {
38
38
  }
39
39
  }
40
40
 
41
+ /** Access the top value of the stack without removing it.
42
+ * @return the value. */
43
+ Value peek() {
44
+ if (head < STACK_SIZE) {
45
+ return stack[head];
46
+ } else {
47
+ perror("Computation stack empty.\n");
48
+ exit(1);
49
+ }
50
+ }
51
+
41
52
  /** Pops multiple values.
42
53
  * @param num the number of values to pop.
43
54
  * @return a pointer on the first value (in heap order!). */
@@ -58,10 +69,11 @@ static Value* popn(int num) {
58
69
  **/
59
70
  Value unary(Value (*oper)(Value,Value)) {
60
71
  // printf("unary\n");
61
- Value dst = get_top_value();
62
- dst = oper(pop(),dst);
63
- push(dst);
64
- return dst;
72
+ // Value dst = get_top_value();
73
+ // dst = oper(pop(),dst);
74
+ // push(dst);
75
+ // return dst;
76
+ return oper(pop(),peek());
65
77
  }
66
78
 
67
79
  /** Binary calculation.
@@ -70,12 +82,15 @@ Value unary(Value (*oper)(Value,Value)) {
70
82
  **/
71
83
  Value binary(Value (*oper)(Value,Value,Value)) {
72
84
  // printf("binary\n");
73
- Value dst = get_top_value();
85
+ // Value dst = get_top_value();
86
+ // Value r = pop();
87
+ // Value l = pop();
88
+ // dst = oper(l,r,dst);
89
+ // push(dst);
90
+ // return dst;
74
91
  Value r = pop();
75
92
  Value l = pop();
76
- dst = oper(l,r,dst);
77
- push(dst);
78
- return dst;
93
+ return oper(l,r,peek());
79
94
  }
80
95
 
81
96
  /** Cast calculation.
@@ -84,72 +99,93 @@ Value binary(Value (*oper)(Value,Value,Value)) {
84
99
  **/
85
100
  Value cast(Type typ) {
86
101
  // printf("cast\n");
87
- Value dst = get_top_value();
88
- Value src = pop();
89
- dst = cast_value(src,typ,dst);
90
- push(dst);
91
- return dst;
102
+ // Value dst = get_top_value();
103
+ // Value src = pop();
104
+ // dst = cast_value(src,typ,dst);
105
+ // push(dst);
106
+ // return dst;
107
+ return cast_value(pop(),typ,peek());
92
108
  }
93
109
 
94
110
  /* Concat values.
95
111
  * @param num the number of values to concat.
96
112
  * @param dir the direction. */
97
113
  Value sconcat(int num, int dir) {
114
+ // Value* vals = alloca(num*sizeof(Value));
115
+ // Value dst = get_top_value();
116
+ // int i;
117
+ // // printf("sconcat\n");
118
+ // /* Get the values to concat from the stack. */
119
+ // for(i=1;i<=num;++i) vals[num-i] = pop();
120
+ // dst = concat_valueP(num,dir,dst,vals);
121
+ // push(dst);
122
+ // return dst;
98
123
  Value* vals = alloca(num*sizeof(Value));
99
- Value dst = get_top_value();
100
124
  int i;
101
125
  // printf("sconcat\n");
102
126
  /* Get the values to concat from the stack. */
103
127
  for(i=1;i<=num;++i) vals[num-i] = pop();
104
- dst = concat_valueP(num,dir,dst,vals);
105
- push(dst);
106
- return dst;
128
+ return concat_valueP(num,dir,peek(),vals);
107
129
  }
108
130
 
109
131
  /* Index read calculation.
110
132
  * @param typ the data type of the access. */
111
133
  Value sreadI(Type typ) {
134
+ // // printf("sreadI\n");
135
+ // Value dst = get_top_value();
136
+ // unsigned long long idx = value2integer(pop());
137
+ // dst = read_range(pop(),idx,idx,typ,dst);
138
+ // push(dst);
139
+ // return dst;
112
140
  // printf("sreadI\n");
113
- Value dst = get_top_value();
114
141
  unsigned long long idx = value2integer(pop());
115
- dst = read_range(pop(),idx,idx,typ,dst);
116
- push(dst);
117
- return dst;
142
+ return read_range(pop(),idx,idx,typ,peek());
118
143
  }
119
144
 
120
145
  /* Index write calculation.
121
146
  * @param typ the data type of the access. */
122
147
  Value swriteI(Type typ) {
148
+ // // printf("swriteI\n");
149
+ // Value dst = get_top_value();
150
+ // unsigned long long idx = value2integer(pop());
151
+ // dst = write_range(pop(),idx,idx,typ,dst);
152
+ // push(dst);
153
+ // return dst;
123
154
  // printf("swriteI\n");
124
- Value dst = get_top_value();
125
155
  unsigned long long idx = value2integer(pop());
126
- dst = write_range(pop(),idx,idx,typ,dst);
127
- push(dst);
128
- return dst;
156
+ return write_range(pop(),idx,idx,typ,peek());
129
157
  }
130
158
 
131
159
  /* Range read calculation.
132
160
  * @param typ the data type of the access. */
133
161
  Value sreadR(Type typ) {
162
+ // // printf("sreadR\n");
163
+ // Value dst = get_top_value();
164
+ // unsigned long long last = value2integer(pop());
165
+ // unsigned long long first = value2integer(pop());
166
+ // dst = read_range(pop(),first,last,typ,dst);
167
+ // push(dst);
168
+ // return dst;
134
169
  // printf("sreadR\n");
135
- Value dst = get_top_value();
136
170
  unsigned long long last = value2integer(pop());
137
171
  unsigned long long first = value2integer(pop());
138
- dst = read_range(pop(),first,last,typ,dst);
139
- push(dst);
140
- return dst;
172
+ return read_range(pop(),first,last,typ,peek());
141
173
  }
142
174
 
143
175
  /* Range write calculation.
144
176
  * @param typ the data type of the access. */
145
177
  Value swriteR(Type typ) {
178
+ // // printf("swriteR\n");
179
+ // Value dst = get_top_value();
180
+ // unsigned long long last = value2integer(pop());
181
+ // unsigned long long first = value2integer(pop());
182
+ // dst = write_range(pop(),first,last,typ,dst);
183
+ // push(dst);
184
+ // return dst;
146
185
  // printf("swriteR\n");
147
- Value dst = get_top_value();
148
186
  unsigned long long last = value2integer(pop());
149
187
  unsigned long long first = value2integer(pop());
150
- dst = write_range(pop(),first,last,typ,dst);
151
- push(dst);
152
- return dst;
188
+ return write_range(pop(),first,last,typ,peek());
153
189
  }
154
190
 
155
191
  /** Check if the top value is defined. */
@@ -1,3 +1,3 @@
1
1
  module HDLRuby
2
- VERSION = "2.6.25"
2
+ VERSION = "2.7.1"
3
3
  end
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.25
4
+ version: 2.7.1
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-01-02 00:00:00.000000000 Z
11
+ date: 2022-01-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -157,9 +157,12 @@ files:
157
157
  - lib/HDLRuby/hdr_samples/with_multi_channels.rb
158
158
  - lib/HDLRuby/hdr_samples/with_reconf.rb
159
159
  - lib/HDLRuby/hdr_samples/with_reduce.rb
160
+ - lib/HDLRuby/hdr_samples/with_ref_array.rb
160
161
  - lib/HDLRuby/hdr_samples/with_str2value.rb
162
+ - lib/HDLRuby/hdr_samples/with_subsums.rb
161
163
  - lib/HDLRuby/hdr_samples/with_to_a.rb
162
164
  - lib/HDLRuby/hdr_samples/with_to_array.rb
165
+ - lib/HDLRuby/hdr_samples/with_values.rb
163
166
  - lib/HDLRuby/hdrcc.rb
164
167
  - lib/HDLRuby/high_samples/_adder_fault.rb
165
168
  - lib/HDLRuby/high_samples/_generic_transmission2.rb