HDLRuby 2.4.12 → 2.4.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -29,8 +29,14 @@ module HDLRuby
29
29
  class ::Integer
30
30
 
31
31
  # Gets the bit width
32
+ # NOTE: returns infinity if the number is negative.
32
33
  def width
33
- return Math.log2(self+1).ceil
34
+ return self >= 0 ? Math.log2(self+1).ceil : 1.0/0.0
35
+ end
36
+
37
+ # Tells if the value is a power of 2.
38
+ def pow2?
39
+ return self > 0 && (self & (self - 1) == 0)
34
40
  end
35
41
  end
36
42
 
@@ -1223,6 +1223,8 @@ static Value concat_value_bitstring_array(int num, int dir,
1223
1223
  }
1224
1224
  /* Resize the destination accordignly. */
1225
1225
  resize_value(dst,width);
1226
+ /* Ensure it is not numeric. */
1227
+ dst->numeric = 0;
1226
1228
 
1227
1229
  /* Access the data of the destination. */
1228
1230
  char* dst_data = dst->data_str;
@@ -1233,7 +1235,7 @@ static Value concat_value_bitstring_array(int num, int dir,
1233
1235
  unsigned int idx = dir ? (num-i-1) : i;
1234
1236
  Value value = args[idx];
1235
1237
  unsigned long long cw = type_width(value->type);
1236
- // printf("value=%s cw=%llu\n",value->data_str,cw);
1238
+ // printf("value=%s cw=%llu pos=%llu\n",value->data_str,cw,pos);
1237
1239
  memcpy(dst_data+pos,value->data_str,cw);
1238
1240
  pos += cw;
1239
1241
  }
@@ -0,0 +1,110 @@
1
+ module HDLRuby::High::Std
2
+
3
+ ##
4
+ # Standard HDLRuby::High library: connectors between channels
5
+ #
6
+ ########################################################################
7
+
8
+ # Function for generating a connector that duplicates the output of
9
+ # channel +in_ch+ and connect it to channels +out_chs+ with data of
10
+ # +typ+.
11
+ # The duplication is done according to event +ev+.
12
+ function :duplicator do |typ, ev, in_ch, out_chs|
13
+ ev = ev.poswedge unless ev.is_a?(Event)
14
+ inner :in_ack, :in_req
15
+ out_acks = out_chs.size.times.map { |i| inner(:"out_ack#{i}") }
16
+ typ.inner :data
17
+ par(ev) do
18
+ in_req <= 1
19
+ out_acks.each { |ack| ack <= 0 }
20
+ out_acks.each do |ack|
21
+ hif(ack == 1) { in_req <= 0 }
22
+ end
23
+ hif(in_req) do
24
+ in_ack <= 0
25
+ in_ch.read(data) { in_ack <= 1 }
26
+ end
27
+ hif(in_ack) do
28
+ out_chs.zip(out_acks).each do |ch,ack|
29
+ hif(ack == 0) { ch.write(data) { ack <= 1 } }
30
+ end
31
+ hif (out_acks.reduce(_1) { |sum,ack| ack & sum }) do
32
+ out_acks.each { |ack| ack <= 0 }
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+ # Function for generating a connector that merges the output of
39
+ # channels +in_chs+ and connects the result to channel +out_ch+ with
40
+ # data of types from +typs+.
41
+ # The merge is done according to event +ev+.
42
+ function :merger do |typs, ev, in_chs, out_ch|
43
+ ev = ev.posedge unless ev.is_a?(Event)
44
+ inner :out_ack
45
+ in_reqs = in_chs.size.times.map { |i| inner(:"in_req#{i}") }
46
+ in_acks = in_chs.size.times.map { |i| inner(:"in_ack#{i}") }
47
+ datas = typs.map.with_index { |typ,i| typ.inner(:"data#{i}") }
48
+ par(ev) do
49
+ in_reqs.each { |req| req <= 1 }
50
+ out_ack <= 0
51
+ hif(out_ack == 1) { in_reqs.each { |req| req <= 0 } }
52
+ hif(in_reqs.reduce(_1) { |sum,req| req & sum }) do
53
+ in_chs.each_with_index do |ch,i|
54
+ in_acks[i] <= 0
55
+ ch.read(datas[i]) { in_acks[i] <= 1 }
56
+ end
57
+ end
58
+ hif(in_acks.reduce(_1) { |sum,req| req & sum }) do
59
+ hif(out_ack == 0) { out_ch.write(datas) { out_ack <= 1 } }
60
+ hif (out_ack == 1) { out_ack <= 0 }
61
+ end
62
+ end
63
+ end
64
+
65
+
66
+ # Function for generating a connector that serialize to the output of
67
+ # channels +in_chs+ and connects the result to channel +out_ch+ with
68
+ # data of +typ+.
69
+ # The merge is done according to event +ev+.
70
+ function :serializer do |typ, ev, in_chs, out_ch|
71
+ ev = ev.posedge unless ev.is_a?(Event)
72
+ size = in_chs.size
73
+ inner :out_ack
74
+ # in_reqs = size.times.map { |i| inner(:"in_req#{i}") }
75
+ in_acks = size.times.map { |i| inner(:"in_ack#{i}") }
76
+ datas = size.times.map { |i| typ.inner(:"data#{i}") }
77
+ # The inpt channel selector
78
+ [size.width].inner :idx
79
+ inner :reading
80
+ par(ev) do
81
+ # in_reqs.each { |req| req <= 1 }
82
+ idx <= 0
83
+ reading <= 0
84
+ out_ack <= 0
85
+ hif(idx == size-1) { in_acks.each { |ack| ack <= 0 } }
86
+ # hif((idx == 0) & (in_reqs.reduce(_1) { |sum,req| req & sum })) do
87
+ hif(idx == 0) do
88
+ hif(~reading) do
89
+ size.times { |i| in_acks[i] <= 0 }
90
+ end
91
+ reading <= 1
92
+ in_chs.each_with_index do |ch,i|
93
+ hif(~in_acks[i]) do
94
+ ch.read(datas[i]) { in_acks[i] <= 1 }
95
+ end
96
+ end
97
+ end
98
+ hif(in_acks.reduce(_1) { |sum,req| req & sum }) do
99
+ hcase(idx)
100
+ datas.each_with_index do |data,i|
101
+ hwhen(i) do
102
+ out_ch.write(data) { idx <= idx + 1; out_ack <= 1 }
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
108
+
109
+
110
+ end
@@ -1,3 +1,3 @@
1
1
  module HDLRuby
2
- VERSION = "2.4.12"
2
+ VERSION = "2.4.19"
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.4.12
4
+ version: 2.4.19
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lovic Gauthier
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-10-30 00:00:00.000000000 Z
11
+ date: 2020-12-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,6 +66,10 @@ files:
66
66
  - lib/HDLRuby/alcc.rb
67
67
  - lib/HDLRuby/backend/hruby_allocator.rb
68
68
  - lib/HDLRuby/backend/hruby_c_allocator.rb
69
+ - lib/HDLRuby/hdr_samples/WithMultiChannelExpVerilog/with_multi_channels_hs_32.v
70
+ - lib/HDLRuby/hdr_samples/WithMultiChannelExpVerilog/with_multi_channels_qu_213.v
71
+ - lib/HDLRuby/hdr_samples/WithMultiChannelExpVerilog/with_multi_channels_qu_222.v
72
+ - lib/HDLRuby/hdr_samples/WithMultiChannelExpVerilog/with_multi_channels_rg_23.v
69
73
  - lib/HDLRuby/hdr_samples/adder.rb
70
74
  - lib/HDLRuby/hdr_samples/adder_assign_error.rb
71
75
  - lib/HDLRuby/hdr_samples/adder_bench.rb
@@ -84,6 +88,7 @@ files:
84
88
  - lib/HDLRuby/hdr_samples/include.rb
85
89
  - lib/HDLRuby/hdr_samples/instance_open.rb
86
90
  - lib/HDLRuby/hdr_samples/linear_test.rb
91
+ - lib/HDLRuby/hdr_samples/make_multi_channels_v.rb
87
92
  - lib/HDLRuby/hdr_samples/make_multi_channels_vcd.rb
88
93
  - lib/HDLRuby/hdr_samples/mei8.rb
89
94
  - lib/HDLRuby/hdr_samples/mei8_bench.rb
@@ -120,6 +125,8 @@ files:
120
125
  - lib/HDLRuby/hdr_samples/tuple.rb
121
126
  - lib/HDLRuby/hdr_samples/with_channel.rb
122
127
  - lib/HDLRuby/hdr_samples/with_class.rb
128
+ - lib/HDLRuby/hdr_samples/with_connector.rb
129
+ - lib/HDLRuby/hdr_samples/with_connector_memory.rb
123
130
  - lib/HDLRuby/hdr_samples/with_decoder.rb
124
131
  - lib/HDLRuby/hdr_samples/with_fixpoint.rb
125
132
  - lib/HDLRuby/hdr_samples/with_fsm.rb
@@ -272,6 +279,7 @@ files:
272
279
  - lib/HDLRuby/sim/hruby_value_pool.c
273
280
  - lib/HDLRuby/std/channel.rb
274
281
  - lib/HDLRuby/std/clocks.rb
282
+ - lib/HDLRuby/std/connector.rb
275
283
  - lib/HDLRuby/std/counters.rb
276
284
  - lib/HDLRuby/std/decoder.rb
277
285
  - lib/HDLRuby/std/fixpoint.rb