HDLRuby 2.0.8
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 +7 -0
- data/.gitignore +9 -0
- data/.travis.yml +5 -0
- data/.yardopts +1 -0
- data/Gemfile +4 -0
- data/HDLRuby.gemspec +36 -0
- data/LICENSE.txt +21 -0
- data/README.md +2774 -0
- data/README.pdf +0 -0
- data/Rakefile +10 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/exe/hdrcc +3 -0
- data/lib/HDLRuby/alcc.rb +137 -0
- data/lib/HDLRuby/backend/hruby_allocator.rb +69 -0
- data/lib/HDLRuby/backend/hruby_c_allocator.rb +76 -0
- data/lib/HDLRuby/hdr_samples/adder.rb +7 -0
- data/lib/HDLRuby/hdr_samples/adder_assign_error.rb +11 -0
- data/lib/HDLRuby/hdr_samples/adder_bench.rb +27 -0
- data/lib/HDLRuby/hdr_samples/adder_gen.rb +7 -0
- data/lib/HDLRuby/hdr_samples/adder_nodef_error.rb +7 -0
- data/lib/HDLRuby/hdr_samples/addsub.rb +19 -0
- data/lib/HDLRuby/hdr_samples/addsubz.rb +22 -0
- data/lib/HDLRuby/hdr_samples/alu.rb +47 -0
- data/lib/HDLRuby/hdr_samples/calculator.rb +48 -0
- data/lib/HDLRuby/hdr_samples/counter_bench.rb +83 -0
- data/lib/HDLRuby/hdr_samples/dff.rb +9 -0
- data/lib/HDLRuby/hdr_samples/dff_bench.rb +66 -0
- data/lib/HDLRuby/hdr_samples/dff_counter.rb +20 -0
- data/lib/HDLRuby/hdr_samples/include.rb +14 -0
- data/lib/HDLRuby/hdr_samples/instance_open.rb +23 -0
- data/lib/HDLRuby/hdr_samples/mei8.rb +256 -0
- data/lib/HDLRuby/hdr_samples/mei8_bench.rb +309 -0
- data/lib/HDLRuby/hdr_samples/multer_gen.rb +8 -0
- data/lib/HDLRuby/hdr_samples/multer_seq.rb +29 -0
- data/lib/HDLRuby/hdr_samples/neural/a.rb +9 -0
- data/lib/HDLRuby/hdr_samples/neural/a_sub.rb +5 -0
- data/lib/HDLRuby/hdr_samples/neural/bw.rb +23 -0
- data/lib/HDLRuby/hdr_samples/neural/counter.rb +16 -0
- data/lib/HDLRuby/hdr_samples/neural/dadz.rb +9 -0
- data/lib/HDLRuby/hdr_samples/neural/dadz_sub.rb +4 -0
- data/lib/HDLRuby/hdr_samples/neural/forward.rb +153 -0
- data/lib/HDLRuby/hdr_samples/neural/forward_sub.rb +62 -0
- data/lib/HDLRuby/hdr_samples/neural/forward_sub_rand.rb +41 -0
- data/lib/HDLRuby/hdr_samples/neural/forward_sub_rand_typedef.rb +47 -0
- data/lib/HDLRuby/hdr_samples/neural/mem.rb +30 -0
- data/lib/HDLRuby/hdr_samples/neural/random.rb +23 -0
- data/lib/HDLRuby/hdr_samples/neural/selector.rb +29 -0
- data/lib/HDLRuby/hdr_samples/neural/sigmoid.rb +20 -0
- data/lib/HDLRuby/hdr_samples/neural/z.rb +33 -0
- data/lib/HDLRuby/hdr_samples/prog.obj +256 -0
- data/lib/HDLRuby/hdr_samples/ram.rb +18 -0
- data/lib/HDLRuby/hdr_samples/register_with_code_bench.rb +98 -0
- data/lib/HDLRuby/hdr_samples/rom.rb +10 -0
- data/lib/HDLRuby/hdr_samples/struct.rb +14 -0
- data/lib/HDLRuby/hdr_samples/sumprod.rb +29 -0
- data/lib/HDLRuby/hdr_samples/sw_encrypt_bench.rb +103 -0
- data/lib/HDLRuby/hdr_samples/sw_encrypt_cpu_bench.rb +261 -0
- data/lib/HDLRuby/hdr_samples/sw_encrypt_cpusim_bench.rb +302 -0
- data/lib/HDLRuby/hdr_samples/system_open.rb +11 -0
- data/lib/HDLRuby/hdr_samples/tuple.rb +16 -0
- data/lib/HDLRuby/hdr_samples/with_channel.rb +118 -0
- data/lib/HDLRuby/hdr_samples/with_class.rb +199 -0
- data/lib/HDLRuby/hdr_samples/with_decoder.rb +17 -0
- data/lib/HDLRuby/hdr_samples/with_fsm.rb +34 -0
- data/lib/HDLRuby/hdr_samples/with_reconf.rb +103 -0
- data/lib/HDLRuby/hdrcc.rb +623 -0
- data/lib/HDLRuby/high_samples/_adder_fault.rb +23 -0
- data/lib/HDLRuby/high_samples/_generic_transmission2.rb +146 -0
- data/lib/HDLRuby/high_samples/adder.rb +21 -0
- data/lib/HDLRuby/high_samples/adder_common_errors.rb +25 -0
- data/lib/HDLRuby/high_samples/addsub.rb +33 -0
- data/lib/HDLRuby/high_samples/addsubz.rb +37 -0
- data/lib/HDLRuby/high_samples/after.rb +28 -0
- data/lib/HDLRuby/high_samples/all_signals.rb +29 -0
- data/lib/HDLRuby/high_samples/alu.rb +61 -0
- data/lib/HDLRuby/high_samples/anonymous.rb +41 -0
- data/lib/HDLRuby/high_samples/before.rb +28 -0
- data/lib/HDLRuby/high_samples/blockblock.rb +26 -0
- data/lib/HDLRuby/high_samples/bugs/dadz.rb +22 -0
- data/lib/HDLRuby/high_samples/bugs/misample_instan.rb +20 -0
- data/lib/HDLRuby/high_samples/bugs/misample_updown.rb +22 -0
- data/lib/HDLRuby/high_samples/bugs/sample_add.rb +16 -0
- data/lib/HDLRuby/high_samples/bugs/sample_barrel.rb +13 -0
- data/lib/HDLRuby/high_samples/bugs/sample_daice.rb +57 -0
- data/lib/HDLRuby/high_samples/bugs/sample_kumiawase.rb +52 -0
- data/lib/HDLRuby/high_samples/bugs/sample_multi.rb +18 -0
- data/lib/HDLRuby/high_samples/bugs/sample_sub.rb +14 -0
- data/lib/HDLRuby/high_samples/bugs/z2.rb +32 -0
- data/lib/HDLRuby/high_samples/case.rb +32 -0
- data/lib/HDLRuby/high_samples/case2.rb +30 -0
- data/lib/HDLRuby/high_samples/change.rb +23 -0
- data/lib/HDLRuby/high_samples/clocks.rb +35 -0
- data/lib/HDLRuby/high_samples/comparer.rb +21 -0
- data/lib/HDLRuby/high_samples/conditionals.rb +29 -0
- data/lib/HDLRuby/high_samples/dff.rb +23 -0
- data/lib/HDLRuby/high_samples/each.rb +28 -0
- data/lib/HDLRuby/high_samples/exporter.rb +42 -0
- data/lib/HDLRuby/high_samples/functions.rb +60 -0
- data/lib/HDLRuby/high_samples/if_seq.rb +26 -0
- data/lib/HDLRuby/high_samples/inherit_as_dff.rb +32 -0
- data/lib/HDLRuby/high_samples/inherit_dff.rb +36 -0
- data/lib/HDLRuby/high_samples/instance.rb +37 -0
- data/lib/HDLRuby/high_samples/memory.rb +64 -0
- data/lib/HDLRuby/high_samples/multi_file.rb +27 -0
- data/lib/HDLRuby/high_samples/overload.rb +32 -0
- data/lib/HDLRuby/high_samples/paper_after.rb +49 -0
- data/lib/HDLRuby/high_samples/ram.rb +27 -0
- data/lib/HDLRuby/high_samples/registers.rb +139 -0
- data/lib/HDLRuby/high_samples/rom.rb +23 -0
- data/lib/HDLRuby/high_samples/scopeblockname.rb +37 -0
- data/lib/HDLRuby/high_samples/scopescope.rb +26 -0
- data/lib/HDLRuby/high_samples/shift.rb +31 -0
- data/lib/HDLRuby/high_samples/shift2.rb +40 -0
- data/lib/HDLRuby/high_samples/simple_instance.rb +31 -0
- data/lib/HDLRuby/high_samples/test_all.sh +10 -0
- data/lib/HDLRuby/high_samples/typedef.rb +24 -0
- data/lib/HDLRuby/high_samples/values.rb +70 -0
- data/lib/HDLRuby/high_samples/vector.rb +22 -0
- data/lib/HDLRuby/high_samples/with_decoder.rb +30 -0
- data/lib/HDLRuby/high_samples/with_fsm.rb +46 -0
- data/lib/HDLRuby/high_samples/with_pipe.rb +43 -0
- data/lib/HDLRuby/high_samples/with_seq.rb +25 -0
- data/lib/HDLRuby/hruby_bstr.rb +1085 -0
- data/lib/HDLRuby/hruby_check.rb +317 -0
- data/lib/HDLRuby/hruby_db.rb +432 -0
- data/lib/HDLRuby/hruby_error.rb +44 -0
- data/lib/HDLRuby/hruby_high.rb +4103 -0
- data/lib/HDLRuby/hruby_low.rb +4735 -0
- data/lib/HDLRuby/hruby_low2c.rb +1986 -0
- data/lib/HDLRuby/hruby_low2high.rb +738 -0
- data/lib/HDLRuby/hruby_low2seq.rb +248 -0
- data/lib/HDLRuby/hruby_low2sym.rb +126 -0
- data/lib/HDLRuby/hruby_low2vhd.rb +1437 -0
- data/lib/HDLRuby/hruby_low_bool2select.rb +295 -0
- data/lib/HDLRuby/hruby_low_cleanup.rb +193 -0
- data/lib/HDLRuby/hruby_low_fix_types.rb +437 -0
- data/lib/HDLRuby/hruby_low_mutable.rb +1803 -0
- data/lib/HDLRuby/hruby_low_resolve.rb +165 -0
- data/lib/HDLRuby/hruby_low_skeleton.rb +129 -0
- data/lib/HDLRuby/hruby_low_with_bool.rb +141 -0
- data/lib/HDLRuby/hruby_low_with_port.rb +167 -0
- data/lib/HDLRuby/hruby_low_with_var.rb +302 -0
- data/lib/HDLRuby/hruby_low_without_bit2vector.rb +88 -0
- data/lib/HDLRuby/hruby_low_without_concat.rb +162 -0
- data/lib/HDLRuby/hruby_low_without_connection.rb +113 -0
- data/lib/HDLRuby/hruby_low_without_namespace.rb +718 -0
- data/lib/HDLRuby/hruby_low_without_outread.rb +107 -0
- data/lib/HDLRuby/hruby_low_without_select.rb +206 -0
- data/lib/HDLRuby/hruby_serializer.rb +398 -0
- data/lib/HDLRuby/hruby_tools.rb +37 -0
- data/lib/HDLRuby/hruby_types.rb +239 -0
- data/lib/HDLRuby/hruby_values.rb +64 -0
- data/lib/HDLRuby/hruby_verilog.rb +1888 -0
- data/lib/HDLRuby/hruby_verilog_name.rb +52 -0
- data/lib/HDLRuby/low_samples/adder.yaml +97 -0
- data/lib/HDLRuby/low_samples/after.yaml +228 -0
- data/lib/HDLRuby/low_samples/before.yaml +223 -0
- data/lib/HDLRuby/low_samples/blockblock.yaml +48 -0
- data/lib/HDLRuby/low_samples/bugs/sample_add.yaml +97 -0
- data/lib/HDLRuby/low_samples/bugs/sample_daice.yaml +444 -0
- data/lib/HDLRuby/low_samples/bugs/sample_kumiawase.yaml +332 -0
- data/lib/HDLRuby/low_samples/bugs/sample_sub.yaml +97 -0
- data/lib/HDLRuby/low_samples/bugs/seqpar.yaml +184 -0
- data/lib/HDLRuby/low_samples/case.yaml +327 -0
- data/lib/HDLRuby/low_samples/change.yaml +135 -0
- data/lib/HDLRuby/low_samples/clocks.yaml +674 -0
- data/lib/HDLRuby/low_samples/cloner.rb +22 -0
- data/lib/HDLRuby/low_samples/comparer.yaml +85 -0
- data/lib/HDLRuby/low_samples/conditionals.yaml +133 -0
- data/lib/HDLRuby/low_samples/dff.yaml +107 -0
- data/lib/HDLRuby/low_samples/each.yaml +1328 -0
- data/lib/HDLRuby/low_samples/exporter.yaml +226 -0
- data/lib/HDLRuby/low_samples/functions.yaml +298 -0
- data/lib/HDLRuby/low_samples/generic_transmission.yaml +597 -0
- data/lib/HDLRuby/low_samples/inherit_as_dff.yaml +125 -0
- data/lib/HDLRuby/low_samples/inherit_dff.yaml +107 -0
- data/lib/HDLRuby/low_samples/load_yaml.rb +11 -0
- data/lib/HDLRuby/low_samples/memory.yaml +678 -0
- data/lib/HDLRuby/low_samples/namespace_extractor.rb +23 -0
- data/lib/HDLRuby/low_samples/overload.yaml +226 -0
- data/lib/HDLRuby/low_samples/paper_after.yaml +431 -0
- data/lib/HDLRuby/low_samples/port_maker.rb +14 -0
- data/lib/HDLRuby/low_samples/ram.yaml +207 -0
- data/lib/HDLRuby/low_samples/registers.yaml +228 -0
- data/lib/HDLRuby/low_samples/rom.yaml +2950 -0
- data/lib/HDLRuby/low_samples/shift.yaml +230 -0
- data/lib/HDLRuby/low_samples/shift2.yaml +2095 -0
- data/lib/HDLRuby/low_samples/simple_instance.yaml +102 -0
- data/lib/HDLRuby/low_samples/test_all.sh +43 -0
- data/lib/HDLRuby/low_samples/typedef.yaml +115 -0
- data/lib/HDLRuby/low_samples/values.yaml +577 -0
- data/lib/HDLRuby/low_samples/variable_maker.rb +14 -0
- data/lib/HDLRuby/low_samples/vector.yaml +56 -0
- data/lib/HDLRuby/low_samples/with_seq.yaml +188 -0
- data/lib/HDLRuby/low_samples/yaml2hdr.rb +10 -0
- data/lib/HDLRuby/low_samples/yaml2vhd.rb +19 -0
- data/lib/HDLRuby/sim/Makefile +19 -0
- data/lib/HDLRuby/sim/hruby_sim.h +590 -0
- data/lib/HDLRuby/sim/hruby_sim_calc.c +2362 -0
- data/lib/HDLRuby/sim/hruby_sim_core.c +589 -0
- data/lib/HDLRuby/sim/hruby_sim_list.c +93 -0
- data/lib/HDLRuby/sim/hruby_sim_vizualize.c +91 -0
- data/lib/HDLRuby/sim/hruby_value_pool.c +64 -0
- data/lib/HDLRuby/std/channel.rb +354 -0
- data/lib/HDLRuby/std/clocks.rb +165 -0
- data/lib/HDLRuby/std/counters.rb +82 -0
- data/lib/HDLRuby/std/decoder.rb +214 -0
- data/lib/HDLRuby/std/fsm.rb +516 -0
- data/lib/HDLRuby/std/pipeline.rb +220 -0
- data/lib/HDLRuby/std/reconf.rb +309 -0
- data/lib/HDLRuby/test_hruby_bstr.rb +2259 -0
- data/lib/HDLRuby/test_hruby_high.rb +594 -0
- data/lib/HDLRuby/test_hruby_high_low.rb +99 -0
- data/lib/HDLRuby/test_hruby_low.rb +934 -0
- data/lib/HDLRuby/v_samples/adder.v +10 -0
- data/lib/HDLRuby/v_samples/dff.v +12 -0
- data/lib/HDLRuby/v_samples/ram.v +20 -0
- data/lib/HDLRuby/v_samples/rom.v +270 -0
- data/lib/HDLRuby/version.rb +3 -0
- data/lib/HDLRuby.rb +11 -0
- data/makedoc +1 -0
- data/metadata.yaml +4 -0
- metadata +299 -0
|
@@ -0,0 +1,594 @@
|
|
|
1
|
+
########################################################################
|
|
2
|
+
## Program for testing the HDLRuby::Low module. ##
|
|
3
|
+
########################################################################
|
|
4
|
+
|
|
5
|
+
require "HDLRuby.rb"
|
|
6
|
+
require "HDLRuby/hruby_serializer.rb"
|
|
7
|
+
|
|
8
|
+
configure_high
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
$success = true
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
print "Creating an empty system type... "
|
|
15
|
+
begin
|
|
16
|
+
$systemT0 = system(:systemT0) {}
|
|
17
|
+
unless $systemT0 then
|
|
18
|
+
raise "Error: created system type not found."
|
|
19
|
+
$success =false
|
|
20
|
+
end
|
|
21
|
+
if $systemT0.name != :systemT0 then
|
|
22
|
+
raise "Error: invalid system type name, got #{$systemT0.name} but expecting systemT0."
|
|
23
|
+
$success = false
|
|
24
|
+
end
|
|
25
|
+
puts "Ok."
|
|
26
|
+
# rescue Exception => e
|
|
27
|
+
# puts "Error: unexpected exception raised #{e.inspect}\n"
|
|
28
|
+
# $success = false
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
print "Instantiate it... "
|
|
32
|
+
begin
|
|
33
|
+
$systemI0 = $systemT0.instantiate("systemI0")
|
|
34
|
+
puts "Ok."
|
|
35
|
+
# rescue Exception => e
|
|
36
|
+
# puts "Error: unexpected exception raised #{e.inspect}\n"
|
|
37
|
+
# $success = false
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
print "Creating the unsigned char type (bit[8])... "
|
|
41
|
+
begin
|
|
42
|
+
$uchar = typedef(:uchar) { bit[8] }
|
|
43
|
+
puts "Ok."
|
|
44
|
+
# rescue Exception => e
|
|
45
|
+
# puts "Error: unexpected exception raised #{e.inspect}\n"
|
|
46
|
+
# $success = false
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# print "Converting systemT0 to a type... "
|
|
50
|
+
# begin
|
|
51
|
+
# $sigT0 = type(:sigT0) { $systemT0.to_type([],[]) }
|
|
52
|
+
# puts "Ok."
|
|
53
|
+
# # rescue Exception => e
|
|
54
|
+
# # puts "Error: unexpected exception raised #{e.inspect}\n"
|
|
55
|
+
# # $success = false
|
|
56
|
+
# end
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
print "\nCreating a system type with content (also using the created char type)... "
|
|
60
|
+
begin
|
|
61
|
+
$systemT1 = system :systemT1 do # |x,y,z|
|
|
62
|
+
bit.input :clk
|
|
63
|
+
systemT0 :my_system
|
|
64
|
+
input :i0, :i1
|
|
65
|
+
output :o0
|
|
66
|
+
uchar.input :i2
|
|
67
|
+
[7..0].input :i3
|
|
68
|
+
bit[7..0].output :o1
|
|
69
|
+
{header: bit[4], data: bit[28]}.inner :frame
|
|
70
|
+
{int: signed[32], uint: bit[32]}.inout :value
|
|
71
|
+
# sigT0.inner :my_sig
|
|
72
|
+
[bit[4],unsigned[8],signed[16]].inner :my_sig
|
|
73
|
+
|
|
74
|
+
o0 <= i0 + i1 # Standard connection
|
|
75
|
+
# x <= mux(o0, y, z) # Connection of generic parameters with a mux
|
|
76
|
+
|
|
77
|
+
par(i0.posedge) do
|
|
78
|
+
(o1 <= i0 * i1).hif(i0 != 0)
|
|
79
|
+
seq do
|
|
80
|
+
value.int[7..0] <= i2 + i3
|
|
81
|
+
end
|
|
82
|
+
hif (i3 > i2) {
|
|
83
|
+
value.int[15..8] <= i3
|
|
84
|
+
}
|
|
85
|
+
helse {
|
|
86
|
+
value.int[15..8] <= i2
|
|
87
|
+
}
|
|
88
|
+
hcase(i2)
|
|
89
|
+
hwhen(5) {
|
|
90
|
+
value.int[15..14] <= 0
|
|
91
|
+
}
|
|
92
|
+
hwhen(i3) {
|
|
93
|
+
value.int[15..14] <= 1
|
|
94
|
+
}
|
|
95
|
+
helse {
|
|
96
|
+
value.int[15..14] <= 2
|
|
97
|
+
}
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
timed do
|
|
101
|
+
clk <= 0
|
|
102
|
+
!10.ns
|
|
103
|
+
clk <= 1
|
|
104
|
+
!10.ns
|
|
105
|
+
clk <= 0
|
|
106
|
+
repeat(1000.ns) do
|
|
107
|
+
!10.ns
|
|
108
|
+
clk <= 1
|
|
109
|
+
!10.ns
|
|
110
|
+
clk <= 0
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
# Connection converted to behavior through a at.
|
|
114
|
+
(o1 <= i2 + i3).at(clk.posedge)
|
|
115
|
+
end
|
|
116
|
+
unless $systemT1 then
|
|
117
|
+
raise "Error: created system type not found."
|
|
118
|
+
$success =false
|
|
119
|
+
end
|
|
120
|
+
if $systemT1.name != :systemT1 then
|
|
121
|
+
raise "Error: invalid system type name, got #{$systemT0.name} but expecting systemT0."
|
|
122
|
+
$success = false
|
|
123
|
+
end
|
|
124
|
+
puts "Ok."
|
|
125
|
+
# rescue Exception => e
|
|
126
|
+
# puts "Error: unexpected exception raised #{e.inspect}\n"
|
|
127
|
+
# $success = false
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
print "Instantiate it... "
|
|
131
|
+
begin
|
|
132
|
+
# $systemI1 = $systemT1.instantiate("systemI1",SignalI.new(:"",$uchar,:inner),SignalI.new(:"",$uchar,:inner),SignalI.new(:"",$uchar,:inner))
|
|
133
|
+
$systemI1 = $systemT1.instantiate("systemI1")
|
|
134
|
+
puts "$systemI1 scope=#{$systemI1.systemT.scope}"
|
|
135
|
+
systemI1Is = $systemI1.each_systemI.to_a
|
|
136
|
+
success = true
|
|
137
|
+
if systemI1Is.size != 1 then
|
|
138
|
+
puts "Error: invalid number of inner system instances, got #{systemI1Is.size} but expecting 1."
|
|
139
|
+
success = false
|
|
140
|
+
elsif systemI1Is[0].name != :my_system then
|
|
141
|
+
puts "Error: invalid inner system instance, got #{systemI1Is[0].name} but expecting my_system."
|
|
142
|
+
success = false
|
|
143
|
+
end
|
|
144
|
+
systemI1Ins = $systemI1.each_input.to_a
|
|
145
|
+
if systemI1Ins.size != 5 then
|
|
146
|
+
puts "Error: invalid number of input signals, got #{systemI1Ins.size} but expecting 5."
|
|
147
|
+
success = false
|
|
148
|
+
elsif systemI1Ins[0].name != :clk then
|
|
149
|
+
puts "Error: invalid input signal, got #{systemI1Ins[0].name} but expecting clk."
|
|
150
|
+
success = false
|
|
151
|
+
elsif systemI1Ins[0].type.name != :bit then
|
|
152
|
+
puts "Error: invalid type for clk, got #{systemI1Ins[0].type.name} but expecting clk."
|
|
153
|
+
success = false
|
|
154
|
+
elsif systemI1Ins[1].name != :i0 then
|
|
155
|
+
puts "Error: invalid input signal, got #{systemI1Ins[0].name} but expecting i0."
|
|
156
|
+
success = false
|
|
157
|
+
elsif systemI1Ins[1].type.name != :bit then
|
|
158
|
+
puts "Error: invalid type for i0, got #{systemI1Ins[0].type.name} but expecting bit."
|
|
159
|
+
success = false
|
|
160
|
+
elsif systemI1Ins[2].name != :i1 then
|
|
161
|
+
puts "Error: invalid input signal, got #{systemI1Ins[1].name} but expecting i1."
|
|
162
|
+
success = false
|
|
163
|
+
elsif systemI1Ins[3].name != :i2 then
|
|
164
|
+
puts "Error: invalid input signal, got #{systemI1Ins[2].name} but expecting i2."
|
|
165
|
+
success = false
|
|
166
|
+
elsif !systemI1Ins[3].type.is_a?(TypeDef) then
|
|
167
|
+
puts "Error: invalid type for i2, got #{systemI1Ins[3].type.class} but expecting TypeVector."
|
|
168
|
+
success = false
|
|
169
|
+
elsif systemI1Ins[3].type.base.name != :bit then
|
|
170
|
+
puts "Error: invalid base type for i2, got #{systemI1Ins[2].type.base.name} but expecting bit."
|
|
171
|
+
success = false
|
|
172
|
+
elsif systemI1Ins[3].type.range != (7..0) then
|
|
173
|
+
puts "Error: invalid type range for i2, got #{systemI1Ins[2].type.range} but expecting 7..0."
|
|
174
|
+
success = false
|
|
175
|
+
elsif systemI1Ins[4].name != :i3 then
|
|
176
|
+
puts "Error: invalid input signal, got #{systemI1Ins[3].name} but expecting i3."
|
|
177
|
+
success = false
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
systemI1Outs = $systemI1.each_output.to_a
|
|
181
|
+
if systemI1Outs.size != 2 then
|
|
182
|
+
puts "Error: invalid number of output signals, got #{systemI1Outs.size} but expecting 2."
|
|
183
|
+
success = false
|
|
184
|
+
elsif systemI1Outs[0].name != :o0 then
|
|
185
|
+
puts "Error: invalid output signal, got #{systemI1Outs[0].name} but expecting o0."
|
|
186
|
+
success = false
|
|
187
|
+
elsif systemI1Outs[1].name != :o1 then
|
|
188
|
+
puts "Error: invalid output signal, got #{systemI1Outs[1].name} but expecting o1."
|
|
189
|
+
success = false
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
systemI1Inners = $systemI1.each_inner.to_a
|
|
193
|
+
if systemI1Inners.size != 2 then
|
|
194
|
+
puts "Error: invalid number of inner signals, got #{systemI1Inners.size} but expecting 2."
|
|
195
|
+
success = false
|
|
196
|
+
elsif systemI1Inners[0].name != :frame then
|
|
197
|
+
puts "Error: invalid inner signal, got #{systemI1Inners[0].name} but expecting frame."
|
|
198
|
+
success = false
|
|
199
|
+
elsif !systemI1Inners[0].type.is_a?(TypeStruct) then
|
|
200
|
+
puts "Error: invalid inner type, got #{systemI1Inners[0].type.class} but expecting TypeStruct."
|
|
201
|
+
success = false
|
|
202
|
+
elsif !systemI1Inners[0].type.get_type(:header).is_a?(TypeVector) then
|
|
203
|
+
puts "Error: invalid inner type record for header, got #{systemI1Inners[0].type.get_type(:header).class} but expecting TypeVector."
|
|
204
|
+
success = false
|
|
205
|
+
elsif !systemI1Inners[0].type.get_type(:data).is_a?(TypeVector) then
|
|
206
|
+
puts "Error: invalid inner type record for data, got #{systemI1Inners[0].type.get_type(:data).class} but expecting TypeVector."
|
|
207
|
+
success = false
|
|
208
|
+
elsif systemI1Inners[1].name != :my_sig then
|
|
209
|
+
puts "Error: invalid inner signal, got #{systemI1Inners[1].name} but expecting my_sig."
|
|
210
|
+
success = false
|
|
211
|
+
elsif !systemI1Inners[1].type.is_a?(TypeTuple) then
|
|
212
|
+
puts "Error: invalid inner type, got #{systemI1Inners[1].type.class} but expecting TypeTuple."
|
|
213
|
+
success = false
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
systemI1Inouts = $systemI1.each_inout.to_a
|
|
217
|
+
if systemI1Inouts.size != 1 then
|
|
218
|
+
puts "Error: invalid number of inout signals, got #{systemI1Inouts.size} but expecting 1."
|
|
219
|
+
success = false
|
|
220
|
+
elsif systemI1Inouts[0].name != :value then
|
|
221
|
+
puts "Error: invalid inout signal, got #{systemI1Inouts[0].name} but expecting value."
|
|
222
|
+
success = false
|
|
223
|
+
elsif !systemI1Inouts[0].type.is_a?(TypeStruct) then
|
|
224
|
+
puts "Error: invalid inout type, got #{systemI1Inouts[0].type.class} but expecting TypeStruct."
|
|
225
|
+
success = false
|
|
226
|
+
elsif !systemI1Inouts[0].type.get_type(:uint).is_a?(TypeVector) then
|
|
227
|
+
puts "Error: invalid inout type record for uint, got #{systemI1Inouts[0].type.get_type(:header).class} but expecting TypeVector."
|
|
228
|
+
success = false
|
|
229
|
+
elsif !systemI1Inouts[0].type.get_type(:int).is_a?(TypeVector) then
|
|
230
|
+
puts "Error: invalid inout type record for int, got #{systemI1Inouts[0].type.get_type(:data).class} but expecting TypeVector."
|
|
231
|
+
success = false
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
systemI1Connections = $systemI1.each_connection.to_a
|
|
235
|
+
if systemI1Connections.size != 1 then
|
|
236
|
+
puts "Error: invalid number of connections, got #{systemI1Connections.size} but expecting 1."
|
|
237
|
+
success = false
|
|
238
|
+
elsif systemI1Connections[0].left.object.name != :o0 then
|
|
239
|
+
puts "Error: invalid left for connection, got #{systemI1Connections[0].left.object.name} but expecting o0."
|
|
240
|
+
success = false
|
|
241
|
+
elsif systemI1Connections[0].right.operator != :+ then
|
|
242
|
+
puts "Error: invalid right operator for connection, got #{systemI1Connections[0].right.operator} but expecting +."
|
|
243
|
+
success = false
|
|
244
|
+
elsif systemI1Connections[0].right.left.object.name != :i0 then
|
|
245
|
+
puts "Error: invalid right left for connection, got #{systemI1Connections[0].right.left.object.name} but expecting i0."
|
|
246
|
+
success = false
|
|
247
|
+
elsif systemI1Connections[0].right.right.object.name != :i1 then
|
|
248
|
+
puts "Error: invalid right right for connection, got #{systemI1Connections[0].right.right.object.name} but expecting i1."
|
|
249
|
+
success = false
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
systemI1Behaviors = $systemI1.each_behavior.to_a
|
|
253
|
+
if systemI1Behaviors.size != 3 then
|
|
254
|
+
puts "Error: invalid number of behaviors, got #{systemI1Behaviors.size} but expecting 3."
|
|
255
|
+
success = false
|
|
256
|
+
end
|
|
257
|
+
systemI1Behavior = systemI1Behaviors[0]
|
|
258
|
+
systemI1Events = systemI1Behavior.each_event.to_a
|
|
259
|
+
if systemI1Events.size != 1 then
|
|
260
|
+
puts "Error: invalid number of events, got #{systemI1Events.size} but expecting 1."
|
|
261
|
+
success = false
|
|
262
|
+
elsif systemI1Events[0].type != :posedge then
|
|
263
|
+
puts "Error: invalid type of event, got #{systemI1Events[0].type} but expecting posedge."
|
|
264
|
+
elsif systemI1Events[0].ref.object.name != :i0 then
|
|
265
|
+
puts "Error: invalid event reference, got #{systemI1Events[0].ref.object.name} but expecting i0."
|
|
266
|
+
end
|
|
267
|
+
systemI1Block = systemI1Behavior.block
|
|
268
|
+
if systemI1Block.mode != :par then
|
|
269
|
+
puts "Error: invalid block mode, got #{systemI1Block.type} but expecting par."
|
|
270
|
+
success = false
|
|
271
|
+
end
|
|
272
|
+
systemI1Statements = systemI1Block.each_statement.to_a
|
|
273
|
+
if systemI1Statements.size != 4 then
|
|
274
|
+
puts "Error: invalid number of statements, got #{systemI1Statements.size} but expecting 4."
|
|
275
|
+
success = false
|
|
276
|
+
elsif !systemI1Statements[0].is_a?(Transmit) then
|
|
277
|
+
puts "Error: invalid first statement, got #{systemI1Statements[0].class} but expecting Transmit."
|
|
278
|
+
success = false
|
|
279
|
+
elsif systemI1Statements[0].left.object.name != :o1 then
|
|
280
|
+
puts "Error: invalid first statement left, got #{systemI1Statements[0].left.object.name} but expecting o1."
|
|
281
|
+
success = false
|
|
282
|
+
elsif systemI1Statements[0].right.operator != :* then
|
|
283
|
+
puts "Error: invalid first statement right operator, got #{systemI1Statements[0].right.operator} but expecting *."
|
|
284
|
+
success = false
|
|
285
|
+
elsif systemI1Statements[0].right.left.object.name != :i0 then
|
|
286
|
+
puts "Error: invalid first statement right left, got #{systemI1Statements[0].right.left.object.name} but expecting i0."
|
|
287
|
+
success = false
|
|
288
|
+
elsif systemI1Statements[0].right.right.object.name != :i1 then
|
|
289
|
+
puts "Error: invalid first statement right right, got #{systemI1Statements[0].right.left.object.name} but expecting i1."
|
|
290
|
+
success = false
|
|
291
|
+
elsif !systemI1Statements[2].is_a?(If) then
|
|
292
|
+
puts "Error: invalid third statement, got #{systemI1Statements[2].class} but expecting If."
|
|
293
|
+
success = false
|
|
294
|
+
elsif systemI1Statements[2].condition.operator != :> then
|
|
295
|
+
puts "Error: invalid third statement condition operator, got #{systemI1Statements[2].operator} but expecting <."
|
|
296
|
+
success = false
|
|
297
|
+
elsif !systemI1Statements[2].yes.is_a?(Block) then
|
|
298
|
+
puts "Error: invalid third statement yes, got #{systemI1Statements[2].yes.class} but expecting Block."
|
|
299
|
+
success = false
|
|
300
|
+
elsif !systemI1Statements[2].no.is_a?(Block) then
|
|
301
|
+
puts "Error: invalid third statement no, got #{systemI1Statements[2].no.class} but expecting Block."
|
|
302
|
+
success = false
|
|
303
|
+
elsif !systemI1Statements[3].is_a?(Case) then
|
|
304
|
+
puts "Error: invalid fourth statement, got #{systemI1Statements[3].class} but expecting Case."
|
|
305
|
+
success = false
|
|
306
|
+
elsif systemI1Statements[3].value.object.name != :i2 then
|
|
307
|
+
puts "Error: invalid fourth statement value, got #{systemI1Statements[3].value.object.name} but expecting i2."
|
|
308
|
+
success = false
|
|
309
|
+
elsif systemI1Statements[3].each_when.to_a.size != 2 then
|
|
310
|
+
puts "Error: invalid number of when for fourth statement, got #{systemI1Statements[3].each_when.to_a.size} but expecting 2."
|
|
311
|
+
success = false
|
|
312
|
+
elsif systemI1Statements[3].each_when.first.match.content != 5 then
|
|
313
|
+
puts "Error: invalid match of first when for fourth statement, got #{systemI1Statements[3].each_when.first[0].content} but expecting 5."
|
|
314
|
+
success = false
|
|
315
|
+
elsif !systemI1Statements[3].default then
|
|
316
|
+
puts "Error: no default for fourth statement."
|
|
317
|
+
success = false
|
|
318
|
+
end
|
|
319
|
+
systemI1Seq = systemI1Statements[1]
|
|
320
|
+
if !systemI1Seq.is_a?(Block) then
|
|
321
|
+
puts "Error: invalid second statement, got #{systemI1Seq.class} but expecting Block."
|
|
322
|
+
success = false
|
|
323
|
+
elsif systemI1Seq.mode != :seq then
|
|
324
|
+
puts "Error: invalid type of block, got #{systemI1Seq.type} but expecting seq."
|
|
325
|
+
success = false
|
|
326
|
+
end
|
|
327
|
+
systemI1SeqStatements = systemI1Seq.each_statement.to_a
|
|
328
|
+
if systemI1SeqStatements.size != 1 then
|
|
329
|
+
puts "Error: invalid number of statements, got #{systemI1Statements.size} but expecting 1."
|
|
330
|
+
success = false
|
|
331
|
+
elsif !systemI1SeqStatements[0].is_a?(Transmit) then
|
|
332
|
+
puts "Error: invalid first statement, got #{systemI1SeqStatements[0].class} but expecting Transmit."
|
|
333
|
+
success = false
|
|
334
|
+
elsif systemI1SeqStatements[0].right.operator != :+ then
|
|
335
|
+
puts "Error: invalid first statement right operator, got #{systemI1SeqStatements[0].right.operator} but expecting +."
|
|
336
|
+
success = false
|
|
337
|
+
elsif !systemI1SeqStatements[0].left.is_a?(RefRange) then
|
|
338
|
+
puts "Error: invalid first statement left reference, got #{systemI1SeqStatements[0].left.class} but expecting RefRange."
|
|
339
|
+
success = false
|
|
340
|
+
elsif systemI1SeqStatements[0].left.range.first.content != 7 then
|
|
341
|
+
puts "Error: invalid first statement left reference range, got #{systemI1SeqStatements[0].left.range} but expecting 7..0."
|
|
342
|
+
success = false
|
|
343
|
+
elsif systemI1SeqStatements[0].left.range.last.content != 0 then
|
|
344
|
+
puts "Error: invalid first statement left reference range, got #{systemI1SeqStatements[0].left.range} but expecting 7..0."
|
|
345
|
+
success = false
|
|
346
|
+
elsif !systemI1SeqStatements[0].left.ref.is_a?(RefObject) then
|
|
347
|
+
puts "Error: invalid first statement left left reference, got #{systemI1SeqStatements[0].left.ref.class} but expecting RefName."
|
|
348
|
+
success = false
|
|
349
|
+
elsif systemI1SeqStatements[0].left.ref.name != :int then
|
|
350
|
+
puts "Error: invalid first statement left left reference name, got #{systemI1SeqStatements[0].left.ref.name} but expecting int."
|
|
351
|
+
success = false
|
|
352
|
+
elsif systemI1SeqStatements[0].left.ref.base.object.name != :value then
|
|
353
|
+
puts "Error: invalid first statement left left left reference name, got #{systemI1SeqStatements[0].left.ref.base.object.name} but expecting value."
|
|
354
|
+
success = false
|
|
355
|
+
end
|
|
356
|
+
|
|
357
|
+
systemI1Time = systemI1Behaviors[1]
|
|
358
|
+
unless systemI1Time.is_a?(Low::TimeBehavior) then
|
|
359
|
+
puts "Error: invalid behavior class: got #{systemI1Time.class} but expecting TimeBehavior."
|
|
360
|
+
success = false
|
|
361
|
+
end
|
|
362
|
+
# systemI1TimeBlks = systemI1Time.each_block.to_a
|
|
363
|
+
# unless systemI1TimeBlks.size == 1 then
|
|
364
|
+
# puts "Error: invalid number of timed blocks: got #{systemI1TimeBlks.size} but expecting 1."
|
|
365
|
+
# success = false
|
|
366
|
+
# end
|
|
367
|
+
# systemI1TimeStms = systemI1TimeBlks[0].each_statement.to_a
|
|
368
|
+
systemI1TimeStms = systemI1Time.block.each_statement.to_a
|
|
369
|
+
unless systemI1TimeStms.size == 6 then
|
|
370
|
+
puts "Error: invalid number of timed statements: got #{systemI1TimeStms.size} but expecting 6."
|
|
371
|
+
success = false
|
|
372
|
+
end
|
|
373
|
+
unless systemI1TimeStms[0].is_a?(Transmit) then
|
|
374
|
+
puts "Error: invalid class for first timed statements: got #{systemI1TimeStms[0].class} but expecting Transmit."
|
|
375
|
+
success = false
|
|
376
|
+
end
|
|
377
|
+
unless systemI1TimeStms[1].is_a?(TimeWait) then
|
|
378
|
+
puts "Error: invalid class for second timed statements: got #{systemI1TimeStms[1].class} but expecting TimeDelay."
|
|
379
|
+
success = false
|
|
380
|
+
end
|
|
381
|
+
unless systemI1TimeStms[1].delay.unit == :ns then
|
|
382
|
+
puts "Error: invalid unit for second timed statements: got #{systemI1TimeStms[1].unit} but expecting ns."
|
|
383
|
+
success = false
|
|
384
|
+
end
|
|
385
|
+
unless systemI1TimeStms[1].delay.value == 10 then
|
|
386
|
+
puts "Error: invalid value for second timed statements: got #{systemI1TimeStms[1].value} but expecting 10."
|
|
387
|
+
success = false
|
|
388
|
+
end
|
|
389
|
+
unless systemI1TimeStms[-1].is_a?(TimeRepeat) then
|
|
390
|
+
puts "Error: invalid class for last time statement: got #{systemI1TimeStms[-1].class} but expecting TimeRepeat."
|
|
391
|
+
success = false
|
|
392
|
+
end
|
|
393
|
+
unless systemI1TimeStms[-1].delay.value == 1000 then
|
|
394
|
+
puts "Error: invalid value for second timed statements: got #{systemI1TimeStms[-1].value} but expecting 10."
|
|
395
|
+
success = false
|
|
396
|
+
end
|
|
397
|
+
unless systemI1TimeStms[-1].statement.each_statement.to_a.size == 4 then
|
|
398
|
+
puts "Error: invalid number of statements in the timed repeat: got #{systemI1TimeStms[-1].statement.each_statement.to_a.size} but expecting 4."
|
|
399
|
+
success = false
|
|
400
|
+
end
|
|
401
|
+
|
|
402
|
+
systemI1At = systemI1Behaviors[2]
|
|
403
|
+
systemI1AtEvents = systemI1At.each_event.to_a
|
|
404
|
+
if systemI1AtEvents.size != 1 then
|
|
405
|
+
puts "Error: invalid number of events, got #{systemI1AtEvents.size} but expecting 1."
|
|
406
|
+
success = false
|
|
407
|
+
elsif systemI1AtEvents[0].type != :posedge then
|
|
408
|
+
puts "Error: invalid type of event, got #{systemI1AtEvents[0].type} but expecting posedge."
|
|
409
|
+
elsif systemI1AtEvents[0].ref.object.name != :clk then
|
|
410
|
+
puts "Error: invalid event reference, got #{systemI1AtEvents[0].ref.object.name} but expecting clk."
|
|
411
|
+
end
|
|
412
|
+
systemI1AtBlock = systemI1At.block
|
|
413
|
+
if systemI1AtBlock.mode != :par then
|
|
414
|
+
puts "Error: invalid block mode, got #{systemI1AtBlock.type} but expecting par."
|
|
415
|
+
success = false
|
|
416
|
+
end
|
|
417
|
+
systemI1AtStatements = systemI1AtBlock.each_statement.to_a
|
|
418
|
+
if systemI1AtStatements.size != 1 then
|
|
419
|
+
puts "Error: invalid number of statements, got #{systemI1AtStatements.size} but expecting 1."
|
|
420
|
+
success = false
|
|
421
|
+
elsif !systemI1AtStatements[0].is_a?(Transmit) then
|
|
422
|
+
puts "Error: invalid first statement, got #{systemI1AtStatements[0].class} but expecting Transmit."
|
|
423
|
+
success = false
|
|
424
|
+
elsif systemI1AtStatements[0].left.object.name != :o1 then
|
|
425
|
+
puts "Error: invalid first statement left, got #{systemI1AtStatements[0].left.object.name} but expecting o1."
|
|
426
|
+
success = false
|
|
427
|
+
elsif systemI1AtStatements[0].right.operator != :+ then
|
|
428
|
+
puts "Error: invalid first statement right operator, got #{systemI1AtStatements[0].right.operator} but expecting +."
|
|
429
|
+
success = false
|
|
430
|
+
elsif systemI1AtStatements[0].right.left.object.name != :i2 then
|
|
431
|
+
puts "Error: invalid first statement right left, got #{systemI1AtStatements[0].right.left.object.name} but expecting i2."
|
|
432
|
+
success = false
|
|
433
|
+
elsif systemI1AtStatements[0].right.right.object.name != :i3 then
|
|
434
|
+
puts "Error: invalid first statement right right, got #{systemI1AtStatements[0].right.left.object.name} but expecting i3."
|
|
435
|
+
success = false
|
|
436
|
+
end
|
|
437
|
+
|
|
438
|
+
if success then
|
|
439
|
+
puts "Ok."
|
|
440
|
+
else
|
|
441
|
+
$success = false
|
|
442
|
+
end
|
|
443
|
+
# rescue Exception => e
|
|
444
|
+
# puts "Error: unexpected exception raised #{e.inspect}\n"
|
|
445
|
+
# $success = false
|
|
446
|
+
end
|
|
447
|
+
|
|
448
|
+
print "\nCreating a simple generic system with 2 inputs and 2 outputs... "
|
|
449
|
+
begin
|
|
450
|
+
$systemT2 = system :systemT2 do |type|
|
|
451
|
+
input :clk
|
|
452
|
+
type.input :i0,:i1
|
|
453
|
+
type.output :o0,:o1
|
|
454
|
+
end
|
|
455
|
+
puts "Ok."
|
|
456
|
+
# rescue Exception => e
|
|
457
|
+
# puts "Error: unexpected exception raised #{e.inspect}\n"
|
|
458
|
+
# $success = false
|
|
459
|
+
end
|
|
460
|
+
|
|
461
|
+
# print "Converting it to a type... "
|
|
462
|
+
# begin
|
|
463
|
+
# $sigT2 = type(:sigT2) { $systemT2.to_type([:i0,:i1],[:o0,:o1]) }
|
|
464
|
+
# unless $sigT2.is_a?(TypeSystemT) then
|
|
465
|
+
# raise "Invalid type class: got #{$sigT2.class} but expecting TypeSystemT."
|
|
466
|
+
# end
|
|
467
|
+
# puts "Ok."
|
|
468
|
+
# # rescue Exception => e
|
|
469
|
+
# # puts "Error: unexpected exception raised #{e.inspect}\n"
|
|
470
|
+
# # $success = false
|
|
471
|
+
# end
|
|
472
|
+
#
|
|
473
|
+
# print "Using it in a new system and instantiate the result... "
|
|
474
|
+
# begin
|
|
475
|
+
# $systemT3 = system :systemT3 do
|
|
476
|
+
# sigT2.(uchar).input :x,:y
|
|
477
|
+
# sigT2.(uchar).output :z
|
|
478
|
+
# end
|
|
479
|
+
# $systemI3 = $systemT3.instantiate("systemI3")
|
|
480
|
+
# systemI3inputs = $systemI3.each_input.to_a
|
|
481
|
+
# success = true
|
|
482
|
+
# [:i0,:i1,:o0,:o1].each do |name|
|
|
483
|
+
# unless systemI3inputs[0].respond_to?(name) then
|
|
484
|
+
# puts "Error: systemI3's input does not include #{name} sub signal."
|
|
485
|
+
# success = false
|
|
486
|
+
# end
|
|
487
|
+
# end
|
|
488
|
+
# [:i0,:i1].each do |name|
|
|
489
|
+
# unless systemI3inputs[0].type.left.get_type(name) then
|
|
490
|
+
# puts "Error: systemI3's input type's left side does not include #{name} sub type."
|
|
491
|
+
# success = false
|
|
492
|
+
# end
|
|
493
|
+
# end
|
|
494
|
+
# [:o0,:o1].each do |name|
|
|
495
|
+
# unless systemI3inputs[0].type.right.get_type(name) then
|
|
496
|
+
# puts "Error: systemI3's input type's right side does not include #{name} sub type."
|
|
497
|
+
# success = false
|
|
498
|
+
# end
|
|
499
|
+
# end
|
|
500
|
+
# if (success) then
|
|
501
|
+
# puts "Ok."
|
|
502
|
+
# else
|
|
503
|
+
# $success = false
|
|
504
|
+
# end
|
|
505
|
+
# # rescue Exception => e
|
|
506
|
+
# # puts "Error: unexpected exception raised #{e.inspect}\n"
|
|
507
|
+
# # $success = false
|
|
508
|
+
# end
|
|
509
|
+
|
|
510
|
+
print "Creating another basic system and instantiate it... "
|
|
511
|
+
$systemT3 = system :systemT3 do
|
|
512
|
+
uchar.input :x,:y
|
|
513
|
+
uchar.output :z
|
|
514
|
+
end
|
|
515
|
+
$systemI3 = $systemT3.instantiate("systemI3")
|
|
516
|
+
|
|
517
|
+
|
|
518
|
+
print "\nExtending systemT3 and do a bit of meta programming... "
|
|
519
|
+
begin
|
|
520
|
+
$systemI3.open do
|
|
521
|
+
z <= x & y
|
|
522
|
+
end
|
|
523
|
+
# block_open do
|
|
524
|
+
# def hello(name)
|
|
525
|
+
# $hello = "Hello #{name}."
|
|
526
|
+
# end
|
|
527
|
+
# end
|
|
528
|
+
# par do
|
|
529
|
+
# hello("everybody")
|
|
530
|
+
# end
|
|
531
|
+
# end
|
|
532
|
+
$systemT3.singleton_instance.class_eval do
|
|
533
|
+
def hello(name)
|
|
534
|
+
$hello = "Hello #{name}."
|
|
535
|
+
end
|
|
536
|
+
end
|
|
537
|
+
$systemI32 = $systemT3.instantiate("systemI32")
|
|
538
|
+
$systemI32.hello("everybody")
|
|
539
|
+
success = true
|
|
540
|
+
unless $hello == "Hello everybody." then
|
|
541
|
+
puts "Change of the block classes had no effect."
|
|
542
|
+
success = false
|
|
543
|
+
end
|
|
544
|
+
# Not valid any longer.
|
|
545
|
+
# begin
|
|
546
|
+
# system :fake do
|
|
547
|
+
# par do
|
|
548
|
+
# hello("no one.")
|
|
549
|
+
# end
|
|
550
|
+
# end.instantiate(:faker)
|
|
551
|
+
# puts "The hello method should not be in a general block class."
|
|
552
|
+
# success = false
|
|
553
|
+
# rescue Exception => e
|
|
554
|
+
# unless ( e.is_a?(NoMethodError) and e.message.include?("hello") ) then
|
|
555
|
+
# puts "Error: unexpected exception #{e.inspect}."
|
|
556
|
+
# success = false
|
|
557
|
+
# end
|
|
558
|
+
# end
|
|
559
|
+
$systemI3Connections = $systemI3.each_connection.to_a
|
|
560
|
+
unless $systemI3Connections.size == 1 then
|
|
561
|
+
puts "Invalid number of connection: got #{$systemI3Connections.size} but expecting 1."
|
|
562
|
+
success = false
|
|
563
|
+
end
|
|
564
|
+
unless $systemI3Connections[0].right.operator == :& then
|
|
565
|
+
puts "Invalid operator for connection's right: got #{$systemI3Connections[0].right.operator} but expecting &."
|
|
566
|
+
success = false
|
|
567
|
+
end
|
|
568
|
+
if success then
|
|
569
|
+
puts "Ok."
|
|
570
|
+
else
|
|
571
|
+
$success = false
|
|
572
|
+
end
|
|
573
|
+
# rescue Exception => e
|
|
574
|
+
# puts "Error: unexpected exception raised #{e.inspect}\n"
|
|
575
|
+
# $success = false
|
|
576
|
+
end
|
|
577
|
+
|
|
578
|
+
begin
|
|
579
|
+
# Try to convert to low
|
|
580
|
+
print "\nConverts systemI1 to low... "
|
|
581
|
+
$systemI1low = $systemI1.to_low
|
|
582
|
+
puts "Ok."
|
|
583
|
+
puts "The resulting low level system is: "
|
|
584
|
+
puts $systemI1low.to_yaml
|
|
585
|
+
# rescue Exception => e
|
|
586
|
+
# puts "Error: unexpected exception raised #{e.inspect}\n"
|
|
587
|
+
# $success = false
|
|
588
|
+
end
|
|
589
|
+
|
|
590
|
+
if $success then
|
|
591
|
+
puts "\nSuccess."
|
|
592
|
+
else
|
|
593
|
+
puts "\nFailure."
|
|
594
|
+
end
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
require 'HDLRuby'
|
|
2
|
+
require 'HDLRuby/hruby_low2sym'
|
|
3
|
+
|
|
4
|
+
configure_high
|
|
5
|
+
|
|
6
|
+
# Program for testing both HDLRuby::High and HDLRuby::Low
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
print "Checking creation of an HDLRuby::High system... "
|
|
10
|
+
# Create a HDLRuby::High testing system
|
|
11
|
+
system :high_test do
|
|
12
|
+
input :clk, :cond0, :cond1
|
|
13
|
+
[15..0].input :x,:y,:z
|
|
14
|
+
[16..0].output :s,:u,:v
|
|
15
|
+
|
|
16
|
+
seq(clk.posedge) do
|
|
17
|
+
hif(cond0) { s <= x+y }
|
|
18
|
+
helsif(cond1) { u <= x+y+2 }
|
|
19
|
+
helse { s <= z }
|
|
20
|
+
v <= x*y*_011
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
[3..0].output :sig
|
|
24
|
+
timed do
|
|
25
|
+
!1.us
|
|
26
|
+
sig <= _1010
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
puts "Ok."
|
|
31
|
+
|
|
32
|
+
print "Checking its instantiation... "
|
|
33
|
+
# Instantiate it for checking.
|
|
34
|
+
high_test :high
|
|
35
|
+
|
|
36
|
+
puts "Ok."
|
|
37
|
+
|
|
38
|
+
print "Checking its conversion to low... "
|
|
39
|
+
# Generate the low level representation.
|
|
40
|
+
low = high.systemT.to_low
|
|
41
|
+
|
|
42
|
+
puts "Ok."
|
|
43
|
+
puts
|
|
44
|
+
puts "##############################"
|
|
45
|
+
puts "Checking HDLRuby::Low methods."
|
|
46
|
+
puts "##############################"
|
|
47
|
+
|
|
48
|
+
puts
|
|
49
|
+
puts "Checking clone."
|
|
50
|
+
# Try clone
|
|
51
|
+
low.each_behavior do |beh|
|
|
52
|
+
beh.each_statement do |statement|
|
|
53
|
+
print "Cloning statement: #{statement}... "
|
|
54
|
+
copy = statement.clone
|
|
55
|
+
if copy.class == statement.class then
|
|
56
|
+
puts "Ok."
|
|
57
|
+
else
|
|
58
|
+
puts "Invalid clone result: #{statement.class}"
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
puts
|
|
65
|
+
puts "Checking eql?."
|
|
66
|
+
puts "Cloning system: #{system}... "
|
|
67
|
+
low_clone = low.clone
|
|
68
|
+
print "Checking eql? with the copy and the original of #{system}... "
|
|
69
|
+
# Try eql?
|
|
70
|
+
res = low.eql?(low_clone)
|
|
71
|
+
if res then
|
|
72
|
+
puts "Ok."
|
|
73
|
+
else
|
|
74
|
+
puts "Invalid eql result: #{res}."
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
puts
|
|
79
|
+
puts "Checking hash."
|
|
80
|
+
print "Checking hash with the copy and the original of #{system}... "
|
|
81
|
+
low_hash = low.hash
|
|
82
|
+
clone_hash = low_clone.hash
|
|
83
|
+
if low_hash == clone_hash then
|
|
84
|
+
puts "Ok."
|
|
85
|
+
else
|
|
86
|
+
puts "Invalid hashbol expected #{low_hash} but got: #{clone_hash}."
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
puts
|
|
91
|
+
puts "Checking to_sym."
|
|
92
|
+
print "Checking to_sym with the copy and the original of #{system}... "
|
|
93
|
+
low_to_sym = low.to_sym
|
|
94
|
+
clone_to_sym = low_clone.to_sym
|
|
95
|
+
if low_to_sym == clone_to_sym then
|
|
96
|
+
puts "Ok."
|
|
97
|
+
else
|
|
98
|
+
puts "Invalid to_symbol expected #{low_to_sym} but got: #{clone_to_sym}."
|
|
99
|
+
end
|