HDLRuby 2.4.19 → 2.4.26

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: 98f251acca7748335f7f60586eddb75a2b8efb9773225d3776bdb585b6d05060
4
- data.tar.gz: 689f2d3b0c2332e2877c3dcfd273b43c3b7deb44853f21aeffdd2e60d7e1d74c
3
+ metadata.gz: 7f20b0aa1f19499dddcec1f7eedcff464ed1e440a323c181df7d908730899bb8
4
+ data.tar.gz: 512b16d80eb0621270e516ffa51c9d2b6b2b61d93842fb02a4cdeb5a1a71d5bc
5
5
  SHA512:
6
- metadata.gz: 3732704b0a83a69ccf1796772c25d70a453adf5b0d4d795d2c9741fdb2e6e9ba5b086348983012a6ff68415de2327e22e7a7eed6bdff647da98e37406410869a
7
- data.tar.gz: b01e94018fb612dfae8cbce2076a19829fe44f9301a5f4969d153323981b889c8b9d434ffc4b6f91e27830c312ef1108decc28c275be7a65997d74123488480d
6
+ metadata.gz: 81250f799e3e102a155fce24aeb29cfc00e254cd0e0568162f103bbccaeb8bfcc82f3f2cb43ad6fe2eb120801c55e35e631e39d10280df98b137d0f85f8df5cd
7
+ data.tar.gz: 5dff6e40cf54495703b7d3825f25776c0a1d1fdd7243f93ff85c8466e2f9ee1713b2a403efe3092dc5f451d5b9ba0260ffcba6f5fed1edb68edb49115d082dd0
@@ -1,12 +1,14 @@
1
1
 
2
+ signed[7..0].typedef(:typ)
3
+
2
4
  # Describes an 8-bit data 4-bit address ROM.
3
5
  system :rom4_8 do
4
6
  [2..0].input :addr
5
7
  [7..0].output :data0,:data1,:data2
6
8
 
7
9
  bit[7..0][0..7].constant content0: [0,1,2,3,4,5,6,7]
8
- bit[7..0][-8].constant content1: [0,1,2,3,4,5,6,7]
9
- bit[7..0][-8].constant content2: (8).times.to_a
10
+ signed[7..0][-8].constant content1: [0,1,2,3,4,5,6,7]
11
+ typ[-8].constant content2: (8).times.to_a
10
12
 
11
13
  data0 <= content0[addr]
12
14
  data1 <= content1[addr]
@@ -130,6 +130,7 @@ system :with_connectors do
130
130
  [4].inner :counter
131
131
  [4*4].inner :res
132
132
  inner :ack_in, :ack_out
133
+ inner :dup_req, :dup_ack
133
134
 
134
135
  # The input queue.
135
136
  queue(bit[4],4,clk,rst).(:in_qu)
@@ -143,7 +144,7 @@ system :with_connectors do
143
144
  queue(bit[4*4],4,clk,rst).(:out_qu)
144
145
 
145
146
  # Connect the input queue to the middle queues.
146
- duplicator(bit[4],clk.negedge,in_qu,mid_qus)
147
+ duplicator(bit[4],clk.negedge,in_qu,mid_qus,dup_req,dup_ack)
147
148
 
148
149
  # Connect the middle queues to the output queue.
149
150
  merger([bit[4]]*4,clk.negedge,mid_qus,out_qu)
@@ -221,6 +222,7 @@ system :with_connectors do
221
222
  timed do
222
223
  clk <= 0
223
224
  rst <= 0
225
+ dup_req <= 0
224
226
  !10.ns
225
227
  clk <= 1
226
228
  !10.ns
@@ -235,6 +237,13 @@ system :with_connectors do
235
237
  !10.ns
236
238
  clk <= 0
237
239
  rst <= 0
240
+ 4.times do
241
+ !10.ns
242
+ clk <= 1
243
+ !10.ns
244
+ clk <= 0
245
+ end
246
+ dup_req <= 1
238
247
  16.times do
239
248
  !10.ns
240
249
  clk <= 1
@@ -40,10 +40,14 @@ system :channel_connector do
40
40
 
41
41
  serializer(typ,clk.negedge,[reader_inputs_x,reader_inputs_h],writer_inputs_serializer)
42
42
 
43
- # merger([typ]*2,clk.negedge,[reader_inputs_x,reader_inputs_h], writer_inputs_meger)
44
-
45
- # duplicator(typ,clk.negedge,reader_inputs_r,[])
46
-
43
+ mem_rom(typ, columns[0], clk, rst, inputs_x, rinc: :rst, winc: :rst).(:rom_inputs_r) # 入力値を格納するrom(x)
44
+ mem_dual(typ, columns[0], clk, rst, rinc: :rst, winc: :rst).(:ram_duplicator0) #
45
+ mem_dual(typ, columns[0], clk, rst, rinc: :rst, winc: :rst).(:ram_duplicator1) #
46
+ reader_inputs_r = rom_inputs_r.branch(:rinc)
47
+ writer_duplicator0 = ram_duplicator0.branch(:winc)
48
+ writer_duplicator1 = ram_duplicator1.branch(:winc)
49
+
50
+ duplicator(typ,clk.posedge,reader_inputs_r,[writer_duplicator0, writer_duplicator1])
47
51
 
48
52
  timed do
49
53
  # リセット
@@ -61,5 +61,6 @@ system :fix_test do
61
61
  !10.ns
62
62
  c <= a * b
63
63
  !10.ns
64
+ c <= (a+b) * b
64
65
  end
65
66
  end
@@ -19,6 +19,7 @@ require 'HDLRuby/hruby_low_with_port'
19
19
  require 'HDLRuby/hruby_low_with_var'
20
20
  require 'HDLRuby/hruby_low_without_concat'
21
21
  require 'HDLRuby/hruby_low_without_connection'
22
+ require 'HDLRuby/hruby_low_casts_without_expression'
22
23
  require 'HDLRuby/hruby_low_cleanup'
23
24
 
24
25
  require 'HDLRuby/hruby_verilog.rb'
@@ -577,6 +578,7 @@ elsif $options[:verilog] then
577
578
  # top_system = $top_system
578
579
  # Make description compatible with verilog generation.
579
580
  $top_system.each_systemT_deep do |systemT|
581
+ systemT.casts_without_expression!
580
582
  systemT.to_upper_space!
581
583
  systemT.to_global_systemTs!
582
584
  # systemT.break_types!
@@ -1183,6 +1183,11 @@ module HDLRuby::Low
1183
1183
  return false
1184
1184
  end
1185
1185
 
1186
+ # Tells if the type of of vector kind.
1187
+ def vector?
1188
+ return false
1189
+ end
1190
+
1186
1191
  # Gets the bitwidth of the type, by default 0.
1187
1192
  # Bit, signed, unsigned and Float base have a width of 1.
1188
1193
  def width
@@ -1410,7 +1415,7 @@ module HDLRuby::Low
1410
1415
 
1411
1416
  # Sets the delegations
1412
1417
  self.extend Forwardable
1413
- [ :signed?, :unsigned?, :fixed?, :float?, :leaf?,
1418
+ [ :signed?, :unsigned?, :fixed?, :float?, :leaf?, :vector?,
1414
1419
  :width, :range?, :range, :base?, :base, :types?,
1415
1420
  :get_all_types, :get_type, :each, :each_type,
1416
1421
  :regular?,
@@ -1466,6 +1471,11 @@ module HDLRuby::Low
1466
1471
  # The base type of the vector
1467
1472
  attr_reader :base
1468
1473
 
1474
+ # Tells if the type of of vector kind.
1475
+ def vector?
1476
+ return true
1477
+ end
1478
+
1469
1479
  # Tells if the type has a base.
1470
1480
  def base?
1471
1481
  return true
@@ -0,0 +1,326 @@
1
+ require 'HDLRuby'
2
+ require 'HDLRuby/hruby_tools'
3
+ require 'HDLRuby/hruby_low_mutable'
4
+ require 'HDLRuby/hruby_low_with_bool'
5
+
6
+
7
+ module HDLRuby::Low
8
+
9
+
10
+ ##
11
+ # Replace expressions in cast operators with variables.
12
+ # Use for generating Verilog code generation since bit extension cannot
13
+ # be performed on expression but only on signals.
14
+ #
15
+ ########################################################################
16
+
17
+
18
+ ## Extends the SystemT class with functionality for extracting
19
+ # expressions from cast.
20
+ class SystemT
21
+
22
+ # Extracts the expressions from the casts.
23
+ def casts_without_expression!
24
+ self.scope.casts_without_expression!
25
+ return self
26
+ end
27
+
28
+ end
29
+
30
+
31
+ ## Extends the Scope class with functionality for extracting
32
+ # expressions from cast.
33
+ class Scope
34
+
35
+ # Extracts the expressions from the casts.
36
+ def casts_without_expression!
37
+ # Recurse on the sub scopes.
38
+ self.each_scope(&:casts_without_expression!)
39
+
40
+ # Apply on the connections.
41
+ self.each_connection(&:casts_without_expression!)
42
+
43
+ # Apply on the behaviors.
44
+ self.each_behavior do |behavior|
45
+ behavior.block.casts_without_expression!
46
+ end
47
+ return self
48
+ end
49
+ end
50
+
51
+
52
+ ## Extends the Transmit class with functionality for extracting
53
+ # expressions from cast.
54
+ class Transmit
55
+
56
+ # Extracts the expressions from the casts.
57
+ def casts_without_expression!
58
+ # Apply on the left value.
59
+ self.set_left!(self.left.casts_without_expression)
60
+ # Apply on the right value.
61
+ self.set_right!(self.right.casts_without_expression)
62
+ return self
63
+ end
64
+ end
65
+
66
+ ## Extends the If class with functionality for extracting
67
+ # expressions from cast.
68
+ class If
69
+
70
+ # Extracts the expressions from the casts.
71
+ def casts_without_expression!
72
+ # Apply on the condition.
73
+ self.set_condition!(self.condition.casts_without_expression)
74
+ # Apply on the yes.
75
+ self.yes.casts_without_expression!
76
+ # Apply on the noifs.
77
+ @noifs.map! do |cond,stmnt|
78
+ [cond.casts_without_expression,stmnt.casts_without_expression!]
79
+ end
80
+ # Apply on the no if any.
81
+ self.no.casts_without_expression! if self.no
82
+ return self
83
+ end
84
+ end
85
+
86
+ ## Extends the When class with functionality for extracting
87
+ # expressions from cast.
88
+ class When
89
+
90
+ # Extracts the expressions from the casts.
91
+ def casts_without_expression!
92
+ # Apply on the match.
93
+ self.set_match!(self.match.casts_without_expression)
94
+ # Apply on the statement.
95
+ self.statement.casts_without_expression!
96
+ return self
97
+ end
98
+ end
99
+
100
+
101
+ ## Extends the Case class with functionality for extracting
102
+ # expressions from cast.
103
+ class Case
104
+
105
+ # Extracts the expressions from the casts.
106
+ def casts_without_expression!
107
+ # No need to apply on the value!
108
+ # Apply on the value.
109
+ self.set_value!(self.value.casts_without_expression)
110
+ # Apply on the whens.
111
+ self.each_when(&:casts_without_expression!)
112
+ # Apply on the default if any.
113
+ self.default.casts_without_expression! if self.default
114
+ return self
115
+ end
116
+ end
117
+
118
+
119
+ ## Extends the TimeWait class with functionality for extracting
120
+ # expressions from cast.
121
+ class TimeWait
122
+ # Extracts the expressions from the casts.
123
+ def casts_without_expression!
124
+ # Nothing to do.
125
+ return self
126
+ end
127
+ end
128
+
129
+ ## Extends the TimeRepeat class with functionality for extracting
130
+ # expressions from cast.
131
+ class TimeRepeat
132
+ # Extracts the expressions from the casts.
133
+ def casts_without_expression!
134
+ # Simply recurse on the stamtement.
135
+ self.statement.casts_without_expression!
136
+ return self
137
+ end
138
+ end
139
+
140
+
141
+ ## Extends the Block class with functionality for extracting
142
+ # expressions from cast.
143
+ class Block
144
+
145
+ # Extracts the expressions from the casts.
146
+ def casts_without_expression!
147
+ # Apply on each statement.
148
+ self.each_statement(&:casts_without_expression!)
149
+ return self
150
+ end
151
+ end
152
+
153
+
154
+ ## Extends the Value class with functionality for extracting
155
+ # expressions from cast.
156
+ class Value
157
+ # Extracts the expressions from the casts.
158
+ def casts_without_expression
159
+ # Simple clones.
160
+ return self.clone
161
+ end
162
+ end
163
+
164
+
165
+ ## Extends the Cast class with functionality for extracting
166
+ # expressions from cast.
167
+ class Cast
168
+ # Extracts the expressions from the casts.
169
+ def casts_without_expression
170
+ # Recurse on the child.
171
+ nchild = self.child.casts_without_expression
172
+ # Process the cast.
173
+ unless (nchild.is_a?(Ref)) then
174
+ # Need to extract the child.
175
+ # Create signal holding the child.
176
+ stmnt = self.statement
177
+ if (stmnt.is_a?(Connection)) then
178
+ # Specific case of connections: need to build
179
+ # a new block.
180
+ scop = stmnt.parent
181
+ scop.delete_connection!(stmnt)
182
+ stmnt = Transmit.new(stmnt.left.clone, stmnt.right.clone)
183
+ blk = Block.new(:seq)
184
+ scop.add_behavior(Behavior.new(blk))
185
+ blk.add_statement(stmnt)
186
+ else
187
+ blk = stmnt.block
188
+ end
189
+ name = HDLRuby.uniq_name
190
+ typ = nchild.type
191
+ sig = blk.add_inner(SignalI.new(name,typ))
192
+ # Add a statement assigning the child to the new signal.
193
+ nref = RefName.new(typ,RefThis.new,name)
194
+ nstmnt = Transmit.new(nref,nchild)
195
+ idx = blk.each_statement.find_index(stmnt)
196
+ blk.insert_statement!(idx,nstmnt)
197
+ # Replace the child by a reference to the created
198
+ # signal.
199
+ nchild = nref.clone
200
+ end
201
+ return Cast.new(self.type,nchild)
202
+ end
203
+ end
204
+
205
+ ## Extends the Unary class with functionality for extracting
206
+ # expressions from cast.
207
+ class Unary
208
+
209
+ # Extracts the expressions from the casts.
210
+ def casts_without_expression
211
+ # Recurse on the sub node.
212
+ return Unary.new(self.type,self.operator,
213
+ self.child.casts_without_expression)
214
+ return self
215
+ end
216
+ end
217
+
218
+
219
+ ## Extends the Binary class with functionality for extracting
220
+ # expressions from cast.
221
+ class Binary
222
+
223
+ # Extracts the expressions from the casts.
224
+ def casts_without_expression
225
+ # Recurse on the sub nodes.
226
+ return Binary.new(self.type,self.operator,
227
+ self.left.casts_without_expression,
228
+ self.right.casts_without_expression)
229
+ end
230
+ end
231
+
232
+
233
+
234
+ ## Extends the Select class with functionality for extracting
235
+ # expressions from cast.
236
+ class Select
237
+
238
+ # Extracts the expressions from the casts.
239
+ def casts_without_expression
240
+ # Recurse on the sub node.
241
+ return Select.new(self.type,"?",
242
+ self.select.casts_without_expression,
243
+ *self.each_choice.map do |choice|
244
+ choice.casts_without_expression
245
+ end )
246
+ return self
247
+ end
248
+ end
249
+
250
+
251
+ ## Extends the Concat class with functionality for converting booleans
252
+ # in assignments to select operators.
253
+ class Concat
254
+ # Extracts the expressions from the casts.
255
+ def casts_without_expression
256
+ # Recurse on the sub expressions.
257
+ return Concat.new(self.type,self.each_expression.map do |expr|
258
+ expr.casts_without_expression
259
+ end )
260
+ end
261
+ end
262
+
263
+
264
+ ## Extends the RefConcat class with functionality for converting booleans
265
+ # in assignments to select operators.
266
+ class RefConcat
267
+ # Extracts the expressions from the casts.
268
+ def casts_without_expression
269
+ # Recurse on the sub references.
270
+ return RefConcat.new(self.type,self.each_expression.map do |expr|
271
+ expr.casts_without_expression
272
+ end )
273
+ end
274
+ end
275
+
276
+
277
+ ## Extends the RefIndex class with functionality for converting booleans
278
+ # in assignments to select operators.
279
+ class RefIndex
280
+ # Extracts the expressions from the casts.
281
+ def casts_without_expression
282
+ # Recurse on the sub references.
283
+ return RefIndex.new(self.type,
284
+ self.ref.casts_without_expression,
285
+ self.index.casts_without_expression)
286
+ end
287
+ end
288
+
289
+
290
+ ## Extends the RefRange class with functionality for converting booleans
291
+ # in assignments to select operators.
292
+ class RefRange
293
+ # Extracts the expressions from the casts.
294
+ def casts_without_expression
295
+ # Recurse on the sub references.
296
+ return RefRange.new(self.type,
297
+ self.ref.casts_without_expression,
298
+ self.range.first.casts_without_expression ..
299
+ self.range.last.casts_without_expression)
300
+ end
301
+ end
302
+
303
+
304
+ ## Extends the RefName class with functionality for converting booleans
305
+ # in assignments to select operators.
306
+ class RefName
307
+ # Extracts the expressions from the casts.
308
+ def casts_without_expression
309
+ # Recurse on the sub references.
310
+ return RefName.new(self.type,
311
+ self.ref.casts_without_expression,
312
+ self.name)
313
+ end
314
+ end
315
+
316
+
317
+ ## Extends the RefThis class with functionality for converting booleans
318
+ # in assignments to select operators.
319
+ class RefThis
320
+ # Extracts the expressions from the casts.
321
+ def casts_without_expression
322
+ # Simply clone.
323
+ return self.clone
324
+ end
325
+ end
326
+ end
@@ -11,6 +11,10 @@ include HDLRuby::Verilog
11
11
  module HDLRuby::Low
12
12
 
13
13
 
14
+ # The list of base types used both in verilog and HDLRuby
15
+ VERILOG_BASE_TYPES = ["signed"]
16
+
17
+
14
18
  # Sample of very handy for programming.
15
19
  # puts "class=#{self.yes.class}" # Confirm class of self.yes.
16
20
  # puts "methods=#{self.right.methods}" # Confirm method of self.right.
@@ -456,7 +460,10 @@ class Block
456
460
  $fm.fm_par["#{tmt.left.to_verilog}"] = tmt.right
457
461
  end
458
462
  new_block.add_statement(tmt.clone)
459
- end
463
+ end
464
+ else
465
+ # Other statements are simply added as is.
466
+ new_block.add_statement(statement.clone)
460
467
  end
461
468
  end
462
469
 
@@ -1349,7 +1356,8 @@ end
1349
1356
  class TypeVector
1350
1357
  # Converts the system to Verilog code.
1351
1358
  def to_verilog
1352
- if self.base.name.to_s != "bit"
1359
+ # if self.base.name.to_s != "bit"
1360
+ if VERILOG_BASE_TYPES.include?(self.base.name.to_s)
1353
1361
  return " #{self.base.name.to_s}[#{self.range.first}:#{self.range.last}]"
1354
1362
  end
1355
1363
  return " [#{self.range.first}:#{self.range.last}]"
@@ -1598,7 +1606,7 @@ end
1598
1606
  class Unary
1599
1607
  # Converts the system to Verilog code.
1600
1608
  def to_verilog
1601
- return "#{self.operator}#{self.child.to_verilog}"
1609
+ return "#{self.operator[0]}#{self.child.to_verilog}"
1602
1610
  end
1603
1611
  end
1604
1612
 
@@ -1609,10 +1617,37 @@ class Cast
1609
1617
  # by traditional verilog.
1610
1618
  def to_verilog
1611
1619
  # return "#{self.type.to_verilog}'(#{self.child.to_verilog})"
1620
+ if self.child.is_a?(Value) then
1621
+ return self.child.to_verilog
1622
+ end
1623
+ # Get the type widths, used for computing extensions or truncations.
1624
+ cw = self.child.type.width
1625
+ sw = self.type.width
1612
1626
  if self.type.signed? then
1613
- return "$signed(#{self.child.to_verilog})"
1627
+ # return "$signed(#{self.child.to_verilog})"
1628
+ if (sw>cw) then
1629
+ # Need to sign extend.
1630
+ return "$signed({{#{sw-cw}{#{self.child.to_verilog}[#{cw-1}]}}," +
1631
+ "#{self.child.to_verilog}})"
1632
+ elsif (sw<cw) then
1633
+ # Need to truncate
1634
+ return "$signed(#{self.child.to_verilog}[#{sw-1}:0])"
1635
+ else
1636
+ # Only enforce signed.
1637
+ return "$signed(#{self.child.to_verilog})"
1638
+ end
1614
1639
  else
1615
- return "$unsigned(#{self.child.to_verilog})"
1640
+ # return "$unsigned(#{self.child.to_verilog})"
1641
+ if (sw>cw) then
1642
+ # Need to extend.
1643
+ return "$unsigned({{#{sw-cw}{1'b0}},#{self.child.to_verilog}})"
1644
+ elsif (sw<cw) then
1645
+ # Need to truncate
1646
+ return "$unsigned(#{self.child.to_verilog}[#{sw-1}:0])"
1647
+ else
1648
+ # Only enforce signed.
1649
+ return "$unsigned(#{self.child.to_verilog})"
1650
+ end
1616
1651
  end
1617
1652
  end
1618
1653
  end
@@ -1670,15 +1705,15 @@ class Delay
1670
1705
  def to_verilog
1671
1706
  time = self.value.to_s
1672
1707
  if(self.unit.to_s == "ps") then
1673
- return "##{time}"
1708
+ return "##{time};"
1674
1709
  elsif(self.unit.to_s == "ns")
1675
- return "##{time}000"
1710
+ return "##{time}000;"
1676
1711
  elsif(self.unit.to_s == "us")
1677
- return "##{time}000000"
1712
+ return "##{time}000000;"
1678
1713
  elsif(self.unit.to_s == "ms")
1679
- return "##{time}000000000"
1714
+ return "##{time}000000000;"
1680
1715
  elsif(self.unit.to_s == "s")
1681
- return "##{time}000000000000"
1716
+ return "##{time}000000000000;"
1682
1717
  end
1683
1718
  end
1684
1719
  end
@@ -1690,6 +1725,20 @@ end
1690
1725
 
1691
1726
  # Enhance SystemT with generation of verilog code.
1692
1727
  class SystemT
1728
+
1729
+ ## Tells if a connection is actually a port connection.
1730
+ def port_output_connection?(connection)
1731
+ return self.each_systemI.find do |systemI|
1732
+ if connection.right.is_a?(RefName) &&
1733
+ connection.right.ref.is_a?(RefName) &&
1734
+ systemI.name == connection.right.ref.name
1735
+ puts "port_connection for right=#{connection.right.name} and systemI=#{systemI.name}"
1736
+ true
1737
+ else
1738
+ false
1739
+ end
1740
+ end
1741
+ end
1693
1742
 
1694
1743
  ## Tells if an expression is a reference to port +systemI.signal+.
1695
1744
  def port_assign?(expr, systemI, signal)
@@ -1741,6 +1790,17 @@ class SystemT
1741
1790
  end
1742
1791
  end
1743
1792
  end
1793
+ # # puts "regs has clk?: #{regs.include?("clk")}"
1794
+ # # puts "for system #{self.name}"
1795
+ # # Remove the left values of connection, they do not count.
1796
+ # self.scope.each_connection do |connection|
1797
+ # # Skip port connections.
1798
+ # next if !self.port_output_connection?(connection)
1799
+ # # puts "Not counting left in connection: #{connection.to_verilog}"
1800
+ # # puts "i.e.: #{connection.left.to_verilog}"
1801
+ # regs.delete(connection.left.to_verilog)
1802
+ # end
1803
+ # # puts "Now regs has clk?: #{regs.include?("clk")}"
1744
1804
  # And the initialized signals.
1745
1805
  self.each_output do |output|
1746
1806
  regs << output.to_verilog if output.value
@@ -1750,10 +1810,12 @@ class SystemT
1750
1810
  end
1751
1811
  # And the array types signals.
1752
1812
  self.each_signal do |sig|
1753
- regs << sig.to_verilog if sig.type.is_a?(TypeVector) && sig.type.base.is_a?(TypeVector)
1813
+ # regs << sig.to_verilog if sig.type.is_a?(TypeVector) && sig.type.base.is_a?(TypeVector)
1814
+ regs << sig.to_verilog if sig.type.vector? && sig.type.base.vector?
1754
1815
  end
1755
1816
  self.each_inner do |sig|
1756
- regs << sig.to_verilog if sig.type.is_a?(TypeVector) && sig.type.base.is_a?(TypeVector)
1817
+ # regs << sig.to_verilog if sig.type.is_a?(TypeVector) && sig.type.base.is_a?(TypeVector)
1818
+ regs << sig.to_verilog if sig.type.vector? && sig.type.base.vector?
1757
1819
  end
1758
1820
 
1759
1821
  # Code generation
@@ -1932,9 +1994,11 @@ class SystemT
1932
1994
 
1933
1995
  code << "\n"
1934
1996
 
1997
+ # puts "For system=#{self.name}"
1935
1998
  # transliation of the instantiation part.
1936
1999
  # Generate the instances connections.
1937
2000
  self.each_systemI do |systemI|
2001
+ # puts "Processing systemI = #{systemI.name}"
1938
2002
  # Its Declaration.
1939
2003
  code << " " * 3
1940
2004
  systemT = systemI.systemT
@@ -778,15 +778,30 @@ module HDLRuby::High::Std
778
778
  # Port in same system as the channel case.
779
779
  # Add them to the current system.
780
780
  HDLRuby::High.cur_system.open do
781
- locs.each do |name,sig|
782
- port_pairs << [sig, sig.type.inner(name)]
781
+ # locs.each do |name,sig|
782
+ # port_pairs << [sig, sig.type.inner(name)]
783
+ # end
784
+ loc_inputs.each do |name,sig|
785
+ port_pairs << [sig, sig.type.inner(name),:input]
786
+ end
787
+ loc_outputs.each do |name,sig|
788
+ port_pairs << [sig, sig.type.inner(name),:output]
789
+ end
790
+ loc_inouts.each do |name,sig|
791
+ port_pairs << [sig, sig.type.inner(name),:inout]
783
792
  end
784
793
  end
785
794
  obj = self
786
795
  # Make the inner connection
787
- port_pairs.each do |sig, port|
796
+ # port_pairs.each do |sig, port|
797
+ port_pairs.each do |sig, port, dir|
788
798
  sig.parent.open do
789
- port.to_ref <= sig
799
+ # port.to_ref <= sig
800
+ if dir == :input then
801
+ port.to_ref <= sig
802
+ else
803
+ sig <= port.to_ref
804
+ end
790
805
  end
791
806
  end
792
807
  else
@@ -796,23 +811,28 @@ module HDLRuby::High::Std
796
811
  # The inputs
797
812
  loc_inputs.each do |name,sig|
798
813
  # puts "name=#{name} sig.name=#{sig.name}"
799
- port_pairs << [sig, sig.type.input(name)]
814
+ port_pairs << [sig, sig.type.input(name),:input]
800
815
  end
801
816
  # The outputs
802
817
  loc_outputs.each do |name,sig|
803
- port_pairs << [sig, sig.type.output(name)]
818
+ port_pairs << [sig, sig.type.output(name),:output]
804
819
  end
805
820
  # The inouts
806
821
  loc_inouts.each do |name,sig|
807
- port_pairs << [sig, sig.type.inout(name)]
822
+ port_pairs << [sig, sig.type.inout(name),:inout]
808
823
  end
809
824
  end
810
825
  obj = self
811
826
  # Make the connection of the instance.
812
827
  HDLRuby::High.cur_system.on_instance do |inst|
813
828
  obj.scope.open do
814
- port_pairs.each do |sig, port|
815
- RefObject.new(inst,port.to_ref) <= sig
829
+ port_pairs.each do |sig, port, dir|
830
+ # RefObject.new(inst,port.to_ref) <= sig
831
+ if dir == :input then
832
+ RefObject.new(inst,port.to_ref) <= sig
833
+ else
834
+ sig <= RefObject.new(inst,port.to_ref)
835
+ end
816
836
  end
817
837
  end
818
838
  end
@@ -870,15 +890,30 @@ module HDLRuby::High::Std
870
890
  # Port in same system as the channel case.
871
891
  # Add them to the current system.
872
892
  HDLRuby::High.cur_system.open do
873
- locs.each do |name,sig|
874
- port_pairs << [sig, sig.type.inner(name)]
893
+ # locs.each do |name,sig|
894
+ # port_pairs << [sig, sig.type.inner(name)]
895
+ # end
896
+ loc_inputs.each do |name,sig|
897
+ port_pairs << [sig, sig.type.inner(name),:input]
898
+ end
899
+ loc_outputs.each do |name,sig|
900
+ port_pairs << [sig, sig.type.inner(name),:output]
901
+ end
902
+ loc_inouts.each do |name,sig|
903
+ port_pairs << [sig, sig.type.inner(name),:inout]
875
904
  end
876
905
  end
877
906
  obj = self
878
907
  # Make the inner connection
879
- port_pairs.each do |sig, port|
908
+ # port_pairs.each do |sig, port|
909
+ port_pairs.each do |sig, port, dir|
880
910
  sig.parent.open do
881
- port.to_ref <= sig
911
+ # port.to_ref <= sig
912
+ if dir == :input then
913
+ port.to_ref <= sig
914
+ else
915
+ sig <= port.to_ref
916
+ end
882
917
  end
883
918
  end
884
919
  else
@@ -887,23 +922,29 @@ module HDLRuby::High::Std
887
922
  HDLRuby::High.cur_system.open do
888
923
  # The inputs
889
924
  loc_inputs.each do |name,sig|
890
- port_pairs << [sig, sig.type.input(name)]
925
+ port_pairs << [sig, sig.type.input(name),:input]
891
926
  end
892
927
  # The outputs
893
928
  loc_outputs.each do |name,sig|
894
- port_pairs << [sig, sig.type.output(name)]
929
+ port_pairs << [sig, sig.type.output(name),:output]
895
930
  end
896
931
  # The inouts
897
932
  loc_inouts.each do |name,sig|
898
- port_pairs << [sig, sig.type.inout(name)]
933
+ port_pairs << [sig, sig.type.inout(name),:inout]
899
934
  end
900
935
  end
901
936
  obj = self
902
937
  # Make the connection of the instance.
903
938
  HDLRuby::High.cur_system.on_instance do |inst|
904
939
  obj.scope.open do
905
- port_pairs.each do |sig, port|
906
- RefObject.new(inst,port.to_ref) <= sig
940
+ port_pairs.each do |sig, port, dir|
941
+ # RefObject.new(inst,port.to_ref) <= sig
942
+ # RefObject.new(inst,port.to_ref) <= sig
943
+ if dir == :input then
944
+ RefObject.new(inst,port.to_ref) <= sig
945
+ else
946
+ sig <= RefObject.new(inst,port.to_ref)
947
+ end
907
948
  end
908
949
  end
909
950
  end
@@ -9,13 +9,28 @@ module HDLRuby::High::Std
9
9
  # channel +in_ch+ and connect it to channels +out_chs+ with data of
10
10
  # +typ+.
11
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
12
+ # The optional req and ack arguments are the signals for controlling the
13
+ # duplicator using a handshake protocol. If set to nil, the duplicator
14
+ # runs automatically.
15
+ function :duplicator do |typ, ev, in_ch, out_chs, req = nil, ack = nil|
16
+ ev = ev.posedge unless ev.is_a?(Event)
17
+ inner :in_ack
18
+ inner :in_req
15
19
  out_acks = out_chs.size.times.map { |i| inner(:"out_ack#{i}") }
16
20
  typ.inner :data
17
21
  par(ev) do
18
- in_req <= 1
22
+ if (ack) then
23
+ # Output ack mode.
24
+ ack <= 0
25
+ end
26
+ if (req) then
27
+ # Input request mode.
28
+ in_req <= 0
29
+ hif(req) { in_req <= 1 }
30
+ else
31
+ # Automatic mode.
32
+ in_req <= 1
33
+ end
19
34
  out_acks.each { |ack| ack <= 0 }
20
35
  out_acks.each do |ack|
21
36
  hif(ack == 1) { in_req <= 0 }
@@ -30,6 +45,10 @@ module HDLRuby::High::Std
30
45
  end
31
46
  hif (out_acks.reduce(_1) { |sum,ack| ack & sum }) do
32
47
  out_acks.each { |ack| ack <= 0 }
48
+ if (ack) then
49
+ # Output ack mode.
50
+ ack <= 1
51
+ end
33
52
  end
34
53
  end
35
54
  end
@@ -233,15 +233,16 @@ module HDLRuby::High::Std
233
233
  hif(lvoks[i] & rvok & ~woks[i]) do
234
234
  ack <= 1
235
235
  run <= 0
236
- seq do
237
- avs[i] <= add.(avs[i],mul.(lvs[i],rv))
238
- accs[i].write(avs[i]) do
239
- woks[i] <= 1
240
- # seq do
241
- # lvoks[i] <= 0
242
- # rvok <= lvoks.reduce(:|)
243
- # end
244
- end
236
+ # seq do
237
+ # avs[i] <= add.(avs[i],mul.(lvs[i],rv))
238
+ # accs[i].write(avs[i]) do
239
+ # woks[i] <= 1
240
+ # end
241
+ # end
242
+ # Seems that can do without seq.
243
+ avs[i] <= add.(avs[i],mul.(lvs[i],rv))
244
+ accs[i].write(avs[i]) do
245
+ woks[i] <= 1
245
246
  end
246
247
  end
247
248
  hif (woks.reduce(:&)) do
@@ -289,9 +289,10 @@ HDLRuby::High::Std.channel(:mem_rom) do |typ,size,clk,rst,content,
289
289
  rst = send(rst_name)
290
290
  top_block.unshift do
291
291
  # Initialize the address so that the next access is at address 0.
292
- hif(rst==1) { abus_r <= -1 }
293
- # Reset so switch of the access trigger.
294
- trig_r <= 0
292
+ # hif(rst==1) { abus_r <= -1 }
293
+ # # Reset so switch of the access trigger.
294
+ # trig_r <= 0
295
+ hif(rst==1) { abus_r <= -1; trig_r <= 0 }
295
296
  end
296
297
  # The read procedure.
297
298
  # par do
@@ -317,6 +318,7 @@ HDLRuby::High::Std.channel(:mem_rom) do |typ,size,clk,rst,content,
317
318
  # blk.call if blk
318
319
  seq do
319
320
  # abus_r <= abus_r + 1
321
+ trig_r <= 0
320
322
  target <= dbus_r
321
323
  blk.call if blk
322
324
  end
@@ -324,7 +326,8 @@ HDLRuby::High::Std.channel(:mem_rom) do |typ,size,clk,rst,content,
324
326
  helse do
325
327
  # Prepare the read.
326
328
  # abus_r <= abus_r + 1
327
- if 2**size.width != size then
329
+ # if 2**size.width != size then
330
+ if 2**awidth != size then
328
331
  abus_r <= mux((abus_r + 1) == size, abus_r + 1, 0)
329
332
  else
330
333
  abus_r <= abus_r + 1
@@ -390,7 +393,8 @@ HDLRuby::High::Std.channel(:mem_rom) do |typ,size,clk,rst,content,
390
393
  helse do
391
394
  # Prepare the read.
392
395
  # abus_r <= abus_r - 1
393
- if 2**size.width != size then
396
+ # if 2**size.width != size then
397
+ if 2**awidth != size then
394
398
  abus_r <= mux(abus_r == 0, abus_r - 1, size - 1)
395
399
  else
396
400
  abus_r <= abus_r - 1
@@ -607,7 +611,8 @@ HDLRuby::High::Std.channel(:mem_dual) do |typ,size,clk,rst,br_rsts = {}|
607
611
  helse do
608
612
  # Prepare the read.
609
613
  # abus_r <= abus_r + 1
610
- if 2**size.width != size then
614
+ # if 2**size.width != size then
615
+ if 2**awidth != size then
611
616
  abus_r <= mux((abus_r + 1) == size, abus_r + 1, 0)
612
617
  else
613
618
  abus_r <= abus_r + 1
@@ -649,7 +654,8 @@ HDLRuby::High::Std.channel(:mem_dual) do |typ,size,clk,rst,br_rsts = {}|
649
654
  blk.call if blk
650
655
  # Prepare the write.
651
656
  # abus_w <= abus_w + 1
652
- if 2**size.width != size then
657
+ # if 2**size.width != size then
658
+ if 2**awidth != size then
653
659
  abus_w <= mux((abus_w + 1) == size, abus_w + 1, 0)
654
660
  else
655
661
  abus_w <= abus_w + 1
@@ -716,7 +722,8 @@ HDLRuby::High::Std.channel(:mem_dual) do |typ,size,clk,rst,br_rsts = {}|
716
722
  helse do
717
723
  # Prepare the read.
718
724
  # abus_r <= abus_r - 1
719
- if 2**size.width != size then
725
+ # if 2**size.width != size then
726
+ if 2**awidth != size then
720
727
  abus_r <= mux(abus_r == 0, abus_r - 1, size - 1)
721
728
  else
722
729
  abus_r <= abus_r - 1
@@ -758,7 +765,8 @@ HDLRuby::High::Std.channel(:mem_dual) do |typ,size,clk,rst,br_rsts = {}|
758
765
  blk.call if blk
759
766
  # Prepare the write.
760
767
  # abus_w <= abus_w - 1
761
- if 2**size.width != size then
768
+ # if 2**size.width != size then
769
+ if 2**awidth != size then
762
770
  abus_w <= mux(abus_w == 0, abus_w - 1, size - 1)
763
771
  else
764
772
  abus_w <= abus_w - 1
@@ -839,9 +847,12 @@ HDLRuby::High::Std.channel(:mem_file) do |typ,size,clk,rst,br_rsts = {}|
839
847
 
840
848
  # Defines the ports of the memory as branchs of the channel.
841
849
 
842
- # The number branch (accesser).
850
+ # # The number branch (accesser).
851
+ # The number branch (reader/writer).
843
852
  brancher(:anum) do
844
- size.times { |i| accesser_inout :"reg_#{i}" }
853
+ # size.times { |i| accesser_inout :"reg_#{i}" }
854
+ size.times { |i| reader_input :"reg_#{i}" }
855
+ size.times { |i| writer_output :"reg_#{i}" }
845
856
 
846
857
  # Defines the read procedure of register number +num+
847
858
  # using +target+ as target of access result.
@@ -884,6 +895,39 @@ HDLRuby::High::Std.channel(:mem_file) do |typ,size,clk,rst,br_rsts = {}|
884
895
 
885
896
  end
886
897
 
898
+ # The number read branch (reader).
899
+ brancher(:rnum) do
900
+ size.times { |i| reader_input :"reg_#{i}" }
901
+
902
+ # Defines the read procedure of register number +num+
903
+ # using +target+ as target of access result.
904
+ reader do |blk,num,target|
905
+ regs = size.times.map {|i| send(:"reg_#{i}") }
906
+ # The read procedure.
907
+ par do
908
+ # No reset, so can perform the read.
909
+ target <= regs[num]
910
+ blk.call if blk
911
+ end
912
+ end
913
+ end
914
+
915
+ # The number write branch (writer).
916
+ brancher(:wnum) do
917
+ size.times { |i| writer_output :"reg_#{i}" }
918
+
919
+ # Defines the read procedure of register number +num+
920
+ # using +target+ as target of access result.
921
+ writer do |blk,num,target|
922
+ regs = size.times.map {|i| send(:"reg_#{i}") }
923
+ # The write procedure.
924
+ par do
925
+ regs[num] <= target
926
+ blk.call if blk
927
+ end
928
+ end
929
+ end
930
+
887
931
 
888
932
  # The address branches.
889
933
  # Read with address
@@ -959,7 +1003,8 @@ HDLRuby::High::Std.channel(:mem_file) do |typ,size,clk,rst,br_rsts = {}|
959
1003
  awidth = (size-1).width
960
1004
  awidth = 1 if awidth == 0
961
1005
  [awidth].inner :abus_r
962
- reader_inout :abus_r
1006
+ # reader_inout :abus_r
1007
+ reader_output :abus_r
963
1008
 
964
1009
  # Defines the read procedure at address +addr+
965
1010
  # using +target+ as target of access result.
@@ -982,7 +1027,8 @@ HDLRuby::High::Std.channel(:mem_file) do |typ,size,clk,rst,br_rsts = {}|
982
1027
  blk.call if blk
983
1028
  # Prepare the next read.
984
1029
  # abus_r <= abus_r + 1
985
- if 2**size.width != size then
1030
+ # if 2**size.width != size then
1031
+ if 2**awidth != size then
986
1032
  abus_r <= mux((abus_r + 1) == size, abus_r + 1, 0)
987
1033
  else
988
1034
  abus_r <= abus_r + 1
@@ -1028,7 +1074,8 @@ HDLRuby::High::Std.channel(:mem_file) do |typ,size,clk,rst,br_rsts = {}|
1028
1074
  blk.call if blk
1029
1075
  # Prepare the next write.
1030
1076
  # abus_w <= abus_w + 1
1031
- if 2**size.width != size then
1077
+ # if 2**size.width != size then
1078
+ if 2**awidth != size then
1032
1079
  abus_w <= mux((abus_w + 1) == size, abus_w + 1, 0)
1033
1080
  else
1034
1081
  abus_w <= abus_w + 1
@@ -1076,7 +1123,8 @@ HDLRuby::High::Std.channel(:mem_file) do |typ,size,clk,rst,br_rsts = {}|
1076
1123
  blk.call if blk
1077
1124
  # Prepare the next read.
1078
1125
  # abus_r <= abus_r - 1
1079
- if 2**size.width != size then
1126
+ # if 2**size.width != size then
1127
+ if 2**awidth != size then
1080
1128
  abus_r <= mux(abus_r == 0, abus_r - 1, size - 1)
1081
1129
  else
1082
1130
  abus_r <= abus_r - 1
@@ -1122,7 +1170,8 @@ HDLRuby::High::Std.channel(:mem_file) do |typ,size,clk,rst,br_rsts = {}|
1122
1170
  blk.call if blk
1123
1171
  # Prepare the next write.
1124
1172
  # abus_w <= abus_w - 1
1125
- if 2**size.width != size then
1173
+ # if 2**size.width != size then
1174
+ if 2**awidth != size then
1126
1175
  abus_w <= mux(abus_w == 0, abus_w - 1, size - 1)
1127
1176
  else
1128
1177
  abus_w <= abus_w - 1
@@ -1338,7 +1387,8 @@ HDLRuby::High::Std.channel(:mem_bank) do |typ,nbanks,size,clk,rst,br_rsts = {}|
1338
1387
  end
1339
1388
  # Prepare the read.
1340
1389
  # abus_r <= abus_r + 1
1341
- if 2**size.width != size then
1390
+ # if 2**size.width != size then
1391
+ if 2**awidth != size then
1342
1392
  abus_r <= mux((abus_r + 1) == size, abus_r + 1, 0)
1343
1393
  else
1344
1394
  abus_r <= abus_r + 1
@@ -1379,7 +1429,8 @@ HDLRuby::High::Std.channel(:mem_bank) do |typ,nbanks,size,clk,rst,br_rsts = {}|
1379
1429
  blk.call if blk
1380
1430
  # Prepare the write.
1381
1431
  # abus_w <= abus_w + 1
1382
- if 2**size.width != size then
1432
+ # if 2**size.width != size then
1433
+ if 2**awidth != size then
1383
1434
  abus_w <= mux((abus_w + 1) == size, abus_w + 1, 0)
1384
1435
  else
1385
1436
  abus_w <= abus_w + 1
@@ -1425,7 +1476,8 @@ HDLRuby::High::Std.channel(:mem_bank) do |typ,nbanks,size,clk,rst,br_rsts = {}|
1425
1476
  end
1426
1477
  # Prepare the read.
1427
1478
  # abus_r <= abus_r - 1
1428
- if 2**size.width != size then
1479
+ # if 2**size.width != size then
1480
+ if 2**awidth != size then
1429
1481
  abus_r <= mux(abus_r == 0, abus_r - 1, size - 1)
1430
1482
  else
1431
1483
  abus_r <= abus_r - 1
@@ -1466,7 +1518,8 @@ HDLRuby::High::Std.channel(:mem_bank) do |typ,nbanks,size,clk,rst,br_rsts = {}|
1466
1518
  blk.call if blk
1467
1519
  # Prepare the write.
1468
1520
  abus_w <= abus_w - 1
1469
- if 2**size.width != size then
1521
+ # if 2**size.width != size then
1522
+ if 2**awidth != size then
1470
1523
  abus_w <= mux(abus_w == 0, abus_w - 1, size - 1)
1471
1524
  else
1472
1525
  abus_w <= abus_w - 1
@@ -1704,6 +1757,127 @@ HDLRuby::High::Std.channel(:mem_bank) do |typ,nbanks,size,clk,rst,br_rsts = {}|
1704
1757
 
1705
1758
  end
1706
1759
 
1760
+
1761
+ # Queue memory of +size+ elements of +typ+ typ, syncrhonized on +clk+
1762
+ # (positive and negative edges) and reset on +rst+.
1763
+ # At each rising edge of +clk+ a read and a write is guaranteed to be
1764
+ # completed provided they are triggered.
1765
+ #
1766
+ # NOTE: this channel does not have any branch.
1767
+ HDLRuby::High::Std.channel(:mem_queue) do |typ,size,clk,rst|
1768
+ # The inner buffer of the queue.
1769
+ typ[-size].inner :buffer
1770
+ # The read and write pointers.
1771
+ [size.width].inner :rptr, :wptr
1772
+ # The read and write command signals.
1773
+ inner :rreq, :wreq
1774
+ # The read and write ack signals.
1775
+ inner :rack, :wack
1776
+ # The read/write data registers.
1777
+ typ.inner :rdata, :wdata
1778
+
1779
+ # The flags telling of the channel is synchronized
1780
+ inner :rsync, :wsync
1781
+
1782
+ # The process handling the decoupled access to the buffer.
1783
+ par(clk.posedge) do
1784
+ hif(rst) { rptr <= 0; wptr <= 0 }
1785
+ helse do
1786
+ hif(~rsync) do
1787
+ hif (~rreq) { rack <= 0 }
1788
+ hif(rreq & (~rack) & (rptr != wptr)) do
1789
+ rdata <= buffer[rptr]
1790
+ rptr <= (rptr + 1) % depth
1791
+ rack <= 1
1792
+ end
1793
+ end
1794
+
1795
+ hif(~wsync) do
1796
+ hif (~wreq) { wack <= 0 }
1797
+ hif(wreq & (~wack) & (((wptr+1) % size) != rptr)) do
1798
+ buffer[wptr] <= wdata
1799
+ wptr <= (wptr + 1) % size
1800
+ wack <= 1
1801
+ end
1802
+ end
1803
+ end
1804
+ end
1805
+
1806
+ reader_output :rreq, :rptr, :rsync
1807
+ reader_input :rdata, :rack, :wptr, :buffer
1808
+
1809
+ # The read primitive.
1810
+ reader do |blk,target|
1811
+ if (cur_behavior.on_event?(clk.posedge,clk.negedge)) then
1812
+ # Same clk event, synchrone case: perform a direct access.
1813
+ # Now perform the access.
1814
+ top_block.unshift do
1815
+ rsync <= 1
1816
+ rreq <= 0
1817
+ end
1818
+ seq do
1819
+ hif(rptr != wptr) do
1820
+ # target <= rdata
1821
+ target <= buffer[rptr]
1822
+ rptr <= (rptr + 1) % size
1823
+ blk.call if blk
1824
+ end
1825
+ end
1826
+ else
1827
+ # Different clk event, perform a decoupled access.
1828
+ top_block.unshift do
1829
+ rsync <= 0
1830
+ rreq <= 0
1831
+ end
1832
+ par do
1833
+ hif (~rack) { rreq <= 1 }
1834
+ helsif(rreq) do
1835
+ rreq <= 0
1836
+ target <= rdata
1837
+ blk.call if blk
1838
+ end
1839
+ end
1840
+ end
1841
+ end
1842
+
1843
+ writer_output :wreq, :wdata, :wptr, :wsync, :buffer
1844
+ writer_input :wack, :rptr
1845
+
1846
+ # The write primitive.
1847
+ writer do |blk,target|
1848
+ if (cur_behavior.on_event?(clk.negedge,clk.posedge)) then
1849
+ # Same clk event, synchrone case: perform a direct access.
1850
+ top_block.unshift do
1851
+ wsync <= 1
1852
+ wreq <= 0
1853
+ end
1854
+ hif(((wptr+1) % size) != rptr) do
1855
+ buffer[wptr] <= target
1856
+ wptr <= (wptr + 1) % size
1857
+ blk.call if blk
1858
+ end
1859
+ else
1860
+ # Different clk event, asynchrone case: perform a decoupled access.
1861
+ top_block.unshift do
1862
+ wsync <= 0
1863
+ wreq <= 0
1864
+ end
1865
+ seq do
1866
+ hif (~wack) do
1867
+ wreq <= 1
1868
+ wdata <= target
1869
+ end
1870
+ helsif(wreq) do
1871
+ wreq <= 0
1872
+ blk.call if blk
1873
+ end
1874
+ end
1875
+ end
1876
+ end
1877
+ end
1878
+
1879
+
1880
+
1707
1881
  # HDLRuby::High::Std.channel(:mem_bank) do |typ,nbanks,size,clk,rst,br_rsts = {}|
1708
1882
  # # Ensure typ is a type.
1709
1883
  # typ = typ.to_type
@@ -1,3 +1,3 @@
1
1
  module HDLRuby
2
- VERSION = "2.4.19"
2
+ VERSION = "2.4.26"
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.19
4
+ version: 2.4.26
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-12-06 00:00:00.000000000 Z
11
+ date: 2021-01-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -207,6 +207,7 @@ files:
207
207
  - lib/HDLRuby/hruby_low2sym.rb
208
208
  - lib/HDLRuby/hruby_low2vhd.rb
209
209
  - lib/HDLRuby/hruby_low_bool2select.rb
210
+ - lib/HDLRuby/hruby_low_casts_without_expression.rb
210
211
  - lib/HDLRuby/hruby_low_cleanup.rb
211
212
  - lib/HDLRuby/hruby_low_fix_types.rb
212
213
  - lib/HDLRuby/hruby_low_mutable.rb