HDLRuby 2.0.18 → 2.1.0

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.
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