HDLRuby 2.0.8

Sign up to get free protection for your applications and to get access to all the features.
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,398 @@
1
+ require 'yaml'
2
+
3
+ require "HDLRuby/hruby_bstr"
4
+
5
+
6
+ module HDLRuby
7
+
8
+ # Reduce a constant +name+ to +num+ number of namespace levels.
9
+ def self.const_reduce(name, num = 1)
10
+ levels = name.split("::")
11
+ return levels[-([num,levels.size].min)..-1].join("::")
12
+ end
13
+
14
+
15
+ # The classes meant to support to_basic.
16
+ TO_BASICS = [
17
+ # Low::SystemT, Low::SignalT, Low::Behavior, Low::TimeBehavior,
18
+ Low::SystemT,
19
+ Low::Scope,
20
+ Low::Type, # Low::TypeNumeric,
21
+ Low::TypeDef,
22
+ Low::TypeVector,
23
+ Low::TypeSigned, Low::TypeUnsigned, Low::TypeFloat,
24
+ Low::TypeTuple, Low::TypeStruct,
25
+ Low::Behavior, Low::TimeBehavior,
26
+ Low::Event, Low::Block, Low::TimeBlock, Low::Code,
27
+ Low::SignalI, Low::SignalC,
28
+ Low::SystemI, Low::Connection,
29
+ Low::Transmit, Low::If, Low::Case, Low::When, Low::Cast,
30
+ Low::TimeWait, Low::TimeRepeat,
31
+ Low::Delay,
32
+ # Low::Value, Low::Unary, Low::Binary, Low::Ternary, Low::Concat,
33
+ Low::Value, Low::Unary, Low::Binary, Low::Select, Low::Concat,
34
+ Low::RefConcat, Low::RefIndex, Low::RefRange,
35
+ Low::RefName, Low::RefThis,
36
+
37
+ BitString
38
+ ]
39
+ # The names of the classes of HDLRuby supporting to_basic
40
+ TO_BASIC_NAMES = TO_BASICS.map { |klass| const_reduce(klass.to_s) }
41
+ # The classes describing types (must be described only once)
42
+ TO_BASICS_TYPES = [Low::SystemT,
43
+ Low::Type, Low::TypeDef,
44
+ Low::TypeVector, Low::TypeTuple, Low::TypeStruct]
45
+
46
+ # The list of fields to exclude from serialization.
47
+ FIELDS_TO_EXCLUDE = { Low::SystemT => [:@interface,:@parent ] }
48
+ FIELDS_TO_EXCLUDE.default = [ :@parent ]
49
+
50
+ # The list of fields that correspond to reference.
51
+ FIELDS_OF_REF = { Low::SystemI => [ :@systemT,:@systemTs ] }
52
+ FIELDS_OF_REF.default = [ :@type ]
53
+
54
+ # The name of the reference argument if any.
55
+ REF_ARG_NAMES = { Low::SystemI => ["systemT","systemTs"],
56
+ Low::SignalI => ["type"],
57
+ Low::TypeVector => ["base"],
58
+ Low::TypeTuple => ["types"],
59
+ Low::RefThis => ["type"],
60
+ Low::RefName => ["type"],
61
+ Low::RefIndex => ["type"],
62
+ Low::Unary => ["type"],
63
+ Low::Binary => ["type"],
64
+ Low::Select => ["type"],
65
+ Low::Value => ["type"]
66
+ }
67
+
68
+ # The table of the object that can be refered to, used when deserializing.
69
+ FROM_BASICS_REFS = { }
70
+
71
+ # Tells if a +basic+ structure is a representation of an HDLRuby object.
72
+ def self.is_basic_HDLRuby?(basic)
73
+ return ( basic.is_a?(Hash) and basic.size == 1 and
74
+ TO_BASIC_NAMES.include?(HDLRuby.const_reduce(basic.keys[0])) )
75
+ end
76
+
77
+
78
+ # Converts a +value+ to a basic structure easy-to-write YAML string.
79
+ #
80
+ # Other parameters:
81
+ # +top+:: indicates if the object is the top of the
82
+ # description or not. If it is the top, the namespace it comes
83
+ # from is kept.
84
+ # +types+:: contains the type objects which will have to be converted
85
+ # separately.
86
+ # def self.value_to_basic(value, types = {})
87
+ # Converts a +value+ to a basic structure easy-to-write YAML string.
88
+ #
89
+ # Other parameters:
90
+ # +ref+:: indicates if the object is a reference or not.
91
+ # +types+:: contains the type objects which will have to be converted
92
+ # separately.
93
+ # +generated+:: is the stack of the generated named objects in the current
94
+ # context.
95
+ def self.value_to_basic(ref, value, types = {}, generated = [[]])
96
+ # Depending on the class.
97
+ if value.is_a?(Symbol) then
98
+ # Symbol objects are converted to strings.
99
+ return value.to_s
100
+ elsif value.is_a?(String) then
101
+ # String objects are cloned for avoid side effects.
102
+ return value.clone
103
+ elsif value.is_a?(Numeric) or value.is_a?(NilClass) then
104
+ # Nil and Numeric objects are kept as they are.
105
+ return value
106
+ elsif value.is_a?(Range)
107
+ # Convert to an array made of the converted first and last.
108
+ return [value_to_basic(ref,value.first,types,generated),
109
+ value_to_basic(ref,value.last,types,generated)]
110
+ elsif value.is_a?(Array) then
111
+ # Arrays are kept as they are, but their content is converted
112
+ # to basic.
113
+ return value.map { |elem| value_to_basic(ref,elem,types,generated) }
114
+ # elsif value.is_a?(Base::HashName) then
115
+ elsif value.is_a?(Low::HashName) then
116
+ # Hash name, convert it to an array.
117
+ return value.map { |v| value_to_basic(ref,v,types,generated) }
118
+ elsif value.is_a?(Hash) then
119
+ # Maybe the hash is empty.
120
+ if value.empty? then
121
+ return { }
122
+ end
123
+ # Convert its content to basic.
124
+ return value.map do |k,v|
125
+ [value_to_basic(ref,k,types,generated),
126
+ value_to_basic(ref,v,types,generated)]
127
+ end.to_h
128
+ else
129
+ # For the other cases, only HDLRuby classes supporting to_basic
130
+ # are supported.
131
+ unless TO_BASICS.include?(value.class) then
132
+ raise AnyError, "Invalid class for converting to basic structure: #{value.class}"
133
+ end
134
+ # return value.to_basic(false,types)
135
+ return value.to_basic(false,ref,types,generated)
136
+ end
137
+ end
138
+
139
+
140
+ # Convert a +basic+ structure to a ruby object.
141
+ def self.basic_to_value(basic)
142
+ # print "For basic=#{basic} (#{basic.class})\n"
143
+ # Detect which kind of basic struture it is.
144
+ if basic.is_a?(NilClass) or basic.is_a?(Numeric) or
145
+ basic.is_a?(Low::Value) then
146
+ # Nil, Numeric or Value objects are kept as they are.
147
+ return basic
148
+ elsif basic.is_a?(Range) then
149
+ # First and last of range are converted.
150
+ return basic_to_value(basic.first)..basic_to_value(basic.last)
151
+ elsif basic.is_a?(String) then
152
+ # String objects are cloned for avoiding side effects.
153
+ return basic.clone
154
+ elsif basic.is_a?(Array) then
155
+ # Array objects are kept as they are, but their content is converted
156
+ # to basic.
157
+ return basic.map { |elem| basic_to_value(elem) }
158
+ elsif basic.is_a?(Hash) then
159
+ # Is the hash representing a class?
160
+ # print "basic.size = #{basic.size}\n"
161
+ # if basic.size == 1 then
162
+ # print "name = #{HDLRuby.const_reduce(basic.keys[0])}\n"
163
+ # end
164
+ if is_basic_HDLRuby?(basic) then
165
+ # Yes, rebuild the object.
166
+ # First get the class.
167
+ klass = HDLRuby.const_get(basic.keys[0])
168
+ # print "klass=#{klass}\n"
169
+ # The the content.
170
+ content = basic.values[0]
171
+ # Handle the case of the ranges
172
+ content.each do |k,v|
173
+ if k.to_sym == :range and v.is_a?(Array) then
174
+ content[k] = basic_to_value(v[0])..basic_to_value(v[1])
175
+ end
176
+ end
177
+ # Single instance variables are set with the structure,
178
+ # separate them from the multiple instances.
179
+ multiples,singles = content.partition do |k,v|
180
+ (v.is_a?(Hash) or v.is_a?(Array)) and !is_basic_HDLRuby?(v)
181
+ end
182
+ # Create the object.
183
+ # Get the name of the reference used in the constructor if any
184
+ ref = REF_ARG_NAMES[klass]
185
+ # Process the arguments of the object constructor.
186
+ singles.map! do |k,v|
187
+ # puts "ref=#{ref} k=#{k} v=#{v}"
188
+ elem = basic_to_value(v)
189
+ # puts "elem=#{elem}"
190
+ # if ref == k and elem.is_a?(String) then
191
+ if ref and ref.include?(k) and elem.is_a?(String) then
192
+ # The argument is actually a reference, get the
193
+ # corresponding object.
194
+ elem = FROM_BASICS_REFS[elem.to_sym]
195
+ end
196
+ # puts "now elem=#{elem}"
197
+ elem
198
+ end
199
+ # Build the object with the processed arguments.
200
+ # object = klass.new(*singles.map{|k,v| basic_to_value(v) })
201
+ # puts "klass=#{klass}, singles=#{singles.join("\n")}, multiples=#{multiples.join("\n")}"
202
+ object = klass.new(*singles)
203
+ # Adds the multiple instances.
204
+ multiples.each do |k,v|
205
+ # puts "k=#{k} v=#{v}"
206
+ # Construct the add method: add_<key name without ending s>
207
+ add_meth = ("add_" + k)[0..-2].to_sym
208
+ # Treat the values a an array.
209
+ v = v.values if v.is_a?(Hash)
210
+ # puts "v=#{v}"
211
+ v.each do |elem|
212
+ # object.send(add_meth, *basic_to_value(elem) )
213
+ elem = basic_to_value(elem)
214
+ # puts "ref=#{ref}, k=#{k}"
215
+ # puts "to add elem=#{elem}"
216
+ # if ref == k and elem.is_a?(String) then
217
+ if ref and ref.include?(k) and elem.is_a?(String) then
218
+ # The argument is actually a reference, get the
219
+ # corresponding object.
220
+ elem = FROM_BASICS_REFS[elem.to_sym]
221
+ end
222
+ # puts "adding elem=#{elem} to object=#{object}" if elem.is_a?(SystemT)
223
+ # In general it is enough to add the element to
224
+ # the object. However, in the case of a systemI,
225
+ # the main systemT is added to the list at
226
+ # the creation of the SystemI and is therefore
227
+ # not to be added.
228
+ if !object.is_a?(SystemI) || object.systemT != elem
229
+ object.send(add_meth, *elem )
230
+ end
231
+ end
232
+ end
233
+ # Store the objects if it is named.
234
+ if object.respond_to?(:name) then
235
+ # puts "Registering name=#{object.name} with #{object}"
236
+ FROM_BASICS_REFS[object.name] = object
237
+ end
238
+ # Returns the resulting object.
239
+ return object
240
+ else
241
+ # No, this a standard hash, keep it as is but convert its
242
+ # contents.
243
+ return basic.map do |k,v|
244
+ [ basic_to_value(k), basic_to_value(v) ]
245
+ end.to_h
246
+ end
247
+ else
248
+ # Other cases should happen.
249
+ raise AnyError, "Invalid class for a basic object: #{basic.class}."
250
+ end
251
+ end
252
+
253
+
254
+ # Convert a stream to a HDLRuby list of objects.
255
+ def self.from_yaml(stream)
256
+ # Get the basic structure from the stream.
257
+ basic = YAML.load_stream(stream)
258
+ # Convert the basic structure to HDLRuby objects.
259
+ return basic_to_value(basic)
260
+ end
261
+
262
+ #
263
+ # Module adding serialization capability to HDLRuby classes
264
+ ###########################################################
265
+ module Serializer
266
+
267
+ # Converts the object to a basic structure which can be dumped into an
268
+ # easy-to-write YAML string.
269
+ #
270
+ # Other parameters:
271
+ # +top+:: indicates if the object is the top of the
272
+ # description or not. If it is the top, the namespace it comes
273
+ # from is kept.
274
+ # +types+:: contains the type objects which will have to be converted
275
+ # separately.
276
+ # def to_basic(top = true, types = {})
277
+ # Converts the object to a basic structure which can be dumped into an
278
+ # easy-to-write YAML string.
279
+ #
280
+ # Other parameters:
281
+ # +top+:: indicates if the object is the top of the
282
+ # description or not. If it is the top, the namespace it comes
283
+ # from is kept.
284
+ # +ref+:: indicates if the object is a reference or not.
285
+ # If it is a reference, its generation is to be skipped
286
+ # for later.
287
+ # +types+:: contains the type objects which will have to be converted
288
+ # separately.
289
+ # +generated+:: is the stack of the generated named objects in the
290
+ # current context.
291
+ def to_basic(top = true, ref = false, types = {}, generated = [[]])
292
+ # if !top and TO_BASICS_TYPES.include?(self.class) and
293
+ # Ensure it is a initial ref: if the object has no name
294
+ # it is the case.
295
+ if ref then
296
+ ref = self.respond_to?(:name) && !self.name.empty?
297
+ end
298
+ # Process the object
299
+ if !top and ref then
300
+ # Refered object, but not the top, add it to the types list
301
+ # without converting it if not already generated.
302
+ unless generated.flatten.include?(self.name)
303
+ # puts "Adding type with name=#{self.name}\n"
304
+ types[self.name] = self
305
+ end
306
+ # puts "types=#{types}"
307
+ # And return the name.
308
+ return self.name.to_s
309
+ end
310
+ # puts "generating #{self.class} with name=#{self.name}\n" if self.respond_to?(:name)
311
+ # Self is generated, remove it from the types to generate.
312
+ generated[-1] << self.name if self.respond_to?(:name)
313
+ # Add a level to the stack of generated named objects.
314
+ generated << []
315
+ # print "to_basic for class=#{self.class}\n"
316
+ # Create the hash which will contains the content of the object.
317
+ content = { }
318
+ # Create the resulting hash with a single entry whose key
319
+ # is the class name and whose value is the content of the
320
+ # object.
321
+ class_name = self.class.to_s
322
+ # Keep only the class name
323
+ class_name = HDLRuby.const_reduce(class_name)
324
+
325
+ result = { class_name => content }
326
+ # Fills the contents with the instance variables value.
327
+ self.instance_variables.each do |var_sym|
328
+ # Skip the fields that should not be serialized
329
+ # next if var_sym == :@parent # Now added to FIELDS_TO_EXCLUDE
330
+ next if (FIELDS_TO_EXCLUDE[self.class] and
331
+ FIELDS_TO_EXCLUDE[self.class].include?(var_sym) )
332
+ # print "for instance variable #{var_sym}...\n"
333
+ # Skip the parent.
334
+ # Get the value of the variable.
335
+ var_val = self.instance_variable_get(var_sym)
336
+ # Sets the content.
337
+ # content[var_sym] = HDLRuby.value_to_basic(var_val,types)
338
+ value = HDLRuby.value_to_basic(
339
+ # FIELDS_OF_REF[self.class].include?(var_sym) &&
340
+ # var_val.respond_to?(:name) && !var_val.name.empty?,
341
+ FIELDS_OF_REF[self.class].include?(var_sym),
342
+ var_val, types,generated)
343
+ # Remove the @ from the symbol.
344
+ var_sym = var_sym.to_s[1..-1]
345
+ # EMPTY VALUES ARE NOT SKIPPED
346
+ # # Empty values are skipped
347
+ # unless value.respond_to?(:empty?) and value.empty? then
348
+ # content[var_sym] = value
349
+ # end
350
+ content[var_sym] = value
351
+ end
352
+
353
+ if top and !types.empty? then
354
+ # It is a top and there where types.
355
+ # The result is a sequence including each type and the
356
+ # current object.
357
+ result = [ result ]
358
+ # Sort the type so that data types comes first.
359
+ to_treat = types.each.partition {|name,type| !type.is_a?(Type) }
360
+ to_treat.flatten!(1)
361
+ while !to_treat.empty?
362
+ others = {}
363
+ to_treat.each do |name,type|
364
+ # print "Dumping type with name=#{name}\n"
365
+ # type_basic = type.to_basic(true)
366
+ type_basic = type.to_basic(true,others)
367
+ type_basic = type_basic.last if type_basic.is_a?(Array)
368
+ result.unshift(type_basic)
369
+ end
370
+ to_treat = others
371
+ end
372
+
373
+ end
374
+
375
+ # Restore the stack of generated named objets.
376
+ generated.pop
377
+
378
+ # Return the resulting hash.
379
+ return result
380
+ end
381
+
382
+ # Converts the object to YAML string.
383
+ def to_yaml
384
+ # Convert the object to basic representations
385
+ basics = to_basic
386
+ # puts "basics=#{basics}"
387
+ basics = [ basics ] unless basics.is_a?(Array)
388
+ # Remove duplicate descriptions
389
+ basics.uniq! { |elem| elem.first[1]["name"] }
390
+ # Convert the basic representations to YAML
391
+ return YAML.dump_stream(*basics)
392
+ end
393
+ end
394
+
395
+
396
+ # Adds the serializing features to the HDLRuby classes supporting to_basic.
397
+ TO_BASICS.each { |klass| klass.include(Serializer) }
398
+ end
@@ -0,0 +1,37 @@
1
+
2
+ module HDLRuby
3
+
4
+ ##
5
+ # General tools for handling HDLRuby objects
6
+ #######################################################
7
+
8
+
9
+ # Method and attribute for generating an absolute uniq name.
10
+ # Such names cannot be used in HDLRuby::High code, but can be used
11
+ # to generate such code.
12
+
13
+ @@absoluteCounter = -1 # The absolute name counter.
14
+
15
+ # Generates an absolute uniq name.
16
+ def self.uniq_name
17
+ @@absoluteCounter += 1
18
+ name = ":#{@@absoluteCounter}"
19
+ if Symbol.all_symbols.find {|symbol| symbol.to_s == name } then
20
+ # The symbol exists, try again.
21
+ return self.uniq_name
22
+ else
23
+ return name.to_sym
24
+ end
25
+ end
26
+
27
+
28
+ # Extends the Integer class for computing the bit width.
29
+ class ::Integer
30
+
31
+ # Gets the bit width
32
+ def width
33
+ return Math.log2(self+1).ceil
34
+ end
35
+ end
36
+
37
+ end
@@ -0,0 +1,239 @@
1
+ module HDLRuby
2
+
3
+ ##
4
+ # Library for imnplementing the type processing
5
+ #
6
+ ########################################################################
7
+
8
+
9
+ # To include to classes for type processing support.
10
+ module Tprocess
11
+
12
+ # Creates a new generic vector type named +name+ from +base+ type and
13
+ # with +range+.
14
+ # NOTE: used for type processing.
15
+ def make(name,base,range)
16
+ # Generate a vector or a scalar type depending on the range.
17
+ # First for checking the rangem ensures the bounds are Ruby
18
+ # values.
19
+ first = range.first
20
+ last = range.last
21
+ first = first.content if first.is_a?(Value)
22
+ last = last.content if last.is_a?(Value)
23
+ # Necessarily a TypeVector, since [0..0] has actually a
24
+ # different meaning from [0]!
25
+ # # Now can compare at Ruby level (and not HDLRuby level).
26
+ # if first == last then
27
+ # # Single-element, return the base.
28
+ # return base
29
+ # else
30
+ # # Multiple elements, create a new type vector.
31
+ # return TypeVector.new(name,base,range)
32
+ # end
33
+ return TypeVector.new(name,base,range)
34
+ end
35
+
36
+ # Type resolution: decide which class to use for representing
37
+ # a computating result with +type+.
38
+ def resolve(type)
39
+ # puts "self=#{self} type=#{type}"
40
+ if self.float? then
41
+ return self
42
+ elsif type.float? then
43
+ return type
44
+ elsif self.signed? then
45
+ return self
46
+ elsif type.signed? then
47
+ return type
48
+ elsif self.unsigned? then
49
+ return self
50
+ elsif type.unsigned? then
51
+ return type
52
+ elsif self.width >= type.width then
53
+ return self
54
+ else
55
+ return type
56
+ end
57
+ end
58
+
59
+ # Range access with +idx+
60
+ # NOTE:
61
+ # - +idx+ may be a range.
62
+ # - Do not use the [] operator for this since it is used for
63
+ # defining vector types!
64
+ def slice(idx)
65
+ if idx.is_a?(Range) then
66
+ # Make a resized vector.
67
+ return make(:"",self.base,idx)
68
+ else
69
+ # Return the base type.
70
+ return self.base
71
+ end
72
+ end
73
+
74
+
75
+ # Arithmetic operations
76
+
77
+ # Addition.
78
+ def +(type)
79
+ # Resolve the type class.
80
+ resolved = self.resolve(type)
81
+ # New type range: largest range + 1
82
+ bounds = [ self.range.first.to_i, type.range.first.to_i,
83
+ self.range.last.to_i, type.range.last.to_i ]
84
+ res_lsb = bounds.min
85
+ res_msb = bounds.max + 1
86
+ # Create and return the new type: its endianess is the one of self
87
+ if self.range.first.to_i > self.range.last.to_i then
88
+ return resolved.make(:"",resolved.base,res_msb..res_lsb)
89
+ else
90
+ return resolved.make(:"",resolved.base,res_lsb..res_msb)
91
+ end
92
+ end
93
+
94
+ # Subtraction
95
+ alias_method :-, :+
96
+
97
+ # Multiplication
98
+ def *(type)
99
+ # Resolve the type class.
100
+ resolved = self.resolve(type)
101
+ # New type range: largest range * 2
102
+ bounds = [ self.range.first.to_i, type.range.first.to_i,
103
+ self.range.last.to_i, type.range.last.to_i ]
104
+ res_lsb = bounds.min
105
+ res_msb = bounds.max * 2
106
+ # Create and return the new type: its endianess is the one of self
107
+ if self.range.first.to_i > self.range.last.to_i then
108
+ return resolved.make(:"",resolved.base,res_msb..res_lsb)
109
+ else
110
+ return resolved.make(:"",resolved.base,res_lsb..res_msb)
111
+ end
112
+ end
113
+
114
+ # Division
115
+ def /(type)
116
+ # Resolve the type class.
117
+ resolved = self.resolve(type)
118
+ # New type range: largest range
119
+ bounds = [ self.range.first.to_i, type.range.first.to_i,
120
+ self.range.last.to_i, type.range.last.to_i ]
121
+ res_lsb = bounds.min
122
+ res_msb = bounds.max
123
+ # Create and return the new type: its endianess is the one of self
124
+ if self.range.first.to_i > self.range.last.to_i then
125
+ return resolved.make(:"",resolved.base,res_msb..res_lsb)
126
+ else
127
+ return resolved.make(:"",resolved.base,res_lsb..res_msb)
128
+ end
129
+ end
130
+
131
+ # Modulo
132
+ alias_method :%, :/
133
+
134
+ # Positive
135
+ def +@()
136
+ return self
137
+ end
138
+
139
+ # Negative
140
+ def -@()
141
+ return self
142
+ end
143
+
144
+ # Absolute value
145
+ def abs()
146
+ return self
147
+ end
148
+
149
+ # Logical operations and comparisons
150
+
151
+
152
+ # And
153
+ def &(type)
154
+ # puts "compute types with=#{self} and #{type}"
155
+ # Resolve the type class.
156
+ resolved = self.resolve(type)
157
+
158
+ # Logical operation on non-vector types are kept as is.
159
+ return resolved unless resolved.is_a?(TypeVector)
160
+
161
+ # Otherwise the range is computed.
162
+ # New type range: largest range
163
+ bounds = [ self.range.first.to_i, type.range.first.to_i,
164
+ self.range.last.to_i, type.range.last.to_i ]
165
+ # puts "bounds=#{bounds}"
166
+ res_lsb = bounds.min
167
+ res_msb = bounds.max
168
+ # Create and return the new type: its endianess is the one of self
169
+ if self.range.first.to_i > self.range.last.to_i then
170
+ return resolved.make(:"",resolved.base,res_msb..res_lsb)
171
+ else
172
+ return resolved.make(:"",resolved.base,res_lsb..res_msb)
173
+ end
174
+ end
175
+
176
+ # Or
177
+ alias_method :|, :&
178
+
179
+ # Xor
180
+ alias_method :^, :&
181
+
182
+ # Not
183
+ def ~()
184
+ return self
185
+ end
186
+
187
+ # Equals
188
+ # alias_method :==, :&
189
+ def ==(type)
190
+ return Bit
191
+ end
192
+ alias_method :!=, :==
193
+
194
+ # Inferior
195
+ alias_method :<, :&
196
+
197
+ # Superior
198
+ alias_method :>, :&
199
+
200
+ # Inferior or equal
201
+ alias_method :<=, :&
202
+
203
+ # Superior or equal
204
+ alias_method :>=, :&
205
+
206
+ # Comparison
207
+ alias_method :<=>, :&
208
+
209
+
210
+ # Shifts
211
+
212
+ # Shift left
213
+ def <<(type)
214
+ # The result type is the type of left.
215
+ resolved = self
216
+ # New type range: 2**(type width) times self range
217
+ bounds = [ self.range.first.to_i, self.range.last.to_i ]
218
+ res_lsb = bounds.min
219
+ res_msb = bounds.max +
220
+ (2 ** ((type.range.last-type.range.first).abs))
221
+ # Create and return the new type: its endianess is the one of self
222
+ if self.range.first.to_i > self.range.last.to_i then
223
+ return resolved.make(:"",resolved.base,res_msb..res_lsb)
224
+ else
225
+ return resolved.make(:"",resolved.base,res_lsb..res_msb)
226
+ end
227
+ end
228
+
229
+ # Shift right
230
+ alias_method :>>, :<<
231
+
232
+
233
+ end
234
+
235
+
236
+
237
+
238
+
239
+ end