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,317 @@
|
|
|
1
|
+
# require 'method_source'
|
|
2
|
+
require 'ripper'
|
|
3
|
+
require 'pp'
|
|
4
|
+
|
|
5
|
+
# code.source
|
|
6
|
+
# method.source_location
|
|
7
|
+
|
|
8
|
+
##
|
|
9
|
+
# High-level libraries for describing digital hardware.
|
|
10
|
+
########################################################
|
|
11
|
+
module HDLRuby
|
|
12
|
+
|
|
13
|
+
##
|
|
14
|
+
# Describes a HDLRuby code checker.
|
|
15
|
+
class Checker
|
|
16
|
+
|
|
17
|
+
# Create a new checker on +code+ string, from +filename+ file.
|
|
18
|
+
# Returns a list of error and the related object and method.
|
|
19
|
+
def initialize(code,filename = nil)
|
|
20
|
+
@code = Ripper.sexp(code.to_s,filename ? filename : "-", 1)
|
|
21
|
+
@code ||= [] # In case the parse failed
|
|
22
|
+
@filename = filename
|
|
23
|
+
# puts "@code=#{@code}"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Displays the full syntax tree.
|
|
27
|
+
def show(output = $stout)
|
|
28
|
+
pp(@code,output)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Tells if +name+ is included in one of the field or subfield of
|
|
32
|
+
# +code+.
|
|
33
|
+
def has_name_deep?(code, name)
|
|
34
|
+
# Checks recursively.
|
|
35
|
+
return code.find do |field|
|
|
36
|
+
field.is_a?(Array) ? has_name_deep?(field,name) : field == name
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Tells if +code+ is a require description.
|
|
41
|
+
def is_require?(code)
|
|
42
|
+
# return code[0] && (code[0][0] == :command) &&
|
|
43
|
+
# (code[0][1][1] == "require")
|
|
44
|
+
return code && (code[0] == :command) &&
|
|
45
|
+
(code[1][1] == "require")
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Gets the required file from +code+.
|
|
49
|
+
def get_require(code)
|
|
50
|
+
# return (code[0][2][1][0][1][1][1])
|
|
51
|
+
return (code[2][1][0][1][1][1])
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Gets all the required files of +code+.
|
|
55
|
+
def get_all_requires(code = @code)
|
|
56
|
+
if code.is_a?(Array) then
|
|
57
|
+
requires = (code.select { |sub| is_require?(sub) }).map! do |sub|
|
|
58
|
+
get_require(sub)
|
|
59
|
+
end
|
|
60
|
+
code.each do |sub|
|
|
61
|
+
requires += get_all_requires(sub)
|
|
62
|
+
end
|
|
63
|
+
return requires
|
|
64
|
+
else
|
|
65
|
+
return []
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Tells if +code+ is a system description.
|
|
70
|
+
def is_system?(code)
|
|
71
|
+
return code.is_a?(Array) && (code[0] == :command) &&
|
|
72
|
+
(code[1][1] == "system")
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Gets the system name in +code+.
|
|
76
|
+
def get_system(code)
|
|
77
|
+
return code[2][1][0][1][1][1]
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Gets all the required files of +code+.
|
|
81
|
+
def get_all_systems(code = @code)
|
|
82
|
+
return [] unless code.is_a?(Array)
|
|
83
|
+
return code.reduce([]) {|ar,sub| ar + get_all_systems(sub) } +
|
|
84
|
+
(code.select { |sub| is_system?(sub) }).map! do |sub|
|
|
85
|
+
get_system(sub)
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Tells is +code+ is an instance of one of +systems+.
|
|
90
|
+
def is_instance?(code,systems)
|
|
91
|
+
# puts "is_instance? with #{code}"
|
|
92
|
+
# Ensures systems is an array.
|
|
93
|
+
systems = [*systems]
|
|
94
|
+
# Check for each system.
|
|
95
|
+
return systems.any? do |system|
|
|
96
|
+
code.is_a?(Array) &&
|
|
97
|
+
( (code[0] == :command) || (code[0] == :fcall) ) &&
|
|
98
|
+
(code[1][1] == system)
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# Get the system of an instance in +code+.
|
|
103
|
+
def get_instance_system(code)
|
|
104
|
+
return code[1][1]
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Get all the instances in +code+ of +systems+.
|
|
108
|
+
# NOTE: return the sub code describing the instantiation.
|
|
109
|
+
def get_all_instances(systems,code = @code)
|
|
110
|
+
return [] unless code.is_a?(Array)
|
|
111
|
+
return code.reduce([]) do |ar,sub|
|
|
112
|
+
ar + get_all_instances(systems,sub)
|
|
113
|
+
end + (code.select { |sub| is_instance?(sub,systems) }).to_a
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Tells is +code+ is an include of one of +systems+.
|
|
117
|
+
def is_include?(code,systems)
|
|
118
|
+
# Ensures systems is an array.
|
|
119
|
+
systems = [*systems]
|
|
120
|
+
# Check for each system.
|
|
121
|
+
return systems.any? do |system|
|
|
122
|
+
code.is_a?(Array) && (code[0] == :command) &&
|
|
123
|
+
(code[1][1] == "include") &&
|
|
124
|
+
(code[2][1][1] == system)
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# Get the system of an include in +code+.
|
|
129
|
+
def get_include_system(code)
|
|
130
|
+
return code[2][1][1]
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# Get all the include in +code+ of +systems+.
|
|
134
|
+
# NOTE: return the sub code describing the include.
|
|
135
|
+
def get_all_includes(systems,code = @code)
|
|
136
|
+
return [] unless code.is_a?(Array)
|
|
137
|
+
return code.reduce([]) do |ar,sub|
|
|
138
|
+
ar + get_all_includes(systems,sub)
|
|
139
|
+
end + (code.select { |sub| is_include?(sub,systems) }).to_a
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# Tells is +code+ is an inheritance of one of +systems+.
|
|
143
|
+
def is_inherit?(code,systems)
|
|
144
|
+
# Ensures systems is an array.
|
|
145
|
+
systems = [*systems]
|
|
146
|
+
# Check for each system.
|
|
147
|
+
return systems.any? do |system|
|
|
148
|
+
code.is_a?(Array) && (code[0] == :command) &&
|
|
149
|
+
(code[1][1] == "system") &&
|
|
150
|
+
(has_name_deep?(code[2][1][1..-1],system))
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
# Get the inherted systems of an inheritance in +code+.
|
|
155
|
+
def get_inherit_systems(code)
|
|
156
|
+
res = []
|
|
157
|
+
code[2][1][1..-1].each do |field|
|
|
158
|
+
if (field[0] == :command) then
|
|
159
|
+
res << field[1][1]
|
|
160
|
+
elsif (field[0] == :method_add_arg) then
|
|
161
|
+
res << field[1][1][1]
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
return res
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
# Get all the inherited system in +code+ of +systems+.
|
|
168
|
+
# NOTE: return the sub code describing the include.
|
|
169
|
+
def get_all_inherits(systems,code = @code)
|
|
170
|
+
return [] unless code.is_a?(Array)
|
|
171
|
+
return code.reduce([]) do |ar,sub|
|
|
172
|
+
ar + get_all_inherits(systems,sub)
|
|
173
|
+
end + (code.select { |sub| is_inherit?(sub,systems) }).to_a
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
# Tells if +code+ is a variable assignment.
|
|
177
|
+
def is_variable_assign?(code)
|
|
178
|
+
return (code[0] == :assign) && (code[1][1][0] == :@ident)
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
# Gets the assigned variable in +code+.
|
|
182
|
+
def get_assign_variable(code)
|
|
183
|
+
return code[1][1]
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
# Tells if +code+ is a signal declaration.
|
|
187
|
+
def is_signal_declare?(code)
|
|
188
|
+
return [:command,:command_call].include?(code[0]) &&
|
|
189
|
+
( has_name_deep?(code,"input") ||
|
|
190
|
+
has_name_deep?(code,"output") ||
|
|
191
|
+
has_name_deep?(code,"inout") ||
|
|
192
|
+
has_name_deep?(code,"inner") )
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
# Tells if +code+ is an instance declaration of one of +systems+.
|
|
196
|
+
def is_instance_declare?(code,systems)
|
|
197
|
+
return code[0] == :command &&
|
|
198
|
+
systems.find {|sys| has_name_deep?(code,sys) }
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
# Tells if +code+ is an HDLRuby declaration of a signal or an
|
|
202
|
+
# instance of one of +systems+.
|
|
203
|
+
def is_hdr_declare?(code, systems)
|
|
204
|
+
return is_system?(code) || is_signal_declare?(code) ||
|
|
205
|
+
is_instance_declare?(code, systems)
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
# Gets the HDLRuby names declared from +code+.
|
|
209
|
+
#
|
|
210
|
+
# Note: assumes code is indeed a declaration.
|
|
211
|
+
def get_hdr_declares(code)
|
|
212
|
+
if code.is_a?(Array) then
|
|
213
|
+
if code[0] == :@ident then
|
|
214
|
+
return [ code[1] ]
|
|
215
|
+
else
|
|
216
|
+
return code.map {|elem| get_hdr_declares(elem) }.flatten
|
|
217
|
+
end
|
|
218
|
+
else
|
|
219
|
+
return []
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
# Gets the line of a code.
|
|
224
|
+
def get_line(code)
|
|
225
|
+
return code[2][0]
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
# Gets the variable name of a code.
|
|
229
|
+
def get_name(code)
|
|
230
|
+
return code[1]
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
# Check for invalid assignments in +code+.
|
|
234
|
+
def assign_check(code = @code)
|
|
235
|
+
system_check = false # Flag telling if the internal of a system
|
|
236
|
+
# is reached.
|
|
237
|
+
hdr_names = [] # The existing HDLRuby names, they cannot be
|
|
238
|
+
# used as Ruby variables.
|
|
239
|
+
code.each do |subcode|
|
|
240
|
+
if system_check then
|
|
241
|
+
# Internal of a system, do a specific check.
|
|
242
|
+
assign_check_in_system(subcode,hdr_names.clone)
|
|
243
|
+
system_check = false
|
|
244
|
+
elsif subcode.is_a?(Array) then
|
|
245
|
+
if (self.is_hdr_declare?(code,hdr_names)) then
|
|
246
|
+
# New HDLRuby name, add them to the hdr names.
|
|
247
|
+
hdr_names.concat(self.get_hdr_declares(code))
|
|
248
|
+
end
|
|
249
|
+
if self.is_system?(subcode) then
|
|
250
|
+
# The current subcode is a system, the next one will
|
|
251
|
+
# be its internal.
|
|
252
|
+
system_check = true
|
|
253
|
+
else
|
|
254
|
+
# Go on cheking recursively.
|
|
255
|
+
self.assign_check(subcode)
|
|
256
|
+
end
|
|
257
|
+
end
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
# Check for invalid assignments in +code+ assuming being within
|
|
262
|
+
# a system. For that purpose assigned names are look for in
|
|
263
|
+
# +hdr_names+ that includes the current HDLRuby names.
|
|
264
|
+
def assign_check_in_system(code, hdr_names)
|
|
265
|
+
# puts "hdr_names=#{hdr_names}"
|
|
266
|
+
if (self.is_hdr_declare?(code,hdr_names)) then
|
|
267
|
+
# New HDLRuby names, add them to the hdr names.
|
|
268
|
+
hdr_names.concat(self.get_hdr_declares(code))
|
|
269
|
+
elsif (self.is_variable_assign?(code)) then
|
|
270
|
+
var = self.get_assign_variable(code)
|
|
271
|
+
# puts "var=#{var} and hdr_names=#{hdr_names}"
|
|
272
|
+
if hdr_names.include?(var[1]) then
|
|
273
|
+
# An HDLRuby name is overwritten.
|
|
274
|
+
if @filename then
|
|
275
|
+
warn("*WARNING* In file '#{@filename}': ")
|
|
276
|
+
else
|
|
277
|
+
warn("*WARNING*")
|
|
278
|
+
end
|
|
279
|
+
warn("Potential invalid assignment for '#{self.get_name(var)}' at line #{self.get_line(var)}")
|
|
280
|
+
end
|
|
281
|
+
else
|
|
282
|
+
# Go on checking recursively.
|
|
283
|
+
code.each do |subcode|
|
|
284
|
+
if subcode.is_a?(Array) then
|
|
285
|
+
self.assign_check_in_system(subcode,hdr_names)
|
|
286
|
+
end
|
|
287
|
+
end
|
|
288
|
+
end
|
|
289
|
+
end
|
|
290
|
+
end
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
if __FILE__ == $0 then
|
|
295
|
+
# Used standalone, check the files given in the standard input.
|
|
296
|
+
include HDLRuby
|
|
297
|
+
|
|
298
|
+
show = false # Tell if in show mode
|
|
299
|
+
|
|
300
|
+
if $*[0] == "-s" || $*[0] == "--show" then
|
|
301
|
+
$*.shift
|
|
302
|
+
# Only shows the syntax tree.
|
|
303
|
+
show = true
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
$*.each do |filename|
|
|
307
|
+
checker = Checker.new(File.read(filename),filename)
|
|
308
|
+
if show then
|
|
309
|
+
checker.show
|
|
310
|
+
# systems = checker.get_all_systems
|
|
311
|
+
# puts "All systems are: #{systems}"
|
|
312
|
+
# puts "All instances of all systems are: #{checker.get_all_instances(systems)}"
|
|
313
|
+
else
|
|
314
|
+
checker.assign_check
|
|
315
|
+
end
|
|
316
|
+
end
|
|
317
|
+
end
|