HDLRuby 2.4.29 → 2.5.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a583dff628b7090369ac26e9136e3c911204ea3078135fecfd249e1cd4521d2b
4
- data.tar.gz: 1ac0f7881ab17a0ac1bf69cccc2028ae129eb5ac99640440ddb05fdb18605fe1
3
+ metadata.gz: 99c77fd470dae8d84cb066923fc8ed89d18e2aafa8bc826df85e03cae674c4e2
4
+ data.tar.gz: 4ef6902aec739f56c398bd653dc30f0dc03227799e1f54a9900b762d1a077aaa
5
5
  SHA512:
6
- metadata.gz: c6883993bfcd2f3956710c1a88550faa6bc892b579a1741c85f43c19a44baafa3429d0735cbbdc7cacba7f51cbf40d92bfa3b0b74ba5c6fe014779935b82f6b5
7
- data.tar.gz: e94a1ea16d576f5b1424ac2a3274ff43d5ed8a95471ad6ee4c86d45ec7d956c375f64c8011f8bdf7c7c85d2f02c882f869ca3d4e81f986831263a633f60e14e8
6
+ metadata.gz: 8c9972c8567cb1fd496268c4385b7f3caa0bd8718769254542adeceafafdc26ed09d5ce7c47430e0b0732ecbcda4ea5d0220cf4bc7be9721faf5b99bf47057cf
7
+ data.tar.gz: d300640fdc354ed55f9210c95d4aee10e52768a59ac39a993b402d8da78dd091f31d97fe307fe96b729d9194b532bf958761070224663e3bf2cd37e165877c21
@@ -0,0 +1,79 @@
1
+ require "HDLRuby/template_expander"
2
+
3
+ ##
4
+ # XCD file generator from 'xcd' properties
5
+ ##########################################
6
+
7
+
8
+ # Generates a xcd file from the HDLRuby objects from +top+ using
9
+ # their 'xcd' properties.
10
+ # The file is saved in +path+ directory.
11
+ def xcd_generator(top, path)
12
+ # Ensure top is a system.
13
+ if top.is_a?(HDLRuby::Low::SystemI) then
14
+ top = top.systemT
15
+ elsif !top.is_a?(HDLRuby::Low::SystemT) then
16
+ raise "The 'xcd_generator' driver can only be applied on SystemT objects."
17
+ end
18
+
19
+ # Get the name of the resulting file if any.
20
+ if (top.properties.key?(:xcd_file)) then
21
+ xcd_file = top.properties[:xcd_file].join
22
+ else
23
+ # Default file name.
24
+ xcd_file = "default.xcd"
25
+ end
26
+
27
+ # Get the target template.
28
+ xcd_target = top.properties[:xcd_target].join
29
+ xcd_target_name = xcd_target
30
+ xcd_target_name += ".xcd" unless xcd_target_name.end_with?(".xcd")
31
+ xcd_target_tries = [ xcd_target_name,
32
+ File.join(path,xcd_target_name),
33
+ File.join(File.dirname(__FILE__),"xcd",xcd_target_name) ]
34
+ xcd_target_file = xcd_target_tries.find { |fname| File.exist?(fname) }
35
+ unless xcd_target_file then
36
+ raise "XCD target template not found for #{xcd_target}."
37
+ end
38
+ # Load the template.
39
+ template = File.read(xcd_target_file)
40
+
41
+ # Gather the signals by xcd key.
42
+ xcd2sig = top.each_signal.reduce([]) do |ar,sig|
43
+ ar += sig.properties.each_with_key(:xcd).map do |val|
44
+ [val,sig.name.to_s]
45
+ end
46
+ end
47
+
48
+ # Create the template expander that will generate the xcd file.
49
+ expander = TemplateExpander.new([
50
+ [ /^\?.*(\n|\z)/, proc do |str| # Signal link to port
51
+ if xcd2sig.any? do |match,rep|
52
+ if str.include?(match) then
53
+ str = str.gsub("<>",rep)[1..-1]
54
+ else
55
+ false
56
+ end
57
+ end then
58
+ str
59
+ else
60
+ ""
61
+ end
62
+ end ]
63
+ ])
64
+
65
+ # # Generate the xcd file.
66
+ # File.open(File.join(path,xcd_file),"w") do |file|
67
+ # # Generate the signals mapping.
68
+ # top.each_signal do |signal|
69
+ # signal.properties.each_with_key(:xcd) do |value|
70
+ # file << "#{value}\n"
71
+ # end
72
+ # end
73
+ # end
74
+
75
+ # Generate the xcd file.
76
+ File.open(File.join(path,xcd_file),"w") do |file|
77
+ expander.expand(template,file)
78
+ end
79
+ end
@@ -0,0 +1,4 @@
1
+ <Dummy xcd template>
2
+ ?<PORT <> CLK>
3
+ ?<PORT <> RST>
4
+
@@ -0,0 +1,19 @@
1
+ # A simple D-FF
2
+ system :dff do
3
+ input :clk, :rst, :d
4
+ output :q, :qb
5
+
6
+ qb <= ~q
7
+
8
+ par(clk.posedge) { q <= d & ~rst }
9
+
10
+ clk.properties[:xcd] = "CLK"
11
+ rst.properties[:xcd] = "RST"
12
+ d.properties[:xcd] = "PORT0"
13
+ q.properties[:xcd] = "PORT1"
14
+ qb.properties[:xcd] = "PORT2"
15
+ cur_system.properties[:xcd_target] = "dummy"
16
+ cur_system.properties[:xcd_file] = "dff.xcd"
17
+ cur_system.properties[:post_driver] = "drivers/xcd.rb", :xcd_generator
18
+ end
19
+
data/lib/HDLRuby/hdrcc.rb CHANGED
@@ -316,9 +316,9 @@ $optparse = OptionParser.new do |opts|
316
316
  opts.on("-p", "--param x,y,z", "Specify the generic parameters") do |p|
317
317
  $options[:param] = p
318
318
  end
319
- opts.on("--version", "Print the version number, then exit") do
320
- puts "hdrcc: HDLRuby #{HDLRuby::VERSION} compiler"
321
- exit
319
+ opts.on("--dump","Dump all the properties to yaml files") do |v|
320
+ $options[:dump] = v
321
+ $options[:multiple] = v
322
322
  end
323
323
  # opts.on_tail("-h", "--help", "Show this message") do
324
324
  opts.on("-h", "--help", "Show this message") do
@@ -678,3 +678,31 @@ elsif $options[:vhdl] then
678
678
  end
679
679
  end
680
680
  end
681
+
682
+ # Apply the post drivers if any.
683
+ Hdecorator.each_with_property(:post_driver) do |obj, value|
684
+ # Load the driver.
685
+ require_relative(value[0].to_s)
686
+ # Execute it.
687
+ send(value[1].to_sym,obj,$output)
688
+ end
689
+
690
+ # Dump the properties
691
+ if $options[:dump] then
692
+ # Decorate with the parent ids.
693
+ Hdecorator.decorate_parent_id
694
+
695
+ # Generate the directory for the properties
696
+ property_dir = $output + "/properties"
697
+ unless File.directory?(property_dir)
698
+ FileUtils.mkdir_p(property_dir)
699
+ end
700
+
701
+ # Dump to one file per key
702
+ Properties.each_key do |key|
703
+ File.open(property_dir + "/#{key}.yaml", "w") do |f|
704
+ Hdecorator.dump(key,f)
705
+ end
706
+ end
707
+
708
+ end
@@ -0,0 +1,248 @@
1
+ require 'yaml'
2
+ require 'set'
3
+
4
+ module HDLRuby
5
+
6
+ ##
7
+ # Library for describing a decorator used for adding properties to
8
+ # HDLRuby objects that are persistent and can be used for back annotation
9
+ ########################################################################
10
+
11
+ ##
12
+ # Gives a decorator the HDLRuby object.
13
+ module Hdecorator
14
+ # The decorator requires that each HDLRuby object has a uniq
15
+ # persistent id
16
+
17
+ # The id
18
+ attr_reader :hdr_id
19
+
20
+ # The id to object table
21
+ @@id_map = {}
22
+
23
+ # Generate the ID
24
+ @@id_gen = 0
25
+
26
+ # Ensures the ID is generated when object is initialized
27
+ def self.included(base) # built-in Ruby hook for modules
28
+ base.class_eval do
29
+ original_method = instance_method(:initialize)
30
+ define_method(:initialize) do |*args, &block|
31
+ original_method.bind(self).call(*args, &block)
32
+ # Generate the id.
33
+ @hdr_id = @@id_gen
34
+ @@id_gen += 1
35
+ # Update the id to object table
36
+ @@id_map[@hdr_id] = self
37
+ end
38
+ end
39
+ end
40
+
41
+ # Get an object by id.
42
+ def self.get(id)
43
+ return @@id_map[id]
44
+ end
45
+
46
+ # Iterate over all the id with their object.
47
+ #
48
+ # Returns an enumerator if no ruby block is given.
49
+ def self.each(&ruby_block)
50
+ # No ruby block? Return an enumerator.
51
+ return to_enum(:each) unless ruby_block
52
+ # A ruby block? Apply it on each object.
53
+ @@id_map.each(&ruby_block)
54
+ end
55
+
56
+ # The decorator also need to add properties to the HDLRuby objects.
57
+
58
+ # Access the set of properties
59
+ def properties
60
+ # Create the properties if not present.
61
+ unless @properties then
62
+ @properties = Properties.new(self)
63
+ end
64
+ return @properties
65
+ end
66
+
67
+ # Iterate over all the objects from +top+ with +prop+ property.
68
+ #
69
+ # Returns an enumerator if no ruby block is given.
70
+ # NOTE: if +top+ is not given, iterate over all the objects.
71
+ def self.each_with_property(prop, top = nil, &ruby_block)
72
+ # No ruby block? Return an enumerator.
73
+ return to_enum(:each_with_property) unless ruby_block
74
+ # A ruby block? Apply the ruby_block...
75
+ if (top) then
76
+ # A top... on each object from it.
77
+ top.each_deep do |obj|
78
+ if (obj.properties.key?(prop)) then
79
+ ruby_block.call(obj, *obj.properties[prop])
80
+ end
81
+ end
82
+ else
83
+ # No top... on all the objects.
84
+ self.each do |id,obj|
85
+ if (obj.properties.key?(prop)) then
86
+ ruby_block.call(obj, *obj.properties[prop])
87
+ end
88
+ end
89
+ end
90
+ end
91
+
92
+ # # Access the set of properties and the inherited properties from
93
+ # # the high objects.
94
+ # def all_properties
95
+ # high_id = self.properties[:low2high]
96
+ # if high_id && high_id >= 0 then
97
+ # return properties.merge(Hdecorator.get(high_id))
98
+ # else
99
+ # return properties.clone
100
+ # end
101
+ # end
102
+
103
+ # Saves properties +key+ of all the object associated with
104
+ # their id to +target+.
105
+ def self.dump(key, target = "")
106
+ # Build the table to dump
107
+ tbl = {}
108
+ self.each do |id,obj|
109
+ value = obj.properties[key]
110
+ if value.any? then
111
+ tbl[id] = value
112
+ end
113
+ end
114
+ # Dump the table.
115
+ target << YAML.dump(tbl)
116
+ return target
117
+ end
118
+
119
+ # Loads properties to +key+ for all objects from +source+.
120
+ def self.load(source,key)
121
+ # Load the id to property table.
122
+ tbl = YAML.load(source)
123
+ # Adds the property of each object according to tbl
124
+ tbl.each do |id,value|
125
+ @@id_map[id].properties[key] = value
126
+ end
127
+ end
128
+
129
+ # Some predefined properties to set.
130
+
131
+ def self.decorate_parent_id
132
+ @@id_map.each do |id, obj|
133
+ parent = obj.parent
134
+ if parent then
135
+ obj.properties[:parent_id] = obj.parent.hdr_id
136
+ else
137
+ obj.properties[:parent_id] = -1
138
+ end
139
+ end
140
+ end
141
+
142
+ end
143
+
144
+
145
+ ## A HDLRuby set of properties
146
+ class Properties
147
+
148
+ # The set of all the property keys
149
+ @@property_keys = Set.new
150
+
151
+ # The HDLRuby object owning of the set of properties
152
+ attr_reader :owner
153
+
154
+ # Create a new set of properties and attach it to HDLRuby object
155
+ # +owner+.
156
+ def initialize(owner)
157
+ # Attach the owner.
158
+ @owner = owner
159
+ # Create the set.
160
+ @content = {}
161
+ end
162
+
163
+ # Clones the properties: also clone the contents.
164
+ def clone
165
+ result = Properties.new(owner)
166
+ @contents.each do |k,vals|
167
+ vals.each { |v| result[k] = v }
168
+ end
169
+ return result
170
+ end
171
+
172
+ # Create a new set of properties by merging with +prop+
173
+ def merge(prop)
174
+ result = self.clone
175
+ prop.each do |k,vals|
176
+ vals.each { |v| result[k] = v }
177
+ end
178
+ return result
179
+ end
180
+
181
+ # Tells if +key+ is present.
182
+ def key?(key)
183
+ @content.key?(key)
184
+ end
185
+
186
+ # Add a property
187
+ def []=(key,value)
188
+ @@property_keys << key
189
+ # Add an entry if not present.
190
+ @content[key] = [] unless @content.key?(key)
191
+ # Add the value to the entry.
192
+ @content[key] << value
193
+ end
194
+
195
+ # Get a property
196
+ def [](key)
197
+ return @content[key]
198
+ end
199
+
200
+ # Iterate over each value associated with +key+.
201
+ def each_with_key(key,&ruby_block)
202
+ return unless @content.key?(key)
203
+ @content[key].each(&ruby_block)
204
+ end
205
+
206
+ # Iterate over the properties of the current set.
207
+ #
208
+ # Returns an enumerator if no ruby block is given.
209
+ def each(&ruby_block)
210
+ # No ruby block? Return an enumerator.
211
+ return to_enum(:each) unless ruby_block
212
+ # A ruby block? Apply it on each input signal instance.
213
+ @content.each(&ruby_block)
214
+ end
215
+
216
+ # Iterator over all the property keys
217
+ #
218
+ # Returns an enumerator if no ruby block is given.
219
+ def self.each_key(&ruby_block)
220
+ # No ruby block? Return an enumerator.
221
+ return to_enum(:each_key) unless ruby_block
222
+ # A ruby block? Apply it on each input signal instance.
223
+ @@property_keys.each(&ruby_block)
224
+ end
225
+
226
+ # # Iterate over the property set of all the objects from current owner.
227
+ # #
228
+ # # Returns an enumerator if no ruby block is given.
229
+ # def each_properties(&ruby_block)
230
+ # # No ruby block? Return an enumerator.
231
+ # return to_enum(:each_properties) unless ruby_block
232
+ # # A ruby block? Apply it.
233
+ # # On current property set
234
+ # ruby_block.call(self)
235
+ # # And on the properties set of sub objects of the owner.
236
+ # self.owner.instance_variables.each do |var|
237
+ # obj = owner.instance_variable_get(var)
238
+ # if (obj.is_a?(Hproperties)) then
239
+ # # obj has properties, recurse on them.
240
+ # obj.properties.each_properties(&ruby_block)
241
+ # end
242
+ # end
243
+ # end
244
+
245
+ end
246
+
247
+
248
+ end
@@ -347,6 +347,12 @@ module HDLRuby::High
347
347
  end
348
348
  end
349
349
  @to_includes = mixins
350
+
351
+ # The list of systems the current system is expanded from if any.
352
+ # The first one is the main system, the other ones are the
353
+ # mixins.
354
+ @generators = []
355
+
350
356
  # Prepare the instantiation methods
351
357
  make_instantiater(name,SystemI,&ruby_block)
352
358
  end
@@ -472,6 +478,24 @@ module HDLRuby::High
472
478
  @scope.each_export(&ruby_block)
473
479
  end
474
480
 
481
+ # Adds a generator system.
482
+ def add_generator(gen)
483
+ unless gen.is_a?(SystemT) then
484
+ raise "Invalid class for a generator system"
485
+ end
486
+ @generators << gen
487
+ end
488
+
489
+ # Iterates over the origin systems.
490
+ #
491
+ # Returns an enumerator if no ruby block is given.
492
+ def each_generator(&ruby_block)
493
+ # No ruby block? Return an enumerator.
494
+ return to_enum(:each_generator) unless ruby_block
495
+ # A block? Apply it on each generator.
496
+ @generators.each(&ruby_block)
497
+ end
498
+
475
499
  # Gets class containing the extension for the instances.
476
500
  def singleton_instance
477
501
  @singleton_instanceO.singleton_class
@@ -527,6 +551,10 @@ module HDLRuby::High
527
551
  # Include the mixin systems given when declaring the system.
528
552
  @to_includes.each { |system| expanded.scope.include(system) }
529
553
 
554
+ # Sets the generators of the expanded result.
555
+ expanded.add_generator(self)
556
+ @to_includes.each { |system| expanded.add_generator(system) }
557
+
530
558
  # Fills the scope of the expanded class.
531
559
  # puts "Build top with #{self.name} for #{name}"
532
560
  expanded.scope.build_top(self.scope,*args)
@@ -730,13 +758,16 @@ module HDLRuby::High
730
758
  "Cannot convert a system without a name to HDLRuby::Low."
731
759
  end
732
760
  # Create the resulting low system type.
733
- systemTlow = HDLRuby::Low::SystemT.new(High.names_create(name),
761
+ systemTL = HDLRuby::Low::SystemT.new(High.names_create(name),
734
762
  self.scope.to_low)
763
+ # For debugging: set the source high object
764
+ systemTL.properties[:low2high] = self.hdr_id
765
+
735
766
  # Fills the interface of the new system
736
767
  # from the included systems.
737
- self.fill_low(systemTlow)
768
+ self.fill_low(systemTL)
738
769
  # Return theresulting system.
739
- return systemTlow
770
+ return systemTL
740
771
  end
741
772
  end
742
773
 
@@ -1213,26 +1244,26 @@ module HDLRuby::High
1213
1244
  # Fills a low level scope with self's contents.
1214
1245
  #
1215
1246
  # NOTE: name conflicts are treated in the current NameStack state.
1216
- def fill_low(scopeLow)
1247
+ def fill_low(scopeL)
1217
1248
  # Adds the content of its included systems.
1218
- @includes.each_value {|system| system.scope.fill_low(scopeLow) }
1249
+ @includes.each_value {|system| system.scope.fill_low(scopeL) }
1219
1250
  # Adds the declared local system types.
1220
1251
  # NOTE: in the current version of HDLRuby::High, there should not
1221
1252
  # be any of them (only eigen systems are real system types).
1222
- self.each_systemT { |systemT| scopeLow.add_systemT(systemT.to_low) }
1253
+ self.each_systemT { |systemT| scopeL.add_systemT(systemT.to_low) }
1223
1254
  # Adds the local types.
1224
- self.each_type { |type| scopeLow.add_type(type.to_low) }
1255
+ self.each_type { |type| scopeL.add_type(type.to_low) }
1225
1256
  # Adds the inner scopes.
1226
- self.each_scope { |scope| scopeLow.add_scope(scope.to_low) }
1257
+ self.each_scope { |scope| scopeL.add_scope(scope.to_low) }
1227
1258
  # Adds the inner signals.
1228
- self.each_inner { |inner| scopeLow.add_inner(inner.to_low) }
1259
+ self.each_inner { |inner| scopeL.add_inner(inner.to_low) }
1229
1260
  # Adds the instances.
1230
1261
  # Single ones.
1231
1262
  self.each_systemI do |systemI|
1232
1263
  # puts "Filling with systemI=#{systemI.name}"
1233
- systemI_low = scopeLow.add_systemI(systemI.to_low)
1264
+ systemI_low = scopeL.add_systemI(systemI.to_low)
1234
1265
  # Also add the eigen system to the list of local systems.
1235
- scopeLow.add_systemT(systemI_low.systemT)
1266
+ scopeL.add_systemT(systemI_low.systemT)
1236
1267
  end
1237
1268
  # Grouped ones.
1238
1269
  self.each_groupI do |name,systemIs|
@@ -1242,42 +1273,45 @@ module HDLRuby::High
1242
1273
  # puts "systemI.respond_to?=#{systemI.respond_to?(:name=)}"
1243
1274
  systemI.name = name.to_s + "[#{i}]"
1244
1275
  # And convert it to low
1245
- systemI_low = scopeLow.add_systemI(systemI.to_low())
1276
+ systemI_low = scopeL.add_systemI(systemI.to_low())
1246
1277
  # Also add the eigen system to the list of local systems.
1247
- scopeLow.add_systemT(systemI_low.systemT)
1278
+ scopeL.add_systemT(systemI_low.systemT)
1248
1279
  }
1249
1280
  end
1250
1281
  # Adds the code chunks.
1251
- self.each_code { |code| scopeLow.add_code(code.to_low) }
1282
+ self.each_code { |code| scopeL.add_code(code.to_low) }
1252
1283
  # Adds the connections.
1253
1284
  self.each_connection { |connection|
1254
1285
  # puts "connection=#{connection}"
1255
- scopeLow.add_connection(connection.to_low)
1286
+ scopeL.add_connection(connection.to_low)
1256
1287
  }
1257
1288
  # Adds the behaviors.
1258
1289
  self.each_behavior { |behavior|
1259
- scopeLow.add_behavior(behavior.to_low)
1290
+ scopeL.add_behavior(behavior.to_low)
1260
1291
  }
1261
1292
  end
1262
1293
 
1263
1294
  # Converts the scope to HDLRuby::Low.
1264
1295
  def to_low()
1265
1296
  # Create the resulting low scope.
1266
- # scopeLow = HDLRuby::Low::Scope.new()
1267
- scopeLow = HDLRuby::Low::Scope.new(self.name)
1297
+ # scopeL = HDLRuby::Low::Scope.new()
1298
+ scopeL = HDLRuby::Low::Scope.new(self.name)
1299
+ # For debugging: set the source high object
1300
+ scopeL.properties[:low2high] = self.hdr_id
1301
+
1268
1302
  # Push the private namespace for the low generation.
1269
1303
  High.space_push(@namespace)
1270
1304
  # Pushes on the name stack for converting the internals of
1271
1305
  # the system.
1272
1306
  High.names_push
1273
1307
  # Adds the content of the actual system.
1274
- self.fill_low(scopeLow)
1308
+ self.fill_low(scopeL)
1275
1309
  # Restores the name stack.
1276
1310
  High.names_pop
1277
1311
  # Restores the namespace stack.
1278
1312
  High.space_pop
1279
1313
  # Return theresulting system.
1280
- return scopeLow
1314
+ return scopeL
1281
1315
  end
1282
1316
  end
1283
1317
 
@@ -1493,7 +1527,11 @@ module HDLRuby::High
1493
1527
  #
1494
1528
  # NOTE: should be overridden by other type classes.
1495
1529
  def to_low(name = self.name)
1496
- return HDLRuby::Low::Type.new(name)
1530
+ # return HDLRuby::Low::Type.new(name)
1531
+ typeL = HDLRuby::Low::Type.new(name)
1532
+ # For debugging: set the source high object
1533
+ typeL.properties[:low2high] = self.hdr_id
1534
+ return typeL
1497
1535
  end
1498
1536
  end
1499
1537
 
@@ -1630,7 +1668,11 @@ module HDLRuby::High
1630
1668
  #
1631
1669
  # NOTE: should be overridden by other type classes.
1632
1670
  def to_low(name = self.name)
1633
- return HDLRuby::Low::TypeDef.new(name,self.def.to_low)
1671
+ # return HDLRuby::Low::TypeDef.new(name,self.def.to_low)
1672
+ typeDefL = HDLRuby::Low::TypeDef.new(name,self.def.to_low)
1673
+ # For debugging: set the source high object
1674
+ typeDefL.properties[:low2high] = self.hdr_id
1675
+ return typeDefL
1634
1676
  end
1635
1677
  end
1636
1678
 
@@ -1678,7 +1720,11 @@ module HDLRuby::High
1678
1720
  #
1679
1721
  # NOTE: should be overridden by other type classes.
1680
1722
  def to_low(name = self.name)
1681
- return HDLRuby::Low::TypeDef.new(name,self.def.to_low)
1723
+ # return HDLRuby::Low::TypeDef.new(name,self.def.to_low)
1724
+ typeDefL = HDLRuby::Low::TypeDef.new(name,self.def.to_low)
1725
+ # For debugging: set the source high object
1726
+ typeDefL.properties[:low2high] = self.hdr_id
1727
+ return typeDefL
1682
1728
  end
1683
1729
  end
1684
1730
 
@@ -1689,8 +1735,13 @@ module HDLRuby::High
1689
1735
  # Converts the type to HDLRuby::Low and set its +name+.
1690
1736
  def to_low(name = self.name)
1691
1737
  # Generate and return the new type.
1692
- return HDLRuby::Low::TypeVector.new(name,self.base.to_low,
1738
+ # return HDLRuby::Low::TypeVector.new(name,self.base.to_low,
1739
+ # self.range.to_low)
1740
+ typeVectorL = HDLRuby::Low::TypeVector.new(name,self.base.to_low,
1693
1741
  self.range.to_low)
1742
+ # For debugging: set the source high object
1743
+ typeVectorL.properties[:low2high] = self.hdr_id
1744
+ return typeVectorL
1694
1745
  end
1695
1746
  end
1696
1747
 
@@ -1763,8 +1814,13 @@ module HDLRuby::High
1763
1814
 
1764
1815
  # Converts the type to HDLRuby::Low and set its +name+.
1765
1816
  def to_low(name = self.name)
1766
- return HDLRuby::Low::TypeTuple.new(name,self.direction,
1817
+ # return HDLRuby::Low::TypeTuple.new(name,self.direction,
1818
+ # *@types.map { |type| type.to_low } )
1819
+ typeTupleL = HDLRuby::Low::TypeTuple.new(name,self.direction,
1767
1820
  *@types.map { |type| type.to_low } )
1821
+ # For debugging: set the source high object
1822
+ typeTupleL.properties[:low2high] = self.hdr_id
1823
+ return typeTupleL
1768
1824
  end
1769
1825
  end
1770
1826
 
@@ -1778,8 +1834,13 @@ module HDLRuby::High
1778
1834
 
1779
1835
  # Converts the type to HDLRuby::Low and set its +name+.
1780
1836
  def to_low(name = self.name)
1781
- return HDLRuby::Low::TypeStruct.new(name,self.direction,
1837
+ # return HDLRuby::Low::TypeStruct.new(name,self.direction,
1838
+ # @types.map { |name,type| [name,type.to_low] } )
1839
+ typeStructL = HDLRuby::Low::TypeStruct.new(name,self.direction,
1782
1840
  @types.map { |name,type| [name,type.to_low] } )
1841
+ # For debugging: set the source high object
1842
+ typeStructL.properties[:low2high] = self.hdr_id
1843
+ return typeStructL
1783
1844
  end
1784
1845
  end
1785
1846
 
@@ -2011,15 +2072,17 @@ module HDLRuby::High
2011
2072
  def to_low(name = self.name)
2012
2073
  # puts "to_low with #{self} (#{self.name}) #{self.systemT}"
2013
2074
  # Converts the system of the instance to HDLRuby::Low
2014
- systemTlow = self.systemT.to_low
2075
+ systemTL = self.systemT.to_low
2015
2076
  # Creates the resulting HDLRuby::Low instance
2016
- systemIlow = HDLRuby::Low::SystemI.new(High.names_create(name),
2017
- systemTlow)
2077
+ systemIL = HDLRuby::Low::SystemI.new(High.names_create(name),
2078
+ systemTL)
2079
+ # For debugging: set the source high object
2080
+ systemIL.properties[:low2high] = self.hdr_id
2018
2081
  # Adds the other systemTs.
2019
2082
  self.each_systemT do |systemT|
2020
- systemIlow.add_systemT(systemT.to_low) unless systemT == self.systemT
2083
+ systemIL.add_systemT(systemT.to_low) unless systemT == self.systemT
2021
2084
  end
2022
- return systemIlow
2085
+ return systemIL
2023
2086
  end
2024
2087
  end
2025
2088
 
@@ -2030,11 +2093,19 @@ module HDLRuby::High
2030
2093
  class Chunk < HDLRuby::Low::Chunk
2031
2094
  # Converts the if to HDLRuby::Low.
2032
2095
  def to_low
2033
- return HDLRuby::Low::Chunk.new(self.name,
2096
+ # return HDLRuby::Low::Chunk.new(self.name,
2097
+ # *self.each_lump.map do |lump|
2098
+ # lump = lump.respond_to?(:to_low) ? lump.to_low : lump.to_s
2099
+ # lump
2100
+ # end)
2101
+ chunkL = HDLRuby::Low::Chunk.new(self.name,
2034
2102
  *self.each_lump.map do |lump|
2035
2103
  lump = lump.respond_to?(:to_low) ? lump.to_low : lump.to_s
2036
2104
  lump
2037
2105
  end)
2106
+ # For debugging: set the source high object
2107
+ chunkL.properties[:low2high] = self.hdr_id
2108
+ return chunkL
2038
2109
  end
2039
2110
  end
2040
2111
 
@@ -2044,13 +2115,15 @@ module HDLRuby::High
2044
2115
  # Converts the if to HDLRuby::Low.
2045
2116
  def to_low
2046
2117
  # Create the resulting code.
2047
- res = HDLRuby::Low::Code.new
2118
+ codeL = HDLRuby::Low::Code.new
2119
+ # For debugging: set the source high object
2120
+ codeL.properties[:low2high] = self.hdr_id
2048
2121
  # Add the low-level events.
2049
- self.each_event { |event| res.add_event(event.to_low) }
2122
+ self.each_event { |event| codeL.add_event(event.to_low) }
2050
2123
  # Add the low-level code chunks.
2051
- self.each_chunk { |chunk| res.add_chunk(chunk.to_low) }
2124
+ self.each_chunk { |chunk| codeL.add_chunk(chunk.to_low) }
2052
2125
  # Return the resulting code.
2053
- return res
2126
+ return codeL
2054
2127
  end
2055
2128
  end
2056
2129
 
@@ -2133,10 +2206,12 @@ module HDLRuby::High
2133
2206
  # no may be nil, so treat it appart
2134
2207
  noL = self.no ? self.no.to_low : nil
2135
2208
  # Now generate the low-level if.
2136
- low = HDLRuby::Low::If.new(self.condition.to_low,
2209
+ ifL = HDLRuby::Low::If.new(self.condition.to_low,
2137
2210
  self.yes.to_low,noL)
2138
- self.each_noif {|cond,block| low.add_noif(cond.to_low,block.to_low)}
2139
- return low
2211
+ self.each_noif {|cond,block| ifL.add_noif(cond.to_low,block.to_low)}
2212
+ # For debugging: set the source high object
2213
+ ifL.properties[:low2high] = self.hdr_id
2214
+ return ifL
2140
2215
  end
2141
2216
  end
2142
2217
 
@@ -2154,8 +2229,13 @@ module HDLRuby::High
2154
2229
 
2155
2230
  # Converts the if to HDLRuby::Low.
2156
2231
  def to_low
2157
- return HDLRuby::Low::When.new(self.match.to_low,
2232
+ # return HDLRuby::Low::When.new(self.match.to_low,
2233
+ # self.statement.to_low)
2234
+ whenL = HDLRuby::Low::When.new(self.match.to_low,
2158
2235
  self.statement.to_low)
2236
+ # For debugging: set the source high object
2237
+ whenL.properties[:low2high] = self.hdr_id
2238
+ return whenL
2159
2239
  end
2160
2240
  end
2161
2241
 
@@ -2200,6 +2280,8 @@ module HDLRuby::High
2200
2280
  def to_low
2201
2281
  # Create the low level case.
2202
2282
  caseL = HDLRuby::Low::Case.new(@value.to_low)
2283
+ # For debugging: set the source high object
2284
+ caseL.properties[:low2high] = self.hdr_id
2203
2285
  # Add each when case.
2204
2286
  self.each_when do |w|
2205
2287
  caseL.add_when(w.to_low)
@@ -2226,7 +2308,11 @@ module HDLRuby::High
2226
2308
 
2227
2309
  # Converts the delay to HDLRuby::Low.
2228
2310
  def to_low
2229
- return HDLRuby::Low::Delay.new(self.value, self.unit)
2311
+ # return HDLRuby::Low::Delay.new(self.value, self.unit)
2312
+ delayL = HDLRuby::Low::Delay.new(self.value, self.unit)
2313
+ # For debugging: set the source high object
2314
+ delayL.properties[:low2high] = self.hdr_id
2315
+ return delayL
2230
2316
  end
2231
2317
  end
2232
2318
 
@@ -2237,7 +2323,11 @@ module HDLRuby::High
2237
2323
 
2238
2324
  # Converts the wait statement to HDLRuby::Low.
2239
2325
  def to_low
2240
- return HDLRuby::Low::TimeWait.new(self.delay.to_low)
2326
+ # return HDLRuby::Low::TimeWait.new(self.delay.to_low)
2327
+ timeWaitL = HDLRuby::Low::TimeWait.new(self.delay.to_low)
2328
+ # For debugging: set the source high object
2329
+ timeWaitL.properties[:low2high] = self.hdr_id
2330
+ return timeWaitL
2241
2331
  end
2242
2332
  end
2243
2333
 
@@ -2249,8 +2339,13 @@ module HDLRuby::High
2249
2339
 
2250
2340
  # Converts the repeat statement to HDLRuby::Low.
2251
2341
  def to_low
2252
- return HDLRuby::Low::TimeRepeat.new(self.statement.to_low,
2342
+ # return HDLRuby::Low::TimeRepeat.new(self.statement.to_low,
2343
+ # self.delay.to_low)
2344
+ timeRepeatL = HDLRuby::Low::TimeRepeat.new(self.statement.to_low,
2253
2345
  self.delay.to_low)
2346
+ # For debugging: set the source high object
2347
+ timeRepeatL.properties[:low2high] = self.hdr_id
2348
+ return timeRepeatL
2254
2349
  end
2255
2350
  end
2256
2351
 
@@ -2571,7 +2666,11 @@ module HDLRuby::High
2571
2666
 
2572
2667
  # Converts the unary expression to HDLRuby::Low.
2573
2668
  def to_low
2574
- return HDLRuby::Low::Cast.new(self.type.to_low,self.child.to_low)
2669
+ # return HDLRuby::Low::Cast.new(self.type.to_low,self.child.to_low)
2670
+ castL =HDLRuby::Low::Cast.new(self.type.to_low,self.child.to_low)
2671
+ # For debugging: set the source high object
2672
+ castL.properties[:low2high] = self.hdr_id
2673
+ return castL
2575
2674
  end
2576
2675
  end
2577
2676
 
@@ -2588,8 +2687,13 @@ module HDLRuby::High
2588
2687
 
2589
2688
  # Converts the unary expression to HDLRuby::Low.
2590
2689
  def to_low
2591
- return HDLRuby::Low::Unary.new(self.type.to_low, self.operator,
2690
+ # return HDLRuby::Low::Unary.new(self.type.to_low, self.operator,
2691
+ # self.child.to_low)
2692
+ unaryL = HDLRuby::Low::Unary.new(self.type.to_low, self.operator,
2592
2693
  self.child.to_low)
2694
+ # For debugging: set the source high object
2695
+ unaryL.properties[:low2high] = self.hdr_id
2696
+ return unaryL
2593
2697
  end
2594
2698
  end
2595
2699
 
@@ -2607,9 +2711,13 @@ module HDLRuby::High
2607
2711
 
2608
2712
  # Converts the binary expression to HDLRuby::Low.
2609
2713
  def to_low
2610
- # return HDLRuby::Low::Binary.new(self.operator,
2611
- return HDLRuby::Low::Binary.new(self.type.to_low, self.operator,
2714
+ # return HDLRuby::Low::Binary.new(self.type.to_low, self.operator,
2715
+ # self.left.to_low, self.right.to_low)
2716
+ binaryL = HDLRuby::Low::Binary.new(self.type.to_low, self.operator,
2612
2717
  self.left.to_low, self.right.to_low)
2718
+ # For debugging: set the source high object
2719
+ binaryL.properties[:low2high] = self.hdr_id
2720
+ return binaryL
2613
2721
  end
2614
2722
  end
2615
2723
 
@@ -2631,11 +2739,19 @@ module HDLRuby::High
2631
2739
 
2632
2740
  # Converts the selection expression to HDLRuby::Low.
2633
2741
  def to_low
2634
- return HDLRuby::Low::Select.new(self.type.to_low,"?",
2742
+ # return HDLRuby::Low::Select.new(self.type.to_low,"?",
2743
+ # self.select.to_low,
2744
+ # *self.each_choice.map do |choice|
2745
+ # choice.to_low
2746
+ # end)
2747
+ selectL = HDLRuby::Low::Select.new(self.type.to_low,"?",
2635
2748
  self.select.to_low,
2636
2749
  *self.each_choice.map do |choice|
2637
2750
  choice.to_low
2638
2751
  end)
2752
+ # For debugging: set the source high object
2753
+ selectL.properties[:low2high] = self.hdr_id
2754
+ return selectL
2639
2755
  end
2640
2756
  end
2641
2757
 
@@ -2656,11 +2772,19 @@ module HDLRuby::High
2656
2772
 
2657
2773
  # Converts the concatenation expression to HDLRuby::Low.
2658
2774
  def to_low
2659
- return HDLRuby::Low::Concat.new(self.type.to_low,
2775
+ # return HDLRuby::Low::Concat.new(self.type.to_low,
2776
+ # self.each_expression.map do |expr|
2777
+ # expr.to_low
2778
+ # end
2779
+ # )
2780
+ concatL = HDLRuby::Low::Concat.new(self.type.to_low,
2660
2781
  self.each_expression.map do |expr|
2661
2782
  expr.to_low
2662
2783
  end
2663
2784
  )
2785
+ # For debugging: set the source high object
2786
+ concatL.properties[:low2high] = self.hdr_id
2787
+ return concatL
2664
2788
  end
2665
2789
  end
2666
2790
 
@@ -2699,7 +2823,11 @@ module HDLRuby::High
2699
2823
  # Clone the content if possible
2700
2824
  content = self.content.frozen? ? self.content : self.content.clone
2701
2825
  # Create and return the resulting low-level value
2702
- return HDLRuby::Low::Value.new(self.type.to_low,self.content)
2826
+ # return HDLRuby::Low::Value.new(self.type.to_low,self.content)
2827
+ valueL = HDLRuby::Low::Value.new(self.type.to_low,self.content)
2828
+ # For debugging: set the source high object
2829
+ valueL.properties[:low2high] = self.hdr_id
2830
+ return valueL
2703
2831
  end
2704
2832
 
2705
2833
  end
@@ -2801,9 +2929,13 @@ module HDLRuby::High
2801
2929
 
2802
2930
  # Converts the name reference to a HDLRuby::Low::RefName.
2803
2931
  def to_low
2804
- # return HDLRuby::Low::RefName.new(@base.to_ref.to_low,@object.name)
2805
- return HDLRuby::Low::RefName.new(self.type.to_low,
2932
+ # return HDLRuby::Low::RefName.new(self.type.to_low,
2933
+ # @base.to_ref.to_low,@object.name)
2934
+ refNameL = HDLRuby::Low::RefName.new(self.type.to_low,
2806
2935
  @base.to_ref.to_low,@object.name)
2936
+ # For debugging: set the source high object
2937
+ refNameL.properties[:low2high] = self.hdr_id
2938
+ return refNameL
2807
2939
  end
2808
2940
 
2809
2941
  # Missing methods are looked for into the refered object.
@@ -2830,11 +2962,19 @@ module HDLRuby::High
2830
2962
 
2831
2963
  # Converts the concat reference to HDLRuby::Low.
2832
2964
  def to_low
2833
- return HDLRuby::Low::RefConcat.new(self.type.to_low,
2965
+ # return HDLRuby::Low::RefConcat.new(self.type.to_low,
2966
+ # self.each_ref.map do |ref|
2967
+ # ref.to_low
2968
+ # end
2969
+ # )
2970
+ refConcatL = HDLRuby::Low::RefConcat.new(self.type.to_low,
2834
2971
  self.each_ref.map do |ref|
2835
2972
  ref.to_low
2836
2973
  end
2837
2974
  )
2975
+ # For debugging: set the source high object
2976
+ refConcatL.properties[:low2high] = self.hdr_id
2977
+ return refConcatL
2838
2978
  end
2839
2979
  end
2840
2980
 
@@ -2851,8 +2991,13 @@ module HDLRuby::High
2851
2991
 
2852
2992
  # Converts the index reference to HDLRuby::Low.
2853
2993
  def to_low
2854
- return HDLRuby::Low::RefIndex.new(self.type.to_low,
2855
- self.ref.to_low,self.index.to_low)
2994
+ # return HDLRuby::Low::RefIndex.new(self.type.to_low,
2995
+ # self.ref.to_low,self.index.to_low)
2996
+ refIndexL = HDLRuby::Low::RefIndex.new(self.type.to_low,
2997
+ self.ref.to_low,self.index.to_low)
2998
+ # For debugging: set the source high object
2999
+ refIndexL.properties[:low2high] = self.hdr_id
3000
+ return refIndexL
2856
3001
  end
2857
3002
  end
2858
3003
 
@@ -2869,8 +3014,13 @@ module HDLRuby::High
2869
3014
 
2870
3015
  # Converts the range reference to HDLRuby::Low.
2871
3016
  def to_low
2872
- return HDLRuby::Low::RefRange.new(self.type.to_low,
3017
+ # return HDLRuby::Low::RefRange.new(self.type.to_low,
3018
+ # self.ref.to_low,self.range.to_low)
3019
+ refRangeL = HDLRuby::Low::RefRange.new(self.type.to_low,
2873
3020
  self.ref.to_low,self.range.to_low)
3021
+ # For debugging: set the source high object
3022
+ refRangeL.properties[:low2high] = self.hdr_id
3023
+ return refRangeL
2874
3024
  end
2875
3025
  end
2876
3026
 
@@ -2886,9 +3036,13 @@ module HDLRuby::High
2886
3036
 
2887
3037
  # Converts the name reference to HDLRuby::Low.
2888
3038
  def to_low
2889
- # puts "To low for ref with name=#{self.name} and subref=#{self.ref}"
2890
- return HDLRuby::Low::RefName.new(self.type.to_low,
3039
+ # return HDLRuby::Low::RefName.new(self.type.to_low,
3040
+ # self.ref.to_low,self.name)
3041
+ refNameL = HDLRuby::Low::RefName.new(self.type.to_low,
2891
3042
  self.ref.to_low,self.name)
3043
+ # For debugging: set the source high object
3044
+ refNameL.properties[:low2high] = self.hdr_id
3045
+ return refNameL
2892
3046
  end
2893
3047
  end
2894
3048
 
@@ -2920,7 +3074,11 @@ module HDLRuby::High
2920
3074
 
2921
3075
  # Converts the this reference to HDLRuby::Low.
2922
3076
  def to_low
2923
- return HDLRuby::Low::RefThis.new
3077
+ # return HDLRuby::Low::RefThis.new
3078
+ refThisL = HDLRuby::Low::RefThis.new
3079
+ # For debugging: set the source high object
3080
+ refThisL.properties[:low2high] = self.hdr_id
3081
+ return refThisL
2924
3082
  end
2925
3083
  end
2926
3084
 
@@ -2954,7 +3112,11 @@ module HDLRuby::High
2954
3112
 
2955
3113
  # Converts the event to HDLRuby::Low.
2956
3114
  def to_low
2957
- return HDLRuby::Low::Event.new(self.type,self.ref.to_low)
3115
+ # return HDLRuby::Low::Event.new(self.type,self.ref.to_low)
3116
+ eventL = HDLRuby::Low::Event.new(self.type,self.ref.to_low)
3117
+ # For debugging: set the source high object
3118
+ eventL.properties[:low2high] = self.hdr_id
3119
+ return eventL
2958
3120
  end
2959
3121
  end
2960
3122
 
@@ -2990,8 +3152,13 @@ module HDLRuby::High
2990
3152
 
2991
3153
  # Converts the transmit to HDLRuby::Low.
2992
3154
  def to_low
2993
- return HDLRuby::Low::Transmit.new(self.left.to_low,
3155
+ # return HDLRuby::Low::Transmit.new(self.left.to_low,
3156
+ # self.right.to_low)
3157
+ transmitL = HDLRuby::Low::Transmit.new(self.left.to_low,
2994
3158
  self.right.to_low)
3159
+ # For debugging: set the source high object
3160
+ transmitL.properties[:low2high] = self.hdr_id
3161
+ return transmitL
2995
3162
  end
2996
3163
  end
2997
3164
 
@@ -3055,8 +3222,13 @@ module HDLRuby::High
3055
3222
 
3056
3223
  # Converts the connection to HDLRuby::Low.
3057
3224
  def to_low
3058
- return HDLRuby::Low::Connection.new(self.left.to_low,
3225
+ # return HDLRuby::Low::Connection.new(self.left.to_low,
3226
+ # self.right.to_low)
3227
+ connectionL = HDLRuby::Low::Connection.new(self.left.to_low,
3059
3228
  self.right.to_low)
3229
+ # For debugging: set the source high object
3230
+ connectionL.properties[:low2high] = self.hdr_id
3231
+ return connectionL
3060
3232
  end
3061
3233
  end
3062
3234
 
@@ -3165,7 +3337,11 @@ module HDLRuby::High
3165
3337
 
3166
3338
  # Converts the system to HDLRuby::Low and set its +name+.
3167
3339
  def to_low(name = self.name)
3168
- return HDLRuby::Low::SignalI.new(name,self.type.to_low)
3340
+ # return HDLRuby::Low::SignalI.new(name,self.type.to_low)
3341
+ signalIL = HDLRuby::Low::SignalI.new(name,self.type.to_low)
3342
+ # For debugging: set the source high object
3343
+ signalIL.properties[:low2high] = self.hdr_id
3344
+ return signalIL
3169
3345
  end
3170
3346
  end
3171
3347
 
@@ -3224,8 +3400,13 @@ module HDLRuby::High
3224
3400
 
3225
3401
  # Converts the system to HDLRuby::Low and set its +name+.
3226
3402
  def to_low(name = self.name)
3227
- return HDLRuby::Low::SignalC.new(name,self.type.to_low,
3403
+ # return HDLRuby::Low::SignalC.new(name,self.type.to_low,
3404
+ # self.value.to_low)
3405
+ signalCL = HDLRuby::Low::SignalC.new(name,self.type.to_low,
3228
3406
  self.value.to_low)
3407
+ # For debugging: set the source high object
3408
+ signalCL.properties[:low2high] = self.hdr_id
3409
+ return signalCL
3229
3410
  end
3230
3411
  end
3231
3412
 
@@ -3436,6 +3617,8 @@ module HDLRuby::High
3436
3617
  def to_low
3437
3618
  # Create the resulting block
3438
3619
  blockL = HDLRuby::Low::Block.new(self.mode)
3620
+ # For debugging: set the source high object
3621
+ blockL.properties[:low2high] = self.hdr_id
3439
3622
  # Push the namespace for the low generation.
3440
3623
  High.space_push(@namespace)
3441
3624
  # Pushes on the name stack for converting the internals of
@@ -3503,6 +3686,8 @@ module HDLRuby::High
3503
3686
  def to_low
3504
3687
  # Create the resulting block
3505
3688
  blockL = HDLRuby::Low::TimeBlock.new(self.mode)
3689
+ # For debugging: set the source high object
3690
+ blockL.properties[:low2high] = self.hdr_id
3506
3691
  # Add the inner signals
3507
3692
  self.each_inner { |inner| blockL.add_inner(inner.to_low) }
3508
3693
  # Add the statements
@@ -3594,6 +3779,8 @@ module HDLRuby::High
3594
3779
  eventLs = self.each_event.map { |event| event.to_low }
3595
3780
  # Create and return the resulting low level behavior.
3596
3781
  behaviorL = HDLRuby::Low::Behavior.new(blockL)
3782
+ # For debugging: set the source high object
3783
+ behaviorL.properties[:low2high] = self.hdr_id
3597
3784
  eventLs.each(&behaviorL.method(:add_event))
3598
3785
  return behaviorL
3599
3786
  end
@@ -3620,9 +3807,11 @@ module HDLRuby::High
3620
3807
  # Create the low level events.
3621
3808
  eventLs = self.each_event.map { |event| event.to_low }
3622
3809
  # Create and return the resulting low level behavior.
3623
- behaviorL = HDLRuby::Low::TimeBehavior.new(blockL)
3810
+ timeBehaviorL = HDLRuby::Low::TimeBehavior.new(blockL)
3811
+ # For debugging: set the source high object
3812
+ timeBehaviorL.properties[:low2high] = self.hdr_id
3624
3813
  eventLs.each(&behaviorL.method(:add_event))
3625
- return behaviorL
3814
+ return timeBehaviorL
3626
3815
  end
3627
3816
  end
3628
3817