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.
Files changed (224) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.travis.yml +5 -0
  4. data/.yardopts +1 -0
  5. data/Gemfile +4 -0
  6. data/HDLRuby.gemspec +36 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +2774 -0
  9. data/README.pdf +0 -0
  10. data/Rakefile +10 -0
  11. data/bin/console +14 -0
  12. data/bin/setup +8 -0
  13. data/exe/hdrcc +3 -0
  14. data/lib/HDLRuby/alcc.rb +137 -0
  15. data/lib/HDLRuby/backend/hruby_allocator.rb +69 -0
  16. data/lib/HDLRuby/backend/hruby_c_allocator.rb +76 -0
  17. data/lib/HDLRuby/hdr_samples/adder.rb +7 -0
  18. data/lib/HDLRuby/hdr_samples/adder_assign_error.rb +11 -0
  19. data/lib/HDLRuby/hdr_samples/adder_bench.rb +27 -0
  20. data/lib/HDLRuby/hdr_samples/adder_gen.rb +7 -0
  21. data/lib/HDLRuby/hdr_samples/adder_nodef_error.rb +7 -0
  22. data/lib/HDLRuby/hdr_samples/addsub.rb +19 -0
  23. data/lib/HDLRuby/hdr_samples/addsubz.rb +22 -0
  24. data/lib/HDLRuby/hdr_samples/alu.rb +47 -0
  25. data/lib/HDLRuby/hdr_samples/calculator.rb +48 -0
  26. data/lib/HDLRuby/hdr_samples/counter_bench.rb +83 -0
  27. data/lib/HDLRuby/hdr_samples/dff.rb +9 -0
  28. data/lib/HDLRuby/hdr_samples/dff_bench.rb +66 -0
  29. data/lib/HDLRuby/hdr_samples/dff_counter.rb +20 -0
  30. data/lib/HDLRuby/hdr_samples/include.rb +14 -0
  31. data/lib/HDLRuby/hdr_samples/instance_open.rb +23 -0
  32. data/lib/HDLRuby/hdr_samples/mei8.rb +256 -0
  33. data/lib/HDLRuby/hdr_samples/mei8_bench.rb +309 -0
  34. data/lib/HDLRuby/hdr_samples/multer_gen.rb +8 -0
  35. data/lib/HDLRuby/hdr_samples/multer_seq.rb +29 -0
  36. data/lib/HDLRuby/hdr_samples/neural/a.rb +9 -0
  37. data/lib/HDLRuby/hdr_samples/neural/a_sub.rb +5 -0
  38. data/lib/HDLRuby/hdr_samples/neural/bw.rb +23 -0
  39. data/lib/HDLRuby/hdr_samples/neural/counter.rb +16 -0
  40. data/lib/HDLRuby/hdr_samples/neural/dadz.rb +9 -0
  41. data/lib/HDLRuby/hdr_samples/neural/dadz_sub.rb +4 -0
  42. data/lib/HDLRuby/hdr_samples/neural/forward.rb +153 -0
  43. data/lib/HDLRuby/hdr_samples/neural/forward_sub.rb +62 -0
  44. data/lib/HDLRuby/hdr_samples/neural/forward_sub_rand.rb +41 -0
  45. data/lib/HDLRuby/hdr_samples/neural/forward_sub_rand_typedef.rb +47 -0
  46. data/lib/HDLRuby/hdr_samples/neural/mem.rb +30 -0
  47. data/lib/HDLRuby/hdr_samples/neural/random.rb +23 -0
  48. data/lib/HDLRuby/hdr_samples/neural/selector.rb +29 -0
  49. data/lib/HDLRuby/hdr_samples/neural/sigmoid.rb +20 -0
  50. data/lib/HDLRuby/hdr_samples/neural/z.rb +33 -0
  51. data/lib/HDLRuby/hdr_samples/prog.obj +256 -0
  52. data/lib/HDLRuby/hdr_samples/ram.rb +18 -0
  53. data/lib/HDLRuby/hdr_samples/register_with_code_bench.rb +98 -0
  54. data/lib/HDLRuby/hdr_samples/rom.rb +10 -0
  55. data/lib/HDLRuby/hdr_samples/struct.rb +14 -0
  56. data/lib/HDLRuby/hdr_samples/sumprod.rb +29 -0
  57. data/lib/HDLRuby/hdr_samples/sw_encrypt_bench.rb +103 -0
  58. data/lib/HDLRuby/hdr_samples/sw_encrypt_cpu_bench.rb +261 -0
  59. data/lib/HDLRuby/hdr_samples/sw_encrypt_cpusim_bench.rb +302 -0
  60. data/lib/HDLRuby/hdr_samples/system_open.rb +11 -0
  61. data/lib/HDLRuby/hdr_samples/tuple.rb +16 -0
  62. data/lib/HDLRuby/hdr_samples/with_channel.rb +118 -0
  63. data/lib/HDLRuby/hdr_samples/with_class.rb +199 -0
  64. data/lib/HDLRuby/hdr_samples/with_decoder.rb +17 -0
  65. data/lib/HDLRuby/hdr_samples/with_fsm.rb +34 -0
  66. data/lib/HDLRuby/hdr_samples/with_reconf.rb +103 -0
  67. data/lib/HDLRuby/hdrcc.rb +623 -0
  68. data/lib/HDLRuby/high_samples/_adder_fault.rb +23 -0
  69. data/lib/HDLRuby/high_samples/_generic_transmission2.rb +146 -0
  70. data/lib/HDLRuby/high_samples/adder.rb +21 -0
  71. data/lib/HDLRuby/high_samples/adder_common_errors.rb +25 -0
  72. data/lib/HDLRuby/high_samples/addsub.rb +33 -0
  73. data/lib/HDLRuby/high_samples/addsubz.rb +37 -0
  74. data/lib/HDLRuby/high_samples/after.rb +28 -0
  75. data/lib/HDLRuby/high_samples/all_signals.rb +29 -0
  76. data/lib/HDLRuby/high_samples/alu.rb +61 -0
  77. data/lib/HDLRuby/high_samples/anonymous.rb +41 -0
  78. data/lib/HDLRuby/high_samples/before.rb +28 -0
  79. data/lib/HDLRuby/high_samples/blockblock.rb +26 -0
  80. data/lib/HDLRuby/high_samples/bugs/dadz.rb +22 -0
  81. data/lib/HDLRuby/high_samples/bugs/misample_instan.rb +20 -0
  82. data/lib/HDLRuby/high_samples/bugs/misample_updown.rb +22 -0
  83. data/lib/HDLRuby/high_samples/bugs/sample_add.rb +16 -0
  84. data/lib/HDLRuby/high_samples/bugs/sample_barrel.rb +13 -0
  85. data/lib/HDLRuby/high_samples/bugs/sample_daice.rb +57 -0
  86. data/lib/HDLRuby/high_samples/bugs/sample_kumiawase.rb +52 -0
  87. data/lib/HDLRuby/high_samples/bugs/sample_multi.rb +18 -0
  88. data/lib/HDLRuby/high_samples/bugs/sample_sub.rb +14 -0
  89. data/lib/HDLRuby/high_samples/bugs/z2.rb +32 -0
  90. data/lib/HDLRuby/high_samples/case.rb +32 -0
  91. data/lib/HDLRuby/high_samples/case2.rb +30 -0
  92. data/lib/HDLRuby/high_samples/change.rb +23 -0
  93. data/lib/HDLRuby/high_samples/clocks.rb +35 -0
  94. data/lib/HDLRuby/high_samples/comparer.rb +21 -0
  95. data/lib/HDLRuby/high_samples/conditionals.rb +29 -0
  96. data/lib/HDLRuby/high_samples/dff.rb +23 -0
  97. data/lib/HDLRuby/high_samples/each.rb +28 -0
  98. data/lib/HDLRuby/high_samples/exporter.rb +42 -0
  99. data/lib/HDLRuby/high_samples/functions.rb +60 -0
  100. data/lib/HDLRuby/high_samples/if_seq.rb +26 -0
  101. data/lib/HDLRuby/high_samples/inherit_as_dff.rb +32 -0
  102. data/lib/HDLRuby/high_samples/inherit_dff.rb +36 -0
  103. data/lib/HDLRuby/high_samples/instance.rb +37 -0
  104. data/lib/HDLRuby/high_samples/memory.rb +64 -0
  105. data/lib/HDLRuby/high_samples/multi_file.rb +27 -0
  106. data/lib/HDLRuby/high_samples/overload.rb +32 -0
  107. data/lib/HDLRuby/high_samples/paper_after.rb +49 -0
  108. data/lib/HDLRuby/high_samples/ram.rb +27 -0
  109. data/lib/HDLRuby/high_samples/registers.rb +139 -0
  110. data/lib/HDLRuby/high_samples/rom.rb +23 -0
  111. data/lib/HDLRuby/high_samples/scopeblockname.rb +37 -0
  112. data/lib/HDLRuby/high_samples/scopescope.rb +26 -0
  113. data/lib/HDLRuby/high_samples/shift.rb +31 -0
  114. data/lib/HDLRuby/high_samples/shift2.rb +40 -0
  115. data/lib/HDLRuby/high_samples/simple_instance.rb +31 -0
  116. data/lib/HDLRuby/high_samples/test_all.sh +10 -0
  117. data/lib/HDLRuby/high_samples/typedef.rb +24 -0
  118. data/lib/HDLRuby/high_samples/values.rb +70 -0
  119. data/lib/HDLRuby/high_samples/vector.rb +22 -0
  120. data/lib/HDLRuby/high_samples/with_decoder.rb +30 -0
  121. data/lib/HDLRuby/high_samples/with_fsm.rb +46 -0
  122. data/lib/HDLRuby/high_samples/with_pipe.rb +43 -0
  123. data/lib/HDLRuby/high_samples/with_seq.rb +25 -0
  124. data/lib/HDLRuby/hruby_bstr.rb +1085 -0
  125. data/lib/HDLRuby/hruby_check.rb +317 -0
  126. data/lib/HDLRuby/hruby_db.rb +432 -0
  127. data/lib/HDLRuby/hruby_error.rb +44 -0
  128. data/lib/HDLRuby/hruby_high.rb +4103 -0
  129. data/lib/HDLRuby/hruby_low.rb +4735 -0
  130. data/lib/HDLRuby/hruby_low2c.rb +1986 -0
  131. data/lib/HDLRuby/hruby_low2high.rb +738 -0
  132. data/lib/HDLRuby/hruby_low2seq.rb +248 -0
  133. data/lib/HDLRuby/hruby_low2sym.rb +126 -0
  134. data/lib/HDLRuby/hruby_low2vhd.rb +1437 -0
  135. data/lib/HDLRuby/hruby_low_bool2select.rb +295 -0
  136. data/lib/HDLRuby/hruby_low_cleanup.rb +193 -0
  137. data/lib/HDLRuby/hruby_low_fix_types.rb +437 -0
  138. data/lib/HDLRuby/hruby_low_mutable.rb +1803 -0
  139. data/lib/HDLRuby/hruby_low_resolve.rb +165 -0
  140. data/lib/HDLRuby/hruby_low_skeleton.rb +129 -0
  141. data/lib/HDLRuby/hruby_low_with_bool.rb +141 -0
  142. data/lib/HDLRuby/hruby_low_with_port.rb +167 -0
  143. data/lib/HDLRuby/hruby_low_with_var.rb +302 -0
  144. data/lib/HDLRuby/hruby_low_without_bit2vector.rb +88 -0
  145. data/lib/HDLRuby/hruby_low_without_concat.rb +162 -0
  146. data/lib/HDLRuby/hruby_low_without_connection.rb +113 -0
  147. data/lib/HDLRuby/hruby_low_without_namespace.rb +718 -0
  148. data/lib/HDLRuby/hruby_low_without_outread.rb +107 -0
  149. data/lib/HDLRuby/hruby_low_without_select.rb +206 -0
  150. data/lib/HDLRuby/hruby_serializer.rb +398 -0
  151. data/lib/HDLRuby/hruby_tools.rb +37 -0
  152. data/lib/HDLRuby/hruby_types.rb +239 -0
  153. data/lib/HDLRuby/hruby_values.rb +64 -0
  154. data/lib/HDLRuby/hruby_verilog.rb +1888 -0
  155. data/lib/HDLRuby/hruby_verilog_name.rb +52 -0
  156. data/lib/HDLRuby/low_samples/adder.yaml +97 -0
  157. data/lib/HDLRuby/low_samples/after.yaml +228 -0
  158. data/lib/HDLRuby/low_samples/before.yaml +223 -0
  159. data/lib/HDLRuby/low_samples/blockblock.yaml +48 -0
  160. data/lib/HDLRuby/low_samples/bugs/sample_add.yaml +97 -0
  161. data/lib/HDLRuby/low_samples/bugs/sample_daice.yaml +444 -0
  162. data/lib/HDLRuby/low_samples/bugs/sample_kumiawase.yaml +332 -0
  163. data/lib/HDLRuby/low_samples/bugs/sample_sub.yaml +97 -0
  164. data/lib/HDLRuby/low_samples/bugs/seqpar.yaml +184 -0
  165. data/lib/HDLRuby/low_samples/case.yaml +327 -0
  166. data/lib/HDLRuby/low_samples/change.yaml +135 -0
  167. data/lib/HDLRuby/low_samples/clocks.yaml +674 -0
  168. data/lib/HDLRuby/low_samples/cloner.rb +22 -0
  169. data/lib/HDLRuby/low_samples/comparer.yaml +85 -0
  170. data/lib/HDLRuby/low_samples/conditionals.yaml +133 -0
  171. data/lib/HDLRuby/low_samples/dff.yaml +107 -0
  172. data/lib/HDLRuby/low_samples/each.yaml +1328 -0
  173. data/lib/HDLRuby/low_samples/exporter.yaml +226 -0
  174. data/lib/HDLRuby/low_samples/functions.yaml +298 -0
  175. data/lib/HDLRuby/low_samples/generic_transmission.yaml +597 -0
  176. data/lib/HDLRuby/low_samples/inherit_as_dff.yaml +125 -0
  177. data/lib/HDLRuby/low_samples/inherit_dff.yaml +107 -0
  178. data/lib/HDLRuby/low_samples/load_yaml.rb +11 -0
  179. data/lib/HDLRuby/low_samples/memory.yaml +678 -0
  180. data/lib/HDLRuby/low_samples/namespace_extractor.rb +23 -0
  181. data/lib/HDLRuby/low_samples/overload.yaml +226 -0
  182. data/lib/HDLRuby/low_samples/paper_after.yaml +431 -0
  183. data/lib/HDLRuby/low_samples/port_maker.rb +14 -0
  184. data/lib/HDLRuby/low_samples/ram.yaml +207 -0
  185. data/lib/HDLRuby/low_samples/registers.yaml +228 -0
  186. data/lib/HDLRuby/low_samples/rom.yaml +2950 -0
  187. data/lib/HDLRuby/low_samples/shift.yaml +230 -0
  188. data/lib/HDLRuby/low_samples/shift2.yaml +2095 -0
  189. data/lib/HDLRuby/low_samples/simple_instance.yaml +102 -0
  190. data/lib/HDLRuby/low_samples/test_all.sh +43 -0
  191. data/lib/HDLRuby/low_samples/typedef.yaml +115 -0
  192. data/lib/HDLRuby/low_samples/values.yaml +577 -0
  193. data/lib/HDLRuby/low_samples/variable_maker.rb +14 -0
  194. data/lib/HDLRuby/low_samples/vector.yaml +56 -0
  195. data/lib/HDLRuby/low_samples/with_seq.yaml +188 -0
  196. data/lib/HDLRuby/low_samples/yaml2hdr.rb +10 -0
  197. data/lib/HDLRuby/low_samples/yaml2vhd.rb +19 -0
  198. data/lib/HDLRuby/sim/Makefile +19 -0
  199. data/lib/HDLRuby/sim/hruby_sim.h +590 -0
  200. data/lib/HDLRuby/sim/hruby_sim_calc.c +2362 -0
  201. data/lib/HDLRuby/sim/hruby_sim_core.c +589 -0
  202. data/lib/HDLRuby/sim/hruby_sim_list.c +93 -0
  203. data/lib/HDLRuby/sim/hruby_sim_vizualize.c +91 -0
  204. data/lib/HDLRuby/sim/hruby_value_pool.c +64 -0
  205. data/lib/HDLRuby/std/channel.rb +354 -0
  206. data/lib/HDLRuby/std/clocks.rb +165 -0
  207. data/lib/HDLRuby/std/counters.rb +82 -0
  208. data/lib/HDLRuby/std/decoder.rb +214 -0
  209. data/lib/HDLRuby/std/fsm.rb +516 -0
  210. data/lib/HDLRuby/std/pipeline.rb +220 -0
  211. data/lib/HDLRuby/std/reconf.rb +309 -0
  212. data/lib/HDLRuby/test_hruby_bstr.rb +2259 -0
  213. data/lib/HDLRuby/test_hruby_high.rb +594 -0
  214. data/lib/HDLRuby/test_hruby_high_low.rb +99 -0
  215. data/lib/HDLRuby/test_hruby_low.rb +934 -0
  216. data/lib/HDLRuby/v_samples/adder.v +10 -0
  217. data/lib/HDLRuby/v_samples/dff.v +12 -0
  218. data/lib/HDLRuby/v_samples/ram.v +20 -0
  219. data/lib/HDLRuby/v_samples/rom.v +270 -0
  220. data/lib/HDLRuby/version.rb +3 -0
  221. data/lib/HDLRuby.rb +11 -0
  222. data/makedoc +1 -0
  223. data/metadata.yaml +4 -0
  224. 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