HDLRuby 3.3.4 → 3.5.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 +4 -4
- data/HDLRuby.gemspec +1 -0
- data/README.md +78 -7
- data/exe/v2hdr +3 -0
- data/ext/hruby_sim/hruby_rcsim_build.c +1 -0
- data/lib/HDLRuby/hdr_samples/adder8.v +6 -0
- data/lib/HDLRuby/hdr_samples/hard_to_route.rb +30 -0
- data/lib/HDLRuby/hdr_samples/sw_encrypt_bench.rb +2 -0
- data/lib/HDLRuby/hdr_samples/sw_encrypt_cpu_bench.rb +2 -0
- data/lib/HDLRuby/hdr_samples/sw_encrypt_cpusim_bench.rb +2 -0
- data/lib/HDLRuby/hdr_samples/verilog_parser_bench.rb +36 -0
- data/lib/HDLRuby/hdr_samples/with_generic_in_generic.rb +31 -0
- data/lib/HDLRuby/hdr_samples/with_handshake.rb +2 -0
- data/lib/HDLRuby/hdr_samples/with_memory.rb +2 -0
- data/lib/HDLRuby/hdr_samples/with_nand_board.rb +1 -1
- data/lib/HDLRuby/hdr_samples/with_reconf.rb +1 -0
- data/lib/HDLRuby/hdr_samples/with_seq_case.rb +28 -0
- data/lib/HDLRuby/hdr_samples/with_seq_if.rb +25 -0
- data/lib/HDLRuby/hdr_samples/with_seq_if_succ.rb +27 -0
- data/lib/HDLRuby/hdr_samples/with_verilog.rb +24 -0
- data/lib/HDLRuby/hdrcc.rb +84 -27
- data/lib/HDLRuby/hruby_bstr.rb +2 -2
- data/lib/HDLRuby/hruby_high.rb +80 -24
- data/lib/HDLRuby/hruby_low.rb +4 -0
- data/lib/HDLRuby/hruby_tools.rb +0 -1
- data/lib/HDLRuby/hruby_viz.rb +5060 -0
- data/lib/HDLRuby/std/sequencer.rb +28 -13
- data/lib/HDLRuby/v2hdr.rb +39 -0
- data/lib/HDLRuby/verilog_hruby.rb +1153 -0
- data/lib/HDLRuby/verilog_parser.rb +7293 -0
- data/lib/HDLRuby/version.rb +1 -1
- data/tuto/tutorial_sw.html +2772 -4079
- data/tuto/tutorial_sw.md +89 -5
- metadata +17 -6
data/lib/HDLRuby/hruby_high.rb
CHANGED
@@ -420,6 +420,7 @@ module HDLRuby::High
|
|
420
420
|
#
|
421
421
|
# NOTE: a name can also be a signal, is which case it is duplicated.
|
422
422
|
def make_inputs(type, *names)
|
423
|
+
# puts "for inputs=#{names} top_user=#{High.top_user}(#{High.top_user.name}) @scope=#{@scope}(#{@scope.name})"
|
423
424
|
# Check if called within the top scope of the block.
|
424
425
|
if High.top_user != @scope then
|
425
426
|
# No, cannot make an input from here.
|
@@ -874,6 +875,7 @@ module HDLRuby::High
|
|
874
875
|
|
875
876
|
# Converts the system to HDLRuby::Low and set its +name+.
|
876
877
|
def to_low(name = self.name)
|
878
|
+
# puts "to_low for system=#{name}"
|
877
879
|
name = name.to_s
|
878
880
|
if name.empty? then
|
879
881
|
raise AnyError,
|
@@ -1235,8 +1237,10 @@ module HDLRuby::High
|
|
1235
1237
|
end
|
1236
1238
|
|
1237
1239
|
# Declares a high-level sequential behavior activated on a list of
|
1238
|
-
# +events+, and built by executing
|
1239
|
-
|
1240
|
+
# +events+, with possible name +name+ and built by executing
|
1241
|
+
# +ruby_block+.
|
1242
|
+
# def seq(*events, &ruby_block)
|
1243
|
+
def seq(*events, name: nil, &ruby_block)
|
1240
1244
|
# Ensure there is a block.
|
1241
1245
|
ruby_block = proc {} unless block_given?
|
1242
1246
|
# Preprocess the events.
|
@@ -1244,12 +1248,16 @@ module HDLRuby::High
|
|
1244
1248
|
event.respond_to?(:to_event) ? event.to_event : event
|
1245
1249
|
end
|
1246
1250
|
# Create and add the resulting behavior.
|
1247
|
-
self.add_behavior(Behavior.new(:seq,*events,&ruby_block))
|
1251
|
+
# self.add_behavior(Behavior.new(:seq,*events,&ruby_block))
|
1252
|
+
self.add_behavior(Behavior.new(:seq,*events,name: name,
|
1253
|
+
&ruby_block))
|
1248
1254
|
end
|
1249
1255
|
|
1250
1256
|
# Declares a high-level parallel behavior activated on a list of
|
1251
|
-
# +events+, and built by executing
|
1252
|
-
|
1257
|
+
# +events+, with possible name +name+ and built by executing
|
1258
|
+
# +ruby_block+.
|
1259
|
+
# def par(*events, &ruby_block)
|
1260
|
+
def par(*events, name: nil, &ruby_block)
|
1253
1261
|
# Ensure there is a block.
|
1254
1262
|
ruby_block = proc {} unless block_given?
|
1255
1263
|
# Preprocess the events.
|
@@ -1257,7 +1265,8 @@ module HDLRuby::High
|
|
1257
1265
|
event.respond_to?(:to_event) ? event.to_event : event
|
1258
1266
|
end
|
1259
1267
|
# Create and add the resulting behavior.
|
1260
|
-
self.add_behavior(Behavior.new(:par,*events
|
1268
|
+
self.add_behavior(Behavior.new(:par,*events,name: name,
|
1269
|
+
&ruby_block))
|
1261
1270
|
end
|
1262
1271
|
|
1263
1272
|
# Declares a high-level timed behavior built by executing +ruby_block+.
|
@@ -2271,6 +2280,22 @@ module HDLRuby::High
|
|
2271
2280
|
end
|
2272
2281
|
|
2273
2282
|
|
2283
|
+
## Methods for loading external files.
|
2284
|
+
|
2285
|
+
# Require a verilog file.
|
2286
|
+
def require_verilog(filename)
|
2287
|
+
# Converts the file to HDLRuby.
|
2288
|
+
if Kernel.system("v2hdr", "#{filename}", "#{filename}.rb") then
|
2289
|
+
# Success, require the resulting file.
|
2290
|
+
require "#{Dir.pwd}/#{filename}.rb"
|
2291
|
+
else
|
2292
|
+
# Failure.
|
2293
|
+
raise AnyError,
|
2294
|
+
"Could not load Verilog HDL file: #{filename}."
|
2295
|
+
end
|
2296
|
+
end
|
2297
|
+
|
2298
|
+
|
2274
2299
|
|
2275
2300
|
# Classes describing harware instances.
|
2276
2301
|
|
@@ -2284,6 +2309,11 @@ module HDLRuby::High
|
|
2284
2309
|
|
2285
2310
|
# Creates a new system instance of system type +systemT+ named +name+.
|
2286
2311
|
def initialize(name, systemT)
|
2312
|
+
# Check the validity of the name.
|
2313
|
+
unless name.is_a?(String) or name.is_a?(Symbol)
|
2314
|
+
raise AnyError,
|
2315
|
+
"Missing instance name for system instantiation."
|
2316
|
+
end
|
2287
2317
|
# Initialize the system instance structure.
|
2288
2318
|
super(name,systemT)
|
2289
2319
|
|
@@ -2338,7 +2368,16 @@ module HDLRuby::High
|
|
2338
2368
|
end
|
2339
2369
|
else
|
2340
2370
|
# No, perform a connection is order of declaration
|
2371
|
+
# But first check if there are not too many of them.
|
2372
|
+
if connects.size >
|
2373
|
+
self.systemT.each_signal_with_included.to_a.size then
|
2374
|
+
raise AnyError, "Too many connections to instance " +
|
2375
|
+
"#{self.name}: got #{connects.size} " +
|
2376
|
+
"but expecting at most " +
|
2377
|
+
"#{self.systemT.each_signal_with_included.to_a.size}"
|
2378
|
+
end
|
2341
2379
|
connects.each.with_index do |csig,i|
|
2380
|
+
# Now do the connection.
|
2342
2381
|
# puts "systemT inputs=#{systemT.each_input.to_a.size}"
|
2343
2382
|
# Gets i-est signal to connect
|
2344
2383
|
ssig = self.systemT.get_interface_with_included(i)
|
@@ -3540,12 +3579,21 @@ module HDLRuby::High
|
|
3540
3579
|
|
3541
3580
|
# Converts the name reference to a HDLRuby::Low::RefName.
|
3542
3581
|
def to_low
|
3543
|
-
# puts "to_low with base=#{@base} @object=#{@object}"
|
3544
|
-
# puts "@object.name=#{@object.name}
|
3582
|
+
# puts "to_low with base=#{@base} @object=#{@object} @object.parent=#{@object.parent} High.cur_system=#{High.cur_system}"
|
3583
|
+
# puts "@object.name=#{@object.name}"
|
3584
|
+
# puts "@object.parent.name=#{@object.parent.name}" if @object.parent
|
3585
|
+
# Check if a direct access is possible or not.
|
3586
|
+
# It is possible if the object parent is the top level,
|
3587
|
+
# or if it is a system or the first scope of a system.
|
3588
|
+
# (NOTE: previously we ensured that it was only for the
|
3589
|
+
# current system, however, this did not support the case
|
3590
|
+
# of object within included systems).
|
3545
3591
|
if @base.is_a?(RefThis) &&
|
3546
3592
|
(@object.parent != High.top_user) &&
|
3547
|
-
(@object.parent != High.cur_system) &&
|
3548
|
-
(
|
3593
|
+
# (@object.parent != High.cur_system) &&
|
3594
|
+
(!@object.parent.is_a?(SystemT)) &&
|
3595
|
+
# (@object.parent != High.cur_system.scope) then # &&
|
3596
|
+
(!(@object.parent.is_a?(Scope) && @object.parent.parent.is_a?(SystemT))) then
|
3549
3597
|
# (!@object.parent.name.empty?) then
|
3550
3598
|
# Need to have a hierachical access.
|
3551
3599
|
if @object.respond_to?(:low_object) && @object.low_object then
|
@@ -4474,17 +4522,16 @@ module HDLRuby::High
|
|
4474
4522
|
self.add_statement(TimeWait.new(delay))
|
4475
4523
|
end
|
4476
4524
|
|
4477
|
-
# # Adds a
|
4478
|
-
#
|
4479
|
-
#
|
4480
|
-
# Adds a +number+ times loop statement in the block in +mode+ whose
|
4525
|
+
# # Adds a +number+ times loop statement in the block in +mode+ whose
|
4526
|
+
# def repeat(number = -1, mode = nil, &ruby_block)
|
4527
|
+
# Adds a +number+ times loop statement in the block whose
|
4481
4528
|
# loop content is built using +ruby_block+.
|
4482
4529
|
# NOTE: if +number+ is negative, the number of iteration is infinite.
|
4483
|
-
def repeat(number = -1,
|
4530
|
+
def repeat(number = -1, &ruby_block)
|
4484
4531
|
# Ensure there is a block.
|
4485
4532
|
ruby_block = proc {} unless block_given?
|
4486
|
-
# Build the content block.
|
4487
|
-
content = High.make_block(
|
4533
|
+
# Build the content block: necessarily seq since timed.
|
4534
|
+
content = High.make_block(:seq,&ruby_block)
|
4488
4535
|
# Create and add the statement.
|
4489
4536
|
# self.add_statement(TimeRepeat.new(content,delay))
|
4490
4537
|
self.add_statement(TimeRepeat.new(number,content))
|
@@ -4558,20 +4605,19 @@ module HDLRuby::High
|
|
4558
4605
|
High = HDLRuby::High
|
4559
4606
|
|
4560
4607
|
# Creates a new behavior executing +block+ activated on a list of
|
4561
|
-
# +events+, and built by
|
4608
|
+
# +events+, possible name (of main block) +name+ and built by
|
4609
|
+
# executing +ruby_block+.
|
4562
4610
|
# +mode+ can be either :seq or :par for respectively sequential or
|
4563
4611
|
# parallel.
|
4564
|
-
def initialize(mode
|
4612
|
+
# def initialize(mode, *events, &ruby_block)
|
4613
|
+
def initialize(mode, *events, name: nil, &ruby_block)
|
4565
4614
|
# Initialize the behavior with it.
|
4566
4615
|
super(nil)
|
4567
|
-
# # Save the Location for debugging information
|
4568
|
-
# @location = caller_locations
|
4569
|
-
# # Sets the current behavior
|
4570
|
-
# @@cur_behavior = self
|
4571
4616
|
# Add the events (they may be hierarchical to flatten)
|
4572
4617
|
events.flatten.each { |event| self.add_event(event) }
|
4573
4618
|
# Create and add the block.
|
4574
|
-
self.block = High.make_block(mode,&ruby_block)
|
4619
|
+
# self.block = High.make_block(mode,&ruby_block)
|
4620
|
+
self.block = High.make_block(mode,*name,&ruby_block)
|
4575
4621
|
# # Unset the current behavior
|
4576
4622
|
# @@cur_behavior = nil
|
4577
4623
|
end
|
@@ -4813,6 +4859,11 @@ module HDLRuby::High
|
|
4813
4859
|
# Registers hardware referencing method +name+ to the current namespace.
|
4814
4860
|
def self.space_reg(name,&ruby_block)
|
4815
4861
|
# print "registering #{name} in #{Namespaces[-1]}\n"
|
4862
|
+
# Check the name class.
|
4863
|
+
unless name.is_a?(String) or name.is_a?(Symbol) then
|
4864
|
+
raise AnyError,
|
4865
|
+
"Invalid class for a name, string or symbol expected but got: #{name.class}"
|
4866
|
+
end
|
4816
4867
|
Namespaces[-1].add_method(name,&ruby_block)
|
4817
4868
|
end
|
4818
4869
|
|
@@ -4866,6 +4917,11 @@ module HDLRuby::High
|
|
4866
4917
|
to_expr
|
4867
4918
|
end
|
4868
4919
|
|
4920
|
+
# Converts to a new dealy in fentoseconds.
|
4921
|
+
def fs
|
4922
|
+
return Delay.new(self,:fs)
|
4923
|
+
end
|
4924
|
+
|
4869
4925
|
# Converts to a new delay in picoseconds.
|
4870
4926
|
def ps
|
4871
4927
|
return Delay.new(self,:ps)
|
data/lib/HDLRuby/hruby_low.rb
CHANGED
@@ -6194,6 +6194,10 @@ module HDLRuby::Low
|
|
6194
6194
|
# Create a new named reference with +type+ accessing +ref+ with +name+.
|
6195
6195
|
# def initialize(ref,name)
|
6196
6196
|
def initialize(type,ref,name)
|
6197
|
+
# puts "new RefName with name=#{name}"
|
6198
|
+
if !name or name.empty? then
|
6199
|
+
raise "Internal error: Creating a RefName without a name."
|
6200
|
+
end
|
6197
6201
|
super(type)
|
6198
6202
|
# Check and set the accessed reference.
|
6199
6203
|
unless ref.is_a?(Ref) then
|
data/lib/HDLRuby/hruby_tools.rb
CHANGED
@@ -7,7 +7,6 @@ module HDLRuby
|
|
7
7
|
# General tools for handling HDLRuby objects
|
8
8
|
#######################################################
|
9
9
|
|
10
|
-
|
11
10
|
# Method and attribute for generating an absolute uniq name.
|
12
11
|
# Such names cannot be used in HDLRuby::High code, but can be used
|
13
12
|
# to generate such code.
|