HDLRuby 2.6.24 → 2.6.25

Sign up to get free protection for your applications and to get access to all the features.
@@ -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)) << "SV;\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,37 +1551,93 @@ 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 << "Value v=d;\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_value(v)) {\n"
1272
1617
  # The condition is testable.
1273
1618
  # Generate the case as a succession of if statements.
1274
1619
  first = true
1275
1620
  self.each_when do |w|
1276
- res << " " * (level+2)*3
1621
+ res << " " * ((level+2)*3)
1277
1622
  if first then
1278
1623
  first = false
1279
1624
  else
1280
1625
  res << "else "
1281
1626
  end
1282
- res << "if (value2integer(value) == "
1283
- res << "value2integer(" << w.match.to_c(level+2) << ")) {\n"
1284
- res << w.statement.to_c(level+3)
1627
+ res << "if (value2integer(v) == "
1628
+ res << "value2integer(({\n"
1629
+ res << " " * ((level+2)*3)
1630
+ w.match.to_c(res,level+2)
1631
+ res << "d;})"
1632
+ res << ")) {\n"
1633
+ w.statement.to_c(res,level+3)
1285
1634
  res << " " * (level+2)*3
1286
1635
  res << "}\n"
1287
1636
  end
1288
1637
  if self.default then
1289
1638
  res << " " * (level+2)*3
1290
1639
  res << "else {\n"
1291
- res << self.default.to_c(level+3)
1640
+ self.default.to_c(res,level+3)
1292
1641
  res << " " * (level+2)*3
1293
1642
  res << "}\n"
1294
1643
  end
@@ -1302,12 +1651,15 @@ module HDLRuby::Low
1302
1651
  end
1303
1652
 
1304
1653
  ## Generates the content of the h file.
1305
- def to_ch
1306
- res = ""
1654
+ # def to_ch
1655
+ def to_ch(res)
1656
+ # res = ""
1307
1657
  # Recurse on the whens.
1308
- self.each_when {|w| res << w.to_ch }
1658
+ # self.each_when {|w| res << w.to_ch }
1659
+ self.each_when {|w| w.to_ch(res) }
1309
1660
  # Recurse on the default statement.
1310
- res << self.default.to_ch if self.default
1661
+ # res << self.default.to_ch if self.default
1662
+ self.default.to_ch(res) if self.default
1311
1663
  return res
1312
1664
  end
1313
1665
  end
@@ -1318,9 +1670,13 @@ module HDLRuby::Low
1318
1670
 
1319
1671
  # Generates the C text of the equivalent HDLRuby code.
1320
1672
  # +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)})"
1673
+ # def to_c(level = 0)
1674
+ def to_c(res,level = 0)
1675
+ # return "make_delay(#{self.value.to_s}," +
1676
+ # "#{Low2C.unit_name(self.unit)})"
1677
+ res << "make_delay(#{self.value.to_s},"
1678
+ res << Low2C.unit_name(self.unit) << ")"
1679
+ return res
1324
1680
  end
1325
1681
  end
1326
1682
 
@@ -1330,12 +1686,17 @@ module HDLRuby::Low
1330
1686
 
1331
1687
  # Generates the C text of the equivalent HDLRuby code.
1332
1688
  # +level+ is the hierachical level of the object.
1333
- def to_c(level = 0)
1689
+ # def to_c(level = 0)
1690
+ def to_c(res,level = 0)
1334
1691
  # The resulting string.
1335
- res = " " * level*3
1692
+ # res = " " * level*3
1693
+ res << " " * level*3
1336
1694
  # Generate the wait.
1337
- res << "hw_wait(#{self.delay.to_c(level+1)}," +
1338
- "#{Low2C.behavior_access(self)});\n"
1695
+ # res << "hw_wait(#{self.delay.to_c(level+1)}," +
1696
+ # "#{Low2C.behavior_access(self)});\n"
1697
+ res << "hw_wait("
1698
+ self.delay.to_c(res,level+1)
1699
+ res << "," << Low2C.behavior_access(self) << ");\n"
1339
1700
  # Return the resulting string.
1340
1701
  return res
1341
1702
  end
@@ -1346,13 +1707,17 @@ module HDLRuby::Low
1346
1707
 
1347
1708
  # Generates the C text of the equivalent HDLRuby code.
1348
1709
  # +level+ is the hierachical level of the object.
1349
- def to_c(level = 0)
1710
+ # def to_c(level = 0)
1711
+ def to_c(res,level = 0)
1350
1712
  # The resulting string.
1351
- res = " " * level*3
1713
+ # res = " " * level*3
1714
+ res << " " * level*3
1352
1715
  # Generate an infinite loop executing the block and waiting.
1353
1716
  res << "for(;;) {\n"
1354
- res << "#{self.to_c(level+1)}\n"
1355
- res = " " * (level+1)*3
1717
+ # res << "#{self.statement.to_c(level+1)}\n"
1718
+ self.statement.to_c(res,level+1)
1719
+ res << "\n"
1720
+ res << " " * (level+1)*3
1356
1721
  res << Low2C.wait_code(self,level)
1357
1722
  # Return the resulting string.
1358
1723
  return res
@@ -1364,24 +1729,27 @@ module HDLRuby::Low
1364
1729
 
1365
1730
  # Adds the c code of the blocks to +res+ at +level+
1366
1731
  def add_blocks_code(res,level)
1367
- res << self.to_c_code(level)
1732
+ # res << self.to_c_code(level)
1733
+ self.to_c_code(res,level)
1734
+ return res
1368
1735
  end
1369
1736
 
1370
1737
  # Adds the creation of the blocks to +res+ at +level+.
1371
1738
  def add_make_block(res,level)
1372
1739
  res << " " * level*3
1373
- res << "#{Low2C.make_name(self)}();\n"
1740
+ res << Low2C.make_name(self) << "();\n"
1374
1741
  end
1375
1742
 
1376
1743
  # Generates the C text of the equivalent HDLRuby code.
1377
1744
  # +level+ is the hierachical level of the object.
1378
- def to_c_code(level = 0)
1745
+ # def to_c_code(level = 0)
1746
+ def to_c_code(res,level = 0)
1379
1747
  # The resulting string.
1380
- res = ""
1748
+ # res = ""
1381
1749
  # puts "generating self=#{self.object_id}"
1382
1750
 
1383
1751
  # Declare the global variable holding the block.
1384
- res << "Block #{Low2C.obj_name(self)};\n\n"
1752
+ res << "Block " << Low2C.obj_name(self) << ";\n\n"
1385
1753
 
1386
1754
  # Generate the c code of the sub blocks if any.
1387
1755
  self.each_statement do |stmnt|
@@ -1390,11 +1758,16 @@ module HDLRuby::Low
1390
1758
 
1391
1759
  # Generate the execution function.
1392
1760
  res << " " * level*3
1393
- res << "void #{Low2C.code_name(self)}() {\n"
1761
+ res << "void " << Low2C.code_name(self) << "() {\n"
1762
+ res << " " * (level+1)*3
1763
+ # res << "Value l,r,d;\n"
1764
+ # res << " " * (level+1)*3
1765
+ # res << "unsigned long long i;\n"
1394
1766
  # res << "printf(\"Executing #{Low2C.code_name(self)}...\\n\");"
1395
1767
  # Generate the statements.
1396
1768
  self.each_statement do |stmnt|
1397
- res << stmnt.to_c(level+1)
1769
+ # res << stmnt.to_c(level+1)
1770
+ stmnt.to_c(res,level+1)
1398
1771
  end
1399
1772
  # Close the execution function.
1400
1773
  res << " " * level*3
@@ -1402,11 +1775,12 @@ module HDLRuby::Low
1402
1775
 
1403
1776
 
1404
1777
  # Generate the signals.
1405
- self.each_signal { |signal| res << signal.to_c(level) }
1778
+ # self.each_signal { |signal| res << signal.to_c(level) }
1779
+ self.each_signal { |signal| signal.to_c(res,level) }
1406
1780
 
1407
1781
  # The header of the block.
1408
1782
  res << " " * level*3
1409
- res << "Block #{Low2C.make_name(self)}() {\n"
1783
+ res << "Block " << Low2C.make_name(self) << "() {\n"
1410
1784
  res << " " * (level+1)*3
1411
1785
  res << "Block block = malloc(sizeof(BlockS));\n"
1412
1786
  res << " " * (level+1)*3
@@ -1415,7 +1789,7 @@ module HDLRuby::Low
1415
1789
  # Sets the global variable of the block.
1416
1790
  res << "\n"
1417
1791
  res << " " * (level+1)*3
1418
- res << "#{Low2C.obj_name(self)} = block;\n"
1792
+ res << Low2C.obj_name(self) << " = block;\n"
1419
1793
 
1420
1794
  # Set the owner if any.
1421
1795
  if self.parent then
@@ -1426,8 +1800,8 @@ module HDLRuby::Low
1426
1800
  end
1427
1801
  # Set it as the real parent.
1428
1802
  res << " " * (level+1)*3
1429
- res << "block->owner = (Object)" +
1430
- "#{Low2C.obj_name(true_parent)};\n"
1803
+ res << "block->owner = (Object)"
1804
+ res << Low2C.obj_name(true_parent) << ";\n"
1431
1805
  else
1432
1806
  res << "block->owner = NULL;\n"
1433
1807
  end
@@ -1444,13 +1818,13 @@ module HDLRuby::Low
1444
1818
  "block->num_inners);\n"
1445
1819
  self.each_inner.with_index do |inner,i|
1446
1820
  res << " " * (level+1)*3
1447
- res << "block->inners[#{i}] = " +
1448
- "#{Low2C.make_name(inner)}();\n"
1821
+ res << "block->inners[#{i}] = "
1822
+ res << Low2C.make_name(inner) << "();\n"
1449
1823
  end
1450
1824
 
1451
1825
  # Sets the execution function.
1452
1826
  res << " " * (level+1)*3
1453
- res << "block->function = &#{Low2C.code_name(self)};\n"
1827
+ res << "block->function = &" << Low2C.code_name(self) << ";\n"
1454
1828
 
1455
1829
  # Generate creation of the sub blocks.
1456
1830
  self.each_statement do |stmnt|
@@ -1471,28 +1845,32 @@ module HDLRuby::Low
1471
1845
  # Generates the execution of the block C text of the equivalent
1472
1846
  # HDLRuby code.
1473
1847
  # +level+ is the hierachical level of the object.
1474
- def to_c(level = 0)
1475
- res = " " * (level)
1476
- res << "#{Low2C.code_name(self)}();\n"
1848
+ # def to_c(level = 0)
1849
+ def to_c(res,level = 0)
1850
+ # res = " " * (level*3)
1851
+ res << " " * (level*3)
1852
+ res << Low2C.code_name(self) << "();\n"
1477
1853
  return res
1478
1854
  end
1479
1855
 
1480
1856
  ## Generates the content of the h file.
1481
- def to_ch
1857
+ # def to_ch
1858
+ def to_ch(res)
1482
1859
  # puts "to_ch for block=#{Low2C.obj_name(self)} with=#{self.each_inner.count} inners"
1483
- res = ""
1860
+ # res = ""
1484
1861
  # Declare the global variable holding the block.
1485
- res << "extern Block #{Low2C.obj_name(self)};\n\n"
1862
+ res << "extern Block " << Low2C.obj_name(self) << ";\n\n"
1486
1863
 
1487
1864
  # Generate the access to the function making the block. */
1488
- res << "extern Block #{Low2C.make_name(self)}();\n\n"
1865
+ res << "extern Block " << Low2C.make_name(self) << "();\n\n"
1489
1866
 
1490
1867
  # Generate the accesses to the ports.
1491
- self.each_inner { |inner| res << inner.to_ch }
1868
+ # self.each_inner { |inner| res << inner.to_ch }
1869
+ self.each_inner { |inner| inner.to_ch(res) }
1492
1870
 
1493
1871
  # Recurse on the statements.
1494
- self.each_statement { |stmnt| res << stmnt.to_ch }
1495
-
1872
+ # self.each_statement { |stmnt| res << stmnt.to_ch }
1873
+ self.each_statement { |stmnt| stmnt.to_ch(res) }
1496
1874
 
1497
1875
  return res
1498
1876
  end
@@ -1516,7 +1894,8 @@ module HDLRuby::Low
1516
1894
 
1517
1895
  # Generates the C text of the equivalent HDLRuby code.
1518
1896
  # +level+ is the hierachical level of the object.
1519
- def to_c(level = 0)
1897
+ # def to_c(level = 0)
1898
+ def to_c(res,level = 0)
1520
1899
  # Should never be here.
1521
1900
  raise AnyError, "Internal error: to_c should be implemented in class :#{self.class}"
1522
1901
  end
@@ -1528,25 +1907,50 @@ module HDLRuby::Low
1528
1907
 
1529
1908
  ## Generates the C text for an access to the value.
1530
1909
  # +level+ is the hierachical level of the object.
1531
- def to_c(level = 0)
1532
- return "#{Low2C.make_name(self)}()"
1910
+ def to_c(res,level = 0)
1911
+ # res << Low2C.make_name(self) << "()"
1912
+ # return res
1913
+ res << (" " * (level*3))
1914
+ # res << "d=" << Low2C.make_name(self) << "();\n"
1915
+ res << "push(" << Low2C.make_name(self) << "());\n"
1916
+ return res
1917
+ end
1918
+
1919
+ ## Generates the C text for an expression access to the value.
1920
+ # +level+ is the hierachical level of the object.
1921
+ def to_c_expr(res,level = 0)
1922
+ res << Low2C.make_name(self) << "()"
1923
+ return res
1533
1924
  end
1534
1925
 
1535
1926
  ## Generates the content of the h file.
1536
- def to_ch
1537
- res = ""
1538
- return "extern Value #{Low2C.make_name(self)}();"
1927
+ # def to_ch
1928
+ def to_ch(res)
1929
+ # res = ""
1930
+ # return "extern Value #{Low2C.make_name(self)}();"
1931
+ res << "extern Value " << Low2C.make_name(self) << "();"
1932
+ return res
1539
1933
  end
1540
1934
 
1935
+ @@made_values = Set.new
1936
+
1541
1937
  # Generates the text of the equivalent c.
1542
1938
  # +level+ is the hierachical level of the object.
1543
- def to_c_make(level = 0)
1939
+ # def to_c_make(level = 0)
1940
+ def to_c_make(res,level = 0)
1941
+ # Check is the value maker is already present.
1942
+ maker = Low2C.make_name(self);
1943
+ # return "" if @@made_values.include?(maker)
1944
+ return res if @@made_values.include?(maker)
1945
+ @@made_values.add(maker)
1946
+
1544
1947
  # The resulting string.
1545
- res = ""
1948
+ # res = ""
1546
1949
 
1547
1950
  # The header of the value generation.
1548
1951
  res << " " * level*3
1549
- res << "Value #{Low2C.make_name(self)}() {\n"
1952
+ # res << "Value " << Low2C.make_name(self) << "() {\n"
1953
+ res << "Value " << maker << "() {\n"
1550
1954
 
1551
1955
  # Declares the data.
1552
1956
  # Create the bit string.
@@ -1584,8 +1988,11 @@ module HDLRuby::Low
1584
1988
  # Create the value.
1585
1989
  res << " " * (level+1)*3
1586
1990
  # 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"
1991
+ # res << "return make_set_value(#{self.type.to_c(level+1)},1," +
1992
+ # "data);\n"
1993
+ res << "return make_set_value("
1994
+ self.type.to_c(res,level+1)
1995
+ res << ",1,data);\n"
1589
1996
  else
1590
1997
  # No, generate a bit string value.
1591
1998
  res << " " * (level+1)*3
@@ -1593,8 +2000,11 @@ module HDLRuby::Low
1593
2000
  res << "static unsigned char data[] = \"#{str.reverse}\";\n"
1594
2001
  # Create the value.
1595
2002
  res << " " * (level+1)*3
1596
- res << "return make_set_value(#{self.type.to_c(level+1)},0," +
1597
- "data);\n"
2003
+ # res << "return make_set_value(#{self.type.to_c(level+1)},0," +
2004
+ # "data);\n"
2005
+ res << "return make_set_value("
2006
+ self.type.to_c(res,level+1)
2007
+ res << ",0,data);\n"
1598
2008
  end
1599
2009
 
1600
2010
  # Close the value.
@@ -1608,29 +2018,54 @@ module HDLRuby::Low
1608
2018
  ## Extends the Cast class with generation of C text.
1609
2019
  class Cast
1610
2020
 
2021
+ # # Generates the C text of the equivalent HDLRuby code.
2022
+ # # +level+ is the hierachical level of the object.
2023
+ # # def to_c(level = 0)
2024
+ # def to_c(res,level = 0)
2025
+ # # res = "({\n"
2026
+ # res << "({\n"
2027
+ # # Overrides the upper src0 and dst...
2028
+ # res << (" " * ((level+1)*3))
2029
+ # res << "Value src0, dst = get_value();\n"
2030
+ # # Save the state of the value pool.
2031
+ # res << (" " * ((level+1)*3))
2032
+ # res << "unsigned int pool_state = get_value_pos();\n"
2033
+ # # Compute the child.
2034
+ # res << (" " * ((level+1)*3))
2035
+ # # res << "src0 = #{self.child.to_c(level+2)};\n"
2036
+ # res << "src0 = "
2037
+ # self.child.to_c(res,level+2)
2038
+ # res << ";\n"
2039
+ # res << (" " * ((level+1)*3))
2040
+ # # res += "dst = cast_value(src0," +
2041
+ # # "#{self.type.to_c(level+1)},dst);\n"
2042
+ # res << "dst = cast_value(src0,"
2043
+ # self.type.to_c(res,level+1)
2044
+ # res << ",dst);\n"
2045
+ # # Restore the value pool state.
2046
+ # res << (" " * ((level+1)*3))
2047
+ # res << "set_value_pos(pool_state);\n"
2048
+ # # Close the computation
2049
+ # res << (" " * (level*3))
2050
+ # res << "dst; })"
2051
+
2052
+ # return res
2053
+ # end
1611
2054
  # Generates the C text of the equivalent HDLRuby code.
1612
2055
  # +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
2056
+ # def to_c(level = 0)
2057
+ def to_c(res,level = 0)
2058
+ # Save the value pool state.
2059
+ res << (" " * (level*3)) << "SV;\n"
2060
+ # Generate the child.
2061
+ self.child.to_c(res,level)
1631
2062
  res << (" " * (level*3))
1632
- res << "dst; })"
1633
-
2063
+ # res << "d=cast(d,"
2064
+ res << "cast("
2065
+ self.type.to_c(res,level+1)
2066
+ res << ");\n"
2067
+ # Restore the value pool state.
2068
+ res << (" " * (level*3)) << "RV;\n"
1634
2069
  return res
1635
2070
  end
1636
2071
  end
@@ -1641,7 +2076,8 @@ module HDLRuby::Low
1641
2076
 
1642
2077
  # Generates the C text of the equivalent HDLRuby code.
1643
2078
  # +level+ is the hierachical level of the object.
1644
- def to_c(level = 0)
2079
+ # def to_c(level = 0)
2080
+ def to_c(res,level = 0)
1645
2081
  # Should never be here.
1646
2082
  raise AnyError, "Internal error: to_c should be implemented in class :#{self.class}"
1647
2083
  end
@@ -1650,42 +2086,81 @@ module HDLRuby::Low
1650
2086
  ## Extends the Unary class with generation of C text.
1651
2087
  class Unary
1652
2088
 
2089
+ # # Generates the C text of the equivalent HDLRuby code.
2090
+ # # +level+ is the hierachical level of the object.
2091
+ # # def to_c(level = 0)
2092
+ # def to_c(res,level = 0)
2093
+ # # res = "({\n"
2094
+ # res << "({\n"
2095
+ # # Overrides the upper src0 and dst...
2096
+ # res << (" " * ((level+1)*3))
2097
+ # res << "Value src0, dst;\n"
2098
+ # if (self.operator != :+@) then
2099
+ # # And allocates a new value for dst unless the operator
2100
+ # # is +@ that does not compute anything.
2101
+ # res << (" " * ((level+1)*3))
2102
+ # res << "dst = get_value();\n"
2103
+ # end
2104
+ # # Save the state of the value pool.
2105
+ # res << (" " * ((level+1)*3))
2106
+ # res << "unsigned int pool_state = get_value_pos();\n"
2107
+ # # Compute the child.
2108
+ # res << (" " * ((level+1)*3))
2109
+ # # res << "src0 = #{self.child.to_c(level+2)};\n"
2110
+ # res << "src0 = "
2111
+ # self.child.to_c(res,level+2)
2112
+ # res << ";\n"
2113
+ # res << (" " * ((level+1)*3))
2114
+ # case self.operator
2115
+ # when :~ then
2116
+ # res << "dst = not_value(src0,dst);\n"
2117
+ # when :-@ then
2118
+ # res << "dst = neg_value(src0,dst);\n"
2119
+ # when :+@ then
2120
+ # # res << "dst = #{self.child.to_c(level)};\n"
2121
+ # res << "dst = "
2122
+ # self.child.to_c(res,level)
2123
+ # res << ";\n"
2124
+ # else
2125
+ # raise "Invalid unary operator: #{self.operator}."
2126
+ # end
2127
+ # # Restore the value pool state.
2128
+ # res << (" " * ((level+1)*3))
2129
+ # res << "set_value_pos(pool_state);\n"
2130
+ # # Close the computation
2131
+ # res << (" " * (level*3))
2132
+ # res << "dst; })"
2133
+
2134
+ # return res
2135
+ # end
1653
2136
  # Generates the C text of the equivalent HDLRuby code.
1654
2137
  # +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"
2138
+ # def to_c(level = 0)
2139
+ def to_c(res,level = 0)
2140
+ if (self.operator == :+@) then
2141
+ # No computation required.
2142
+ self.child.to_c(res,level)
2143
+ return res
1665
2144
  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))
2145
+ # Some computation required.
2146
+ # Save the value pool state.
2147
+ res << (" " * (level*3)) << "SV;\n"
2148
+ # Generate the child.
2149
+ self.child.to_c(res,level)
2150
+ res << (" " * (level*3))
2151
+ res << "unary("
2152
+ # Adds the operation
1673
2153
  case self.operator
1674
2154
  when :~ then
1675
- res += "dst = not_value(src0,dst);\n"
2155
+ res << "&not_value"
1676
2156
  when :-@ then
1677
- res += "dst = neg_value(src0,dst);\n"
1678
- when :+@ then
1679
- res += "dst = #{self.child.to_c(level)};\n"
2157
+ res << "&neg_value"
1680
2158
  else
1681
2159
  raise "Invalid unary operator: #{self.operator}."
1682
2160
  end
2161
+ res << ");\n"
1683
2162
  # 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; })"
2163
+ res << (" " * (level*3)) << "RV;\n"
1689
2164
 
1690
2165
  return res
1691
2166
  end
@@ -1695,78 +2170,147 @@ module HDLRuby::Low
1695
2170
  ## Extends the Binary class with generation of C text.
1696
2171
  class Binary
1697
2172
 
2173
+ # # Generates the C text of the equivalent HDLRuby code.
2174
+ # # +level+ is the hierachical level of the object.
2175
+ # # def to_c(level = 0)
2176
+ # def to_c(res, level = 0)
2177
+ # # res = "({\n"
2178
+ # res << "({\n"
2179
+ # # Overrides the upper src0, src1 and dst...
2180
+ # # And allocates a new value for dst.
2181
+ # res << (" " * ((level+1)*3))
2182
+ # res << "Value src0,src1,dst = get_value();\n"
2183
+ # # Save the state of the value pool.
2184
+ # res << (" " * ((level+1)*3))
2185
+ # res << "unsigned int pool_state = get_value_pos();\n"
2186
+ # # Compute the left.
2187
+ # res << (" " * ((level+1)*3))
2188
+ # # res << "src0 = " << self.left.to_c(level+2) << ";\n"
2189
+ # res << "src0 = "
2190
+ # self.left.to_c(res,level+2)
2191
+ # res << ";\n"
2192
+ # # Compute the right.
2193
+ # res << (" " * ((level+1)*3))
2194
+ # # res << "src1 = " << self.right.to_c(level+2) << ";\n"
2195
+ # res << "src1 = "
2196
+ # self.right.to_c(res,level+2)
2197
+ # res << ";\n"
2198
+ # res << (" " * ((level+1)*3))
2199
+
2200
+ # # Compute the current binary operation.
2201
+ # case self.operator
2202
+ # when :+ then
2203
+ # res << "dst = add_value(src0,src1,dst);\n"
2204
+ # when :- then
2205
+ # res << "dst = sub_value(src0,src1,dst);\n"
2206
+ # when :* then
2207
+ # res << "dst = mul_value(src0,src1,dst);\n"
2208
+ # when :/ then
2209
+ # res << "dst = div_value(src0,src1,dst);\n"
2210
+ # when :% then
2211
+ # res << "dst = mod_value(src0,src1,dst);\n"
2212
+ # when :** then
2213
+ # res << "dst = pow_value(src0,src1,dst);\n"
2214
+ # when :& then
2215
+ # res << "dst = and_value(src0,src1,dst);\n"
2216
+ # when :| then
2217
+ # res << "dst = or_value(src0,src1,dst);\n"
2218
+ # when :^ then
2219
+ # res << "dst = xor_value(src0,src1,dst);\n"
2220
+ # when :<<,:ls then
2221
+ # res << "dst = shift_left_value(src0,src1,dst);\n"
2222
+ # when :>>,:rs then
2223
+ # res << "dst = shift_right_value(src0,src1,dst);\n"
2224
+ # when :lr then
2225
+ # res << "dst = rotate_left_value(src0,src1,dst);\n"
2226
+ # when :rr then
2227
+ # res << "dst = rotate_right_value(src0,src1,dst);\n"
2228
+ # when :== then
2229
+ # res << "dst = equal_value(src0,src1,dst);\n"
2230
+ # res << "dst = reduce_or_value(dst,dst);"
2231
+ # when :!= then
2232
+ # res << "dst = xor_value(src0,src1,dst);\n"
2233
+ # res << "dst = reduce_or_value(dst,dst);"
2234
+ # when :> then
2235
+ # res << "dst = greater_value(src0,src1,dst);\n"
2236
+ # when :< then
2237
+ # res << "dst = lesser_value(src0,src1,dst);\n"
2238
+ # when :>= then
2239
+ # res << "dst = greater_equal_value(src0,src1,dst);\n"
2240
+ # when :<= then
2241
+ # res << "dst = lesser_equal_value(src0,src1,dst);\n"
2242
+ # else
2243
+ # raise "Invalid binary operator: #{self.operator}."
2244
+ # end
2245
+ # # Restore the state of the value pool.
2246
+ # res << (" " * ((level+1)*3))
2247
+ # res << "set_value_pos(pool_state);\n"
2248
+ # # Close the computation.
2249
+ # res << (" " * (level*3))
2250
+ # res << "dst;})"
2251
+
2252
+ # return res
2253
+ # end
1698
2254
  # Generates the C text of the equivalent HDLRuby code.
1699
2255
  # +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.
2256
+ # def to_c(level = 0)
2257
+ def to_c(res, level = 0)
2258
+ # Save the value pool state.
2259
+ res << (" " * (level*3)) << "SV;\n"
2260
+ # Generate the left computation.
2261
+ self.left.to_c(res,level)
2262
+ # Generate the right computation.
2263
+ self.right.to_c(res,level)
2264
+ # Generate the binary.
2265
+ res << (" " * (level*3))
2266
+ res << "binary("
2267
+ # Set the operation.
1719
2268
  case self.operator
1720
2269
  when :+ then
1721
- res += "dst = add_value(src0,src1,dst);\n"
2270
+ res << "&add_value"
1722
2271
  when :- then
1723
- res += "dst = sub_value(src0,src1,dst);\n"
2272
+ res << "&sub_value"
1724
2273
  when :* then
1725
- res += "dst = mul_value(src0,src1,dst);\n"
2274
+ res << "&mul_value"
1726
2275
  when :/ then
1727
- res += "dst = div_value(src0,src1,dst);\n"
2276
+ res << "&div_value"
1728
2277
  when :% then
1729
- res += "dst = mod_value(src0,src1,dst);\n"
2278
+ res << "&mod_value"
1730
2279
  when :** then
1731
- res += "dst = pow_value(src0,src1,dst);\n"
2280
+ res << "&pow_value"
1732
2281
  when :& then
1733
- res += "dst = and_value(src0,src1,dst);\n"
2282
+ res << "&and_value"
1734
2283
  when :| then
1735
- res += "dst = or_value(src0,src1,dst);\n"
2284
+ res << "&or_value"
1736
2285
  when :^ then
1737
- res += "dst = xor_value(src0,src1,dst);\n"
2286
+ res << "&xor_value"
1738
2287
  when :<<,:ls then
1739
- res += "dst = shift_left_value(src0,src1,dst);\n"
2288
+ res << "&shift_left_value"
1740
2289
  when :>>,:rs then
1741
- res += "dst = shift_right_value(src0,src1,dst);\n"
2290
+ res << "&shift_right_value"
1742
2291
  when :lr then
1743
- res += "dst = rotate_left_value(src0,src1,dst);\n"
2292
+ res << "&rotate_left_value"
1744
2293
  when :rr then
1745
- res += "dst = rotate_right_value(src0,src1,dst);\n"
2294
+ res << "&rotate_right_value"
1746
2295
  when :== then
1747
- res += "dst = equal_value(src0,src1,dst);\n" +
1748
- "dst = reduce_or_value(dst,dst);"
2296
+ res << "&equal_value_c"
1749
2297
  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);"
2298
+ res << "&not_equal_value_c"
1753
2299
  when :> then
1754
- res += "dst = greater_value(src0,src1,dst);\n"
2300
+ res << "&greater_value"
1755
2301
  when :< then
1756
- res += "dst = lesser_value(src0,src1,dst);\n"
2302
+ res << "&lesser_value"
1757
2303
  when :>= then
1758
- res += "dst = greater_equal_value(src0,src1,dst);\n"
2304
+ res << "&greater_equal_value"
1759
2305
  when :<= then
1760
- res += "dst = lesser_equal_value(src0,src1,dst);\n"
2306
+ res << "&lesser_equal_value"
1761
2307
  else
1762
2308
  raise "Invalid binary operator: #{self.operator}."
1763
2309
  end
1764
- # Restore the state of the value pool.
1765
- res << (" " * ((level+1)*3))
1766
- res << "set_value_pos(pool_state);\n"
1767
2310
  # Close the computation.
1768
- res << (" " * (level*3))
1769
- res << "dst; })"
2311
+ res << ");\n"
2312
+ # Restore the value pool state.
2313
+ res << (" " * (level*3)) << "RV;\n"
1770
2314
 
1771
2315
  return res
1772
2316
  end
@@ -1775,103 +2319,200 @@ module HDLRuby::Low
1775
2319
  ## Extends the Select class with generation of C text.
1776
2320
  class Select
1777
2321
 
2322
+ # # Generates the C text of the equivalent HDLRuby code.
2323
+ # # +level+ is the hierachical level of the object.
2324
+ # # def to_c(level = 0)
2325
+ # def to_c(res,level = 0)
2326
+ # # Gather the possible selection choices.
2327
+ # expressions = self.each_choice.to_a
2328
+ # # Create the resulting string.
2329
+ # # res = "({\n"
2330
+ # res << "({\n"
2331
+ # # Overrides the upper sel, src0, src1, ..., and dst...
2332
+ # # And allocates a new value for dst.
2333
+ # res << (" " * ((level+1)*3))
2334
+ # res << "Value sel;\n"
2335
+ # res << (" " * ((level+1)*3))
2336
+ # res << "Value "
2337
+ # res << expressions.size.times.map do |i|
2338
+ # "src#{i}"
2339
+ # end.join(",")
2340
+ # res << ";\n"
2341
+ # res << (" " * ((level+1)*3))
2342
+ # res << "Value dst = get_value();\n"
2343
+ # # Save the state of the value pool.
2344
+ # res << (" " * ((level+1)*3))
2345
+ # res << "unsigned int pool_state = get_value_pos();\n"
2346
+ # # Compute the selection.
2347
+ # res << (" " * ((level+1)*3))
2348
+ # # res << "sel = #{self.select.to_c(level+2)};\n"
2349
+ # res << "sel = "
2350
+ # self.select.to_c(res,level+2)
2351
+ # res << ";\n"
2352
+ # # Compute each choice expression.
2353
+ # expressions.each_with_index do |expr,i|
2354
+ # res << (" " * ((level+1)*3))
2355
+ # # res << "src#{i} = #{expr.to_c(level+2)};\n"
2356
+ # res << "src#{i} = "
2357
+ # expr.to_c(res,level+2)
2358
+ # res << ";\n"
2359
+ # end
2360
+ # # Compute the resulting selection.
2361
+ # res << (" " * ((level+1)*3))
2362
+ # res << "select_value(sel,dst,#{expressions.size},"
2363
+ # # res << "#{expressions.size.times.map { |i| "src#{i}" }.join(",")}"
2364
+ # res << expressions.size.times.map { |i| "src#{i}" }.join(",")
2365
+ # res << ");\n"
2366
+ # # Restore the state of the value pool.
2367
+ # res << (" " * ((level+1)*3))
2368
+ # res << "set_value_pos(pool_state);\n"
2369
+ # # Close the computation.
2370
+ # res << (" " * (level*3))
2371
+ # res << "dst; })"
2372
+ # return res
2373
+ # end
1778
2374
  # Generates the C text of the equivalent HDLRuby code.
1779
2375
  # +level+ is the hierachical level of the object.
1780
- def to_c(level = 0)
2376
+ def to_c(res,level = 0)
2377
+ # Save the value pool state.
2378
+ res << (" " * (level*3)) << "SV;\n"
1781
2379
  # Gather the possible selection choices.
1782
2380
  expressions = self.each_choice.to_a
1783
2381
  # 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
2382
  # Compute the selection.
1800
- res << (" " * ((level+1)*3))
1801
- res << "sel = #{self.select.to_c(level+2)};\n"
2383
+ self.select.to_c(res,level)
1802
2384
  # Compute each choice expression.
1803
2385
  expressions.each_with_index do |expr,i|
1804
- res << (" " * ((level+1)*3))
1805
- res << "src#{i} = #{expr.to_c(level+2)};\n"
2386
+ expr.to_c(res,level)
1806
2387
  end
1807
2388
  # 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
2389
  res << (" " * (level*3))
1817
- res << "dst; })"
2390
+ res << "select(#{expressions.size});\n"
2391
+ # Restore the value pool state.
2392
+ res << (" " * (level*3)) << "RV;\n"
2393
+ return res
1818
2394
  end
1819
2395
  end
1820
2396
 
1821
2397
  ## Extends the Concat class with generation of C text.
1822
2398
  class Concat
1823
2399
 
1824
- # Generates the C text of the equivalent HDLRuby code.
2400
+
2401
+ # # Generates the C text for the equivalent HDLRuby code.
2402
+ # # +level+ is the hierachical level of the object.
2403
+ # def to_c(res,level = 0)
2404
+ # # Gather the content to concat.
2405
+ # expressions = self.each_expression.to_a
2406
+ # # Create the resulting string.
2407
+ # res << "({\n"
2408
+ # # Overrides the upper src0, src1, ..., and dst...
2409
+ # # And allocates a new value for dst.
2410
+ # res << (" " * ((level+1)*3))
2411
+ # res << "Value "
2412
+ # res << expressions.size.times.map do |i|
2413
+ # "src#{i}"
2414
+ # end.join(",")
2415
+ # res << ";\n"
2416
+ # res << (" " * ((level+1)*3))
2417
+ # res << "Value dst = get_value();\n"
2418
+ # # Save the state of the value pool.
2419
+ # res << (" " * ((level+1)*3))
2420
+ # res << "unsigned int pool_state = get_value_pos();\n"
2421
+ # # Compute each sub expression.
2422
+ # expressions.each_with_index do |expr,i|
2423
+ # res << (" " * ((level+1)*3))
2424
+ # res << "src#{i} = "
2425
+ # expr.to_c_expr(res,level+2)
2426
+ # res << ";\n"
2427
+ # end
2428
+ # # Compute the direction.
2429
+ # # Compute the resulting concatenation.
2430
+ # res << (" " * ((level+1)*3))
2431
+ # res << "concat_value(#{expressions.size},"
2432
+ # res << "#{self.type.direction == :little ? 1 : 0},dst,"
2433
+ # res << expressions.size.times.map { |i| "src#{i}" }.join(",")
2434
+ # res << ");\n"
2435
+ # # Restore the state of the value pool.
2436
+ # res << (" " * ((level+1)*3))
2437
+ # res << "set_value_pos(pool_state);\n"
2438
+ # # Close the computation.
2439
+ # res << (" " * (level*3))
2440
+ # res << "dst; })"
2441
+ # return res
2442
+ # end
2443
+ # Generates the C text for the equivalent HDLRuby code.
1825
2444
  # +level+ is the hierachical level of the object.
1826
- def to_c(level = 0)
2445
+ def to_c(res,level = 0)
2446
+ # Save the value pool state.
2447
+ res << (" " * (level*3)) << "SV;\n"
2448
+ # Gather the content to concat.
2449
+ expressions = self.each_expression.to_a
2450
+ # Compute each sub expression.
2451
+ expressions.each_with_index do |expr,i|
2452
+ expr.to_c(res,level+2)
2453
+ end
2454
+ # Compute the resulting concatenation.
2455
+ res << (" " * ((level+1)*3))
2456
+ res << "sconcat(#{expressions.size},"
2457
+ res << (self.type.direction == :little ? "1" : "0")
2458
+ res << ");\n"
2459
+ # Restore the value pool state.
2460
+ res << (" " * (level*3)) << "RV;\n"
2461
+ return res
2462
+ end
2463
+
2464
+ # Generates the C text of expression for the equivalent HDLRuby code.
2465
+ # +level+ is the hierachical level of the object.
2466
+ def to_c_expr(res,level = 0)
1827
2467
  # Gather the content to concat.
1828
2468
  expressions = self.each_expression.to_a
1829
2469
  # Create the resulting string.
1830
- # res = " " * (level*3)
1831
- res = "({\n"
2470
+ res << "({\n"
1832
2471
  # Overrides the upper src0, src1, ..., and dst...
1833
2472
  # And allocates a new value for dst.
1834
2473
  res << (" " * ((level+1)*3))
1835
- res << "Value #{expressions.size.times.map do |i|
2474
+ res << "Value "
2475
+ res << expressions.size.times.map do |i|
1836
2476
  "src#{i}"
1837
- end.join(",")};\n"
2477
+ end.join(",")
2478
+ res << ";\n"
1838
2479
  res << (" " * ((level+1)*3))
1839
2480
  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"
2481
+ # Save the value pool state.
2482
+ res << (" " * (level*3)) << "SV;\n"
1843
2483
  # Compute each sub expression.
1844
2484
  expressions.each_with_index do |expr,i|
1845
2485
  res << (" " * ((level+1)*3))
1846
- res << "src#{i} = #{expr.to_c(level+2)};\n"
2486
+ res << "src#{i} = "
2487
+ expr.to_c_expr(res,level+2)
2488
+ res << ";\n"
1847
2489
  end
1848
2490
  # Compute the direction.
1849
2491
  # Compute the resulting concatenation.
1850
2492
  res << (" " * ((level+1)*3))
1851
2493
  res << "concat_value(#{expressions.size},"
1852
2494
  res << "#{self.type.direction == :little ? 1 : 0},dst,"
1853
- res << "#{expressions.size.times.map { |i| "src#{i}" }.join(",")}"
2495
+ res << expressions.size.times.map { |i| "src#{i}" }.join(",")
1854
2496
  res << ");\n"
1855
- # Restore the state of the value pool.
1856
- res << (" " * ((level+1)*3))
1857
- res << "set_value_pos(pool_state);\n"
2497
+ # Save the value pool state.
2498
+ res << (" " * (level*3)) << "SV;\n"
1858
2499
  # Close the computation.
1859
2500
  res << (" " * (level*3))
1860
2501
  res << "dst; })"
1861
-
1862
2502
  return res
1863
-
1864
2503
  end
1865
2504
  end
1866
2505
 
1867
2506
 
2507
+
1868
2508
  ## Extends the Ref class with generation of C text.
1869
2509
  class Ref
1870
2510
 
1871
2511
  # Generates the C text of the equivalent HDLRuby code.
1872
2512
  # +level+ is the hierachical level of the object and
1873
2513
  # +left+ tells if it is a left value or not.
1874
- def to_c(level = 0, left = false)
2514
+ # def to_c(level = 0, left = false)
2515
+ def to_c(res,level = 0, left = false)
1875
2516
  # Should never be here.
1876
2517
  raise AnyError, "Internal error: to_c should be implemented in class :#{self.class}"
1877
2518
  end
@@ -1884,7 +2525,8 @@ module HDLRuby::Low
1884
2525
  # Generates the C text of the equivalent HDLRuby code.
1885
2526
  # +level+ is the hierachical level of the object and
1886
2527
  # +left+ tells if it is a left value or not.
1887
- def to_c(level = 0, left = false)
2528
+ # def to_c(level = 0, left = false)
2529
+ def to_c(res,level = 0, left = false)
1888
2530
  raise "RefConcat cannot be converted to C directly, please use break_concat_assign!."
1889
2531
  # # The resulting string.
1890
2532
  # res = "ref_concat(#{self.each_ref.to_a.size}"
@@ -1897,7 +2539,8 @@ module HDLRuby::Low
1897
2539
 
1898
2540
  # Generates the C text for reference as left value to a signal.
1899
2541
  # +level+ is the hierarchical level of the object.
1900
- def to_c_signal(level = 0)
2542
+ # def to_c_signal(level = 0)
2543
+ def to_c_signal(res,level = 0)
1901
2544
  raise "RefConcat cannot be converted to C directly, please use break_concat_assign!."
1902
2545
  # # The resulting string.
1903
2546
  # res = "sig_concat(#{self.each_ref.to_a.size}"
@@ -1913,44 +2556,109 @@ module HDLRuby::Low
1913
2556
  ## Extends the RefIndex class with generation of C text.
1914
2557
  class RefIndex
1915
2558
 
2559
+ # # Generates the C text of the equivalent HDLRuby code.
2560
+ # # +level+ is thehierachical level of the object and
2561
+ # # +left+ tells if it is a left value or not.
2562
+ # # def to_c(level = 0, left = false)
2563
+ # def to_c(res,level = 0, left = false)
2564
+ # # res = "({\n"
2565
+ # res << "({\n"
2566
+ # # And allocates a new value for dst.
2567
+ # res << (" " * ((level+1)*3))
2568
+ # res << "Value ref,dst = get_value();\n"
2569
+ # res << (" " * ((level+1)*3))
2570
+ # res << "unsigned long long idx;\n"
2571
+ # # Save the state of the value pool.
2572
+ # res << (" " * ((level+1)*3))
2573
+ # res << "unsigned int pool_state = get_value_pos();\n"
2574
+ # # Compute the reference.
2575
+ # res << (" " * ((level+1)*3))
2576
+ # # res << "ref = #{self.ref.to_c(level+2)};\n"
2577
+ # res << "ref = "
2578
+ # self.ref.to_c(res,level+2)
2579
+ # res << ";\n"
2580
+ # # Compute the index.
2581
+ # res << (" " * ((level+1)*3))
2582
+ # # res << "idx = value2integer(#{self.index.to_c(level+2)});\n"
2583
+ # res << "idx = value2integer("
2584
+ # self.index.to_c(res,level+2)
2585
+ # res << ");\n"
2586
+ # # Make the access.
2587
+ # res << (" " * ((level+1)*3))
2588
+ # # puts "self.type.width=#{self.type.width}"
2589
+ # # res << "dst = read_range(ref,idx,idx,#{self.type.to_c(level)},dst);\n"
2590
+ # res << "dst = read_range(ref,idx,idx,"
2591
+ # # res << self.type.to_c(level)
2592
+ # self.type.to_c(res,level)
2593
+ # res << ",dst);\n"
2594
+ # # Restore the state of the value pool.
2595
+ # res << (" " * ((level+1)*3))
2596
+ # res << "set_value_pos(pool_state);\n"
2597
+ # # Close the computation.
2598
+ # res << (" " * (level*3))
2599
+ # res << "dst; })"
2600
+ # return res
2601
+ # end
1916
2602
  # Generates the C text of the equivalent HDLRuby code.
1917
2603
  # +level+ is thehierachical level of the object and
1918
2604
  # +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"
2605
+ def to_c(res,level = 0, left = false)
2606
+ # Save the value pool state.
2607
+ res << (" " * (level*3)) << "SV;\n"
1929
2608
  # Compute the reference.
1930
- res << (" " * ((level+1)*3))
1931
- res << "ref = #{self.ref.to_c(level+2)};\n"
2609
+ self.ref.to_c(res,level)
1932
2610
  # Compute the index.
1933
- res << (" " * ((level+1)*3))
1934
- res << "idx = value2integer(#{self.index.to_c(level+2)});\n"
2611
+ self.index.to_c(res,level)
2612
+ res << (" " * (level*3))
1935
2613
  # 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
2614
  res << (" " * (level*3))
1944
- res << "dst; })"
2615
+ if (left) then
2616
+ res << "swriteI("
2617
+ else
2618
+ res << "sreadI("
2619
+ end
2620
+ self.type.to_c(res,level)
2621
+ res << ");\n"
2622
+ # Restore the value pool state.
2623
+ res << (" " * (level*3)) << "RV;\n"
2624
+ return res
1945
2625
  end
1946
2626
 
2627
+ # # Generates the C text for reference as left value to a signal.
2628
+ # # +level+ is the hierarchical level of the object.
2629
+ # # def to_c_signal(level = 0)
2630
+ # def to_c_signal(res,level = 0)
2631
+ # # puts "to_c_signal for RefIndex"
2632
+ # res << "make_ref_rangeS("
2633
+ # self.ref.to_c_signal(res,level)
2634
+ # res << ","
2635
+ # self.type.to_c(res,level)
2636
+ # res << ",value2integer("
2637
+ # self.index.to_c(res,level)
2638
+ # res << "),value2integer("
2639
+ # self.index.to_c(res,level)
2640
+ # res << "))"
2641
+ # return res
2642
+ # end
1947
2643
  # Generates the C text for reference as left value to a signal.
1948
2644
  # +level+ is the hierarchical level of the object.
1949
- def to_c_signal(level = 0)
2645
+ # def to_c_signal(level = 0)
2646
+ def to_c_signal(res,level = 0)
1950
2647
  # 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)}))"
2648
+ res << "make_ref_rangeS("
2649
+ self.ref.to_c_signal(res,level)
2650
+ res << ","
2651
+ self.type.to_c(res,level)
2652
+ res << ",value2integer(({\n"
2653
+ self.index.to_c(res,level)
2654
+ res << " " * ((level+1)*3)
2655
+ res << "pop();})"
2656
+ res << "),value2integer(({\n"
2657
+ self.index.to_c(res,level)
2658
+ res << " " * ((level+1)*3)
2659
+ res << "pop();})"
2660
+ res << "))"
2661
+ return res
1954
2662
  end
1955
2663
  end
1956
2664
 
@@ -1958,51 +2666,112 @@ module HDLRuby::Low
1958
2666
  ## Extends the RefRange class with generation of C text.
1959
2667
  class RefRange
1960
2668
 
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"
2669
+ # # Generates the C text of the equivalent HDLRuby code.
2670
+ # # +level+ is the hierachical level of the object and
2671
+ # # +left+ tells if it is a left value or not.
2672
+ # # def to_c(level = 0, left = false)
2673
+ # def to_c(res,level = 0, left = false)
2674
+ # # Decide if it is a read or a write
2675
+ # command = left ? "write" : "read"
2676
+ # # res = "({\n"
2677
+ # res << "({\n"
2678
+ # # Overrides the upper ref and dst...
2679
+ # # And allocates a new value for dst.
2680
+ # res << (" " * ((level+1)*3))
2681
+ # res << "Value ref,dst = get_value();\n"
2682
+ # res << (" " * ((level+1)*3))
2683
+ # res << "unsigned long long first,last;\n"
2684
+ # # Save the state of the value pool.
2685
+ # res << (" " * ((level+1)*3))
2686
+ # res << "unsigned int pool_state = get_value_pos();\n"
2687
+ # # Compute the reference.
2688
+ # res << (" " * ((level+1)*3))
2689
+ # # res << "ref = #{self.ref.to_c(level+2)};\n"
2690
+ # res << "ref = "
2691
+ # self.ref.to_c(res,level+2)
2692
+ # res << ";\n"
2693
+ # # Compute the range.
2694
+ # res << (" " * ((level+1)*3))
2695
+ # # res << "first = value2integer(#{self.range.first.to_c(level+2)});\n"
2696
+ # res << "first = value2integer("
2697
+ # self.range.first.to_c(res,level+2)
2698
+ # res << ");\n"
2699
+ # res << (" " * ((level+1)*3))
2700
+ # # res << "last = value2integer(#{self.range.last.to_c(level+2)});\n"
2701
+ # res << "last = value2integer("
2702
+ # self.range.last.to_c(res,level+2)
2703
+ # res << ");\n"
2704
+ # # Make the access.
2705
+ # res << (" " * ((level+1)*3))
2706
+ # # puts "#{command}_range with first=#{self.range.first} and last=#{self.range.last}"
2707
+ # # res << "dst = #{command}_range(ref,first,last,#{self.type.base.to_c(level)},dst);\n"
2708
+ # res << "dst = #{command}_range(ref,first,last,"
2709
+ # self.type.base.to_c(res,level)
2710
+ # res << ",dst);\n"
2711
+ # # Restore the state of the value pool.
2712
+ # res << (" " * ((level+1)*3))
2713
+ # res << "set_value_pos(pool_state);\n"
2714
+ # # Close the computation.
2715
+ # res << (" " * (level*3))
2716
+ # res << "dst; })"
2717
+ # return res
2718
+ # end
2719
+ def to_c(res,level = 0, left = false)
2720
+ # Save the value pool state.
2721
+ res << (" " * (level*3)) << "SV;\n"
1977
2722
  # Compute the reference.
1978
- res << (" " * ((level+1)*3))
1979
- res << "ref = #{self.ref.to_c(level+2)};\n"
2723
+ self.ref.to_c(res,level)
2724
+ # res << (" " * (level*3))
1980
2725
  # 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"
2726
+ self.range.first.to_c(res,level)
2727
+ self.range.last.to_c(res,level)
1987
2728
  # 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
2729
  res << (" " * (level*3))
1997
- res << "dst; })"
2730
+ if left then
2731
+ res << "swriteR("
2732
+ else
2733
+ res << "sreadR("
2734
+ end
2735
+ self.type.base.to_c(res,level)
2736
+ res << ");\n"
2737
+ # Restore the value pool state.
2738
+ res << (" " * (level*3)) << "RV;\n"
2739
+ return res
1998
2740
  end
1999
2741
 
2742
+ # # Generates the C text for reference as left value to a signal.
2743
+ # # +level+ is the hierarchical level of the object.
2744
+ # # def to_c_signal(level = 0)
2745
+ # def to_c_signal(res,level = 0)
2746
+ # # return "make_ref_rangeS(#{self.ref.to_c_signal(level)}," +
2747
+ # # "value2integer(#{self.range.first.to_c(level)}),value2integer(#{self.range.last.to_c(level)}))"
2748
+ # res << "make_ref_rangeS("
2749
+ # self.ref.to_c_signal(res,level)
2750
+ # res << ",value2integer("
2751
+ # self.range.first.to_c(res,level)
2752
+ # res << "),value2integer("
2753
+ # self.range.last.to_c(res,level)
2754
+ # res << "))"
2755
+ # return res
2756
+ # end
2000
2757
  # Generates the C text for reference as left value to a signal.
2001
2758
  # +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)}))"
2759
+ # def to_c_signal(level = 0)
2760
+ def to_c_signal(res,level = 0)
2761
+ res << "make_ref_rangeS("
2762
+ self.ref.to_c_signal(res,level)
2763
+ res << ","
2764
+ self.type.base.to_c(res,level)
2765
+ res << ",value2integer(({\n"
2766
+ self.range.first.to_c(res,level)
2767
+ res << " " * ((level+1)*3)
2768
+ res << "pop();})"
2769
+ res << "),value2integer(({\n"
2770
+ self.range.last.to_c(res,level)
2771
+ res << " " * ((level+1)*3)
2772
+ res << "pop();})"
2773
+ res << "))"
2774
+ return res
2006
2775
  end
2007
2776
  end
2008
2777
 
@@ -2013,17 +2782,31 @@ module HDLRuby::Low
2013
2782
  # Generates the C text of the equivalent HDLRuby code.
2014
2783
  # +level+ is the hierachical level of the object and
2015
2784
  # +left+ tells if it is a left value or not.
2016
- def to_c(level = 0, left = false)
2785
+ # def to_c(level = 0, left = false)
2786
+ def to_c(res,level = 0, left = false)
2787
+ # # puts "RefName to_c for #{self.name}"
2788
+ # self.resolve.to_c_signal(res,level+1)
2789
+ # res << "->" << (left ? "f_value" : "c_value")
2790
+ # return res
2017
2791
  # puts "RefName to_c for #{self.name}"
2018
- return "#{self.resolve.to_c_signal(level+1)}->" +
2019
- (left ? "f_value" : "c_value")
2792
+ res << (" " * (level*3))
2793
+ # res << "d="
2794
+ res << "push("
2795
+ self.resolve.to_c_signal(res,level+1)
2796
+ res << "->" << (left ? "f_value" : "c_value")
2797
+ # res << ";\n"
2798
+ res << ");\n"
2799
+ return res
2020
2800
  end
2021
2801
 
2022
2802
  # Generates the C text for reference as left value to a signal.
2023
2803
  # +level+ is the hierarchical level of the object.
2024
- def to_c_signal(level = 0)
2804
+ # def to_c_signal(level = 0)
2805
+ def to_c_signal(res,level = 0)
2025
2806
  # puts "to_c_signal with self=#{self.name}, resolve=#{self.resolve}"
2026
- return "#{self.resolve.to_c_signal(level+1)}"
2807
+ # return "#{self.resolve.to_c_signal(level+1)}"
2808
+ self.resolve.to_c_signal(res,level+1)
2809
+ return res
2027
2810
  end
2028
2811
  end
2029
2812
 
@@ -2033,14 +2816,20 @@ module HDLRuby::Low
2033
2816
  # Generates the C text of the equivalent HDLRuby code.
2034
2817
  # +level+ is the hierachical level of the object and
2035
2818
  # +left+ tells if it is a left value or not.
2036
- def to_c(level = 0, left = false)
2037
- return "this()"
2819
+ # def to_c(level = 0, left = false)
2820
+ def to_c(res,level = 0, left = false)
2821
+ # return "this()"
2822
+ res << "this()"
2823
+ return res
2038
2824
  end
2039
2825
 
2040
2826
  # Generates the C text for reference as left value to a signal.
2041
2827
  # +level+ is the hierarchical level of the object.
2042
- def to_c_signal(level = 0)
2043
- return "this()"
2828
+ # def to_c_signal(level = 0)
2829
+ def to_c_signal(res,level = 0)
2830
+ # return "this()"
2831
+ res << "this()"
2832
+ return res
2044
2833
  end
2045
2834
  end
2046
2835