HDLRuby 2.0.18 → 2.1.0

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
  SHA1:
3
- metadata.gz: afbd4b4db1a9b95b92f5289877bd4fcee7468ff1
4
- data.tar.gz: f7c28abc847bb5061d0321e1de933d8c14f54997
3
+ metadata.gz: c150464dc8c76fe2fdcf37ee752a8662c8d6128b
4
+ data.tar.gz: 16facc5e58f5545cf85586f541c61638ecd78733
5
5
  SHA512:
6
- metadata.gz: 90922bedcaa4374b28b91ef6b165870a680b4b13e530d13b37ff0b6416ac55a08e9adb0f5e9a799d5833932e050651376f5e22c87d1fedee1a040dcb586e4fed
7
- data.tar.gz: f357a3be8525021f6be2a2b022ba283209f101405dbe1b9fbaeb8d8345e95f3b75e46c0fc44ff1617a9cecadf007a0fd98aaf5597c3f73e744fecc7b93d43eb2
6
+ metadata.gz: 8402087045e3f64a50e0553a69b36dcce5b752bb16c58a0f75ffa37bddeea9b3e366f65d94abdc5abae4f9ee0532d0e8e85e8b2a254e9f18484033b17e31fa47
7
+ data.tar.gz: 406803e4c457b43b52a71eec5d121d8fa09902c7943b7611c5ffd22cca5207bfb3647ee642bdbc869a7d4aff9d07d2d69d8f29878a1fdae06fbb6d650f3257bc
@@ -71,7 +71,7 @@ system :producer8 do |channel|
71
71
  # Inputs of the producer: clock and reset.
72
72
  input :clk, :rst
73
73
  # Instantiate the channel ports
74
- channel.writer_ports
74
+ channel.output :ch
75
75
  # Inner 8-bit counter for generating values.
76
76
  [8].inner :counter
77
77
 
@@ -79,7 +79,7 @@ system :producer8 do |channel|
79
79
  par(clk.posedge) do
80
80
  hif(rst) { counter <= 0 }
81
81
  helse do
82
- channel.write(counter) { counter <= counter + 1 }
82
+ ch.write(counter) { counter <= counter + 1 }
83
83
  end
84
84
  end
85
85
  end
@@ -89,13 +89,13 @@ system :consummer8 do |channel|
89
89
  # Input of the consummer: a clock is enough.
90
90
  input :clk
91
91
  # Instantiate the channel ports
92
- channel.reader_ports
92
+ channel.input :ch
93
93
  # Inner buffer for storing the cunsummed value.
94
94
  [8].inner :buf
95
95
 
96
96
  # The value consumption process
97
97
  par(clk.posedge) do
98
- channel.read(buf)
98
+ ch.read(buf)
99
99
  end
100
100
  end
101
101
 
@@ -111,8 +111,8 @@ system :hs_test do
111
111
  hs.reset.at(rst.posedge)
112
112
 
113
113
  # Instantiate the producer.
114
- producer8(hs).(:producerI).(clk,rst,*hs.writer_signals)
114
+ producer8(hs).(:producerI).(clk,rst)
115
115
 
116
116
  # Instantiate the consummer.
117
- consummer8(hs).(:consummerI).(clk,*hs.reader_signals)
117
+ consummer8(hs).(:consummerI).(clk)
118
118
  end
@@ -56,22 +56,31 @@ system :regn do |n|
56
56
  end
57
57
 
58
58
  # Instantiate it for checking.
59
- regn :regn8I,8
59
+ # regn :regn8I,8
60
+ regn(8).(:regn8I)
60
61
 
61
62
 
62
63
  # Describes a register of generic type.
64
+ # NOTE: the input can be automatically connected from the generic argument.
63
65
  system :reg do |typ|
64
66
  input :clk, :rst
65
67
  typ.input :d
68
+ # Now ensure typ is a type.
69
+ typ = typ.type if typ.is_a?(HExpression)
66
70
  typ.output :q,:qb
67
71
 
72
+
68
73
  qb <= ~q
69
74
  (q <= d & [~rst]*typ.width).at(clk.posedge)
70
75
  end
71
76
 
72
77
  # Instantiate it for checking.
73
- reg :regbit8I, bit[7..0]
78
+ # reg :regbit8I, bit[7..0]
79
+ reg(bit[7..0]).(:regbit8I)
74
80
 
81
+ # Instantiate it with infered type from connection.
82
+ bit[8].inner :sig0
83
+ reg(sig0).(:regSig0I)
75
84
 
76
85
 
77
86
  # Function generating the body of a register description.
@@ -104,8 +113,10 @@ end
104
113
  # Instantiate these systems for checking them.
105
114
  dff_body :dff_bodyI
106
115
  reg8_body :reg8_bodyI
107
- regn_body :regn_bodyI, 8
108
- reg_body :reg_bodyI, bit[7..0]
116
+ # regn_body :regn_bodyI, 8
117
+ regn_body(8).(:regn_bodyI)
118
+ # reg_body :reg_bodyI, bit[7..0]
119
+ reg_body(bit[7..0]).(:reg_bodyI)
109
120
 
110
121
 
111
122
  # Function generating a register declaration.
@@ -123,7 +134,7 @@ end
123
134
  # Now let's generate the register declarations.
124
135
  make_reg(:dff_make) { bit }
125
136
  make_reg(:reg8_make){ bit[7..0] }
126
- make_reg(:regn_make){ |n| bit[n-1..0] }
137
+ make_reg(:regn_make){ |n| bit[(n-1)..0] }
127
138
  make_reg(:reg_make) { |typ| typ }
128
139
 
129
140
  # Instantiate these systems for checking them.
@@ -336,6 +336,9 @@ module HDLRuby::High
336
336
  # Create the public namespace.
337
337
  @public_namespace = Namespace.new(self.scope)
338
338
 
339
+ # Initialize the list of tasks to execute on the instance.
340
+ @on_instances = []
341
+
339
342
  # Check and set the mixins.
340
343
  mixins.each do |mixin|
341
344
  unless mixin.is_a?(SystemT) then
@@ -543,6 +546,21 @@ module HDLRuby::High
543
546
  return self
544
547
  end
545
548
 
549
+
550
+ # Adds a task to apply on the instances of the system.
551
+ def on_instance(&ruby_block)
552
+ @on_instances << ruby_block
553
+ end
554
+
555
+ # Iterate over the task to apply on the instances of the system.
556
+ def each_on_instance(&ruby_block)
557
+ # No ruby block? Return an enumerator.
558
+ return to_enum(:each_on_instance) unless ruby_block
559
+ # A block? Apply it on each overload if any.
560
+ @on_instances.each(&ruby_block)
561
+ end
562
+
563
+
546
564
  # Instantiate the system type to an instance named +i_name+ with
547
565
  # possible arguments +args+.
548
566
  def instantiate(i_name,*args)
@@ -560,6 +578,10 @@ module HDLRuby::High
560
578
  # puts "instance scope= #{instance.systemT.scope}"
561
579
  # Add the instance.
562
580
  High.top_user.send(:add_systemI,instance)
581
+
582
+ # Execute the post instantiation tasks.
583
+ eigen.each_on_instance { |task| task.(instance) }
584
+
563
585
  # Return the resulting instance
564
586
  return instance
565
587
  end
@@ -884,8 +906,6 @@ module HDLRuby::High
884
906
  @namespace.concat_namespace(base.namespace)
885
907
  High.space_push(@namespace)
886
908
  # Execute the instantiation block
887
- # instance_proc = base.parent.instance_proc if base.parent.respond_to?(:instance_proc)
888
- # @return_value = High.top_user.instance_exec(*args,&instance_proc) if instance_proc
889
909
  base.parent.each_instance_proc do |instance_proc|
890
910
  @return_value = High.top_user.instance_exec(*args,&instance_proc)
891
911
  end
@@ -1148,9 +1168,14 @@ module HDLRuby::High
1148
1168
  export
1149
1169
  end
1150
1170
  end
1171
+ # Adds the task to execute on the instance.
1172
+ system.each_on_instance do |task|
1173
+ self.parent.on_instance(&task)
1174
+ end
1151
1175
  end
1152
1176
  # Adds it the list of includeds
1153
1177
  @includes[include_name] = system
1178
+
1154
1179
  end
1155
1180
 
1156
1181
  # Casts as an included +system+.
@@ -1161,6 +1186,7 @@ module HDLRuby::High
1161
1186
  return @includes[system].namespace
1162
1187
  end
1163
1188
 
1189
+
1164
1190
  include Hmux
1165
1191
 
1166
1192
  # Fills a low level scope with self's contents.
@@ -1523,7 +1549,34 @@ module HDLRuby::High
1523
1549
 
1524
1550
  include HbasicType
1525
1551
  end
1526
-
1552
+
1553
+ # # The infer type.
1554
+ # # Unspecified, but automatically infered when connected.
1555
+ # Infer = define_type(:infer)
1556
+ # class << Infer
1557
+ # # The specified type.
1558
+ # attr_reader :type
1559
+
1560
+ # # Sets the specifed type to typ.
1561
+ # def type=(typ)
1562
+ # # Ensure typ is a type.
1563
+ # typ = typ.to_type
1564
+ # unless @type
1565
+ # @type = typ
1566
+ # else
1567
+ # unless @type.eql(typ)
1568
+ # raise AnyError.new("Invalid type for connection to auto type: expecting #{@type} but got #{typ}")
1569
+ # end
1570
+ # end
1571
+ # return self
1572
+ # end
1573
+
1574
+ # # Converts the type to HDLRuby::low.
1575
+ # # Actually returns the HDLRuby::low version of the specified type.
1576
+ # def to_low
1577
+ # return type.to_low
1578
+ # end
1579
+ # end
1527
1580
 
1528
1581
 
1529
1582
 
@@ -1839,7 +1892,8 @@ module HDLRuby::High
1839
1892
  # in the order of declaration.
1840
1893
  def call(*connects)
1841
1894
  # Checks if it is a connection through is a hash.
1842
- if connects.size == 1 and connects[0].respond_to?(:to_h) then
1895
+ if connects.size == 1 and connects[0].respond_to?(:to_h) and
1896
+ !connects[0].is_a?(HRef) then
1843
1897
  # Yes, perform a connection by name
1844
1898
  connects = connects[0].to_h
1845
1899
  # Performs the connections.
@@ -2167,6 +2221,66 @@ module HDLRuby::High
2167
2221
  # The type of the expression if resolved.
2168
2222
  attr_reader :type
2169
2223
 
2224
+ # Creates input port +name+ and connect it to the expression.
2225
+ def input(name)
2226
+ # Ensures the name is a symbol.
2227
+ name = name.to_sym
2228
+ # Get access to the current expression
2229
+ obj = self
2230
+ # Create the input.
2231
+ port = nil
2232
+ HDLRuby::High.cur_system.open do
2233
+ port = obj.type.input(name)
2234
+ end
2235
+ # Make the connection when the instance is ready.
2236
+ HDLRuby::High.cur_system.on_instance do |inst|
2237
+ obj.scope.open do
2238
+ RefObject.new(inst,port.to_ref) <= obj
2239
+ end
2240
+ end
2241
+ return port
2242
+ end
2243
+
2244
+ # Creates output port +name+ and connect it to the expression.
2245
+ def output(name)
2246
+ # Ensures the name is a symbol.
2247
+ name = name.to_sym
2248
+ # Get access to the current expression
2249
+ obj = self
2250
+ # Create the output.
2251
+ port = nil
2252
+ HDLRuby::High.cur_system.open do
2253
+ port = obj.type.output(name)
2254
+ end
2255
+ # Make the connection when the instance is ready.
2256
+ HDLRuby::High.cur_system.on_instance do |inst|
2257
+ obj.scope.open do
2258
+ obj <= RefObject.new(inst,port.to_ref)
2259
+ end
2260
+ end
2261
+ return port
2262
+ end
2263
+
2264
+ # Creates inout port +name+ and connect it to the expression.
2265
+ def inout(name)
2266
+ # Ensures the name is a symbol.
2267
+ name = name.to_sym
2268
+ # Get access to the current expression
2269
+ obj = self
2270
+ # Create the inout.
2271
+ port = nil
2272
+ HDLRuby::High.cur_system.open do
2273
+ port = obj.type.inout(name)
2274
+ end
2275
+ # Make the connection when the instance is ready.
2276
+ HDLRuby::High.cur_system.on_instance do |inst|
2277
+ obj.scope.open do
2278
+ RefObject.new(inst,port.to_ref) <= obj
2279
+ end
2280
+ end
2281
+ return port
2282
+ end
2283
+
2170
2284
  # Tell if the expression can be converted to a value.
2171
2285
  def to_value?
2172
2286
  return false
@@ -3495,6 +3609,22 @@ module HDLRuby::High
3495
3609
  top_user.is_a?(Block)
3496
3610
  end
3497
3611
 
3612
+ # Gets the enclosing scope if any.
3613
+ #
3614
+ # NOTE: +level+ allows to get an upper scope of the currently enclosing
3615
+ # scope.
3616
+ def self.cur_scope(level = 0)
3617
+ if level < 0 then
3618
+ raise AnyError, "Not within a scope: #{Namespaces[-1].user.class}"
3619
+ end
3620
+ if Namespaces[-1-level].user.is_a?(Scope) then
3621
+ return Namespaces[-1-level].user
3622
+ else
3623
+ return cur_scope(level+1)
3624
+ end
3625
+ end
3626
+
3627
+
3498
3628
  # Gets the enclosing block if any.
3499
3629
  #
3500
3630
  # NOTE: +level+ allows to get an upper block of the currently enclosing
@@ -52,6 +52,13 @@ module HDLRuby::Low
52
52
  @parent = parent
53
53
  end
54
54
  end
55
+
56
+ # Get the parent scope.
57
+ def scope
58
+ cur = self.parent
59
+ cur = cur.parent until cur.is_a?(Scope)
60
+ return cur
61
+ end
55
62
  end
56
63
 
57
64
 
@@ -71,6 +71,9 @@ module HDLRuby::High::Std
71
71
  # The name of the channel instance.
72
72
  attr_reader :name
73
73
 
74
+ # The scope the channel has been created in.
75
+ attr_reader :scope
76
+
74
77
  # The namespace associated with the current execution when
75
78
  # building a channel, its reader or its writer.
76
79
  attr_reader :namespace
@@ -80,6 +83,10 @@ module HDLRuby::High::Std
80
83
  # Check and set the name
81
84
  @name = name.to_sym
82
85
 
86
+ # Sets the scope.
87
+ @scope = HDLRuby::High.cur_scope
88
+
89
+ # Keep access to self.
83
90
  obj = self
84
91
 
85
92
  # The reader input ports by name.
@@ -253,35 +260,116 @@ module HDLRuby::High::Std
253
260
 
254
261
  # Reader an writer side.
255
262
 
256
- ## Declares the ports for the reader.
257
- def reader_ports
263
+ # ## Declares the ports for the reader.
264
+ # def reader_ports
265
+ # loc_inputs = @reader_inputs
266
+ # loc_outputs = @reader_outputs
267
+ # loc_inouts = @reader_inouts
268
+ # HDLRuby::High.cur_system.open do
269
+ # # The inputs
270
+ # loc_inputs.each { |name,sig| sig.type.input name }
271
+ # # The outputs
272
+ # loc_outputs.each { |name,sig| sig.type.output name }
273
+ # # The inouts
274
+ # loc_inouts.each { |name,sig| sig.type.inout name }
275
+ # end
276
+ # end
277
+
278
+ ## Declares the ports for the reader and assigned them to +name+.
279
+ def input(name)
280
+ # Ensure name is a symbol.
281
+ name = name.to_sym
282
+ # Access the ports
258
283
  loc_inputs = @reader_inputs
259
284
  loc_outputs = @reader_outputs
260
285
  loc_inouts = @reader_inouts
286
+ # The generated port with corresponding channel port pairs.
287
+ port_pairs = []
288
+ # Add them to the current system.
261
289
  HDLRuby::High.cur_system.open do
262
290
  # The inputs
263
- loc_inputs.each { |name,sig| sig.type.input name }
291
+ loc_inputs.each do |name,sig|
292
+ port_pairs << [sig, sig.type.input(name)]
293
+ end
264
294
  # The outputs
265
- loc_outputs.each { |name,sig| sig.type.output name }
295
+ loc_outputs.each do |name,sig|
296
+ port_pairs << [sig, sig.type.output(name)]
297
+ end
266
298
  # The inouts
267
- loc_inouts.each { |name,sig| sig.type.inout name }
299
+ loc_inouts.each do |name,sig|
300
+ port_pairs << [sig, sig.type.inout(name)]
301
+ end
302
+ end
303
+ obj = self
304
+ # Make the connection of the instance.
305
+ HDLRuby::High.cur_system.on_instance do |inst|
306
+ obj.scope.open do
307
+ port_pairs.each do |sig, port|
308
+ RefObject.new(inst,port.to_ref) <= sig
309
+ end
310
+ end
268
311
  end
312
+ # Give access to the ports through name.
313
+ # NOTE: for now, simply associate the channel to name.
314
+ this = self
315
+ HDLRuby::High.space_reg(name) { this }
269
316
  end
270
317
 
271
- ## Declares the ports for the writer.
272
- def writer_ports
318
+ # ## Declares the ports for the writer.
319
+ # def writer_ports
320
+ # loc_inputs = @writer_inputs
321
+ # loc_outputs = @writer_outputs
322
+ # loc_inouts = @writer_inouts
323
+ # HDLRuby::High.cur_system.open do
324
+ # # The inputs
325
+ # loc_inputs.each { |name,sig| sig.type.input name }
326
+ # # The outputs
327
+ # loc_outputs.each { |name,sig| sig.type.output name }
328
+ # # The inouts
329
+ # loc_inouts.each { |name,sig| sig.type.inout name }
330
+ # end
331
+ # end
332
+
333
+ ## Declares the ports for the reader and assigned them to +name+.
334
+ def output(name)
335
+ # Ensure name is a symbol.
336
+ name = name.to_sym
337
+ # Access the ports
273
338
  loc_inputs = @writer_inputs
274
339
  loc_outputs = @writer_outputs
275
340
  loc_inouts = @writer_inouts
341
+ # The generated port with corresponding channel port pairs.
342
+ port_pairs = []
343
+ # Add them to the current system.
276
344
  HDLRuby::High.cur_system.open do
277
345
  # The inputs
278
- loc_inputs.each { |name,sig| sig.type.input name }
346
+ loc_inputs.each do |name,sig|
347
+ port_pairs << [sig, sig.type.input(name)]
348
+ end
279
349
  # The outputs
280
- loc_outputs.each { |name,sig| sig.type.output name }
350
+ loc_outputs.each do |name,sig|
351
+ port_pairs << [sig, sig.type.output(name)]
352
+ end
281
353
  # The inouts
282
- loc_inouts.each { |name,sig| sig.type.inout name }
354
+ loc_inouts.each do |name,sig|
355
+ port_pairs << [sig, sig.type.inout(name)]
356
+ end
283
357
  end
358
+ obj = self
359
+ # Make the connection of the instance.
360
+ HDLRuby::High.cur_system.on_instance do |inst|
361
+ obj.scope.open do
362
+ port_pairs.each do |sig, port|
363
+ RefObject.new(inst,port.to_ref) <= sig
364
+ end
365
+ end
366
+ end
367
+ # Give access to the ports through name.
368
+ # NOTE: for now, simply associate the channel to name.
369
+ this = self
370
+ HDLRuby::High.space_reg(name) { this }
284
371
  end
372
+
285
373
 
286
374
  ## Performs a read on the channel using +args+ and +ruby_block+
287
375
  # as arguments.
@@ -1,3 +1,3 @@
1
1
  module HDLRuby
2
- VERSION = "2.0.18"
2
+ VERSION = "2.1.0"
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.0.18
4
+ version: 2.1.0
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-01-16 00:00:00.000000000 Z
11
+ date: 2020-02-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler