HDLRuby 2.9.0 → 2.10.5
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/README.md +250 -230
- data/lib/HDLRuby/hdr_samples/dff_bench.rb +4 -1
- data/lib/HDLRuby/hdr_samples/dff_override.rb +76 -0
- data/lib/HDLRuby/hdr_samples/with_delay.rb +72 -0
- data/lib/HDLRuby/hdr_samples/with_handshake.rb +110 -0
- data/lib/HDLRuby/hdr_samples/with_values.rb +14 -0
- data/lib/HDLRuby/hdrcc.rb +73 -17
- data/lib/HDLRuby/hdrlib.rb +592 -0
- data/lib/HDLRuby/hruby_high.rb +172 -47
- data/lib/HDLRuby/hruby_low.rb +74 -50
- data/lib/HDLRuby/hruby_low2c.rb +1 -1
- data/lib/HDLRuby/hruby_low_mutable.rb +1 -1
- data/lib/HDLRuby/hruby_low_without_connection.rb +1 -0
- data/lib/HDLRuby/hruby_low_without_namespace.rb +2 -1
- data/lib/HDLRuby/sim/hruby_sim_calc.c +3 -2
- data/lib/HDLRuby/std/delays.rb +92 -0
- data/lib/HDLRuby/std/handshakes.rb +60 -0
- data/lib/HDLRuby/version.rb +1 -1
- metadata +8 -2
@@ -0,0 +1,76 @@
|
|
1
|
+
# A simple D-FF with overridable part.
|
2
|
+
system :dff do
|
3
|
+
input :d, :clk, :rst
|
4
|
+
output :q
|
5
|
+
|
6
|
+
sub(:process) do
|
7
|
+
(q <= d & ~rst).at(clk.posedge)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
# A new dff overriding process.
|
12
|
+
system :dff_neg, dff do
|
13
|
+
sub(:process) do
|
14
|
+
(q <= d & ~rst).at(clk.negedge)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# A benchmark for the dff.
|
19
|
+
system :dff_bench do
|
20
|
+
inner :d, :clk, :rst
|
21
|
+
inner :q
|
22
|
+
|
23
|
+
dff_neg(:my_dff).(d,clk,rst,q)
|
24
|
+
# dff(:my_dff).(d,clk,rst,q)
|
25
|
+
|
26
|
+
timed do
|
27
|
+
clk <= 1
|
28
|
+
rst <= 0
|
29
|
+
d <= _z
|
30
|
+
!10.ns
|
31
|
+
clk <= 0
|
32
|
+
rst <= 0
|
33
|
+
d <= _z
|
34
|
+
!10.ns
|
35
|
+
clk <= 1
|
36
|
+
rst <= 1
|
37
|
+
d <= _z
|
38
|
+
!10.ns
|
39
|
+
clk <= 0
|
40
|
+
rst <= 1
|
41
|
+
d <= _z
|
42
|
+
!10.ns
|
43
|
+
clk <= 1
|
44
|
+
rst <= 0
|
45
|
+
d <= 1
|
46
|
+
!10.ns
|
47
|
+
clk <= 0
|
48
|
+
rst <= 0
|
49
|
+
d <= 1
|
50
|
+
!10.ns
|
51
|
+
clk <= 1
|
52
|
+
rst <= 0
|
53
|
+
d <= 1
|
54
|
+
!10.ns
|
55
|
+
clk <= 0
|
56
|
+
rst <= 0
|
57
|
+
d <= 1
|
58
|
+
!10.ns
|
59
|
+
clk <= 1
|
60
|
+
rst <= 0
|
61
|
+
d <= 0
|
62
|
+
!10.ns
|
63
|
+
clk <= 0
|
64
|
+
rst <= 0
|
65
|
+
d <= 0
|
66
|
+
!10.ns
|
67
|
+
clk <= 1
|
68
|
+
rst <= 0
|
69
|
+
d <= 0
|
70
|
+
!10.ns
|
71
|
+
clk <= 0
|
72
|
+
rst <= 0
|
73
|
+
d <= 0
|
74
|
+
!10.ns
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'std/delays.rb'
|
2
|
+
|
3
|
+
include HDLRuby::High::Std
|
4
|
+
|
5
|
+
# System descending for delayp for adding a reset.
|
6
|
+
system :delayp_rst do |num|
|
7
|
+
include(delayp(num))
|
8
|
+
|
9
|
+
input :rst
|
10
|
+
|
11
|
+
par(clk.posedge) do
|
12
|
+
hif(rst) { state <= 0 }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
# System testing delay, delayp and the new delayp_rst.
|
18
|
+
system :with_delays do
|
19
|
+
num = 10
|
20
|
+
|
21
|
+
# The clock and reset signals
|
22
|
+
inner :clk,:rst
|
23
|
+
# The request signals.
|
24
|
+
inner :req, :reqp, :reqp_rst
|
25
|
+
# The ack signals.
|
26
|
+
inner :ack, :ackp, :ackp_rst
|
27
|
+
|
28
|
+
# Instantiate the delays.
|
29
|
+
delay(num).(:delayI).(clk,req,ack)
|
30
|
+
delayp(num).(:delaypI).(clk,reqp,ackp)
|
31
|
+
delayp_rst(num).(:delaypI_rst).(rst,clk,reqp_rst,ackp_rst)
|
32
|
+
|
33
|
+
# Test the delays.
|
34
|
+
timed do
|
35
|
+
clk <= 0
|
36
|
+
rst <= 0
|
37
|
+
!10.ns
|
38
|
+
clk <= 1
|
39
|
+
!10.ns
|
40
|
+
clk <= 0
|
41
|
+
req <= 1
|
42
|
+
reqp <= 1
|
43
|
+
reqp_rst <= 1
|
44
|
+
!10.ns
|
45
|
+
clk <= 1
|
46
|
+
!10.ns
|
47
|
+
req <= 0
|
48
|
+
clk <= 0
|
49
|
+
rst <= 1
|
50
|
+
!10.ns
|
51
|
+
clk <= 1
|
52
|
+
!10.ns
|
53
|
+
clk <= 0
|
54
|
+
rst <= 0
|
55
|
+
!10.ns
|
56
|
+
clk <= 1
|
57
|
+
!10.ns
|
58
|
+
clk <= 0
|
59
|
+
reqp <= 0
|
60
|
+
!10.ns
|
61
|
+
clk <= 1
|
62
|
+
!10.ns
|
63
|
+
clk <= 0
|
64
|
+
reqp_rst <= 0
|
65
|
+
10.times do
|
66
|
+
!10.ns
|
67
|
+
clk <= 1
|
68
|
+
!10.ns
|
69
|
+
clk <= 0
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require 'std/handshakes.rb'
|
2
|
+
|
3
|
+
include HDLRuby::High::Std
|
4
|
+
|
5
|
+
|
6
|
+
# System using a handshake for summing inputs.
|
7
|
+
system :hs_adder do
|
8
|
+
input :clk
|
9
|
+
[8].input :x,:y
|
10
|
+
[8].output :z
|
11
|
+
|
12
|
+
inner :read, :write
|
13
|
+
|
14
|
+
include(hs_pipe(clk.posedge,read,write))
|
15
|
+
|
16
|
+
par(clk.posedge) do
|
17
|
+
hif(read) do
|
18
|
+
z <= x + y
|
19
|
+
write <= 1
|
20
|
+
end
|
21
|
+
hif(ackO) do
|
22
|
+
z <= _zzzzzzzz
|
23
|
+
write <= 0
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
# System testing handshakes.
|
30
|
+
system :with_handshake do
|
31
|
+
|
32
|
+
# The clock signal.
|
33
|
+
inner :clk
|
34
|
+
# The request and acknoledge signals.
|
35
|
+
inner :reqI,:ackI,:reqO,:ackO
|
36
|
+
|
37
|
+
# The input and output values.
|
38
|
+
[8].inner :x, :y, :z
|
39
|
+
|
40
|
+
# Instantiate the handshake adder.
|
41
|
+
hs_adder.(:adderI).(clk: clk, x: x, y: y, z: z,
|
42
|
+
reqI: reqI, ackI: ackI, reqO: reqO, ackO: ackO)
|
43
|
+
|
44
|
+
# Test the handshake adder.
|
45
|
+
timed do
|
46
|
+
clk <= 0
|
47
|
+
x <= 0
|
48
|
+
y <= 0
|
49
|
+
reqI <= 0
|
50
|
+
ackO <= 0
|
51
|
+
!10.ns
|
52
|
+
clk <= 1
|
53
|
+
!10.ns
|
54
|
+
clk <= 0
|
55
|
+
x <= 1
|
56
|
+
y <= 2
|
57
|
+
!10.ns
|
58
|
+
clk <= 1
|
59
|
+
!10.ns
|
60
|
+
clk <= 0
|
61
|
+
reqI <= 1
|
62
|
+
!10.ns
|
63
|
+
clk <= 1
|
64
|
+
!10.ns
|
65
|
+
clk <= 0
|
66
|
+
reqI <= 0
|
67
|
+
!10.ns
|
68
|
+
clk <= 1
|
69
|
+
!10.ns
|
70
|
+
clk <= 0
|
71
|
+
ackO <= 1
|
72
|
+
!10.ns
|
73
|
+
clk <= 1
|
74
|
+
!10.ns
|
75
|
+
clk <= 0
|
76
|
+
!10.ns
|
77
|
+
clk <= 1
|
78
|
+
!10.ns
|
79
|
+
clk <= 0
|
80
|
+
!10.ns
|
81
|
+
clk <= 1
|
82
|
+
!10.ns
|
83
|
+
clk <= 0
|
84
|
+
ackO <= 0
|
85
|
+
!10.ns
|
86
|
+
clk <= 0
|
87
|
+
x <= 3
|
88
|
+
y <= 4
|
89
|
+
!10.ns
|
90
|
+
clk <= 1
|
91
|
+
!10.ns
|
92
|
+
clk <= 0
|
93
|
+
reqI <= 1
|
94
|
+
!10.ns
|
95
|
+
clk <= 1
|
96
|
+
!10.ns
|
97
|
+
clk <= 0
|
98
|
+
reqI <= 0
|
99
|
+
!10.ns
|
100
|
+
clk <= 1
|
101
|
+
!10.ns
|
102
|
+
clk <= 0
|
103
|
+
ackO <= 1
|
104
|
+
!10.ns
|
105
|
+
clk <= 1
|
106
|
+
!10.ns
|
107
|
+
clk <= 0
|
108
|
+
ackO <= 0
|
109
|
+
end
|
110
|
+
end
|
@@ -37,6 +37,20 @@ system :with_values do
|
|
37
37
|
v64 <= 128
|
38
38
|
v96 <= 128
|
39
39
|
!10.ns
|
40
|
+
v8 <= -1
|
41
|
+
v16 <= -1
|
42
|
+
v32 <= -1
|
43
|
+
v56 <= -1
|
44
|
+
v64 <= -1
|
45
|
+
v96 <= -1
|
46
|
+
!10.ns
|
47
|
+
v8 <= -2
|
48
|
+
v16 <= -2
|
49
|
+
v32 <= -2
|
50
|
+
v56 <= -2
|
51
|
+
v64 <= -2
|
52
|
+
v96 <= -2
|
53
|
+
!10.ns
|
40
54
|
v16 <= 0x1000
|
41
55
|
v32 <= 0x1000
|
42
56
|
v56 <= 0x1000
|
data/lib/HDLRuby/hdrcc.rb
CHANGED
@@ -1,5 +1,57 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
2
|
|
3
|
+
|
4
|
+
# Check if run in interactive mode.
|
5
|
+
if ARGV.include?("-I") || ARGV.include?("--interactive") then
|
6
|
+
# Yes, first check which repl to use.
|
7
|
+
idx = ARGV.index("-I")
|
8
|
+
idx = ARGV.index("--interactive") unless idx
|
9
|
+
if ARGV[idx+1] == "irb" || ARGV[idx+1] == nil then
|
10
|
+
repl = :irb
|
11
|
+
elsif ARGV[idx+1] == "pry" then
|
12
|
+
repl = :pry
|
13
|
+
else
|
14
|
+
raise "Unknown repl: #{ARGV[idx+1]}"
|
15
|
+
end
|
16
|
+
# Look for the interactive Ruby library.
|
17
|
+
libpath = ""
|
18
|
+
$:.each do |dir|
|
19
|
+
if File.exist?(dir + "/hdrlib.rb") then
|
20
|
+
libpath = dir + "/hdrlib.rb"
|
21
|
+
break
|
22
|
+
end
|
23
|
+
end
|
24
|
+
ARGV.clear
|
25
|
+
ARGV.concat(['-r', libpath])
|
26
|
+
case repl
|
27
|
+
when :irb
|
28
|
+
require 'irb'
|
29
|
+
IRB.start
|
30
|
+
when :pry
|
31
|
+
require 'pry'
|
32
|
+
require libpath
|
33
|
+
# Pry.start(binding)
|
34
|
+
Pry.start()
|
35
|
+
end
|
36
|
+
abort
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
begin
|
41
|
+
# We can check the memory.
|
42
|
+
require 'get_process_mem'
|
43
|
+
$memory_check = GetProcessMem.new
|
44
|
+
def show_mem
|
45
|
+
" | "+$memory_check.bytes.to_s+"B"
|
46
|
+
end
|
47
|
+
rescue LoadError
|
48
|
+
# We cannot check the memory.
|
49
|
+
def show_mem
|
50
|
+
""
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
|
3
55
|
require 'fileutils'
|
4
56
|
require 'tempfile'
|
5
57
|
require 'HDLRuby'
|
@@ -31,6 +83,7 @@ require 'HDLRuby/backend/hruby_c_allocator'
|
|
31
83
|
|
32
84
|
require 'HDLRuby/version.rb'
|
33
85
|
|
86
|
+
|
34
87
|
##
|
35
88
|
# HDLRuby compiler interface program
|
36
89
|
#####################################
|
@@ -267,6 +320,9 @@ def which(cmd)
|
|
267
320
|
end
|
268
321
|
|
269
322
|
|
323
|
+
# Used standalone, check the files given in the standard input.
|
324
|
+
include HDLRuby
|
325
|
+
|
270
326
|
|
271
327
|
if __FILE__ == $0 then
|
272
328
|
# From hdrcc.rb
|
@@ -278,9 +334,6 @@ else
|
|
278
334
|
end
|
279
335
|
|
280
336
|
require 'optparse'
|
281
|
-
# Used standalone, check the files given in the standard input.
|
282
|
-
include HDLRuby
|
283
|
-
|
284
337
|
# Process the command line options
|
285
338
|
$options = {}
|
286
339
|
$optparse = OptionParser.new do |opts|
|
@@ -293,7 +346,10 @@ $optparse = OptionParser.new do |opts|
|
|
293
346
|
opts.separator "* `<output file>` is the output file"
|
294
347
|
opts.separator ""
|
295
348
|
opts.separator "Options:"
|
296
|
-
|
349
|
+
|
350
|
+
opts.on("-I", "--interactive") do |repl|
|
351
|
+
raise "Internal error: the --interactive option should have been processed earlier."
|
352
|
+
end
|
297
353
|
opts.on("-y", "--yaml", "Output in YAML format") do |y|
|
298
354
|
$options[:yaml] = y
|
299
355
|
end
|
@@ -486,7 +542,7 @@ if $options[:syntax] then
|
|
486
542
|
$output << $loader.show_all
|
487
543
|
exit
|
488
544
|
end
|
489
|
-
HDLRuby.show Time.now
|
545
|
+
HDLRuby.show "#{Time.now}#{show_mem}"
|
490
546
|
HDLRuby.show "##### Starting parser #####"
|
491
547
|
|
492
548
|
if $options[:debug] then
|
@@ -499,11 +555,11 @@ end
|
|
499
555
|
|
500
556
|
# Generate the result.
|
501
557
|
# Get the top systemT.
|
502
|
-
HDLRuby.show Time.now
|
558
|
+
HDLRuby.show "#{Time.now}#{show_mem}"
|
503
559
|
$top_system = $top_instance.to_low.systemT
|
504
560
|
$top_intance = nil # Free as much memory as possible.
|
505
561
|
HDLRuby.show "##### Top system built #####"
|
506
|
-
HDLRuby.show Time.now
|
562
|
+
HDLRuby.show "#{Time.now}#{show_mem}"
|
507
563
|
|
508
564
|
|
509
565
|
# # Apply the pre drivers if any.
|
@@ -574,19 +630,19 @@ elsif $options[:clang] then
|
|
574
630
|
# Coverts the par blocks in seq blocks to seq blocks to match
|
575
631
|
# the simulation engine.
|
576
632
|
systemT.par_in_seq2seq!
|
577
|
-
HDLRuby.show Time.now
|
633
|
+
HDLRuby.show "#{Time.now}#{show_mem}"
|
578
634
|
HDLRuby.show "connections_to_behaviors step..."
|
579
635
|
# Converts the connections to behaviors.
|
580
636
|
systemT.connections_to_behaviors!
|
581
|
-
HDLRuby.show Time.now
|
637
|
+
HDLRuby.show "#{Time.now}#{show_mem}"
|
582
638
|
# Break the RefConcat.
|
583
639
|
HDLRuby.show "concat_assigns step..."
|
584
640
|
systemT.break_concat_assigns!
|
585
|
-
HDLRuby.show Time.now
|
641
|
+
HDLRuby.show "#{Time.now}#{show_mem}"
|
586
642
|
# Explicits the types.
|
587
643
|
HDLRuby.show "explicit_types step..."
|
588
644
|
systemT.explicit_types!
|
589
|
-
HDLRuby.show Time.now
|
645
|
+
HDLRuby.show "#{Time.now}#{show_mem}"
|
590
646
|
end
|
591
647
|
# Generate the C.
|
592
648
|
if $options[:multiple] then
|
@@ -729,23 +785,23 @@ elsif $options[:verilog] then
|
|
729
785
|
# HDLRuby.show Time.now
|
730
786
|
HDLRuby.show "to_upper_space! step..."
|
731
787
|
systemT.to_upper_space!
|
732
|
-
HDLRuby.show Time.now
|
788
|
+
HDLRuby.show "#{Time.now}#{show_mem}"
|
733
789
|
end
|
734
790
|
HDLRuby.show "to_global_space! step (global)..."
|
735
791
|
$top_system.to_global_systemTs!
|
736
|
-
HDLRuby.show Time.now
|
792
|
+
HDLRuby.show "#{Time.now}#{show_mem}"
|
737
793
|
$top_system.each_systemT_deep do |systemT|
|
738
794
|
## systemT.break_types!
|
739
795
|
## systemT.expand_types!
|
740
796
|
HDLRuby.show "par_in_seq2seq! step..."
|
741
797
|
systemT.par_in_seq2seq!
|
742
|
-
HDLRuby.show Time.now
|
798
|
+
HDLRuby.show "#{Time.now}#{show_mem}"
|
743
799
|
HDLRuby.show "initial_concat_to_timed! step..."
|
744
800
|
systemT.initial_concat_to_timed!
|
745
|
-
HDLRuby.show Time.now
|
801
|
+
HDLRuby.show "#{Time.now}#{show_mem}"
|
746
802
|
HDLRuby.show "with_port! step..."
|
747
803
|
systemT.with_port!
|
748
|
-
HDLRuby.show Time.now
|
804
|
+
HDLRuby.show "#{Time.now}#{show_mem}"
|
749
805
|
end
|
750
806
|
# # Verilog generation
|
751
807
|
# $output << top_system.to_verilog
|
@@ -836,7 +892,7 @@ elsif $options[:vhdl] then
|
|
836
892
|
end
|
837
893
|
|
838
894
|
HDLRuby.show "##### Code generated #####"
|
839
|
-
HDLRuby.show Time.now
|
895
|
+
HDLRuby.show "#{Time.now}#{show_mem}"
|
840
896
|
|
841
897
|
# # Apply the post drivers if any.
|
842
898
|
# Hdecorator.each_with_property(:post_driver) do |obj, value|
|