HDLRuby 2.7.11 → 2.10.2

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: 2c66f2d8f552623dabccc43ea54a7246d49eb42a6aaf0f6b8a1977e7675221ca
4
- data.tar.gz: 10f9b15022166b3fdb90a9a026653f3fec8b5a05f807e468dfed2d1c97d9adf7
3
+ metadata.gz: 960102912fa0b766d6d17de3d6f4c727e022b459813c47ce5156d4f695a97231
4
+ data.tar.gz: d79ea380f00deed3419e8565ee82c59d9568fd8844e2422c2d00e163548225c4
5
5
  SHA512:
6
- metadata.gz: 3c56c51a83e75ddd03d34d0c305a17595c362077010213e299baf60e8a7e0b52e745c6b8f9ada7db3c4931b99809376ffdc54f3f4bbb122e002a82419f39e7fb
7
- data.tar.gz: 3f056bd7523dea35b03188aa689a232afeadb7c24f7608f3207fc2479503081e1e1ce0a55c2ad3cc805721b60e7d559d464d9fa89a6f79f3f962388254eac6e7
6
+ metadata.gz: 45f8c0e72f6ebfee3fbf7cbd0172ccb24995d175134ff8d456c1d7aef22466bd1a0bf8b1fac4fef9f2e912d6e51bd16426b6fd376a7e07796f03114ae8a2bc38
7
+ data.tar.gz: 1fe88f2ce84c4e48eacc20119804062cb50ccf1a36acec6c0bbb82e6e0e9b1414af93af8daff4760c722159fa319d3af19082a2533b34ba9d6bac33ac3cd0f5a
data/README.md CHANGED
@@ -44,6 +44,7 @@ Where:
44
44
 
45
45
  | Options | |
46
46
  |:------------------|:-----------------------------------------------------|
47
+ | `-I, --interactive` | Run in interactive mode |
47
48
  | `-y, --yaml` | Output in YAML format |
48
49
  | `-v, --verilog` | Output in Verilog HDL format |
49
50
  | `-V, --vhdl` | Output in VHDL format |
@@ -97,6 +98,18 @@ hdrcc -y -t multer -p 16,16,32 multer_gen.rb multer
97
98
  hdrcc -S counter_bench.rb counter
98
99
  ```
99
100
 
101
+ * Run in interactive mode.
102
+
103
+ ```
104
+ hdrcc -I
105
+ ```
106
+
107
+ * Run in interactive mode using pry as UI.
108
+
109
+ ```
110
+ hdrcc -I pry
111
+ ```
112
+
100
113
 
101
114
  ## Using HDLRuby within Ruby
102
115
 
@@ -439,7 +452,7 @@ The description above is straight forward, but it would be necessary to rewrite
439
452
 
440
453
  ```ruby
441
454
  system :sumprod do |typ,coefs|
442
- typ[coefs.size].input ins
455
+ typ[coefs.size].input :ins
443
456
  typ.output :o
444
457
 
445
458
  o <= coefs.each_with_index.reduce(_0) do |sum,(coef,i)|
@@ -5,3 +5,25 @@ system :adder do |w|
5
5
 
6
6
  s <= x.as(bit[w+1]) + y
7
7
  end
8
+
9
+
10
+ # Testing the generic adder.
11
+ system :adder_bench do
12
+ width = 4
13
+ [width].inner :x,:y
14
+ [width+1].inner :z
15
+
16
+ adder(width).(:my_adder).(x,y,z)
17
+
18
+ timed do
19
+ x <= 0
20
+ y <= 0
21
+ !10.ns
22
+ x <= 1
23
+ !10.ns
24
+ y <= 1
25
+ !10.ns
26
+ x <= 15
27
+ !10.ns
28
+ end
29
+ end
@@ -0,0 +1,40 @@
1
+ # A simple generic adder
2
+ system :adder do |w|
3
+ [(w-1)..0].input :i,:j
4
+ [w..0].output :k
5
+
6
+ k <= i.as(bit[w+1]) + j
7
+ end
8
+
9
+ # A module embedding two generic adders.
10
+ system :two_adders do |w|
11
+ [w*2].input :x, :y
12
+ [(w+1)*2].output :z
13
+
14
+ adder(w).(:adderI0).(x[(w-1)..0],y[(w-1)..0],z[w..0])
15
+ adder(w).(:adderI1).(x[(w*2-1)..w],y[(w*2-1)..w],z[(w*2+1)..(w+1)])
16
+ end
17
+
18
+
19
+ # Testing the generic adder.
20
+ system :adder_bench do
21
+ width = 4
22
+ [width*2].inner :a,:b
23
+ [(width+1)*2].inner :c
24
+
25
+ two_adders(width).(:my_adders).(a,b,c)
26
+
27
+ timed do
28
+ a <= 0
29
+ b <= 0
30
+ !10.ns
31
+ a <= 1
32
+ !10.ns
33
+ b <= 1
34
+ !10.ns
35
+ a <= 255
36
+ !10.ns
37
+ b <= 128
38
+ !10.ns
39
+ end
40
+ end
@@ -6,7 +6,7 @@
6
6
  3.times do |i|
7
7
 
8
8
  # A simple D-FF
9
- system:"dff#{i}" do
9
+ system :"dff#{i}" do
10
10
  input :clk, :rst, :d
11
11
  output :q, :qb
12
12
 
@@ -0,0 +1,29 @@
1
+ # A test of def.
2
+ def lut84(content,addr)
3
+ bit[8][-4].inner tbl? => content.to_a
4
+ tbl![addr]
5
+ end
6
+
7
+
8
+ # A benchmark for testing the initialization of signals.
9
+ system :def_bench do
10
+
11
+ [2].inner :addr
12
+ [8].inner :val0, :val1
13
+
14
+ par do
15
+ val0 <= lut84([0,1,4,9],addr)
16
+ val1 <= lut84([0,1,4,9],3-addr)
17
+ end
18
+
19
+ timed do
20
+ addr <= 0
21
+ !10.ns
22
+ addr <= 1
23
+ !10.ns
24
+ addr <= 2
25
+ !10.ns
26
+ addr <= 3
27
+ !10.ns
28
+ end
29
+ 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
@@ -0,0 +1,51 @@
1
+ # Some abstract system.
2
+ system :sysA do
3
+ input :clk,:rst
4
+ input :d
5
+ output :q
6
+ end
7
+
8
+ # Some inheriting system.
9
+ system :sysH, sysA do
10
+ par(clk.posedge, rst.posedge) do
11
+ hprint("sys1\n")
12
+ q <= d & ~rst
13
+ end
14
+ end
15
+
16
+ # Another system that have nothing to see with the others.
17
+ # Some abstract system.
18
+ system :sysO do
19
+ input :clk,:rst
20
+ input :d
21
+ output :q
22
+
23
+ par(clk.posedge, rst.posedge) do
24
+ hprint("sys1\n")
25
+ q <= d & ~rst
26
+ end
27
+ end
28
+
29
+
30
+ # A system for testing inheritance and of?
31
+ system :with_reconf do
32
+ input :clk,:rst
33
+ input :d
34
+ output :q
35
+
36
+ # Instantiate the abstract system.
37
+ sysA(:my_dffA).(clk,rst,d,q)
38
+
39
+ # Test the of?
40
+ puts "my_dffA.systemT.of?(sysA)=#{my_dffA.systemT.of?(sysA)}"
41
+ puts "my_dffA.systemT.of?(sysH)=#{my_dffA.systemT.of?(sysH)}"
42
+ puts "my_dffA.systemT.of?(sysO)=#{my_dffA.systemT.of?(sysO)}"
43
+
44
+ # Instantiate the inheriting system.
45
+ sysH(:my_dffH).(clk,rst,d,q)
46
+
47
+ # Test the of?
48
+ puts "my_dffH.systemT.of?(sysH)=#{my_dffH.systemT.of?(sysH)}"
49
+ puts "my_dffH.systemT.of?(sysA)=#{my_dffH.systemT.of?(sysA)}"
50
+ puts "my_dffH.systemT.of?(sysO)=#{my_dffH.systemT.of?(sysO)}"
51
+ end
@@ -1,63 +1,14 @@
1
- require 'std/reconf.rb'
2
1
 
3
- include HDLRuby::High::Std
4
-
5
-
6
-
7
-
8
- # Implementation of a vivado partial reconfiguration system.
9
- reconf(:vivado_reconf) do |clk,rst|
10
-
11
- # Get access to the interface of the reconfigurable component.
12
- inputs = each_input
13
- outputs = each_output
14
- inouts = each_inout
15
-
16
- # Create the main system with the interface and a channel for
17
- # handling the reconfiguration.
18
- main = system do
19
- # Declares the inputs.
20
- inputs.each do |i|
21
- i.type.input(i.name)
22
- end
23
- # Declares the outputs.
24
- outputs.each do |o|
25
- o.type.output(o.name)
26
- end
27
- # Declares the inouts.
28
- inouts.each do |io|
29
- io.type.inout(io.name)
30
- end
31
- # An that's all: in vivado the main system is to be a black-box.
32
- end
33
-
34
- # And set it as the main system.
35
- set_main(main)
36
-
37
- # The switching circuit.
38
- # reconfer = vivado_reconfigurer :do_reconf # Will be that later
39
- # reconfer.clk <= clk
40
- # reconfer.rst <= rst
41
- reconfer = proc do |idx|
42
- puts "Instantiating reconfiguration circuits with #{idx}"
43
- end
44
-
45
- # Defines the reconfiguring procedure: switch to system idx.
46
- switcher do |idx,ruby_block|
47
- reconfer.call(idx)
48
- ruby_block.call
49
- end
50
-
51
- end
52
-
53
-
54
- # Some system that can be used for recponfiguration.
2
+ # Some system that can be used for reconfiguration.
55
3
  system :sys0 do
56
4
  input :clk,:rst
57
5
  input :d
58
6
  output :q
59
7
 
60
- q <= d
8
+ par(clk.posedge) do
9
+ hprint("sys0\n")
10
+ q <= d & ~rst
11
+ end
61
12
  end
62
13
 
63
14
  system :sys1 do
@@ -65,7 +16,10 @@ system :sys1 do
65
16
  input :d
66
17
  output :q
67
18
 
68
- (q <= d).at(clk.posedge)
19
+ par(clk.posedge, rst.posedge) do
20
+ hprint("sys1\n")
21
+ q <= d & ~rst
22
+ end
69
23
  end
70
24
 
71
25
  system :sys2 do
@@ -73,7 +27,10 @@ system :sys2 do
73
27
  input :d
74
28
  output :q
75
29
 
76
- (q <= d & ~rst).at(clk.posedge)
30
+ par(clk.posedge, rst.negedge) do
31
+ hprint("sys2\n")
32
+ q <= d & ~rst
33
+ end
77
34
  end
78
35
 
79
36
  # A system with a reconfifurable part.
@@ -81,23 +38,69 @@ system :with_reconf do
81
38
  input :clk,:rst
82
39
  input :d
83
40
  output :q
84
- [2].input :conf # The configuration number
85
-
86
- inner :wait_reconf
87
41
 
88
- # Create a reconfigurable component.
89
- vivado_reconf(clk,rst).(:my_reconf)
90
- # It is to be reconfigured to sys0, sys1 or sys2
91
- my_reconf.(sys0, sys1, sys2)
92
-
93
- # Connect the reconfigurable instance.
94
- my_reconf.instance.(clk,rst,d,q)
95
-
96
- par(clk.posedge) do
97
- hif(rst) { wait_reconf <= 0 }
98
- helsif(conf != 0 && my_reconf.index != conf && wait_reconf == 0) do
99
- wait_reconf <= 1
100
- my_reconf.switch(conf) { wait_reconf <= 0 }
42
+ # Instantiate the default configuration.
43
+ sys0(:my_dff).(clk,rst,d,q)
44
+
45
+ # Adds the additional configuration.
46
+ my_dff.choice(conf1: sys1, conf2: sys2)
47
+
48
+ timed do
49
+ clk <= 0
50
+ rst <= 0
51
+ d <= 0
52
+ !10.ns
53
+ clk <= 1
54
+ !10.ns
55
+ clk <= 0
56
+ rst <= 1
57
+ !10.ns
58
+ clk <= 1
59
+ !10.ns
60
+ clk <= 0
61
+ rst <= 0
62
+ !10.ns
63
+ 3.times do |i|
64
+ clk <= 1
65
+ !10.ns
66
+ clk <= 0
67
+ d <= 1
68
+ !10.ns
69
+ clk <= 1
70
+ !10.ns
71
+ clk <= 0
72
+ d <= 0
73
+ !10.ns
74
+ clk <= 1
75
+ my_dff.configure((i+1)%3)
76
+ !10.ns
77
+ clk <= 0
78
+ !10.ns
101
79
  end
80
+ clk <= 1
81
+ !10.ns
82
+ clk <= 0
83
+ d <= 1
84
+ !10.ns
85
+ clk <= 1
86
+ my_dff.configure(:conf1)
87
+ !10.ns
88
+ clk <= 0
89
+ d <= 0
90
+ !10.ns
91
+ clk <= 1
92
+ my_dff.configure(:conf2)
93
+ !10.ns
94
+ clk <= 0
95
+ d <= 1
96
+ !10.ns
97
+ clk <= 1
98
+ my_dff.configure(:my_dff)
99
+ !10.ns
100
+ clk <= 0
101
+ d <= 0
102
+ !10.ns
103
+ clk <= 1
104
+ !10.ns
102
105
  end
103
106
  end
@@ -0,0 +1,32 @@
1
+
2
+ # A benchmark for testing the terminate statement.
3
+ system :with_terminate do
4
+ [8].constant cst0: 127
5
+ constant cst1: _1
6
+ [8].inner sig0: _10000000
7
+ inner sig1: _1
8
+ [8].inner :sig2
9
+ [8].inner count: 0
10
+
11
+ timed do
12
+ !20.ns
13
+ 100.times do
14
+ count <= count + 1
15
+ !20.ns
16
+ end
17
+ end
18
+
19
+ timed do
20
+ !10.ns
21
+ sig2 <= cst0 + cst1
22
+ sig0 <= sig0 + sig1
23
+ !10.ns
24
+ sig2 <= sig2 + sig1
25
+ !10.ns
26
+ terminate
27
+ sig0 <= sig0 + sig0
28
+ !10.ns
29
+ sig0 <= sig0 + sig0
30
+ !10.ns
31
+ end
32
+ end
data/lib/HDLRuby/hdrcc.rb CHANGED
@@ -1,5 +1,41 @@
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
+
3
39
  require 'fileutils'
4
40
  require 'tempfile'
5
41
  require 'HDLRuby'
@@ -267,6 +303,9 @@ def which(cmd)
267
303
  end
268
304
 
269
305
 
306
+ # Used standalone, check the files given in the standard input.
307
+ include HDLRuby
308
+
270
309
 
271
310
  if __FILE__ == $0 then
272
311
  # From hdrcc.rb
@@ -278,9 +317,6 @@ else
278
317
  end
279
318
 
280
319
  require 'optparse'
281
- # Used standalone, check the files given in the standard input.
282
- include HDLRuby
283
-
284
320
  # Process the command line options
285
321
  $options = {}
286
322
  $optparse = OptionParser.new do |opts|
@@ -293,7 +329,10 @@ $optparse = OptionParser.new do |opts|
293
329
  opts.separator "* `<output file>` is the output file"
294
330
  opts.separator ""
295
331
  opts.separator "Options:"
296
-
332
+
333
+ opts.on("-I", "--interactive") do |repl|
334
+ raise "Internal error: the --interactive option should have been processed earlier."
335
+ end
297
336
  opts.on("-y", "--yaml", "Output in YAML format") do |y|
298
337
  $options[:yaml] = y
299
338
  end
@@ -647,12 +686,19 @@ elsif $options[:clang] then
647
686
  init_visualizer = $options[:vcd] ? "init_vcd_visualizer" :
648
687
  "init_default_visualizer"
649
688
 
689
+ # Gather the system to generate and sort them in the right order
690
+ # to ensure references are generated before being used.
691
+ # Base: reverse order of the tree.
692
+ # Then, multiple configuration of a system instance must be
693
+ # reverversed so that the base configuration is generated first.
694
+ c_systems = $top_system.each_systemT_deep_ref
650
695
  # Generate the code of the main function.
651
696
  # HDLRuby start code
652
697
  $main << HDLRuby::Low::Low2C.main("hruby_simulator",
653
698
  init_visualizer,
654
699
  $top_system,
655
- $top_system.each_systemT_deep.to_a.reverse,$hnames)
700
+ c_systems,
701
+ $hnames)
656
702
  $main.close
657
703
 
658
704
  $top_system.each_systemT_deep do |systemT|