HDLRuby 2.6.23 → 2.7.5

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.
@@ -39,15 +39,15 @@ module HDLRuby::Low
39
39
  return str
40
40
  end
41
41
 
42
- ## Tells if a +name+ is C-compatible.
43
- # To ensure compatibile, assume all the character must have the
44
- # same case.
45
- def self.c_name?(name)
46
- name = name.to_s
47
- # First: character check.
48
- return false unless name =~ /^[a-zA-Z]|([a-zA-Z][a-zA-Z_0-9]*[a-zA-Z0-9])$/
49
- return true
50
- end
42
+ # ## Tells if a +name+ is C-compatible.
43
+ # # To ensure compatibile, assume all the character must have the
44
+ # # same case.
45
+ # def self.c_name?(name)
46
+ # name = name.to_s
47
+ # # First: character check.
48
+ # return false unless name =~ /^[a-zA-Z]|([a-zA-Z][a-zA-Z_0-9]*[a-zA-Z0-9])$/
49
+ # return true
50
+ # end
51
51
 
52
52
  ## Converts a +name+ to a C-compatible name.
53
53
  def self.c_name(name)
@@ -69,14 +69,29 @@ module HDLRuby::Low
69
69
  return name
70
70
  end
71
71
 
72
+ # ## Generates a uniq name for an object.
73
+ # def self.obj_name(obj)
74
+ # if obj.respond_to?(:name) then
75
+ # return Low2C.c_name(obj.name.to_s) +
76
+ # Low2C.c_name(obj.object_id.to_s)
77
+ # else
78
+ # return "_" + Low2C.c_name(obj.object_id.to_s)
79
+ # end
80
+ # end
81
+
82
+ @@hdrobj2c = {}
83
+
72
84
  ## Generates a uniq name for an object.
73
85
  def self.obj_name(obj)
74
- if obj.respond_to?(:name) then
75
- return Low2C.c_name(obj.name.to_s) +
76
- Low2C.c_name(obj.object_id.to_s)
77
- else
78
- return "_" + Low2C.c_name(obj.object_id.to_s)
86
+ id = obj.hierarchy.map! {|obj| obj.object_id}
87
+ oname = @@hdrobj2c[id]
88
+ unless oname then
89
+ # name = obj.respond_to?(:name) ? "_#{self.c_name(obj.name)}" : ""
90
+ # oname = "_c#{@@hdrobj2c.size}#{name}"
91
+ oname = "_" << @@hdrobj2c.size.to_s(36)
92
+ @@hdrobj2c[id] = oname
79
93
  end
94
+ return oname
80
95
  end
81
96
 
82
97
  ## Generates the name of a makeer for an object.
@@ -117,9 +132,9 @@ module HDLRuby::Low
117
132
  res = Low2C.includes(*hnames)
118
133
  res << "int main(int argc, char* argv[]) {\n"
119
134
  # Build the objects.
120
- objs.each { |obj| res << " #{Low2C.make_name(obj)}();\n" }
135
+ objs.each { |obj| res << " " << Low2C.make_name(obj) << "();\n" }
121
136
  # Sets the top systemT.
122
- res << " top_system = #{Low2C.obj_name(top)};\n"
137
+ res << " top_system = " << Low2C.obj_name(top) << ";\n"
123
138
  # Starts the simulation.
124
139
  res<< " hruby_sim_core(\"#{name}\",#{init_visualizer},-1);\n"
125
140
  # Close the main.
@@ -140,8 +155,9 @@ module HDLRuby::Low
140
155
  ## Generates the code for a wait for time object +obj+ with +level+
141
156
  # identation.
142
157
  def self.wait(obj,level)
143
- return "hw_wait(#{obj.delay.to_c(level+1)}," +
144
- "#{Low2C.behavior_access(obj)});\n"
158
+ res = "hw_wait(#{obj.delay.to_c(level+1)},"
159
+ res << Low2C.behavior_access(obj) << ");\n"
160
+ return res
145
161
  end
146
162
  end
147
163
 
@@ -152,20 +168,24 @@ module HDLRuby::Low
152
168
  # Generates the text of the equivalent HDLRuby code.
153
169
  # +level+ is the hierachical level of the object and +hnames+
154
170
  # is the list of extra h files to include.
155
- def to_c(level = 0, *hnames)
171
+ # def to_c(level = 0, *hnames)
172
+ def to_c(res, level = 0, *hnames)
156
173
  # The header
157
- res = Low2C.includes(*hnames)
174
+ # res = Low2C.includes(*hnames)
175
+ res << Low2C.includes(*hnames)
158
176
 
159
177
  # Declare the global variable holding the system.
160
- res << "SystemT #{Low2C.obj_name(self)};\n\n"
178
+ res << "SystemT " << Low2C.obj_name(self) << ";\n\n"
161
179
 
162
180
  # Generate the signals of the system.
163
- self.each_signal { |signal| res << signal.to_c(level) }
181
+ # self.each_signal { |signal| signal.to_c(level) }
182
+ self.each_signal { |signal| signal.to_c(res,level) }
164
183
 
165
184
  # Generate the code for all the blocks included in the system.
166
185
  self.scope.each_scope_deep do |scope|
167
186
  scope.each_behavior do |behavior|
168
- res << behavior.block.to_c_code(level)
187
+ # res << behavior.block.to_c_code(level)
188
+ behavior.block.to_c_code(res,level)
169
189
  end
170
190
  end
171
191
 
@@ -173,35 +193,38 @@ module HDLRuby::Low
173
193
  self.each_signal do |signal|
174
194
  # res << signal.value.to_c_make(level) if signal.value
175
195
  signal.value.each_node_deep do |node|
176
- res << node.to_c_make(level) if node.respond_to?(:to_c_make)
196
+ # res << node.to_c_make(level) if node.respond_to?(:to_c_make)
197
+ node.to_c_make(res,level) if node.respond_to?(:to_c_make)
177
198
  end if signal.value
178
199
  end
179
200
  self.scope.each_scope_deep do |scope|
180
201
  scope.each_inner do |signal|
181
- # res << signal.value.to_c_make(level) if signal.value
182
202
  signal.value.each_node_deep do |node|
183
- res << node.to_c_make(level) if node.respond_to?(:to_c_make)
203
+ # res << node.to_c_make(level) if node.respond_to?(:to_c_make)
204
+ node.to_c_make(res,level) if node.respond_to?(:to_c_make)
184
205
  end if signal.value
185
206
  end
186
207
  end
187
208
  self.scope.each_block_deep do |block|
188
209
  # puts "treating for block=#{Low2C.obj_name(block)} with=#{block.each_inner.count} inners"
189
210
  block.each_inner do |signal|
190
- # res << signal.value.to_c_make(level) if signal.value
191
211
  signal.value.each_node_deep do |node|
192
- res << node.to_c_make(level) if node.respond_to?(:to_c_make)
212
+ # res << node.to_c_make(level) if node.respond_to?(:to_c_make)
213
+ node.to_c_make(res,level) if node.respond_to?(:to_c_make)
193
214
  end if signal.value
194
215
  end
195
216
  end
196
217
  self.scope.each_node_deep do |node|
197
- res << node.to_c_make(level) if node.is_a?(Value)
218
+ # res << node.to_c_make(level) if node.is_a?(Value)
219
+ node.to_c_make(res,level) if node.is_a?(Value)
198
220
  end
199
221
 
200
222
  # Generate the scope.
201
- res << self.scope.to_c(level)
223
+ # res << self.scope.to_c(level)
224
+ self.scope.to_c(res,level)
202
225
 
203
226
  # Generate the entity
204
- res << "SystemT #{Low2C.make_name(self)}() {\n"
227
+ res << "SystemT " << Low2C.make_name(self) << "() {\n"
205
228
  # Creates the structure.
206
229
  res << " " * (level+1)*3
207
230
  res << "SystemT systemT = malloc(sizeof(SystemTS));\n"
@@ -211,13 +234,13 @@ module HDLRuby::Low
211
234
  # Sets the global variable of the system.
212
235
  res << "\n"
213
236
  res << " " * (level+1)*3
214
- res << "#{Low2C.obj_name(self)} = systemT;\n"
237
+ res << Low2C.obj_name(self) << " = systemT;\n"
215
238
 
216
239
  # Set the owner if any.
217
240
  if @owner then
218
241
  res << " " * (level+1)*3
219
- res << "systemT->owner = (Object)" +
220
- "#{Low2C.obj_name(@owner)};\n"
242
+ res << "systemT->owner = (Object)"
243
+ res << Low2C.obj_name(@owner) << ";\n"
221
244
  else
222
245
  res << "systemT->owner = NULL;\n"
223
246
  end
@@ -231,23 +254,23 @@ module HDLRuby::Low
231
254
  res << " " * (level+1)*3
232
255
  res << "systemT->num_inputs = #{self.each_input.to_a.size};\n"
233
256
  res << " " * (level+1)*3
234
- res << "systemT->inputs = calloc(sizeof(SignalI)," +
235
- "systemT->num_inputs);\n"
257
+ res << "systemT->inputs = calloc(sizeof(SignalI),"
258
+ res << "systemT->num_inputs);\n"
236
259
  self.each_input.with_index do |input,i|
237
260
  res << " " * (level+1)*3
238
- res << "systemT->inputs[#{i}] = " +
239
- "#{Low2C.make_name(input)}();\n"
261
+ res << "systemT->inputs[#{i}] = "
262
+ res << Low2C.make_name(input) << "();\n"
240
263
  end
241
264
  # Outputs
242
265
  res << " " * (level+1)*3
243
266
  res << "systemT->num_outputs = #{self.each_output.to_a.size};\n"
244
267
  res << " " * (level+1)*3
245
- res << "systemT->outputs = calloc(sizeof(SignalI)," +
246
- "systemT->num_outputs);\n"
268
+ res << "systemT->outputs = calloc(sizeof(SignalI),"
269
+ res << "systemT->num_outputs);\n"
247
270
  self.each_output.with_index do |output,i|
248
271
  res << " " * (level+1)*3
249
- res << "systemT->outputs[#{i}] = " +
250
- "#{Low2C.make_name(output)}();\n"
272
+ res << "systemT->outputs[#{i}] = "
273
+ res << Low2C.make_name(output) << "();\n"
251
274
  end
252
275
  # Inouts
253
276
  res << " " * (level+1)*3
@@ -257,14 +280,14 @@ module HDLRuby::Low
257
280
  "systemT->num_inouts);\n"
258
281
  self.each_inout.with_index do |inout,i|
259
282
  res << " " * (level+1)*3
260
- res << "systemT->inouts[#{i}] = " +
261
- "#{Low2C.make_name(inout)}();\n"
283
+ res << "systemT->inouts[#{i}] = "
284
+ res << Low2C.make_name(inout) << "();\n"
262
285
  end
263
286
 
264
287
  # Adds the scope.
265
288
  res << "\n"
266
289
  res << " " * (level+1)*3
267
- res << "systemT->scope = #{Low2C.make_name(self.scope)}();\n"
290
+ res << "systemT->scope = " << Low2C.make_name(self.scope) << "();\n"
268
291
 
269
292
  # Generate the Returns of the result.
270
293
  res << "\n"
@@ -280,16 +303,17 @@ module HDLRuby::Low
280
303
 
281
304
  ## Generates the code for an execution starting from the system.
282
305
  # +level+ is the hierachical level of the object.
283
- def to_c_code(level)
306
+ # def to_c_code(level)
307
+ def to_c_code(res,level)
284
308
  res << " " * (level*3)
285
- res << "#{Low2C.code_name(self)}() {\n"
309
+ res << Low2C.code_name(self) << "() {\n"
286
310
  # res << "printf(\"Executing #{Low2C.code_name(self)}...\\n\");"
287
311
  # Launch the execution of all the time behaviors of the
288
312
  # system.
289
313
  self.each_behavior_deep do |behavior|
290
314
  if behavior.is_a?(HDLRuby::Low::TimeBehavior) then
291
315
  res << " " * (level+1)*3
292
- res << "#{Low2C.code_name(behavior.block)}();\n"
316
+ res << Low2C.code_name(behavior.block) << "();\n"
293
317
  end
294
318
  end
295
319
  # Close the execution procedure.
@@ -301,50 +325,58 @@ module HDLRuby::Low
301
325
 
302
326
 
303
327
  ## Generates the content of the h file.
304
- def to_ch
305
- res = ""
328
+ # def to_ch
329
+ def to_ch(res)
330
+ # res = ""
306
331
  # Declare the global variable holding the signal.
307
- res << "extern SystemT #{Low2C.obj_name(self)};\n\n"
332
+ res << "extern SystemT " << Low2C.obj_name(self) << ";\n\n"
308
333
 
309
334
  # Generate the access to the function making the systemT. */
310
- res << "extern SystemT #{Low2C.make_name(self)}();\n\n"
335
+ res << "extern SystemT " << Low2C.make_name(self) << "();\n\n"
311
336
 
312
337
  # Generate the accesses to the values.
313
338
  self.each_signal do |signal|
314
339
  # res << signal.value.to_ch if signal.value
315
340
  if signal.value then
316
341
  signal.value.each_node_deep do |node|
317
- res << node.to_ch if node.is_a?(Value)
342
+ # res << node.to_ch if node.is_a?(Value)
343
+ node.to_ch(res) if node.is_a?(Value)
318
344
  end
319
345
  end
320
346
  end
321
347
  self.scope.each_scope_deep do |scope|
322
348
  scope.each_inner do |signal|
323
- # res << signal.value.to_ch if signal.value
324
349
  if signal.value then
325
350
  signal.value.each_node_deep do |node|
326
- res << node.to_ch if node.is_a?(Value)
351
+ # res << node.to_ch if node.is_a?(Value)
352
+ node.to_ch(res) if node.is_a?(Value)
327
353
  end
328
354
  end
329
355
  end
330
356
  end
331
357
  self.scope.each_block_deep do |block|
332
358
  block.each_inner do |signal|
333
- res << signal.value.to_ch if signal.value
359
+ # res << signal.value.to_ch if signal.value
360
+ signal.value.to_ch(res) if signal.value
334
361
  end
335
362
  block.each_node_deep do |node|
336
- res << node.to_ch if node.is_a?(Value)
363
+ # res << node.to_ch if node.is_a?(Value)
364
+ node.to_ch(res) if node.is_a?(Value)
337
365
  end
338
366
  end
339
367
 
340
368
  # Generate the accesses to the ports.
341
- self.each_input { |input| res << input.to_ch }
342
- self.each_output { |output| res << output.to_ch }
343
- self.each_inout { |inout| res << inout.to_ch }
369
+ # self.each_input { |input| res << input.to_ch }
370
+ self.each_input { |input| input.to_ch(res) }
371
+ # self.each_output { |output| res << output.to_ch }
372
+ self.each_output { |output| output.to_ch(res) }
373
+ # self.each_inout { |inout| res << inout.to_ch }
374
+ self.each_inout { |inout| inout.to_ch(res) }
344
375
 
345
376
  # Generate the accesses to the scope.
346
- res << self.scope.to_ch << "\n"
347
-
377
+ # res << self.scope.to_ch << "\n"
378
+ self.scope.to_ch(res)
379
+ res << "\n"
348
380
 
349
381
  return res;
350
382
  end
@@ -357,31 +389,37 @@ module HDLRuby::Low
357
389
 
358
390
  # Generates the C text of the equivalent HDLRuby code.
359
391
  # +level+ is the hierachical level of the object.
360
- def to_c(level = 0)
392
+ # def to_c(level = 0)
393
+ def to_c(res,level = 0)
361
394
  # The resulting string.
362
- res = ""
395
+ # res = ""
363
396
 
364
397
  # Declare the global variable holding the scope.
365
- res << "Scope #{Low2C.obj_name(self)};\n\n"
398
+ res << "Scope " << Low2C.obj_name(self) << ";\n\n"
366
399
 
367
400
  # Generate the code makeing the complex sub components.
368
401
 
369
402
  # Generates the code for making signals if any.
370
- self.each_signal { |signal| res << signal.to_c(level) }
403
+ # self.each_signal { |signal| res << signal.to_c(level) }
404
+ self.each_signal { |signal| signal.to_c(res,level) }
371
405
  # Generates the code for making signals if any.
372
- self.each_systemI { |systemI| res << systemI.to_c(level) }
406
+ # self.each_systemI { |systemI| res << systemI.to_c(level) }
407
+ self.each_systemI { |systemI| systemI.to_c(res,level) }
373
408
  # Generates the code for making sub scopes if any.
374
- self.each_scope { |scope| res << scope.to_c(level) }
409
+ # self.each_scope { |scope| res << scope.to_c(level) }
410
+ self.each_scope { |scope| scope.to_c(res,level) }
375
411
  # Generate the code for making the behaviors.
376
- self.each_behavior { |behavior| res << behavior.to_c(level) }
412
+ # self.each_behavior { |behavior| res << behavior.to_c(level) }
413
+ self.each_behavior { |behavior| behavior.to_c(res,level) }
377
414
  # Generate the code for making the non-HDLRuby codes.
378
- self.each_code { |code| res << code.to_c(level) }
415
+ # self.each_code { |code| res << code.to_c(level) }
416
+ self.each_code { |code| code.to_c(res,level) }
379
417
 
380
418
  # Generate the code of the scope.
381
419
 
382
420
  # The header of the scope.
383
421
  res << " " * level*3
384
- res << "Scope #{Low2C.make_name(self)}() {\n"
422
+ res << "Scope " << Low2C.make_name(self) << "() {\n"
385
423
  res << " " * (level+1)*3
386
424
  res << "Scope scope = malloc(sizeof(ScopeS));\n"
387
425
  res << " " * (level+1)*3
@@ -390,13 +428,13 @@ module HDLRuby::Low
390
428
  # Sets the global variable of the scope.
391
429
  res << "\n"
392
430
  res << " " * (level+1)*3
393
- res << "#{Low2C.obj_name(self)} = scope;\n"
431
+ res << Low2C.obj_name(self) << " = scope;\n"
394
432
 
395
433
  # Set the owner if any.
396
434
  if self.parent then
397
435
  res << " " * (level+1)*3
398
- res << "scope->owner = (Object)" +
399
- "#{Low2C.obj_name(self.parent)};\n"
436
+ res << "scope->owner = (Object)"
437
+ res << Low2C.obj_name(self.parent) << ";\n"
400
438
  else
401
439
  res << "scope->owner = NULL;\n"
402
440
  end
@@ -413,44 +451,44 @@ module HDLRuby::Low
413
451
  "scope->num_systemIs);\n"
414
452
  self.each_systemI.with_index do |systemI,i|
415
453
  res << " " * (level+1)*3
416
- res << "scope->systemIs[#{i}] = " +
417
- "#{Low2C.make_name(systemI)}();\n"
454
+ res << "scope->systemIs[#{i}] = "
455
+ res << Low2C.make_name(systemI) << "();\n"
418
456
  end
419
457
 
420
458
  # Add the inner signals declaration.
421
459
  res << " " * (level+1)*3
422
460
  res << "scope->num_inners = #{self.each_inner.to_a.size};\n"
423
461
  res << " " * (level+1)*3
424
- res << "scope->inners = calloc(sizeof(SignalI)," +
425
- "scope->num_inners);\n"
462
+ res << "scope->inners = calloc(sizeof(SignalI),"
463
+ res << "scope->num_inners);\n"
426
464
  self.each_inner.with_index do |inner,i|
427
465
  res << " " * (level+1)*3
428
- res << "scope->inners[#{i}] = " +
429
- "#{Low2C.make_name(inner)}();\n"
466
+ res << "scope->inners[#{i}] = "
467
+ res << Low2C.make_name(inner) << "();\n"
430
468
  end
431
469
 
432
470
  # Add the sub scopes.
433
471
  res << " " * (level+1)*3
434
472
  res << "scope->num_scopes = #{self.each_scope.to_a.size};\n"
435
473
  res << " " * (level+1)*3
436
- res << "scope->scopes = calloc(sizeof(Scope)," +
437
- "scope->num_scopes);\n"
474
+ res << "scope->scopes = calloc(sizeof(Scope),"
475
+ res << "scope->num_scopes);\n"
438
476
  self.each_scope.with_index do |scope,i|
439
477
  res << " " * (level+1)*3
440
- res << "scope->scopes[#{i}] = " +
441
- "#{Low2C.make_name(scope)}();\n"
478
+ res << "scope->scopes[#{i}] = "
479
+ res << Low2C.make_name(scope) << "();\n"
442
480
  end
443
481
 
444
482
  # Add the behaviors.
445
483
  res << " " * (level+1)*3
446
484
  res << "scope->num_behaviors = #{self.each_behavior.to_a.size};\n"
447
485
  res << " " * (level+1)*3
448
- res << "scope->behaviors = calloc(sizeof(Behavior)," +
449
- "scope->num_behaviors);\n"
486
+ res << "scope->behaviors = calloc(sizeof(Behavior),"
487
+ res << "scope->num_behaviors);\n"
450
488
  self.each_behavior.with_index do |behavior,i|
451
489
  res << " " * (level+1)*3
452
- res << "scope->behaviors[#{i}] = " +
453
- "#{Low2C.make_name(behavior)}();\n"
490
+ res << "scope->behaviors[#{i}] = "
491
+ res << Low2C.make_name(behavior) << "();\n"
454
492
  end
455
493
 
456
494
  # Add the non-HDLRuby codes.
@@ -461,8 +499,8 @@ module HDLRuby::Low
461
499
  "scope->num_codes);\n"
462
500
  self.each_code.with_index do |code,i|
463
501
  res << " " * (level+1)*3
464
- res << "scope->codes[#{i}] = " +
465
- "#{Low2C.make_name(code)}();\n"
502
+ res << "scope->codes[#{i}] = "
503
+ res << Low2C.make_name(code) << "();\n"
466
504
  end
467
505
 
468
506
  # Generate the Returns of the result.
@@ -477,28 +515,34 @@ module HDLRuby::Low
477
515
  end
478
516
 
479
517
  ## Generates the content of the h file.
480
- def to_ch
481
- res = ""
518
+ # def to_ch
519
+ def to_ch(res)
520
+ # res = ""
482
521
  # Declare the global variable holding the signal.
483
- res << "extern Scope #{Low2C.obj_name(self)};\n\n"
522
+ res << "extern Scope " << Low2C.obj_name(self) << ";\n\n"
484
523
 
485
524
  # Generate the access to the function making the scope.
486
- res << "extern Scope #{Low2C.make_name(self)}();\n\n"
525
+ res << "extern Scope " << Low2C.make_name(self) << "();\n\n"
487
526
 
488
527
  # Generate the accesses to the system instances.
489
- self.each_systemI { |systemI| res << systemI.to_ch }
528
+ # self.each_systemI { |systemI| res << systemI.to_ch }
529
+ self.each_systemI { |systemI| systemI.to_ch(res) }
490
530
 
491
531
  # Generate the accesses to the signals.
492
- self.each_inner { |inner| res << inner.to_ch }
532
+ # self.each_inner { |inner| res << inner.to_ch }
533
+ self.each_inner { |inner| inner.to_ch(res) }
493
534
 
494
535
  # Generate the access to the sub scopes.
495
- self.each_scope { |scope| res << scope.to_ch }
536
+ # self.each_scope { |scope| res << scope.to_ch }
537
+ self.each_scope { |scope| scope.to_ch(res) }
496
538
 
497
539
  # Generate the access to the behaviors.
498
- self.each_behavior { |behavior| res << behavior.to_ch }
540
+ # self.each_behavior { |behavior| res << behavior.to_ch }
541
+ self.each_behavior { |behavior| behavior.to_ch(res) }
499
542
 
500
543
  # Generate the access to the non-HDLRuby code.
501
- self.each_behavior { |code| res << code.to_ch }
544
+ # self.each_behavior { |code| res << code.to_ch }
545
+ self.each_behavior { |code| code.to_ch(res) }
502
546
 
503
547
  return res;
504
548
  end
@@ -510,16 +554,18 @@ module HDLRuby::Low
510
554
 
511
555
  # Generates the C text of the equivalent HDLRuby code.
512
556
  # +level+ is the hierachical level of the object.
513
- def to_c(level = 0)
514
- # return Low2C.c_name(self.name)
515
- # return Low2C.type_name(Bit) + "()"
557
+ # def to_c(level = 0)
558
+ def to_c(res,level = 0)
516
559
  if self.name == :bit || self.name == :unsigned then
517
- return "get_type_bit()"
560
+ # return "get_type_bit()"
561
+ res << "get_type_bit()"
518
562
  elsif self.name == :signed then
519
- return "get_type_signed()"
563
+ # return "get_type_signed()"
564
+ res << "get_type_signed()"
520
565
  else
521
566
  raise "Unknown type: #{self.name}"
522
567
  end
568
+ return res
523
569
  end
524
570
  end
525
571
 
@@ -528,11 +574,12 @@ module HDLRuby::Low
528
574
 
529
575
  # Generates the C text of the equivalent HDLRuby code.
530
576
  # +level+ is the hierachical level of the object.
531
- def to_c(level = 0)
532
- # # Simply use the name of the type.
533
- # return Low2C.type_name(self.name) + "()"
577
+ # def to_c(level = 0)
578
+ def to_c(res,level = 0)
534
579
  # Simply return the defined type.
535
- return self.def.to_c(level)
580
+ # return self.def.to_c(level)
581
+ self.def.to_c(res,level)
582
+ return res
536
583
  end
537
584
  end
538
585
 
@@ -541,10 +588,15 @@ module HDLRuby::Low
541
588
 
542
589
  # Generates the C text of the equivalent HDLRuby code.
543
590
  # +level+ is the hierachical level of the object.
544
- def to_c(level = 0)
591
+ # def to_c(level = 0)
592
+ def to_c(res,level = 0)
545
593
  # The resulting string.
546
- return "get_type_vector(#{self.base.to_c(level+1)}," +
547
- "#{self.size})"
594
+ # return "get_type_vector(#{self.base.to_c(level+1)}," +
595
+ # "#{self.size})"
596
+ res << "get_type_vector("
597
+ self.base.to_c(res,level+1)
598
+ res << ",#{self.size})"
599
+ return res
548
600
  end
549
601
  end
550
602
 
@@ -555,11 +607,11 @@ module HDLRuby::Low
555
607
  # +level+ is the hierachical level of the object.
556
608
  #
557
609
  # NOTE: type tuples are converted to bit vector of their contents.
558
- def to_c(level = 0)
559
- # return "get_type_tuple(#{self.each.to_a.join(",") do |type|
560
- # type.to_c(level+1)
561
- # end})"
562
- return self.to_vector.to_c(level)
610
+ # def to_c(level = 0)
611
+ def to_c(res,level = 0)
612
+ # return self.to_vector.to_c(level)
613
+ self.to_vector.to_c(res,level)
614
+ return res
563
615
  end
564
616
  end
565
617
 
@@ -569,10 +621,15 @@ module HDLRuby::Low
569
621
 
570
622
  # Generates the text of the equivalent HDLRuby code.
571
623
  # +level+ is the hierachical level of the object.
572
- def to_c(level = 0)
573
- return "get_type_struct(#{self.each.join(",") do |key,type|
574
- "\"#{key.to_s}\",#{type.to_c(level+1)}"
624
+ # def to_c(level = 0)
625
+ def to_c(res,level = 0)
626
+ # return "get_type_struct(#{self.each.join(",") do |key,type|
627
+ # "\"#{key.to_s}\",#{type.to_c(level+1)}"
628
+ # end})"
629
+ res << "get_type_struct(#{self.each.join(",") do |key,type|
630
+ "\"#{key.to_s}\",#{type.to_c("",level+1)}"
575
631
  end})"
632
+ return res
576
633
  end
577
634
  end
578
635
 
@@ -583,19 +640,20 @@ module HDLRuby::Low
583
640
  # Generates the text of the equivalent HDLRuby code.
584
641
  # +level+ is the hierachical level of the object and
585
642
  # +time+ is a flag telling if the behavior is timed or not.
586
- def to_c(level = 0, time = false)
643
+ # def to_c(level = 0, time = false)
644
+ def to_c(res, level = 0, time = false)
587
645
  # puts "For behavior: #{self}"
588
- # The resulting string.
589
- res = ""
646
+ # # The resulting string.
647
+ # res = ""
590
648
 
591
649
  # Declare the global variable holding the behavior.
592
- res << "Behavior #{Low2C.obj_name(self)};\n\n"
650
+ res << "Behavior " << Low2C.obj_name(self) << ";\n\n"
593
651
 
594
652
  # Generate the code of the behavior.
595
653
 
596
654
  # The header of the behavior.
597
655
  res << " " * level*3
598
- res << "Behavior #{Low2C.make_name(self)}() {\n"
656
+ res << "Behavior " << Low2C.make_name(self) << "() {\n"
599
657
  res << " " * (level+1)*3
600
658
 
601
659
  # Allocate the behavior.
@@ -606,7 +664,7 @@ module HDLRuby::Low
606
664
  # Sets the global variable of the behavior.
607
665
  res << "\n"
608
666
  res << " " * (level+1)*3
609
- res << "#{Low2C.obj_name(self)} = behavior;\n"
667
+ res << Low2C.obj_name(self) << " = behavior;\n"
610
668
 
611
669
  # Register it as a time behavior if it is one of them. */
612
670
  if time then
@@ -617,8 +675,8 @@ module HDLRuby::Low
617
675
  # Set the owner if any.
618
676
  if self.parent then
619
677
  res << " " * (level+1)*3
620
- res << "behavior->owner = (Object)" +
621
- "#{Low2C.obj_name(self.parent)};\n"
678
+ res << "behavior->owner = (Object)"
679
+ res << Low2C.obj_name(self.parent) << ";\n"
622
680
  else
623
681
  res << "behavior->owner = NULL;\n"
624
682
  end
@@ -655,14 +713,17 @@ module HDLRuby::Low
655
713
  res << " " * (level+1)*3
656
714
  res << "behavior->num_events = #{events.size};\n"
657
715
  res << " " * (level+1)*3
658
- res << "behavior->events = calloc(sizeof(Event)," +
659
- "behavior->num_events);\n"
716
+ res << "behavior->events = calloc(sizeof(Event),"
717
+ res << "behavior->num_events);\n"
660
718
  # Then, create and add them.
661
719
  events.each_with_index do |event,i|
662
720
  # puts "for event=#{event}"
663
721
  # Add the event.
664
722
  res << " " * (level+1)*3
665
- res << "behavior->events[#{i}] = #{event.to_c};\n"
723
+ # res << "behavior->events[#{i}] = #{event.to_c};\n"
724
+ res << "behavior->events[#{i}] = "
725
+ event.to_c(res)
726
+ res << ";\n"
666
727
 
667
728
  # Register the behavior as activable on this event.
668
729
  # Select the active field.
@@ -671,20 +732,22 @@ module HDLRuby::Low
671
732
  field = "neg" if event.type == :negedge
672
733
  # puts "Adding #{field} event: #{event}\n"
673
734
  # Get the target signal access
674
- sigad = event.ref.resolve.to_c_signal
735
+ # sigad = event.ref.resolve.to_c_signal
736
+ sigad = ""
737
+ event.ref.resolve.to_c_signal(sigad)
675
738
  # Add the behavior to the relevant field.
676
739
  res << " " * (level+1)*3
677
740
  res << "#{sigad}->num_#{field} += 1;\n"
678
741
  res << " " * (level+1)*3
679
- res << "#{sigad}->#{field} = realloc(#{sigad}->#{field}," +
680
- "#{sigad}->num_#{field}*sizeof(Object));\n"
681
- res << "#{sigad}->#{field}[#{sigad}->num_#{field}-1] = " +
682
- "(Object)behavior;\n"
742
+ res << "#{sigad}->#{field} = realloc(#{sigad}->#{field},"
743
+ res << "#{sigad}->num_#{field}*sizeof(Object));\n"
744
+ res << "#{sigad}->#{field}[#{sigad}->num_#{field}-1] = "
745
+ res << "(Object)behavior;\n"
683
746
  end
684
747
 
685
748
  # Adds the block.
686
749
  res << " " * (level+1)*3
687
- res << "behavior->block = #{Low2C.make_name(self.block)}();\n"
750
+ res << "behavior->block = " << Low2C.make_name(self.block) << "();\n"
688
751
 
689
752
  # Generate the Returns of the result.
690
753
  res << "\n"
@@ -698,16 +761,18 @@ module HDLRuby::Low
698
761
  end
699
762
 
700
763
  ## Generates the content of the h file.
701
- def to_ch
702
- res = ""
764
+ # def to_ch
765
+ def to_ch(res)
766
+ # res = ""
703
767
  # Declare the global variable holding the signal.
704
- res << "extern Behavior #{Low2C.obj_name(self)};\n\n"
768
+ res << "extern Behavior " << Low2C.obj_name(self) << ";\n\n"
705
769
 
706
770
  # Generate the access to the function making the behavior.
707
- res << "extern Behavior #{Low2C.make_name(self)}();\n\n"
771
+ res << "extern Behavior " << Low2C.make_name(self) << "();\n\n"
708
772
 
709
773
  # Generate the accesses to the block of the behavior.
710
- res << self.block.to_ch
774
+ # res << self.block.to_ch
775
+ self.block.to_ch(res)
711
776
 
712
777
  return res;
713
778
  end
@@ -718,8 +783,10 @@ module HDLRuby::Low
718
783
 
719
784
  # Generates the C text of the equivalent HDLRuby code.
720
785
  # +level+ is the hierachical level of the object.
721
- def to_c(level = 0)
722
- super(level,true)
786
+ # def to_c(level = 0)
787
+ def to_c(res,level = 0)
788
+ # super(level,true)
789
+ super(res,level,true)
723
790
  end
724
791
  end
725
792
 
@@ -729,12 +796,17 @@ module HDLRuby::Low
729
796
 
730
797
  # Generates the C text of the equivalent HDLRuby code.
731
798
  # +level+ is the hierachical level of the object.
732
- def to_c(level = 0)
799
+ # def to_c(level = 0)
800
+ def to_c(res,level = 0)
733
801
  edge = "ANYEDGE"
734
802
  edge = "POSEDGE" if self.type == :posedge
735
803
  edge = "NEGEDGE" if self.type == :negedge
736
- return "make_event(#{edge}," +
737
- "#{self.ref.resolve.to_c_signal(level+1)})"
804
+ # return "make_event(#{edge}," +
805
+ # "#{self.ref.resolve.to_c_signal(level+1)})"
806
+ res << "make_event(#{edge},"
807
+ self.ref.resolve.to_c_signal(res,level+1)
808
+ res << ")"
809
+ return res
738
810
  end
739
811
  end
740
812
 
@@ -744,29 +816,39 @@ module HDLRuby::Low
744
816
 
745
817
  ## Generates the C text for an access to the signal.
746
818
  # +level+ is the hierachical level of the object.
747
- def to_c_signal(level = 0)
748
- res = Low2C.obj_name(self)
749
- # Accumulate the names of each parent until there is no one left.
750
- obj = self.parent
751
- while(obj) do
752
- res << "_" << Low2C.obj_name(obj)
753
- obj = obj.parent
754
- end
819
+ # def to_c_signal(level = 0)
820
+ def to_c_signal(res,level = 0)
821
+ # res = Low2C.obj_name(self)
822
+ res << Low2C.obj_name(self)
823
+ # # Accumulate the names of each parent until there is no one left.
824
+ # obj = self.parent
825
+ # while(obj) do
826
+ # res << "_" << Low2C.obj_name(obj)
827
+ # obj = obj.parent
828
+ # end
755
829
  return res
756
830
  end
757
831
 
758
832
  ## Generates the C text of the equivalent HDLRuby code.
759
833
  # +level+ is the hierachical level of the object.
760
- def to_c(level = 0)
834
+ # def to_c(level = 0)
835
+ def to_c(res,level = 0)
761
836
  # The resulting string.
762
- res = ""
837
+ # res = ""
763
838
 
764
839
  # Declare the global variable holding the signal.
765
- res << "SignalI #{self.to_c_signal(level+1)};\n\n"
840
+ # res << "SignalI #{self.to_c_signal(level+1)};\n\n"
841
+ res << "SignalI "
842
+ self.to_c_signal(res,level+1)
843
+ res << ";\n\n"
766
844
 
767
845
  # The header of the signal generation.
768
846
  res << " " * level*3
769
- res << "SignalI #{Low2C.make_name(self)}() {\n"
847
+ res << "SignalI " << Low2C.make_name(self) << "() {\n"
848
+ # res << " " * level*3
849
+ # res << "Value l,r,d;\n"
850
+ # res << " " * (level+1)*3
851
+ # res << "unsigned long long i;\n"
770
852
  res << " " * (level+1)*3
771
853
  res << "SignalI signalI = malloc(sizeof(SignalIS));\n"
772
854
  res << " " * (level+1)*3
@@ -775,13 +857,15 @@ module HDLRuby::Low
775
857
  # Sets the global variable of the signal.
776
858
  res << "\n"
777
859
  res << " " * (level+1)*3
778
- res << "#{self.to_c_signal(level+1)} = signalI;\n"
860
+ # res << "#{self.to_c_signal(level+1)} = signalI;\n"
861
+ self.to_c_signal(res,level+1)
862
+ res << " = signalI;\n"
779
863
 
780
864
  # Set the owner if any.
781
865
  if self.parent then
782
866
  res << " " * (level+1)*3
783
- res << "signalI->owner = (Object)" +
784
- "#{Low2C.obj_name(self.parent)};\n"
867
+ res << "signalI->owner = (Object)"
868
+ res << Low2C.obj_name(self.parent) << ";\n"
785
869
  else
786
870
  res << "signalI->owner = NULL;\n"
787
871
  end
@@ -791,7 +875,10 @@ module HDLRuby::Low
791
875
  res << "signalI->name = \"#{self.name}\";\n"
792
876
  # Set the type.
793
877
  res << " " * (level+1)*3
794
- res << "signalI->type = #{self.type.to_c(level+2)};\n"
878
+ # res << "signalI->type = #{self.type.to_c(level+2)};\n"
879
+ res << "signalI->type = "
880
+ self.type.to_c(res,level+2)
881
+ res << ";\n"
795
882
  # Set the current and the next value.
796
883
  res << " " * (level+1)*3
797
884
  res << "signalI->c_value = make_value(signalI->type,0);\n"
@@ -804,8 +891,11 @@ module HDLRuby::Low
804
891
  if self.value then
805
892
  # There is an initial value.
806
893
  res << " " * (level+1)*3
807
- res << "copy_value(#{self.value.to_c(level+2)}," +
808
- "signalI->c_value);\n"
894
+ # res << "copy_value(#{self.value.to_c(level+2)}," +
895
+ # "signalI->c_value);\n"
896
+ res << "copy_value("
897
+ self.value.to_c_expr(res,level+2)
898
+ res << ",signalI->c_value);\n"
809
899
  end
810
900
 
811
901
  # Initially the signal can be overwritten by anything.
@@ -843,14 +933,18 @@ module HDLRuby::Low
843
933
  end
844
934
 
845
935
  ## Generates the content of the h file.
846
- def to_ch
847
- res = ""
936
+ # def to_ch
937
+ def to_ch(res)
938
+ # res = ""
848
939
  # puts "to_ch for SignalI: #{self.to_c_signal()}"
849
940
  # Declare the global variable holding the signal.
850
- res << "extern SignalI #{self.to_c_signal()};\n\n"
941
+ # res << "extern SignalI #{self.to_c_signal()};\n\n"
942
+ res << "extern SignalI "
943
+ self.to_c_signal(res)
944
+ res << ";\n\n"
851
945
 
852
946
  # Generate the access to the function making the behavior.
853
- res << "extern SignalI #{Low2C.make_name(self)}();\n\n"
947
+ res << "extern SignalI " << Low2C.make_name(self) << "();\n\n"
854
948
 
855
949
  return res;
856
950
  end
@@ -862,16 +956,17 @@ module HDLRuby::Low
862
956
 
863
957
  ## Generates the C text of the equivalent HDLRuby code.
864
958
  # +level+ is the hierachical level of the object.
865
- def to_c(level = 0)
959
+ # def to_c(level = 0)
960
+ def to_c(res,level = 0)
866
961
  # The resulting string.
867
- res = ""
962
+ # res = ""
868
963
 
869
964
  # Declare the global variable holding the signal.
870
- res << "SystemI #{Low2C.obj_name(self)};\n\n"
965
+ res << "SystemI " << Low2C.obj_name(self) << ";\n\n"
871
966
 
872
967
  # The header of the signal generation.
873
968
  res << " " * level*3
874
- res << "SystemI #{Low2C.make_name(self)}() {\n"
969
+ res << "SystemI " << Low2C.make_name(self) << "() {\n"
875
970
  res << " " * (level+1)*3
876
971
  res << "SystemI systemI = malloc(sizeof(SystemIS));\n"
877
972
  res << " " * (level+1)*3
@@ -880,13 +975,13 @@ module HDLRuby::Low
880
975
  # Sets the global variable of the system instance.
881
976
  res << "\n"
882
977
  res << " " * (level+1)*3
883
- res << "#{Low2C.obj_name(self)} = systemI;\n"
978
+ res << Low2C.obj_name(self) << " = systemI;\n"
884
979
 
885
980
  # Set the owner if any.
886
981
  if self.parent then
887
982
  res << " " * (level+1)*3
888
- res << "systemI->owner = (Object)" +
889
- "#{Low2C.obj_name(self.parent)};\n"
983
+ res << "systemI->owner = (Object)"
984
+ res << Low2C.obj_name(self.parent) << ";\n"
890
985
  else
891
986
  res << "systemI->owner = NULL;\n"
892
987
  end
@@ -896,7 +991,7 @@ module HDLRuby::Low
896
991
  res << "systemI->name = \"#{self.name}\";\n"
897
992
  # Set the type.
898
993
  res << " " * (level+1)*3
899
- res << "systemI->system = #{Low2C.obj_name(self.systemT)};\n"
994
+ res << "systemI->system = " << Low2C.obj_name(self.systemT) << ";\n"
900
995
 
901
996
  # Generate the return of the signal.
902
997
  res << "\n"
@@ -910,13 +1005,14 @@ module HDLRuby::Low
910
1005
  end
911
1006
 
912
1007
  ## Generates the content of the h file.
913
- def to_ch
914
- res = ""
1008
+ # def to_ch
1009
+ def to_ch(res)
1010
+ # res = ""
915
1011
  # Declare the global variable holding the signal.
916
- res << "extern SystemI #{Low2C.obj_name(self)};\n\n"
1012
+ res << "extern SystemI " << Low2C.obj_name(self) << ";\n\n"
917
1013
 
918
1014
  # Generate the access to the function making the systemT. */
919
- res << "extern SystemI #{Low2C.make_name(self)}();\n\n"
1015
+ res << "extern SystemI " << Low2C.make_name(self) << "();\n\n"
920
1016
 
921
1017
  return res
922
1018
  end
@@ -928,15 +1024,28 @@ module HDLRuby::Low
928
1024
 
929
1025
  # Generates the C text of the equivalent HDLRuby code.
930
1026
  # +level+ is the hierachical level of the object.
931
- def to_c(level = 0)
932
- res = " " * level
933
- res << self.each_lump.map do |lump|
1027
+ # def to_c(level = 0)
1028
+ def to_c(res,level = 0)
1029
+ # res = " " * level
1030
+ res << " " * level
1031
+ # res << self.each_lump.map do |lump|
1032
+ # if !lump.is_a?(String) then
1033
+ # lump.respond_to?(:to_c) ? lump.to_c(level+1) : lump.to_s
1034
+ # else
1035
+ # lump
1036
+ # end
1037
+ # end.join
1038
+ self.each_lump do |lump|
934
1039
  if !lump.is_a?(String) then
935
- lump.respond_to?(:to_c) ? lump.to_c(level+1) : lump.to_s
1040
+ if lump.respond_to?(:to_c) then
1041
+ lump.to_c(res,level+1)
1042
+ else
1043
+ res << lump.to_s
1044
+ end
936
1045
  else
937
- lump
1046
+ res << lump
938
1047
  end
939
- end.join
1048
+ end
940
1049
  return res
941
1050
  end
942
1051
  end
@@ -946,19 +1055,20 @@ module HDLRuby::Low
946
1055
  class Code
947
1056
  # Generates the C text of the equivalent HDLRuby code.
948
1057
  # +level+ is the hierachical level of the object.
949
- def to_c(level = 0)
1058
+ # def to_c(level = 0)
1059
+ def to_c(res,level = 0)
950
1060
  # puts "For behavior: #{self}"
951
1061
  # The resulting string.
952
- res = ""
1062
+ # res = ""
953
1063
 
954
1064
  # Declare the global variable holding the behavior.
955
- res << "Code #{Low2C.obj_name(self)};\n\n"
1065
+ res << "Code " << Low2C.obj_name(self) << ";\n\n"
956
1066
 
957
1067
  # Generate the code of the behavior.
958
1068
 
959
1069
  # The header of the behavior.
960
1070
  res << " " * level*3
961
- res << "Code #{Low2C.make_name(self)}() {\n"
1071
+ res << "Code " << Low2C.make_name(self) << "() {\n"
962
1072
  res << " " * (level+1)*3
963
1073
 
964
1074
  # Allocate the code.
@@ -969,13 +1079,13 @@ module HDLRuby::Low
969
1079
  # Sets the global variable of the code.
970
1080
  res << "\n"
971
1081
  res << " " * (level+1)*3
972
- res << "#{Low2C.obj_name(self)} = code;\n"
1082
+ res << Low2C.obj_name(self) << " = code;\n"
973
1083
 
974
1084
  # Set the owner if any.
975
1085
  if self.parent then
976
1086
  res << " " * (level+1)*3
977
- res << "code->owner = (Object)" +
978
- "#{Low2C.obj_name(self.parent)};\n"
1087
+ res << "code->owner = (Object)"
1088
+ res << Low2C.obj_name(self.parent) << ";\n"
979
1089
  else
980
1090
  res << "code->owner = NULL;\n"
981
1091
  end
@@ -997,7 +1107,10 @@ module HDLRuby::Low
997
1107
  # puts "for event=#{event}"
998
1108
  # Add the event.
999
1109
  res << " " * (level+1)*3
1000
- res << "code->events[#{i}] = #{event.to_c};\n"
1110
+ # res << "code->events[#{i}] = #{event.to_c};\n"
1111
+ res << "code->events[#{i}] = "
1112
+ event.to_c(res)
1113
+ res << ";\n"
1001
1114
 
1002
1115
  # Register the behavior as activable on this event.
1003
1116
  # Select the active field.
@@ -1005,7 +1118,9 @@ module HDLRuby::Low
1005
1118
  field = "pos" if event.type == :posedge
1006
1119
  field = "neg" if event.type == :negedge
1007
1120
  # Get the target signal access
1008
- sigad = event.ref.resolve.to_c_signal
1121
+ # sigad = event.ref.resolve.to_c_signal
1122
+ sigad = ""
1123
+ event.ref.resolve.to_c_signal(sigad)
1009
1124
  # Add the code to the relevant field.
1010
1125
  res << " " * (level+1)*3
1011
1126
  res << "#{sigad}->num_#{field} += 1;\n"
@@ -1019,7 +1134,10 @@ module HDLRuby::Low
1019
1134
  # Adds the function to execute.
1020
1135
  function = self.each_chunk.find { |chunk| chunk.name == :sim }
1021
1136
  res << " " * (level+1)*3
1022
- res << "code->function = &#{function.to_c};\n"
1137
+ # res << "code->function = &#{function.to_c};\n"
1138
+ res << "code->function = &"
1139
+ function.to_c(res)
1140
+ res << ";\n"
1023
1141
 
1024
1142
  # Generate the Returns of the result.
1025
1143
  res << "\n"
@@ -1033,16 +1151,18 @@ module HDLRuby::Low
1033
1151
  end
1034
1152
 
1035
1153
  ## Generates the content of the h file.
1036
- def to_ch
1037
- res = ""
1154
+ # def to_ch
1155
+ def to_ch(res)
1156
+ # res = ""
1038
1157
  # Declare the global variable holding the signal.
1039
- res << "extern Behavior #{Low2C.obj_name(self)};\n\n"
1158
+ res << "extern Behavior " << Low2C.obj_name(self) << ";\n\n"
1040
1159
 
1041
1160
  # Generate the access to the function making the behavior.
1042
- res << "extern Behavior #{Low2C.make_name(self)}();\n\n"
1161
+ res << "extern Behavior " << Low2C.make_name(self) << "();\n\n"
1043
1162
 
1044
1163
  # Generate the accesses to the block of the behavior.
1045
- res << self.block.to_ch
1164
+ # res << self.block.to_ch
1165
+ self.block.to_ch(res)
1046
1166
 
1047
1167
  return res;
1048
1168
  end
@@ -1054,15 +1174,18 @@ module HDLRuby::Low
1054
1174
 
1055
1175
  # Generates the C text of the equivalent HDLRuby code.
1056
1176
  # +level+ is the hierachical level of the object.
1057
- def to_c(level = 0)
1177
+ # def to_c(level = 0)
1178
+ def to_c(res,level = 0)
1058
1179
  # Should never be here.
1059
1180
  raise AnyError, "Internal error: to_c should be implemented in class :#{self.class}"
1060
1181
  end
1061
1182
 
1062
1183
  ## Generates the content of the h file.
1063
- def to_ch
1184
+ # def to_ch
1185
+ def to_ch(res)
1064
1186
  # By default nothing to generate.
1065
- return ""
1187
+ # return ""
1188
+ return res
1066
1189
  end
1067
1190
 
1068
1191
  # Adds the c code of the blocks to +res+ at +level+
@@ -1091,34 +1214,100 @@ module HDLRuby::Low
1091
1214
  ## Extends the Transmit class with generation of C text.
1092
1215
  class Transmit
1093
1216
 
1217
+ # # Generates the C text of the equivalent HDLRuby code.
1218
+ # # +level+ is the hierachical level of the object.
1219
+ # # def to_c(level = 0)
1220
+ # def to_c(res,level = 0)
1221
+ # # Save the state of the value pool.
1222
+ # # res = (" " * ((level)*3))
1223
+ # res << (" " * ((level)*3))
1224
+ # res << "{\n"
1225
+ # res << (" " * ((level+1)*3))
1226
+ # res << "unsigned int pool_state = get_value_pos();\n"
1227
+ # # Perform the copy and the touching only if the new content
1228
+ # # is different.
1229
+ # # res << (" " * ((level+1)*3))
1230
+ # # Is it a sequential execution model?
1231
+ # seq = self.block.mode == :seq ? "_seq" : ""
1232
+ # # # Generate the assignment.
1233
+ # # if (self.left.is_a?(RefName)) then
1234
+ # # # Direct assignment to a signal, simple transmission.
1235
+ # # res << "transmit_to_signal#{seq}("
1236
+ # # self.right.to_c(res,level)
1237
+ # # res << ","
1238
+ # # self.left.to_c_signal(res,level)
1239
+ # # res << ");\n"
1240
+ # # else
1241
+ # # # Assignment inside a signal (RefIndex or RefRange).
1242
+ # # res << "transmit_to_signal_range#{seq}("
1243
+ # # self.right.to_c(res,level)
1244
+ # # res << ","
1245
+ # # self.left.to_c_signal(res,level)
1246
+ # # res << ");\n"
1247
+ # # ### Why twice ???
1248
+ # # res << "transmit_to_signal_range#{seq}("
1249
+ # # self.right.to_c(res,level)
1250
+ # # res << ","
1251
+ # # self.left.to_c_signal(res,level)
1252
+ # # res << ");\n"
1253
+ # # end
1254
+ # # Generate the assignment.
1255
+ # if (self.left.is_a?(RefName)) then
1256
+ # # Generate the right value.
1257
+ # self.right.to_c(res,level+1)
1258
+ # # Direct assignment to a signal, simple transmission.
1259
+ # res << (" " * ((level+1)*3))
1260
+ # res << "transmit_to_signal#{seq}(d,"
1261
+ # # Generate the left value (target signal).
1262
+ # self.left.to_c_signal(res,level+1)
1263
+ # res << ");\n"
1264
+ # else
1265
+ # # Generate the right value.
1266
+ # self.right.to_c(res,level+1)
1267
+ # # Assignment inside a signal (RefIndex or RefRange).
1268
+ # res << "transmit_to_signal_range#{seq}(d,"
1269
+ # # Generate the left value (target signal).
1270
+ # self.left.to_c_signal(res,level+1)
1271
+ # res << ");\n"
1272
+ # end
1273
+ # # Restore the value pool state.
1274
+ # res << (" " * ((level+1)*3))
1275
+ # res << "set_value_pos(pool_state);\n"
1276
+ # res << (" " * ((level)*3))
1277
+ # res << "}\n"
1278
+ # return res
1279
+ # end
1094
1280
  # Generates the C text of the equivalent HDLRuby code.
1095
1281
  # +level+ is the hierachical level of the object.
1096
- def to_c(level = 0)
1097
- # Save the state of the value pool.
1098
- res = (" " * ((level)*3))
1099
- res << "{\n"
1100
- res << (" " * ((level+1)*3))
1101
- res << "unsigned int pool_state = get_value_pos();\n"
1282
+ # def to_c(level = 0)
1283
+ def to_c(res,level = 0)
1284
+ # Save the value pool state.
1285
+ res << (" " * (level*3)) << "SV;\n"
1102
1286
  # Perform the copy and the touching only if the new content
1103
1287
  # is different.
1104
- res << (" " * ((level+1)*3))
1105
1288
  # Is it a sequential execution model?
1106
1289
  seq = self.block.mode == :seq ? "_seq" : ""
1107
1290
  # Generate the assignment.
1108
1291
  if (self.left.is_a?(RefName)) then
1292
+ # Generate the right value.
1293
+ self.right.to_c(res,level)
1109
1294
  # Direct assignment to a signal, simple transmission.
1110
- res << "transmit_to_signal#{seq}(#{self.right.to_c(level)},"+
1111
- "#{self.left.to_c_signal(level)});\n"
1295
+ res << (" " * (level*3))
1296
+ res << "transmit#{seq}("
1297
+ # Generate the left value (target signal).
1298
+ self.left.to_c_signal(res,level+1)
1299
+ res << ");\n"
1112
1300
  else
1301
+ # Generate the right value.
1302
+ self.right.to_c(res,level)
1113
1303
  # Assignment inside a signal (RefIndex or RefRange).
1114
- res << "transmit_to_signal_range#{seq}(#{self.right.to_c(level)},"+
1115
- "#{self.left.to_c_signal(level)});\n"
1304
+ res << "transmitR#{seq}("
1305
+ # Generate the left value (target signal).
1306
+ self.left.to_c_signal(res,level+1)
1307
+ res << ");\n"
1116
1308
  end
1117
1309
  # Restore the value pool state.
1118
- res << (" " * ((level+1)*3))
1119
- res << "set_value_pos(pool_state);\n"
1120
- res << (" " * ((level)*3))
1121
- res << "}\n"
1310
+ res << (" " * (level*3)) << "RV;\n"
1122
1311
  return res
1123
1312
  end
1124
1313
  end
@@ -1127,35 +1316,68 @@ module HDLRuby::Low
1127
1316
  ## Extends the Print class with generation of C text.
1128
1317
  class Print
1129
1318
 
1319
+ # # Generates the C text of the equivalent HDLRuby code.
1320
+ # # +level+ is the hierachical level of the object.
1321
+ # # def to_c(level = 0)
1322
+ # def to_c(res,level = 0)
1323
+ # # Save the state of the value pool.
1324
+ # # res = (" " * ((level)*3))
1325
+ # res << (" " * ((level)*3))
1326
+ # res << "{\n"
1327
+ # res << (" " * ((level+1)*3))
1328
+ # res << "unsigned int pool_state = get_value_pos();\n"
1329
+ # # Perform the copy and the touching only if the new content
1330
+ # # is different.
1331
+ # res << (" " * ((level+1)*3))
1332
+ # # Is it a sequential execution model?
1333
+ # seq = self.block.mode == :seq ? "_seq" : ""
1334
+ # # Generate the print.
1335
+ # self.each_arg do |arg|
1336
+ # if (arg.is_a?(StringE)) then
1337
+ # res << "printer.print_string(\"" +
1338
+ # Low2C.c_string(arg.content) + "\");\n"
1339
+ # elsif (arg.is_a?(Expression)) then
1340
+ # # res << "printer.print_string_value(" + arg.to_c + ");\n"
1341
+ # res << "printer.print_string_value("
1342
+ # arg.to_c(res)
1343
+ # res << ");\n"
1344
+ # else
1345
+ # # res << "printer.print_string_name(" + arg.to_c + ");\n"
1346
+ # res << "printer.print_string_name("
1347
+ # arg.to_c(res)
1348
+ # res << ");\n"
1349
+ # end
1350
+ # end
1351
+ # # Restore the value pool state.
1352
+ # res << (" " * ((level+1)*3))
1353
+ # res << "set_value_pos(pool_state);\n"
1354
+ # res << (" " * ((level)*3))
1355
+ # res << "}\n"
1356
+ # return res
1357
+ # end
1130
1358
  # Generates the C text of the equivalent HDLRuby code.
1131
1359
  # +level+ is the hierachical level of the object.
1132
- def to_c(level = 0)
1133
- # Save the state of the value pool.
1134
- res = (" " * ((level)*3))
1135
- res << "{\n"
1136
- res << (" " * ((level+1)*3))
1137
- res << "unsigned int pool_state = get_value_pos();\n"
1138
- # Perform the copy and the touching only if the new content
1139
- # is different.
1140
- res << (" " * ((level+1)*3))
1141
- # Is it a sequential execution model?
1142
- seq = self.block.mode == :seq ? "_seq" : ""
1143
- # Generate the print.
1360
+ # def to_c(level = 0)
1361
+ def to_c(res,level = 0)
1362
+ # Save the value pool state.
1363
+ res << (" " * (level*3)) << "PV;\n"
1364
+ # Generate the print for each argument.
1144
1365
  self.each_arg do |arg|
1145
1366
  if (arg.is_a?(StringE)) then
1367
+ res << (" " * (level*3))
1146
1368
  res << "printer.print_string(\"" +
1147
1369
  Low2C.c_string(arg.content) + "\");\n"
1148
1370
  elsif (arg.is_a?(Expression)) then
1149
- res << "printer.print_string_value(" + arg.to_c + ");\n"
1371
+ arg.to_c(res)
1372
+ res << (" " * (level*3))
1373
+ res << "printer.print_string_value(pop());\n"
1150
1374
  else
1151
- res << "printer.print_string_name(" + arg.to_c + ");\n"
1375
+ arg.to_c(res)
1376
+ res << "printer.print_string_name(pop());\n"
1152
1377
  end
1153
1378
  end
1154
1379
  # Restore the value pool state.
1155
- res << (" " * ((level+1)*3))
1156
- res << "set_value_pos(pool_state);\n"
1157
- res << (" " * ((level)*3))
1158
- res << "}\n"
1380
+ res << (" " * (level*3)) << "RV;\n"
1159
1381
  return res
1160
1382
  end
1161
1383
  end
@@ -1164,58 +1386,120 @@ module HDLRuby::Low
1164
1386
  ## Extends the If class with generation of C text.
1165
1387
  class If
1166
1388
 
1389
+ # # Generates the C text of the equivalent HDLRuby code.
1390
+ # # +level+ is the hierachical level of the object.
1391
+ # # def to_c(level = 0)
1392
+ # def to_c(res,level = 0)
1393
+ # # The result string.
1394
+ # # res = " " * level*3
1395
+ # res << " " * level*3
1396
+ # # Compute the condition.
1397
+ # res << "{\n"
1398
+ # res << " " * (level+1)*3
1399
+ # # res << "Value cond = " << self.condition.to_c(level+1) << ";\n"
1400
+ # res << "Value cond = "
1401
+ # self.condition.to_c(res,level+1)
1402
+ # res << ";\n"
1403
+ # # Ensure the condition is testable.
1404
+ # res << " " * (level+1)*3
1405
+ # res << "if (is_defined_value(cond)) {\n"
1406
+ # # The condition is testable.
1407
+ # res << " " * (level+2)*3
1408
+ # res << "if (value2integer(cond)) {\n"
1409
+ # # Generate the yes part.
1410
+ # # res << self.yes.to_c(level+3)
1411
+ # self.yes.to_c(res,level+3)
1412
+ # res << " " * level*3
1413
+ # res << "}\n"
1414
+ # # Generate the alternate if parts.
1415
+ # self.each_noif do |cond,stmnt|
1416
+ # res << " " * level*3
1417
+ # # res << "else if (value2integer(" << cond.to_c(level+1) << ")) {\n"
1418
+ # res << "else if (value2integer("
1419
+ # cond.to_c(res,level+1)
1420
+ # res << ")) {\n"
1421
+ # # res << stmnt.to_c(level+1)
1422
+ # stmnt.to_c(res,level+1)
1423
+ # res << " " * level*3
1424
+ # res << "}\n"
1425
+ # end
1426
+ # # Generate the no part if any.
1427
+ # if self.no then
1428
+ # res << " " * level*3
1429
+ # # res << "else {\n" << self.no.to_c(level+1)
1430
+ # res << "else {\n"
1431
+ # self.no.to_c(res,level+1)
1432
+ # res << " " * level*3
1433
+ # res << "}\n"
1434
+ # end
1435
+ # # Close the if.
1436
+ # res << " " * (level+1)*3
1437
+ # res << "}\n"
1438
+ # res << " " * (level)*3
1439
+ # res << "}\n"
1440
+ # # Return the result.
1441
+ # return res
1442
+ # end
1167
1443
  # Generates the C text of the equivalent HDLRuby code.
1168
1444
  # +level+ is the hierachical level of the object.
1169
- def to_c(level = 0)
1170
- # The result string.
1171
- res = " " * level*3
1445
+ def to_c(res,level = 0)
1446
+ res << " " * level*3
1172
1447
  # Compute the condition.
1173
- res << "{\n"
1174
- res << " " * (level+1)*3
1175
- res << "Value cond = " << self.condition.to_c(level+1) << ";\n"
1176
- # Ensure the condition is testable.
1177
- res << " " * (level+1)*3
1178
- res << "if (is_defined_value(cond)) {\n"
1179
- # The condition is testable.
1180
- res << " " * (level+2)*3
1181
- res << "if (value2integer(cond)) {\n"
1448
+ self.condition.to_c(res,level)
1449
+ # Check is the value is true.
1450
+ res << " " * level*3
1451
+ res << "if (is_true()) {\n"
1182
1452
  # Generate the yes part.
1183
- res << self.yes.to_c(level+3)
1453
+ self.yes.to_c(res,level+1)
1184
1454
  res << " " * level*3
1185
1455
  res << "}\n"
1186
1456
  # Generate the alternate if parts.
1187
1457
  self.each_noif do |cond,stmnt|
1188
- res << " " * level*3
1189
- res << "else if (value2integer(" << cond.to_c(level+1) << ")) {\n"
1190
- res << stmnt.to_c(level+1)
1191
- res << " " * level*3
1458
+ res << " " * (level*3)
1459
+ res << "else {\n"
1460
+ cond.to_c(res,level+1)
1461
+ # Check is the value is true.
1462
+ res << " " * (level+1)*3
1463
+ res << "if (is_true()) {\n"
1464
+ stmnt.to_c(res,level+2)
1465
+ res << " " * ((level+1)*3)
1192
1466
  res << "}\n"
1193
1467
  end
1194
1468
  # Generate the no part if any.
1195
1469
  if self.no then
1196
- res << " " * level*3
1197
- res << "else {\n" << self.no.to_c(level+1)
1470
+ res << " " * (level*3)
1471
+ res << "else {\n"
1472
+ self.no.to_c(res,level+1)
1198
1473
  res << " " * level*3
1199
1474
  res << "}\n"
1200
1475
  end
1201
- # Close the if.
1202
- res << " " * (level+1)*3
1203
- res << "}\n"
1204
- res << " " * (level)*3
1205
- res << "}\n"
1476
+ # Close the noifs.
1477
+ self.each_noif do |cond,stmnt|
1478
+ res << " " * (level*3)
1479
+ res << "}\n"
1480
+ end
1481
+ # # Close the if.
1482
+ # res << " " * ((level+1)*3)
1483
+ # res << "}\n"
1484
+ # res << " " * (level*3)
1485
+ # res << "}\n"
1206
1486
  # Return the result.
1207
1487
  return res
1208
1488
  end
1209
1489
 
1210
1490
  ## Generates the content of the h file.
1211
- def to_ch
1212
- res = ""
1491
+ # def to_ch
1492
+ def to_ch(res)
1493
+ # res = ""
1213
1494
  # Recurse on the sub statements.
1214
- res << self.yes.to_ch
1495
+ # res << self.yes.to_ch
1496
+ self.yes.to_ch(res)
1215
1497
  self.each_noif do |cond,stmnt|
1216
- res << stmnt.to_ch
1498
+ # res << stmnt.to_ch
1499
+ stmnt.to_ch(res)
1217
1500
  end
1218
- res << self.no.to_ch if self.no
1501
+ # res << self.no.to_ch if self.no
1502
+ self.no.to_ch(res) if self.no
1219
1503
  return res
1220
1504
  end
1221
1505
  end
@@ -1225,13 +1509,19 @@ module HDLRuby::Low
1225
1509
 
1226
1510
  # Generates the C text of the equivalent HDLRuby code.
1227
1511
  # +level+ is the hierachical level of the object.
1228
- def to_c(level = 0)
1512
+ # def to_c(level = 0)
1513
+ def to_c(res,level = 0)
1229
1514
  # The result string.
1230
- res = " " * level*3
1515
+ # res = " " * level*3
1516
+ res << " " * level*3
1231
1517
  # Generate the match.
1232
- res << "case " << self.match.to_c(level+1) << ": {\n"
1518
+ # res << "case " << self.match.to_c(level+1) << ": {\n"
1519
+ res << "case "
1520
+ self.match.to_c(res,level+1)
1521
+ res << ": {\n"
1233
1522
  # Generate the statement.
1234
- res << self.statement.to_c(level+1)
1523
+ # res << self.statement.to_c(level+1)
1524
+ self.statement.to_c(res,level+1)
1235
1525
  # Adds a break
1236
1526
  res << " " * (level+1)*3 << "break;\n"
1237
1527
  res << " " * level*3 << "}\n"
@@ -1240,8 +1530,11 @@ module HDLRuby::Low
1240
1530
  end
1241
1531
 
1242
1532
  ## Generates the content of the h file.
1243
- def to_ch
1244
- return self.statement.to_ch
1533
+ # def to_ch
1534
+ def to_ch(res)
1535
+ # return self.statement.to_ch
1536
+ self.statement.to_ch(res)
1537
+ return res
1245
1538
  end
1246
1539
 
1247
1540
  # Adds the c code of the blocks to +res+ at +level+
@@ -1258,42 +1551,92 @@ module HDLRuby::Low
1258
1551
  ## Extends the Case class with generation of C text.
1259
1552
  class Case
1260
1553
 
1554
+ # # Generates the text of the equivalent HDLRuby code.
1555
+ # # +level+ is the hierachical level of the object.
1556
+ # # def to_c(level = 0)
1557
+ # def to_c(res,level = 0)
1558
+ # # res = ""
1559
+ # # Compute the selection value.
1560
+ # res << "{\n"
1561
+ # res << " " * (level+1)*3
1562
+ # # res << "Value value = " << self.value.to_c(level+1) << ";\n"
1563
+ # res << "Value value = "
1564
+ # self.value.to_c(res,level+1)
1565
+ # res << ";\n"
1566
+ # # Ensure the selection value is testable.
1567
+ # res << " " * (level+1)*3
1568
+ # res << "if (is_defined_value(value)) {\n"
1569
+ # # The condition is testable.
1570
+ # # Generate the case as a succession of if statements.
1571
+ # first = true
1572
+ # self.each_when do |w|
1573
+ # res << " " * (level+2)*3
1574
+ # if first then
1575
+ # first = false
1576
+ # else
1577
+ # res << "else "
1578
+ # end
1579
+ # res << "if (value2integer(value) == "
1580
+ # # res << "value2integer(" << w.match.to_c(level+2) << ")) {\n"
1581
+ # res << "value2integer("
1582
+ # w.match.to_c(res,level+2)
1583
+ # res << ")) {\n"
1584
+ # # res << w.statement.to_c(level+3)
1585
+ # w.statement.to_c(res,level+3)
1586
+ # res << " " * (level+2)*3
1587
+ # res << "}\n"
1588
+ # end
1589
+ # if self.default then
1590
+ # res << " " * (level+2)*3
1591
+ # res << "else {\n"
1592
+ # # res << self.default.to_c(level+3)
1593
+ # self.default.to_c(res,level+3)
1594
+ # res << " " * (level+2)*3
1595
+ # res << "}\n"
1596
+ # end
1597
+ # # Close the case.
1598
+ # res << " " * (level+1)*3
1599
+ # res << "}\n"
1600
+ # res << " " * (level)*3
1601
+ # res << "}\n"
1602
+ # # Return the resulting string.
1603
+ # return res
1604
+ # end
1261
1605
  # Generates the text of the equivalent HDLRuby code.
1262
1606
  # +level+ is the hierachical level of the object.
1263
- def to_c(level = 0)
1264
- res = ""
1607
+ # def to_c(level = 0)
1608
+ def to_c(res,level = 0)
1265
1609
  # Compute the selection value.
1266
1610
  res << "{\n"
1267
- res << " " * (level+1)*3
1268
- res << "Value value = " << self.value.to_c(level+1) << ";\n"
1611
+ self.value.to_c(res,level+1)
1612
+ res << " " * ((level+1)*3)
1613
+ res << "dup();\n"
1269
1614
  # Ensure the selection value is testable.
1270
- res << " " * (level+1)*3
1271
- res << "if (is_defined_value(value)) {\n"
1615
+ res << " " * ((level+1)*3)
1616
+ res << "if (is_defined()) {\n"
1272
1617
  # The condition is testable.
1273
1618
  # Generate the case as a succession of if statements.
1274
- first = true
1275
1619
  self.each_when do |w|
1276
- res << " " * (level+2)*3
1277
- if first then
1278
- first = false
1279
- else
1280
- res << "else "
1281
- end
1282
- res << "if (value2integer(value) == "
1283
- res << "value2integer(" << w.match.to_c(level+2) << ")) {\n"
1284
- res << w.statement.to_c(level+3)
1620
+ res << " " * ((level+2)*3)
1621
+ res << "dup();\n"
1622
+ res << " " * ((level+2)*3)
1623
+ w.match.to_c(res,level+2)
1624
+ res << "if (to_integer() == to_integer()) {\n"
1625
+ w.statement.to_c(res,level+3)
1285
1626
  res << " " * (level+2)*3
1286
1627
  res << "}\n"
1287
1628
  end
1288
1629
  if self.default then
1289
1630
  res << " " * (level+2)*3
1290
1631
  res << "else {\n"
1291
- res << self.default.to_c(level+3)
1632
+ self.default.to_c(res,level+3)
1292
1633
  res << " " * (level+2)*3
1293
1634
  res << "}\n"
1294
1635
  end
1295
1636
  # Close the case.
1296
1637
  res << " " * (level+1)*3
1638
+ res << "pop();\n" # Remove the testing value.
1639
+ res << " " * (level+1)*3
1297
1640
  res << "}\n"
1298
1641
  res << " " * (level)*3
1299
1642
  res << "}\n"
@@ -1302,12 +1645,15 @@ module HDLRuby::Low
1302
1645
  end
1303
1646
 
1304
1647
  ## Generates the content of the h file.
1305
- def to_ch
1306
- res = ""
1648
+ # def to_ch
1649
+ def to_ch(res)
1650
+ # res = ""
1307
1651
  # Recurse on the whens.
1308
- self.each_when {|w| res << w.to_ch }
1652
+ # self.each_when {|w| res << w.to_ch }
1653
+ self.each_when {|w| w.to_ch(res) }
1309
1654
  # Recurse on the default statement.
1310
- res << self.default.to_ch if self.default
1655
+ # res << self.default.to_ch if self.default
1656
+ self.default.to_ch(res) if self.default
1311
1657
  return res
1312
1658
  end
1313
1659
  end
@@ -1318,9 +1664,13 @@ module HDLRuby::Low
1318
1664
 
1319
1665
  # Generates the C text of the equivalent HDLRuby code.
1320
1666
  # +level+ is the hierachical level of the object.
1321
- def to_c(level = 0)
1322
- return "make_delay(#{self.value.to_s}," +
1323
- "#{Low2C.unit_name(self.unit)})"
1667
+ # def to_c(level = 0)
1668
+ def to_c(res,level = 0)
1669
+ # return "make_delay(#{self.value.to_s}," +
1670
+ # "#{Low2C.unit_name(self.unit)})"
1671
+ res << "make_delay(#{self.value.to_s},"
1672
+ res << Low2C.unit_name(self.unit) << ")"
1673
+ return res
1324
1674
  end
1325
1675
  end
1326
1676
 
@@ -1330,12 +1680,17 @@ module HDLRuby::Low
1330
1680
 
1331
1681
  # Generates the C text of the equivalent HDLRuby code.
1332
1682
  # +level+ is the hierachical level of the object.
1333
- def to_c(level = 0)
1683
+ # def to_c(level = 0)
1684
+ def to_c(res,level = 0)
1334
1685
  # The resulting string.
1335
- res = " " * level*3
1686
+ # res = " " * level*3
1687
+ res << " " * level*3
1336
1688
  # Generate the wait.
1337
- res << "hw_wait(#{self.delay.to_c(level+1)}," +
1338
- "#{Low2C.behavior_access(self)});\n"
1689
+ # res << "hw_wait(#{self.delay.to_c(level+1)}," +
1690
+ # "#{Low2C.behavior_access(self)});\n"
1691
+ res << "hw_wait("
1692
+ self.delay.to_c(res,level+1)
1693
+ res << "," << Low2C.behavior_access(self) << ");\n"
1339
1694
  # Return the resulting string.
1340
1695
  return res
1341
1696
  end
@@ -1346,13 +1701,17 @@ module HDLRuby::Low
1346
1701
 
1347
1702
  # Generates the C text of the equivalent HDLRuby code.
1348
1703
  # +level+ is the hierachical level of the object.
1349
- def to_c(level = 0)
1704
+ # def to_c(level = 0)
1705
+ def to_c(res,level = 0)
1350
1706
  # The resulting string.
1351
- res = " " * level*3
1707
+ # res = " " * level*3
1708
+ res << " " * level*3
1352
1709
  # Generate an infinite loop executing the block and waiting.
1353
1710
  res << "for(;;) {\n"
1354
- res << "#{self.to_c(level+1)}\n"
1355
- res = " " * (level+1)*3
1711
+ # res << "#{self.statement.to_c(level+1)}\n"
1712
+ self.statement.to_c(res,level+1)
1713
+ res << "\n"
1714
+ res << " " * (level+1)*3
1356
1715
  res << Low2C.wait_code(self,level)
1357
1716
  # Return the resulting string.
1358
1717
  return res
@@ -1364,24 +1723,27 @@ module HDLRuby::Low
1364
1723
 
1365
1724
  # Adds the c code of the blocks to +res+ at +level+
1366
1725
  def add_blocks_code(res,level)
1367
- res << self.to_c_code(level)
1726
+ # res << self.to_c_code(level)
1727
+ self.to_c_code(res,level)
1728
+ return res
1368
1729
  end
1369
1730
 
1370
1731
  # Adds the creation of the blocks to +res+ at +level+.
1371
1732
  def add_make_block(res,level)
1372
1733
  res << " " * level*3
1373
- res << "#{Low2C.make_name(self)}();\n"
1734
+ res << Low2C.make_name(self) << "();\n"
1374
1735
  end
1375
1736
 
1376
1737
  # Generates the C text of the equivalent HDLRuby code.
1377
1738
  # +level+ is the hierachical level of the object.
1378
- def to_c_code(level = 0)
1739
+ # def to_c_code(level = 0)
1740
+ def to_c_code(res,level = 0)
1379
1741
  # The resulting string.
1380
- res = ""
1742
+ # res = ""
1381
1743
  # puts "generating self=#{self.object_id}"
1382
1744
 
1383
1745
  # Declare the global variable holding the block.
1384
- res << "Block #{Low2C.obj_name(self)};\n\n"
1746
+ res << "Block " << Low2C.obj_name(self) << ";\n\n"
1385
1747
 
1386
1748
  # Generate the c code of the sub blocks if any.
1387
1749
  self.each_statement do |stmnt|
@@ -1390,11 +1752,16 @@ module HDLRuby::Low
1390
1752
 
1391
1753
  # Generate the execution function.
1392
1754
  res << " " * level*3
1393
- res << "void #{Low2C.code_name(self)}() {\n"
1755
+ res << "void " << Low2C.code_name(self) << "() {\n"
1756
+ res << " " * (level+1)*3
1757
+ # res << "Value l,r,d;\n"
1758
+ # res << " " * (level+1)*3
1759
+ # res << "unsigned long long i;\n"
1394
1760
  # res << "printf(\"Executing #{Low2C.code_name(self)}...\\n\");"
1395
1761
  # Generate the statements.
1396
1762
  self.each_statement do |stmnt|
1397
- res << stmnt.to_c(level+1)
1763
+ # res << stmnt.to_c(level+1)
1764
+ stmnt.to_c(res,level+1)
1398
1765
  end
1399
1766
  # Close the execution function.
1400
1767
  res << " " * level*3
@@ -1402,11 +1769,12 @@ module HDLRuby::Low
1402
1769
 
1403
1770
 
1404
1771
  # Generate the signals.
1405
- self.each_signal { |signal| res << signal.to_c(level) }
1772
+ # self.each_signal { |signal| res << signal.to_c(level) }
1773
+ self.each_signal { |signal| signal.to_c(res,level) }
1406
1774
 
1407
1775
  # The header of the block.
1408
1776
  res << " " * level*3
1409
- res << "Block #{Low2C.make_name(self)}() {\n"
1777
+ res << "Block " << Low2C.make_name(self) << "() {\n"
1410
1778
  res << " " * (level+1)*3
1411
1779
  res << "Block block = malloc(sizeof(BlockS));\n"
1412
1780
  res << " " * (level+1)*3
@@ -1415,7 +1783,7 @@ module HDLRuby::Low
1415
1783
  # Sets the global variable of the block.
1416
1784
  res << "\n"
1417
1785
  res << " " * (level+1)*3
1418
- res << "#{Low2C.obj_name(self)} = block;\n"
1786
+ res << Low2C.obj_name(self) << " = block;\n"
1419
1787
 
1420
1788
  # Set the owner if any.
1421
1789
  if self.parent then
@@ -1426,8 +1794,8 @@ module HDLRuby::Low
1426
1794
  end
1427
1795
  # Set it as the real parent.
1428
1796
  res << " " * (level+1)*3
1429
- res << "block->owner = (Object)" +
1430
- "#{Low2C.obj_name(true_parent)};\n"
1797
+ res << "block->owner = (Object)"
1798
+ res << Low2C.obj_name(true_parent) << ";\n"
1431
1799
  else
1432
1800
  res << "block->owner = NULL;\n"
1433
1801
  end
@@ -1444,13 +1812,13 @@ module HDLRuby::Low
1444
1812
  "block->num_inners);\n"
1445
1813
  self.each_inner.with_index do |inner,i|
1446
1814
  res << " " * (level+1)*3
1447
- res << "block->inners[#{i}] = " +
1448
- "#{Low2C.make_name(inner)}();\n"
1815
+ res << "block->inners[#{i}] = "
1816
+ res << Low2C.make_name(inner) << "();\n"
1449
1817
  end
1450
1818
 
1451
1819
  # Sets the execution function.
1452
1820
  res << " " * (level+1)*3
1453
- res << "block->function = &#{Low2C.code_name(self)};\n"
1821
+ res << "block->function = &" << Low2C.code_name(self) << ";\n"
1454
1822
 
1455
1823
  # Generate creation of the sub blocks.
1456
1824
  self.each_statement do |stmnt|
@@ -1471,28 +1839,32 @@ module HDLRuby::Low
1471
1839
  # Generates the execution of the block C text of the equivalent
1472
1840
  # HDLRuby code.
1473
1841
  # +level+ is the hierachical level of the object.
1474
- def to_c(level = 0)
1475
- res = " " * (level)
1476
- res << "#{Low2C.code_name(self)}();\n"
1842
+ # def to_c(level = 0)
1843
+ def to_c(res,level = 0)
1844
+ # res = " " * (level*3)
1845
+ res << " " * (level*3)
1846
+ res << Low2C.code_name(self) << "();\n"
1477
1847
  return res
1478
1848
  end
1479
1849
 
1480
1850
  ## Generates the content of the h file.
1481
- def to_ch
1851
+ # def to_ch
1852
+ def to_ch(res)
1482
1853
  # puts "to_ch for block=#{Low2C.obj_name(self)} with=#{self.each_inner.count} inners"
1483
- res = ""
1854
+ # res = ""
1484
1855
  # Declare the global variable holding the block.
1485
- res << "extern Block #{Low2C.obj_name(self)};\n\n"
1856
+ res << "extern Block " << Low2C.obj_name(self) << ";\n\n"
1486
1857
 
1487
1858
  # Generate the access to the function making the block. */
1488
- res << "extern Block #{Low2C.make_name(self)}();\n\n"
1859
+ res << "extern Block " << Low2C.make_name(self) << "();\n\n"
1489
1860
 
1490
1861
  # Generate the accesses to the ports.
1491
- self.each_inner { |inner| res << inner.to_ch }
1862
+ # self.each_inner { |inner| res << inner.to_ch }
1863
+ self.each_inner { |inner| inner.to_ch(res) }
1492
1864
 
1493
1865
  # Recurse on the statements.
1494
- self.each_statement { |stmnt| res << stmnt.to_ch }
1495
-
1866
+ # self.each_statement { |stmnt| res << stmnt.to_ch }
1867
+ self.each_statement { |stmnt| stmnt.to_ch(res) }
1496
1868
 
1497
1869
  return res
1498
1870
  end
@@ -1516,7 +1888,8 @@ module HDLRuby::Low
1516
1888
 
1517
1889
  # Generates the C text of the equivalent HDLRuby code.
1518
1890
  # +level+ is the hierachical level of the object.
1519
- def to_c(level = 0)
1891
+ # def to_c(level = 0)
1892
+ def to_c(res,level = 0)
1520
1893
  # Should never be here.
1521
1894
  raise AnyError, "Internal error: to_c should be implemented in class :#{self.class}"
1522
1895
  end
@@ -1528,25 +1901,50 @@ module HDLRuby::Low
1528
1901
 
1529
1902
  ## Generates the C text for an access to the value.
1530
1903
  # +level+ is the hierachical level of the object.
1531
- def to_c(level = 0)
1532
- return "#{Low2C.make_name(self)}()"
1904
+ def to_c(res,level = 0)
1905
+ # res << Low2C.make_name(self) << "()"
1906
+ # return res
1907
+ res << (" " * (level*3))
1908
+ # res << "d=" << Low2C.make_name(self) << "();\n"
1909
+ res << "push(" << Low2C.make_name(self) << "());\n"
1910
+ return res
1911
+ end
1912
+
1913
+ ## Generates the C text for an expression access to the value.
1914
+ # +level+ is the hierachical level of the object.
1915
+ def to_c_expr(res,level = 0)
1916
+ res << Low2C.make_name(self) << "()"
1917
+ return res
1533
1918
  end
1534
1919
 
1535
1920
  ## Generates the content of the h file.
1536
- def to_ch
1537
- res = ""
1538
- return "extern Value #{Low2C.make_name(self)}();"
1921
+ # def to_ch
1922
+ def to_ch(res)
1923
+ # res = ""
1924
+ # return "extern Value #{Low2C.make_name(self)}();"
1925
+ res << "extern Value " << Low2C.make_name(self) << "();"
1926
+ return res
1539
1927
  end
1540
1928
 
1929
+ @@made_values = Set.new
1930
+
1541
1931
  # Generates the text of the equivalent c.
1542
1932
  # +level+ is the hierachical level of the object.
1543
- def to_c_make(level = 0)
1933
+ # def to_c_make(level = 0)
1934
+ def to_c_make(res,level = 0)
1935
+ # Check is the value maker is already present.
1936
+ maker = Low2C.make_name(self);
1937
+ # return "" if @@made_values.include?(maker)
1938
+ return res if @@made_values.include?(maker)
1939
+ @@made_values.add(maker)
1940
+
1544
1941
  # The resulting string.
1545
- res = ""
1942
+ # res = ""
1546
1943
 
1547
1944
  # The header of the value generation.
1548
1945
  res << " " * level*3
1549
- res << "Value #{Low2C.make_name(self)}() {\n"
1946
+ # res << "Value " << Low2C.make_name(self) << "() {\n"
1947
+ res << "Value " << maker << "() {\n"
1550
1948
 
1551
1949
  # Declares the data.
1552
1950
  # Create the bit string.
@@ -1577,15 +1975,18 @@ module HDLRuby::Low
1577
1975
  res << " " * (level+1)*3
1578
1976
  # res << "static unsigned long long data[] = { "
1579
1977
  res << "static unsigned int data[] = { "
1580
- res << str.scan(/.{1,#{Low2C.int_width}}/m).map do |sub|
1978
+ res << str.scan(/.{1,#{Low2C.int_width}}/m).reverse.map do |sub|
1581
1979
  sub.to_i(2).to_s # + "ULL"
1582
1980
  end.join(",")
1583
1981
  res << " };\n"
1584
1982
  # Create the value.
1585
1983
  res << " " * (level+1)*3
1586
1984
  # puts "str=#{str} type width=#{self.type.width} signed? #{type.signed?}"
1587
- res << "return make_set_value(#{self.type.to_c(level+1)},1," +
1588
- "data);\n"
1985
+ # res << "return make_set_value(#{self.type.to_c(level+1)},1," +
1986
+ # "data);\n"
1987
+ res << "return make_set_value("
1988
+ self.type.to_c(res,level+1)
1989
+ res << ",1,data);\n"
1589
1990
  else
1590
1991
  # No, generate a bit string value.
1591
1992
  res << " " * (level+1)*3
@@ -1593,8 +1994,11 @@ module HDLRuby::Low
1593
1994
  res << "static unsigned char data[] = \"#{str.reverse}\";\n"
1594
1995
  # Create the value.
1595
1996
  res << " " * (level+1)*3
1596
- res << "return make_set_value(#{self.type.to_c(level+1)},0," +
1597
- "data);\n"
1997
+ # res << "return make_set_value(#{self.type.to_c(level+1)},0," +
1998
+ # "data);\n"
1999
+ res << "return make_set_value("
2000
+ self.type.to_c(res,level+1)
2001
+ res << ",0,data);\n"
1598
2002
  end
1599
2003
 
1600
2004
  # Close the value.
@@ -1608,29 +2012,54 @@ module HDLRuby::Low
1608
2012
  ## Extends the Cast class with generation of C text.
1609
2013
  class Cast
1610
2014
 
2015
+ # # Generates the C text of the equivalent HDLRuby code.
2016
+ # # +level+ is the hierachical level of the object.
2017
+ # # def to_c(level = 0)
2018
+ # def to_c(res,level = 0)
2019
+ # # res = "({\n"
2020
+ # res << "({\n"
2021
+ # # Overrides the upper src0 and dst...
2022
+ # res << (" " * ((level+1)*3))
2023
+ # res << "Value src0, dst = get_value();\n"
2024
+ # # Save the state of the value pool.
2025
+ # res << (" " * ((level+1)*3))
2026
+ # res << "unsigned int pool_state = get_value_pos();\n"
2027
+ # # Compute the child.
2028
+ # res << (" " * ((level+1)*3))
2029
+ # # res << "src0 = #{self.child.to_c(level+2)};\n"
2030
+ # res << "src0 = "
2031
+ # self.child.to_c(res,level+2)
2032
+ # res << ";\n"
2033
+ # res << (" " * ((level+1)*3))
2034
+ # # res += "dst = cast_value(src0," +
2035
+ # # "#{self.type.to_c(level+1)},dst);\n"
2036
+ # res << "dst = cast_value(src0,"
2037
+ # self.type.to_c(res,level+1)
2038
+ # res << ",dst);\n"
2039
+ # # Restore the value pool state.
2040
+ # res << (" " * ((level+1)*3))
2041
+ # res << "set_value_pos(pool_state);\n"
2042
+ # # Close the computation
2043
+ # res << (" " * (level*3))
2044
+ # res << "dst; })"
2045
+
2046
+ # return res
2047
+ # end
1611
2048
  # Generates the C text of the equivalent HDLRuby code.
1612
2049
  # +level+ is the hierachical level of the object.
1613
- def to_c(level = 0)
1614
- res = "({\n"
1615
- # Overrides the upper src0 and dst...
1616
- res << (" " * ((level+1)*3))
1617
- res << "Value src0, dst = get_value();\n"
1618
- # Save the state of the value pool.
1619
- res << (" " * ((level+1)*3))
1620
- res << "unsigned int pool_state = get_value_pos();\n"
1621
- # Compute the child.
1622
- res << (" " * ((level+1)*3))
1623
- res << "src0 = #{self.child.to_c(level+2)};\n"
1624
- res << (" " * ((level+1)*3))
1625
- res += "dst = cast_value(src0," +
1626
- "#{self.type.to_c(level+1)},dst);\n"
1627
- # Restore the value pool state.
1628
- res << (" " * ((level+1)*3))
1629
- res << "set_value_pos(pool_state);\n"
1630
- # Close the computation
2050
+ # def to_c(level = 0)
2051
+ def to_c(res,level = 0)
2052
+ # Save the value pool state.
2053
+ res << (" " * (level*3)) << "PV;\n"
2054
+ # Generate the child.
2055
+ self.child.to_c(res,level)
1631
2056
  res << (" " * (level*3))
1632
- res << "dst; })"
1633
-
2057
+ # res << "d=cast(d,"
2058
+ res << "cast("
2059
+ self.type.to_c(res,level+1)
2060
+ res << ");\n"
2061
+ # Restore the value pool state.
2062
+ res << (" " * (level*3)) << "RV;\n"
1634
2063
  return res
1635
2064
  end
1636
2065
  end
@@ -1641,7 +2070,8 @@ module HDLRuby::Low
1641
2070
 
1642
2071
  # Generates the C text of the equivalent HDLRuby code.
1643
2072
  # +level+ is the hierachical level of the object.
1644
- def to_c(level = 0)
2073
+ # def to_c(level = 0)
2074
+ def to_c(res,level = 0)
1645
2075
  # Should never be here.
1646
2076
  raise AnyError, "Internal error: to_c should be implemented in class :#{self.class}"
1647
2077
  end
@@ -1650,42 +2080,81 @@ module HDLRuby::Low
1650
2080
  ## Extends the Unary class with generation of C text.
1651
2081
  class Unary
1652
2082
 
2083
+ # # Generates the C text of the equivalent HDLRuby code.
2084
+ # # +level+ is the hierachical level of the object.
2085
+ # # def to_c(level = 0)
2086
+ # def to_c(res,level = 0)
2087
+ # # res = "({\n"
2088
+ # res << "({\n"
2089
+ # # Overrides the upper src0 and dst...
2090
+ # res << (" " * ((level+1)*3))
2091
+ # res << "Value src0, dst;\n"
2092
+ # if (self.operator != :+@) then
2093
+ # # And allocates a new value for dst unless the operator
2094
+ # # is +@ that does not compute anything.
2095
+ # res << (" " * ((level+1)*3))
2096
+ # res << "dst = get_value();\n"
2097
+ # end
2098
+ # # Save the state of the value pool.
2099
+ # res << (" " * ((level+1)*3))
2100
+ # res << "unsigned int pool_state = get_value_pos();\n"
2101
+ # # Compute the child.
2102
+ # res << (" " * ((level+1)*3))
2103
+ # # res << "src0 = #{self.child.to_c(level+2)};\n"
2104
+ # res << "src0 = "
2105
+ # self.child.to_c(res,level+2)
2106
+ # res << ";\n"
2107
+ # res << (" " * ((level+1)*3))
2108
+ # case self.operator
2109
+ # when :~ then
2110
+ # res << "dst = not_value(src0,dst);\n"
2111
+ # when :-@ then
2112
+ # res << "dst = neg_value(src0,dst);\n"
2113
+ # when :+@ then
2114
+ # # res << "dst = #{self.child.to_c(level)};\n"
2115
+ # res << "dst = "
2116
+ # self.child.to_c(res,level)
2117
+ # res << ";\n"
2118
+ # else
2119
+ # raise "Invalid unary operator: #{self.operator}."
2120
+ # end
2121
+ # # Restore the value pool state.
2122
+ # res << (" " * ((level+1)*3))
2123
+ # res << "set_value_pos(pool_state);\n"
2124
+ # # Close the computation
2125
+ # res << (" " * (level*3))
2126
+ # res << "dst; })"
2127
+
2128
+ # return res
2129
+ # end
1653
2130
  # Generates the C text of the equivalent HDLRuby code.
1654
2131
  # +level+ is the hierachical level of the object.
1655
- def to_c(level = 0)
1656
- res = "({\n"
1657
- # Overrides the upper src0 and dst...
1658
- res << (" " * ((level+1)*3))
1659
- res << "Value src0, dst;\n"
1660
- if (self.operator != :+@) then
1661
- # And allocates a new value for dst unless the operator
1662
- # is +@ that does not compute anything.
1663
- res << (" " * ((level+1)*3))
1664
- res << "dst = get_value();\n"
2132
+ # def to_c(level = 0)
2133
+ def to_c(res,level = 0)
2134
+ if (self.operator == :+@) then
2135
+ # No computation required.
2136
+ self.child.to_c(res,level)
2137
+ return res
1665
2138
  end
1666
- # Save the state of the value pool.
1667
- res << (" " * ((level+1)*3))
1668
- res << "unsigned int pool_state = get_value_pos();\n"
1669
- # Compute the child.
1670
- res << (" " * ((level+1)*3))
1671
- res << "src0 = #{self.child.to_c(level+2)};\n"
1672
- res << (" " * ((level+1)*3))
2139
+ # Some computation required.
2140
+ # Save the value pool state.
2141
+ res << (" " * (level*3)) << "PV;\n"
2142
+ # Generate the child.
2143
+ self.child.to_c(res,level)
2144
+ res << (" " * (level*3))
2145
+ res << "unary("
2146
+ # Adds the operation
1673
2147
  case self.operator
1674
2148
  when :~ then
1675
- res += "dst = not_value(src0,dst);\n"
2149
+ res << "&not_value"
1676
2150
  when :-@ then
1677
- res += "dst = neg_value(src0,dst);\n"
1678
- when :+@ then
1679
- res += "dst = #{self.child.to_c(level)};\n"
2151
+ res << "&neg_value"
1680
2152
  else
1681
2153
  raise "Invalid unary operator: #{self.operator}."
1682
2154
  end
2155
+ res << ");\n"
1683
2156
  # Restore the value pool state.
1684
- res << (" " * ((level+1)*3))
1685
- res << "set_value_pos(pool_state);\n"
1686
- # Close the computation
1687
- res << (" " * (level*3))
1688
- res << "dst; })"
2157
+ res << (" " * (level*3)) << "RV;\n"
1689
2158
 
1690
2159
  return res
1691
2160
  end
@@ -1695,78 +2164,147 @@ module HDLRuby::Low
1695
2164
  ## Extends the Binary class with generation of C text.
1696
2165
  class Binary
1697
2166
 
2167
+ # # Generates the C text of the equivalent HDLRuby code.
2168
+ # # +level+ is the hierachical level of the object.
2169
+ # # def to_c(level = 0)
2170
+ # def to_c(res, level = 0)
2171
+ # # res = "({\n"
2172
+ # res << "({\n"
2173
+ # # Overrides the upper src0, src1 and dst...
2174
+ # # And allocates a new value for dst.
2175
+ # res << (" " * ((level+1)*3))
2176
+ # res << "Value src0,src1,dst = get_value();\n"
2177
+ # # Save the state of the value pool.
2178
+ # res << (" " * ((level+1)*3))
2179
+ # res << "unsigned int pool_state = get_value_pos();\n"
2180
+ # # Compute the left.
2181
+ # res << (" " * ((level+1)*3))
2182
+ # # res << "src0 = " << self.left.to_c(level+2) << ";\n"
2183
+ # res << "src0 = "
2184
+ # self.left.to_c(res,level+2)
2185
+ # res << ";\n"
2186
+ # # Compute the right.
2187
+ # res << (" " * ((level+1)*3))
2188
+ # # res << "src1 = " << self.right.to_c(level+2) << ";\n"
2189
+ # res << "src1 = "
2190
+ # self.right.to_c(res,level+2)
2191
+ # res << ";\n"
2192
+ # res << (" " * ((level+1)*3))
2193
+
2194
+ # # Compute the current binary operation.
2195
+ # case self.operator
2196
+ # when :+ then
2197
+ # res << "dst = add_value(src0,src1,dst);\n"
2198
+ # when :- then
2199
+ # res << "dst = sub_value(src0,src1,dst);\n"
2200
+ # when :* then
2201
+ # res << "dst = mul_value(src0,src1,dst);\n"
2202
+ # when :/ then
2203
+ # res << "dst = div_value(src0,src1,dst);\n"
2204
+ # when :% then
2205
+ # res << "dst = mod_value(src0,src1,dst);\n"
2206
+ # when :** then
2207
+ # res << "dst = pow_value(src0,src1,dst);\n"
2208
+ # when :& then
2209
+ # res << "dst = and_value(src0,src1,dst);\n"
2210
+ # when :| then
2211
+ # res << "dst = or_value(src0,src1,dst);\n"
2212
+ # when :^ then
2213
+ # res << "dst = xor_value(src0,src1,dst);\n"
2214
+ # when :<<,:ls then
2215
+ # res << "dst = shift_left_value(src0,src1,dst);\n"
2216
+ # when :>>,:rs then
2217
+ # res << "dst = shift_right_value(src0,src1,dst);\n"
2218
+ # when :lr then
2219
+ # res << "dst = rotate_left_value(src0,src1,dst);\n"
2220
+ # when :rr then
2221
+ # res << "dst = rotate_right_value(src0,src1,dst);\n"
2222
+ # when :== then
2223
+ # res << "dst = equal_value(src0,src1,dst);\n"
2224
+ # res << "dst = reduce_or_value(dst,dst);"
2225
+ # when :!= then
2226
+ # res << "dst = xor_value(src0,src1,dst);\n"
2227
+ # res << "dst = reduce_or_value(dst,dst);"
2228
+ # when :> then
2229
+ # res << "dst = greater_value(src0,src1,dst);\n"
2230
+ # when :< then
2231
+ # res << "dst = lesser_value(src0,src1,dst);\n"
2232
+ # when :>= then
2233
+ # res << "dst = greater_equal_value(src0,src1,dst);\n"
2234
+ # when :<= then
2235
+ # res << "dst = lesser_equal_value(src0,src1,dst);\n"
2236
+ # else
2237
+ # raise "Invalid binary operator: #{self.operator}."
2238
+ # end
2239
+ # # Restore the state of the value pool.
2240
+ # res << (" " * ((level+1)*3))
2241
+ # res << "set_value_pos(pool_state);\n"
2242
+ # # Close the computation.
2243
+ # res << (" " * (level*3))
2244
+ # res << "dst;})"
2245
+
2246
+ # return res
2247
+ # end
1698
2248
  # Generates the C text of the equivalent HDLRuby code.
1699
2249
  # +level+ is the hierachical level of the object.
1700
- def to_c(level = 0)
1701
- # res = " " * (level*3)
1702
- res = "({\n"
1703
- # Overrides the upper src0, src1 and dst...
1704
- # And allocates a new value for dst.
1705
- res << (" " * ((level+1)*3))
1706
- res << "Value src0,src1,dst = get_value();\n"
1707
- # Save the state of the value pool.
1708
- res << (" " * ((level+1)*3))
1709
- res << "unsigned int pool_state = get_value_pos();\n"
1710
- # Compute the left.
1711
- res << (" " * ((level+1)*3))
1712
- res << "src0 = #{self.left.to_c(level+2)};\n"
1713
- # Compute the right.
1714
- res << (" " * ((level+1)*3))
1715
- res << "src1 = #{self.right.to_c(level+2)};\n"
1716
- res << (" " * ((level+1)*3))
1717
-
1718
- # Compute the current binary operation.
2250
+ # def to_c(level = 0)
2251
+ def to_c(res, level = 0)
2252
+ # Save the value pool state.
2253
+ res << (" " * (level*3)) << "PV;\n"
2254
+ # Generate the left computation.
2255
+ self.left.to_c(res,level)
2256
+ # Generate the right computation.
2257
+ self.right.to_c(res,level)
2258
+ # Generate the binary.
2259
+ res << (" " * (level*3))
2260
+ res << "binary("
2261
+ # Set the operation.
1719
2262
  case self.operator
1720
2263
  when :+ then
1721
- res += "dst = add_value(src0,src1,dst);\n"
2264
+ res << "&add_value"
1722
2265
  when :- then
1723
- res += "dst = sub_value(src0,src1,dst);\n"
2266
+ res << "&sub_value"
1724
2267
  when :* then
1725
- res += "dst = mul_value(src0,src1,dst);\n"
2268
+ res << "&mul_value"
1726
2269
  when :/ then
1727
- res += "dst = div_value(src0,src1,dst);\n"
2270
+ res << "&div_value"
1728
2271
  when :% then
1729
- res += "dst = mod_value(src0,src1,dst);\n"
2272
+ res << "&mod_value"
1730
2273
  when :** then
1731
- res += "dst = pow_value(src0,src1,dst);\n"
2274
+ res << "&pow_value"
1732
2275
  when :& then
1733
- res += "dst = and_value(src0,src1,dst);\n"
2276
+ res << "&and_value"
1734
2277
  when :| then
1735
- res += "dst = or_value(src0,src1,dst);\n"
2278
+ res << "&or_value"
1736
2279
  when :^ then
1737
- res += "dst = xor_value(src0,src1,dst);\n"
2280
+ res << "&xor_value"
1738
2281
  when :<<,:ls then
1739
- res += "dst = shift_left_value(src0,src1,dst);\n"
2282
+ res << "&shift_left_value"
1740
2283
  when :>>,:rs then
1741
- res += "dst = shift_right_value(src0,src1,dst);\n"
2284
+ res << "&shift_right_value"
1742
2285
  when :lr then
1743
- res += "dst = rotate_left_value(src0,src1,dst);\n"
2286
+ res << "&rotate_left_value"
1744
2287
  when :rr then
1745
- res += "dst = rotate_right_value(src0,src1,dst);\n"
2288
+ res << "&rotate_right_value"
1746
2289
  when :== then
1747
- res += "dst = equal_value(src0,src1,dst);\n" +
1748
- "dst = reduce_or_value(dst,dst);"
2290
+ res << "&equal_value_c"
1749
2291
  when :!= then
1750
- # res += "dst = not_equal_value(src0,src1,dst);\n"
1751
- res += "dst = xor_value(src0,src1,dst);\n" +
1752
- "dst = reduce_or_value(dst,dst);"
2292
+ res << "&not_equal_value_c"
1753
2293
  when :> then
1754
- res += "dst = greater_value(src0,src1,dst);\n"
2294
+ res << "&greater_value"
1755
2295
  when :< then
1756
- res += "dst = lesser_value(src0,src1,dst);\n"
2296
+ res << "&lesser_value"
1757
2297
  when :>= then
1758
- res += "dst = greater_equal_value(src0,src1,dst);\n"
2298
+ res << "&greater_equal_value"
1759
2299
  when :<= then
1760
- res += "dst = lesser_equal_value(src0,src1,dst);\n"
2300
+ res << "&lesser_equal_value"
1761
2301
  else
1762
2302
  raise "Invalid binary operator: #{self.operator}."
1763
2303
  end
1764
- # Restore the state of the value pool.
1765
- res << (" " * ((level+1)*3))
1766
- res << "set_value_pos(pool_state);\n"
1767
2304
  # Close the computation.
1768
- res << (" " * (level*3))
1769
- res << "dst; })"
2305
+ res << ");\n"
2306
+ # Restore the value pool state.
2307
+ res << (" " * (level*3)) << "RV;\n"
1770
2308
 
1771
2309
  return res
1772
2310
  end
@@ -1775,103 +2313,200 @@ module HDLRuby::Low
1775
2313
  ## Extends the Select class with generation of C text.
1776
2314
  class Select
1777
2315
 
2316
+ # # Generates the C text of the equivalent HDLRuby code.
2317
+ # # +level+ is the hierachical level of the object.
2318
+ # # def to_c(level = 0)
2319
+ # def to_c(res,level = 0)
2320
+ # # Gather the possible selection choices.
2321
+ # expressions = self.each_choice.to_a
2322
+ # # Create the resulting string.
2323
+ # # res = "({\n"
2324
+ # res << "({\n"
2325
+ # # Overrides the upper sel, src0, src1, ..., and dst...
2326
+ # # And allocates a new value for dst.
2327
+ # res << (" " * ((level+1)*3))
2328
+ # res << "Value sel;\n"
2329
+ # res << (" " * ((level+1)*3))
2330
+ # res << "Value "
2331
+ # res << expressions.size.times.map do |i|
2332
+ # "src#{i}"
2333
+ # end.join(",")
2334
+ # res << ";\n"
2335
+ # res << (" " * ((level+1)*3))
2336
+ # res << "Value dst = get_value();\n"
2337
+ # # Save the state of the value pool.
2338
+ # res << (" " * ((level+1)*3))
2339
+ # res << "unsigned int pool_state = get_value_pos();\n"
2340
+ # # Compute the selection.
2341
+ # res << (" " * ((level+1)*3))
2342
+ # # res << "sel = #{self.select.to_c(level+2)};\n"
2343
+ # res << "sel = "
2344
+ # self.select.to_c(res,level+2)
2345
+ # res << ";\n"
2346
+ # # Compute each choice expression.
2347
+ # expressions.each_with_index do |expr,i|
2348
+ # res << (" " * ((level+1)*3))
2349
+ # # res << "src#{i} = #{expr.to_c(level+2)};\n"
2350
+ # res << "src#{i} = "
2351
+ # expr.to_c(res,level+2)
2352
+ # res << ";\n"
2353
+ # end
2354
+ # # Compute the resulting selection.
2355
+ # res << (" " * ((level+1)*3))
2356
+ # res << "select_value(sel,dst,#{expressions.size},"
2357
+ # # res << "#{expressions.size.times.map { |i| "src#{i}" }.join(",")}"
2358
+ # res << expressions.size.times.map { |i| "src#{i}" }.join(",")
2359
+ # res << ");\n"
2360
+ # # Restore the state of the value pool.
2361
+ # res << (" " * ((level+1)*3))
2362
+ # res << "set_value_pos(pool_state);\n"
2363
+ # # Close the computation.
2364
+ # res << (" " * (level*3))
2365
+ # res << "dst; })"
2366
+ # return res
2367
+ # end
1778
2368
  # Generates the C text of the equivalent HDLRuby code.
1779
2369
  # +level+ is the hierachical level of the object.
1780
- def to_c(level = 0)
2370
+ def to_c(res,level = 0)
2371
+ # Save the value pool state.
2372
+ res << (" " * (level*3)) << "PV;\n"
1781
2373
  # Gather the possible selection choices.
1782
2374
  expressions = self.each_choice.to_a
1783
2375
  # Create the resulting string.
1784
- # res = " " * (level*3)
1785
- res = "({\n"
1786
- # Overrides the upper sel, src0, src1, ..., and dst...
1787
- # And allocates a new value for dst.
1788
- res << (" " * ((level+1)*3))
1789
- res << "Value sel;\n"
1790
- res << (" " * ((level+1)*3))
1791
- res << "Value #{expressions.size.times.map do |i|
1792
- "src#{i}"
1793
- end.join(",")};\n"
1794
- res << (" " * ((level+1)*3))
1795
- res << "Value dst = get_value();\n"
1796
- # Save the state of the value pool.
1797
- res << (" " * ((level+1)*3))
1798
- res << "unsigned int pool_state = get_value_pos();\n"
1799
2376
  # Compute the selection.
1800
- res << (" " * ((level+1)*3))
1801
- res << "sel = #{self.select.to_c(level+2)};\n"
2377
+ self.select.to_c(res,level)
1802
2378
  # Compute each choice expression.
1803
2379
  expressions.each_with_index do |expr,i|
1804
- res << (" " * ((level+1)*3))
1805
- res << "src#{i} = #{expr.to_c(level+2)};\n"
2380
+ expr.to_c(res,level)
1806
2381
  end
1807
2382
  # Compute the resulting selection.
1808
- res << (" " * ((level+1)*3))
1809
- res << "select_value(sel,dst,#{expressions.size},"
1810
- res << "#{expressions.size.times.map { |i| "src#{i}" }.join(",")}"
1811
- res << ");\n"
1812
- # Restore the state of the value pool.
1813
- res << (" " * ((level+1)*3))
1814
- res << "set_value_pos(pool_state);\n"
1815
- # Close the computation.
1816
2383
  res << (" " * (level*3))
1817
- res << "dst; })"
2384
+ res << "select(#{expressions.size});\n"
2385
+ # Restore the value pool state.
2386
+ res << (" " * (level*3)) << "RV;\n"
2387
+ return res
1818
2388
  end
1819
2389
  end
1820
2390
 
1821
2391
  ## Extends the Concat class with generation of C text.
1822
2392
  class Concat
1823
2393
 
1824
- # Generates the C text of the equivalent HDLRuby code.
2394
+
2395
+ # # Generates the C text for the equivalent HDLRuby code.
2396
+ # # +level+ is the hierachical level of the object.
2397
+ # def to_c(res,level = 0)
2398
+ # # Gather the content to concat.
2399
+ # expressions = self.each_expression.to_a
2400
+ # # Create the resulting string.
2401
+ # res << "({\n"
2402
+ # # Overrides the upper src0, src1, ..., and dst...
2403
+ # # And allocates a new value for dst.
2404
+ # res << (" " * ((level+1)*3))
2405
+ # res << "Value "
2406
+ # res << expressions.size.times.map do |i|
2407
+ # "src#{i}"
2408
+ # end.join(",")
2409
+ # res << ";\n"
2410
+ # res << (" " * ((level+1)*3))
2411
+ # res << "Value dst = get_value();\n"
2412
+ # # Save the state of the value pool.
2413
+ # res << (" " * ((level+1)*3))
2414
+ # res << "unsigned int pool_state = get_value_pos();\n"
2415
+ # # Compute each sub expression.
2416
+ # expressions.each_with_index do |expr,i|
2417
+ # res << (" " * ((level+1)*3))
2418
+ # res << "src#{i} = "
2419
+ # expr.to_c_expr(res,level+2)
2420
+ # res << ";\n"
2421
+ # end
2422
+ # # Compute the direction.
2423
+ # # Compute the resulting concatenation.
2424
+ # res << (" " * ((level+1)*3))
2425
+ # res << "concat_value(#{expressions.size},"
2426
+ # res << "#{self.type.direction == :little ? 1 : 0},dst,"
2427
+ # res << expressions.size.times.map { |i| "src#{i}" }.join(",")
2428
+ # res << ");\n"
2429
+ # # Restore the state of the value pool.
2430
+ # res << (" " * ((level+1)*3))
2431
+ # res << "set_value_pos(pool_state);\n"
2432
+ # # Close the computation.
2433
+ # res << (" " * (level*3))
2434
+ # res << "dst; })"
2435
+ # return res
2436
+ # end
2437
+ # Generates the C text for the equivalent HDLRuby code.
2438
+ # +level+ is the hierachical level of the object.
2439
+ def to_c(res,level = 0)
2440
+ # Save the value pool state.
2441
+ res << (" " * (level*3)) << "PV;\n"
2442
+ # Gather the content to concat.
2443
+ expressions = self.each_expression.to_a
2444
+ # Compute each sub expression.
2445
+ expressions.each_with_index do |expr,i|
2446
+ expr.to_c(res,level+2)
2447
+ end
2448
+ # Compute the resulting concatenation.
2449
+ res << (" " * ((level+1)*3))
2450
+ res << "sconcat(#{expressions.size},"
2451
+ res << (self.type.direction == :little ? "1" : "0")
2452
+ res << ");\n"
2453
+ # Restore the value pool state.
2454
+ res << (" " * (level*3)) << "RV;\n"
2455
+ return res
2456
+ end
2457
+
2458
+ # Generates the C text of expression for the equivalent HDLRuby code.
1825
2459
  # +level+ is the hierachical level of the object.
1826
- def to_c(level = 0)
2460
+ def to_c_expr(res,level = 0)
1827
2461
  # Gather the content to concat.
1828
2462
  expressions = self.each_expression.to_a
1829
2463
  # Create the resulting string.
1830
- # res = " " * (level*3)
1831
- res = "({\n"
2464
+ res << "({\n"
1832
2465
  # Overrides the upper src0, src1, ..., and dst...
1833
2466
  # And allocates a new value for dst.
1834
2467
  res << (" " * ((level+1)*3))
1835
- res << "Value #{expressions.size.times.map do |i|
2468
+ res << "Value "
2469
+ res << expressions.size.times.map do |i|
1836
2470
  "src#{i}"
1837
- end.join(",")};\n"
2471
+ end.join(",")
2472
+ res << ";\n"
1838
2473
  res << (" " * ((level+1)*3))
1839
2474
  res << "Value dst = get_value();\n"
1840
- # Save the state of the value pool.
1841
- res << (" " * ((level+1)*3))
1842
- res << "unsigned int pool_state = get_value_pos();\n"
2475
+ # Save the value pool state.
2476
+ res << (" " * (level*3)) << "SV;\n"
1843
2477
  # Compute each sub expression.
1844
2478
  expressions.each_with_index do |expr,i|
1845
2479
  res << (" " * ((level+1)*3))
1846
- res << "src#{i} = #{expr.to_c(level+2)};\n"
2480
+ res << "src#{i} = "
2481
+ expr.to_c_expr(res,level+2)
2482
+ res << ";\n"
1847
2483
  end
1848
2484
  # Compute the direction.
1849
2485
  # Compute the resulting concatenation.
1850
2486
  res << (" " * ((level+1)*3))
1851
2487
  res << "concat_value(#{expressions.size},"
1852
2488
  res << "#{self.type.direction == :little ? 1 : 0},dst,"
1853
- res << "#{expressions.size.times.map { |i| "src#{i}" }.join(",")}"
2489
+ res << expressions.size.times.map { |i| "src#{i}" }.join(",")
1854
2490
  res << ");\n"
1855
- # Restore the state of the value pool.
1856
- res << (" " * ((level+1)*3))
1857
- res << "set_value_pos(pool_state);\n"
2491
+ # Save the value pool state.
2492
+ res << (" " * (level*3)) << "SV;\n"
1858
2493
  # Close the computation.
1859
2494
  res << (" " * (level*3))
1860
2495
  res << "dst; })"
1861
-
1862
2496
  return res
1863
-
1864
2497
  end
1865
2498
  end
1866
2499
 
1867
2500
 
2501
+
1868
2502
  ## Extends the Ref class with generation of C text.
1869
2503
  class Ref
1870
2504
 
1871
2505
  # Generates the C text of the equivalent HDLRuby code.
1872
2506
  # +level+ is the hierachical level of the object and
1873
2507
  # +left+ tells if it is a left value or not.
1874
- def to_c(level = 0, left = false)
2508
+ # def to_c(level = 0, left = false)
2509
+ def to_c(res,level = 0, left = false)
1875
2510
  # Should never be here.
1876
2511
  raise AnyError, "Internal error: to_c should be implemented in class :#{self.class}"
1877
2512
  end
@@ -1884,7 +2519,8 @@ module HDLRuby::Low
1884
2519
  # Generates the C text of the equivalent HDLRuby code.
1885
2520
  # +level+ is the hierachical level of the object and
1886
2521
  # +left+ tells if it is a left value or not.
1887
- def to_c(level = 0, left = false)
2522
+ # def to_c(level = 0, left = false)
2523
+ def to_c(res,level = 0, left = false)
1888
2524
  raise "RefConcat cannot be converted to C directly, please use break_concat_assign!."
1889
2525
  # # The resulting string.
1890
2526
  # res = "ref_concat(#{self.each_ref.to_a.size}"
@@ -1897,7 +2533,8 @@ module HDLRuby::Low
1897
2533
 
1898
2534
  # Generates the C text for reference as left value to a signal.
1899
2535
  # +level+ is the hierarchical level of the object.
1900
- def to_c_signal(level = 0)
2536
+ # def to_c_signal(level = 0)
2537
+ def to_c_signal(res,level = 0)
1901
2538
  raise "RefConcat cannot be converted to C directly, please use break_concat_assign!."
1902
2539
  # # The resulting string.
1903
2540
  # res = "sig_concat(#{self.each_ref.to_a.size}"
@@ -1913,44 +2550,109 @@ module HDLRuby::Low
1913
2550
  ## Extends the RefIndex class with generation of C text.
1914
2551
  class RefIndex
1915
2552
 
2553
+ # # Generates the C text of the equivalent HDLRuby code.
2554
+ # # +level+ is thehierachical level of the object and
2555
+ # # +left+ tells if it is a left value or not.
2556
+ # # def to_c(level = 0, left = false)
2557
+ # def to_c(res,level = 0, left = false)
2558
+ # # res = "({\n"
2559
+ # res << "({\n"
2560
+ # # And allocates a new value for dst.
2561
+ # res << (" " * ((level+1)*3))
2562
+ # res << "Value ref,dst = get_value();\n"
2563
+ # res << (" " * ((level+1)*3))
2564
+ # res << "unsigned long long idx;\n"
2565
+ # # Save the state of the value pool.
2566
+ # res << (" " * ((level+1)*3))
2567
+ # res << "unsigned int pool_state = get_value_pos();\n"
2568
+ # # Compute the reference.
2569
+ # res << (" " * ((level+1)*3))
2570
+ # # res << "ref = #{self.ref.to_c(level+2)};\n"
2571
+ # res << "ref = "
2572
+ # self.ref.to_c(res,level+2)
2573
+ # res << ";\n"
2574
+ # # Compute the index.
2575
+ # res << (" " * ((level+1)*3))
2576
+ # # res << "idx = value2integer(#{self.index.to_c(level+2)});\n"
2577
+ # res << "idx = value2integer("
2578
+ # self.index.to_c(res,level+2)
2579
+ # res << ");\n"
2580
+ # # Make the access.
2581
+ # res << (" " * ((level+1)*3))
2582
+ # # puts "self.type.width=#{self.type.width}"
2583
+ # # res << "dst = read_range(ref,idx,idx,#{self.type.to_c(level)},dst);\n"
2584
+ # res << "dst = read_range(ref,idx,idx,"
2585
+ # # res << self.type.to_c(level)
2586
+ # self.type.to_c(res,level)
2587
+ # res << ",dst);\n"
2588
+ # # Restore the state of the value pool.
2589
+ # res << (" " * ((level+1)*3))
2590
+ # res << "set_value_pos(pool_state);\n"
2591
+ # # Close the computation.
2592
+ # res << (" " * (level*3))
2593
+ # res << "dst; })"
2594
+ # return res
2595
+ # end
1916
2596
  # Generates the C text of the equivalent HDLRuby code.
1917
2597
  # +level+ is thehierachical level of the object and
1918
2598
  # +left+ tells if it is a left value or not.
1919
- def to_c(level = 0, left = false)
1920
- res = "({\n"
1921
- # And allocates a new value for dst.
1922
- res << (" " * ((level+1)*3))
1923
- res << "Value ref,dst = get_value();\n"
1924
- res << (" " * ((level+1)*3))
1925
- res << "unsigned long long idx;\n"
1926
- # Save the state of the value pool.
1927
- res << (" " * ((level+1)*3))
1928
- res << "unsigned int pool_state = get_value_pos();\n"
2599
+ def to_c(res,level = 0, left = false)
2600
+ # Save the value pool state.
2601
+ res << (" " * (level*3)) << "PV;\n"
1929
2602
  # Compute the reference.
1930
- res << (" " * ((level+1)*3))
1931
- res << "ref = #{self.ref.to_c(level+2)};\n"
2603
+ self.ref.to_c(res,level)
1932
2604
  # Compute the index.
1933
- res << (" " * ((level+1)*3))
1934
- res << "idx = value2integer(#{self.index.to_c(level+2)});\n"
2605
+ self.index.to_c(res,level)
2606
+ res << (" " * (level*3))
1935
2607
  # Make the access.
1936
- res << (" " * ((level+1)*3))
1937
- # puts "self.type.width=#{self.type.width}"
1938
- res << "dst = read_range(ref,idx,idx,#{self.type.to_c(level)},dst);\n"
1939
- # Restore the state of the value pool.
1940
- res << (" " * ((level+1)*3))
1941
- res << "set_value_pos(pool_state);\n"
1942
- # Close the computation.
1943
2608
  res << (" " * (level*3))
1944
- res << "dst; })"
2609
+ if (left) then
2610
+ res << "swriteI("
2611
+ else
2612
+ res << "sreadI("
2613
+ end
2614
+ self.type.to_c(res,level)
2615
+ res << ");\n"
2616
+ # Restore the value pool state.
2617
+ res << (" " * (level*3)) << "RV;\n"
2618
+ return res
1945
2619
  end
1946
2620
 
2621
+ # # Generates the C text for reference as left value to a signal.
2622
+ # # +level+ is the hierarchical level of the object.
2623
+ # # def to_c_signal(level = 0)
2624
+ # def to_c_signal(res,level = 0)
2625
+ # # puts "to_c_signal for RefIndex"
2626
+ # res << "make_ref_rangeS("
2627
+ # self.ref.to_c_signal(res,level)
2628
+ # res << ","
2629
+ # self.type.to_c(res,level)
2630
+ # res << ",value2integer("
2631
+ # self.index.to_c(res,level)
2632
+ # res << "),value2integer("
2633
+ # self.index.to_c(res,level)
2634
+ # res << "))"
2635
+ # return res
2636
+ # end
1947
2637
  # Generates the C text for reference as left value to a signal.
1948
2638
  # +level+ is the hierarchical level of the object.
1949
- def to_c_signal(level = 0)
2639
+ # def to_c_signal(level = 0)
2640
+ def to_c_signal(res,level = 0)
1950
2641
  # puts "to_c_signal for RefIndex"
1951
- return "make_ref_rangeS(#{self.ref.to_c_signal(level)}," +
1952
- "#{self.type.to_c(level)}," +
1953
- "value2integer(#{self.index.to_c(level)}),value2integer(#{self.index.to_c(level)}))"
2642
+ res << "make_ref_rangeS("
2643
+ self.ref.to_c_signal(res,level)
2644
+ res << ","
2645
+ self.type.to_c(res,level)
2646
+ res << ",value2integer(({\n"
2647
+ self.index.to_c(res,level)
2648
+ res << " " * ((level+1)*3)
2649
+ res << "pop();})"
2650
+ res << "),value2integer(({\n"
2651
+ self.index.to_c(res,level)
2652
+ res << " " * ((level+1)*3)
2653
+ res << "pop();})"
2654
+ res << "))"
2655
+ return res
1954
2656
  end
1955
2657
  end
1956
2658
 
@@ -1958,51 +2660,112 @@ module HDLRuby::Low
1958
2660
  ## Extends the RefRange class with generation of C text.
1959
2661
  class RefRange
1960
2662
 
1961
- # Generates the C text of the equivalent HDLRuby code.
1962
- # +level+ is the hierachical level of the object and
1963
- # +left+ tells if it is a left value or not.
1964
- def to_c(level = 0, left = false)
1965
- # Decide if it is a read or a write
1966
- command = left ? "write" : "read"
1967
- res = "({\n"
1968
- # Overrides the upper ref and dst...
1969
- # And allocates a new value for dst.
1970
- res << (" " * ((level+1)*3))
1971
- res << "Value ref,dst = get_value();\n"
1972
- res << (" " * ((level+1)*3))
1973
- res << "unsigned long long first,last;\n"
1974
- # Save the state of the value pool.
1975
- res << (" " * ((level+1)*3))
1976
- res << "unsigned int pool_state = get_value_pos();\n"
2663
+ # # Generates the C text of the equivalent HDLRuby code.
2664
+ # # +level+ is the hierachical level of the object and
2665
+ # # +left+ tells if it is a left value or not.
2666
+ # # def to_c(level = 0, left = false)
2667
+ # def to_c(res,level = 0, left = false)
2668
+ # # Decide if it is a read or a write
2669
+ # command = left ? "write" : "read"
2670
+ # # res = "({\n"
2671
+ # res << "({\n"
2672
+ # # Overrides the upper ref and dst...
2673
+ # # And allocates a new value for dst.
2674
+ # res << (" " * ((level+1)*3))
2675
+ # res << "Value ref,dst = get_value();\n"
2676
+ # res << (" " * ((level+1)*3))
2677
+ # res << "unsigned long long first,last;\n"
2678
+ # # Save the state of the value pool.
2679
+ # res << (" " * ((level+1)*3))
2680
+ # res << "unsigned int pool_state = get_value_pos();\n"
2681
+ # # Compute the reference.
2682
+ # res << (" " * ((level+1)*3))
2683
+ # # res << "ref = #{self.ref.to_c(level+2)};\n"
2684
+ # res << "ref = "
2685
+ # self.ref.to_c(res,level+2)
2686
+ # res << ";\n"
2687
+ # # Compute the range.
2688
+ # res << (" " * ((level+1)*3))
2689
+ # # res << "first = value2integer(#{self.range.first.to_c(level+2)});\n"
2690
+ # res << "first = value2integer("
2691
+ # self.range.first.to_c(res,level+2)
2692
+ # res << ");\n"
2693
+ # res << (" " * ((level+1)*3))
2694
+ # # res << "last = value2integer(#{self.range.last.to_c(level+2)});\n"
2695
+ # res << "last = value2integer("
2696
+ # self.range.last.to_c(res,level+2)
2697
+ # res << ");\n"
2698
+ # # Make the access.
2699
+ # res << (" " * ((level+1)*3))
2700
+ # # puts "#{command}_range with first=#{self.range.first} and last=#{self.range.last}"
2701
+ # # res << "dst = #{command}_range(ref,first,last,#{self.type.base.to_c(level)},dst);\n"
2702
+ # res << "dst = #{command}_range(ref,first,last,"
2703
+ # self.type.base.to_c(res,level)
2704
+ # res << ",dst);\n"
2705
+ # # Restore the state of the value pool.
2706
+ # res << (" " * ((level+1)*3))
2707
+ # res << "set_value_pos(pool_state);\n"
2708
+ # # Close the computation.
2709
+ # res << (" " * (level*3))
2710
+ # res << "dst; })"
2711
+ # return res
2712
+ # end
2713
+ def to_c(res,level = 0, left = false)
2714
+ # Save the value pool state.
2715
+ res << (" " * (level*3)) << "PV;\n"
1977
2716
  # Compute the reference.
1978
- res << (" " * ((level+1)*3))
1979
- res << "ref = #{self.ref.to_c(level+2)};\n"
2717
+ self.ref.to_c(res,level)
2718
+ # res << (" " * (level*3))
1980
2719
  # Compute the range.
1981
- res << (" " * ((level+1)*3))
1982
- # res << "first = read64(#{self.range.first.to_c(level+2)});\n"
1983
- res << "first = value2integer(#{self.range.first.to_c(level+2)});\n"
1984
- res << (" " * ((level+1)*3))
1985
- # res << "last = read64(#{self.range.last.to_c(level+2)});\n"
1986
- res << "last = value2integer(#{self.range.last.to_c(level+2)});\n"
2720
+ self.range.first.to_c(res,level)
2721
+ self.range.last.to_c(res,level)
1987
2722
  # Make the access.
1988
- res << (" " * ((level+1)*3))
1989
- # res << "dst = #{command}_range(ref,first,last,#{self.ref.type.base.to_c(level)},dst);\n"
1990
- # puts "#{command}_range with first=#{self.range.first} and last=#{self.range.last}"
1991
- res << "dst = #{command}_range(ref,first,last,#{self.type.base.to_c(level)},dst);\n"
1992
- # Restore the state of the value pool.
1993
- res << (" " * ((level+1)*3))
1994
- res << "set_value_pos(pool_state);\n"
1995
- # Close the computation.
1996
2723
  res << (" " * (level*3))
1997
- res << "dst; })"
2724
+ if left then
2725
+ res << "swriteR("
2726
+ else
2727
+ res << "sreadR("
2728
+ end
2729
+ self.type.base.to_c(res,level)
2730
+ res << ");\n"
2731
+ # Restore the value pool state.
2732
+ res << (" " * (level*3)) << "RV;\n"
2733
+ return res
1998
2734
  end
1999
2735
 
2736
+ # # Generates the C text for reference as left value to a signal.
2737
+ # # +level+ is the hierarchical level of the object.
2738
+ # # def to_c_signal(level = 0)
2739
+ # def to_c_signal(res,level = 0)
2740
+ # # return "make_ref_rangeS(#{self.ref.to_c_signal(level)}," +
2741
+ # # "value2integer(#{self.range.first.to_c(level)}),value2integer(#{self.range.last.to_c(level)}))"
2742
+ # res << "make_ref_rangeS("
2743
+ # self.ref.to_c_signal(res,level)
2744
+ # res << ",value2integer("
2745
+ # self.range.first.to_c(res,level)
2746
+ # res << "),value2integer("
2747
+ # self.range.last.to_c(res,level)
2748
+ # res << "))"
2749
+ # return res
2750
+ # end
2000
2751
  # Generates the C text for reference as left value to a signal.
2001
2752
  # +level+ is the hierarchical level of the object.
2002
- def to_c_signal(level = 0)
2003
- # return to_c(level,true)
2004
- return "make_ref_rangeS(#{self.ref.to_c_signal(level)}," +
2005
- "value2integer(#{self.range.first.to_c(level)}),value2integer(#{self.range.last.to_c(level)}))"
2753
+ # def to_c_signal(level = 0)
2754
+ def to_c_signal(res,level = 0)
2755
+ res << "make_ref_rangeS("
2756
+ self.ref.to_c_signal(res,level)
2757
+ res << ","
2758
+ self.type.base.to_c(res,level)
2759
+ res << ",value2integer(({\n"
2760
+ self.range.first.to_c(res,level)
2761
+ res << " " * ((level+1)*3)
2762
+ res << "pop();})"
2763
+ res << "),value2integer(({\n"
2764
+ self.range.last.to_c(res,level)
2765
+ res << " " * ((level+1)*3)
2766
+ res << "pop();})"
2767
+ res << "))"
2768
+ return res
2006
2769
  end
2007
2770
  end
2008
2771
 
@@ -2013,17 +2776,31 @@ module HDLRuby::Low
2013
2776
  # Generates the C text of the equivalent HDLRuby code.
2014
2777
  # +level+ is the hierachical level of the object and
2015
2778
  # +left+ tells if it is a left value or not.
2016
- def to_c(level = 0, left = false)
2779
+ # def to_c(level = 0, left = false)
2780
+ def to_c(res,level = 0, left = false)
2781
+ # # puts "RefName to_c for #{self.name}"
2782
+ # self.resolve.to_c_signal(res,level+1)
2783
+ # res << "->" << (left ? "f_value" : "c_value")
2784
+ # return res
2017
2785
  # puts "RefName to_c for #{self.name}"
2018
- return "#{self.resolve.to_c_signal(level+1)}->" +
2019
- (left ? "f_value" : "c_value")
2786
+ res << (" " * (level*3))
2787
+ # res << "d="
2788
+ res << "push("
2789
+ self.resolve.to_c_signal(res,level+1)
2790
+ res << "->" << (left ? "f_value" : "c_value")
2791
+ # res << ";\n"
2792
+ res << ");\n"
2793
+ return res
2020
2794
  end
2021
2795
 
2022
2796
  # Generates the C text for reference as left value to a signal.
2023
2797
  # +level+ is the hierarchical level of the object.
2024
- def to_c_signal(level = 0)
2798
+ # def to_c_signal(level = 0)
2799
+ def to_c_signal(res,level = 0)
2025
2800
  # puts "to_c_signal with self=#{self.name}, resolve=#{self.resolve}"
2026
- return "#{self.resolve.to_c_signal(level+1)}"
2801
+ # return "#{self.resolve.to_c_signal(level+1)}"
2802
+ self.resolve.to_c_signal(res,level+1)
2803
+ return res
2027
2804
  end
2028
2805
  end
2029
2806
 
@@ -2033,14 +2810,20 @@ module HDLRuby::Low
2033
2810
  # Generates the C text of the equivalent HDLRuby code.
2034
2811
  # +level+ is the hierachical level of the object and
2035
2812
  # +left+ tells if it is a left value or not.
2036
- def to_c(level = 0, left = false)
2037
- return "this()"
2813
+ # def to_c(level = 0, left = false)
2814
+ def to_c(res,level = 0, left = false)
2815
+ # return "this()"
2816
+ res << "this()"
2817
+ return res
2038
2818
  end
2039
2819
 
2040
2820
  # Generates the C text for reference as left value to a signal.
2041
2821
  # +level+ is the hierarchical level of the object.
2042
- def to_c_signal(level = 0)
2043
- return "this()"
2822
+ # def to_c_signal(level = 0)
2823
+ def to_c_signal(res,level = 0)
2824
+ # return "this()"
2825
+ res << "this()"
2826
+ return res
2044
2827
  end
2045
2828
  end
2046
2829