HDLRuby 2.10.5 → 2.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/HDLRuby.gemspec +1 -0
  3. data/README.md +8 -4
  4. data/Rakefile +8 -0
  5. data/{lib/HDLRuby/sim/Makefile → ext/hruby_sim/Makefile_csim} +0 -0
  6. data/ext/hruby_sim/extconf.rb +13 -0
  7. data/ext/hruby_sim/hruby_rcsim_build.c +1188 -0
  8. data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim.h +255 -16
  9. data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_calc.c +310 -181
  10. data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_core.c +34 -17
  11. data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_list.c +0 -0
  12. data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_stack_calc.c +4 -1
  13. data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_stack_calc.c.sav +0 -0
  14. data/ext/hruby_sim/hruby_sim_tree_calc.c +375 -0
  15. data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_vcd.c +5 -5
  16. data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_sim_vizualize.c +2 -2
  17. data/{lib/HDLRuby/sim → ext/hruby_sim}/hruby_value_pool.c +4 -1
  18. data/lib/HDLRuby/hdr_samples/bstr_bench.rb +2 -0
  19. data/lib/HDLRuby/hdr_samples/case_bench.rb +2 -2
  20. data/lib/HDLRuby/hdr_samples/counter_bench.rb +0 -1
  21. data/lib/HDLRuby/hdr_samples/counter_dff_bench.rb +46 -0
  22. data/lib/HDLRuby/hdr_samples/dff_bench.rb +1 -1
  23. data/lib/HDLRuby/hdr_samples/print_bench.rb +62 -0
  24. data/lib/HDLRuby/hdr_samples/rom.rb +5 -3
  25. data/lib/HDLRuby/hdr_samples/simple_counter_bench.rb +43 -0
  26. data/lib/HDLRuby/hdrcc.rb +54 -8
  27. data/lib/HDLRuby/hruby_bstr.rb +1175 -917
  28. data/lib/HDLRuby/hruby_high.rb +200 -90
  29. data/lib/HDLRuby/hruby_high_fullname.rb +82 -0
  30. data/lib/HDLRuby/hruby_low.rb +41 -23
  31. data/lib/HDLRuby/hruby_low2c.rb +7 -0
  32. data/lib/HDLRuby/hruby_rcsim.rb +978 -0
  33. data/lib/HDLRuby/hruby_rsim.rb +1134 -0
  34. data/lib/HDLRuby/hruby_rsim_vcd.rb +322 -0
  35. data/lib/HDLRuby/hruby_values.rb +362 -18
  36. data/lib/HDLRuby/hruby_verilog.rb +21 -3
  37. data/lib/HDLRuby/version.rb +1 -1
  38. metadata +24 -13
@@ -67,6 +67,7 @@ static int sim_end_flag = 0;
67
67
  /** Adds a timed behavior for processing.
68
68
  * @param behavior the timed behavior to register */
69
69
  void register_timed_behavior(Behavior behavior) {
70
+ // printf("Registering timed behavior=%p\n",behavior);fflush(stdout);
70
71
  if (num_timed_behaviors == cap_timed_behaviors) {
71
72
  if (cap_timed_behaviors == 0) {
72
73
  /* Need to create the array containing the timed behaviors. */
@@ -100,7 +101,7 @@ void register_signal(SignalI signal) {
100
101
  all_signals=new_signals;
101
102
  }
102
103
  }
103
- /* Add the behavior. */
104
+ /* Add the signal. */
104
105
  all_signals[num_all_signals++] = signal;
105
106
  }
106
107
 
@@ -108,15 +109,16 @@ void register_signal(SignalI signal) {
108
109
  /** Recursively update the signals until no (untimed) behavior are
109
110
  * activated. */
110
111
  void hruby_sim_update_signals() {
111
- // printf("hruby_sim_update_signals...\n");
112
+ // printf("hruby_sim_update_signals...\n");fflush(stdout);
112
113
  /* As long as the list of touched signals is not empty go on computing. */
113
114
  while(!empty_list(touched_signals) || !empty_list(touched_signals_seq)) {
114
- // printf("## Checking touched signals.\n");
115
+ // printf("## Checking touched signals.\n");fflush(stdout);
115
116
  /* Sets the new signals values and mark the signals as activating. */
116
117
  /* For the case of the parallel execution model. */
117
118
  while(!empty_list(touched_signals)) {
118
119
  Elem e = remove_list(touched_signals);
119
120
  SignalI sig = e->data;
121
+ // printf("sig=%p kind=%d\n",sig,sig->kind);fflush(stdout);
120
122
  delete_element(e);
121
123
  /* Is there a change? */
122
124
  if (same_content_value(sig->c_value,sig->f_value)) continue;
@@ -124,7 +126,7 @@ void hruby_sim_update_signals() {
124
126
  printer.print_signal(sig);
125
127
  // printf("c_value="); printer.print_value(sig->c_value);
126
128
  // printf("\nf_value="); printer.print_value(sig->f_value); printf("\n");
127
- // printf("Touched signal: %p (%s)\n",sig,sig->name);
129
+ // printf("Touched signal: %p (%s)\n",sig,sig->name);fflush(stdout);
128
130
  /* Update the current value of the signal. */
129
131
  copy_value(sig->f_value,sig->c_value);
130
132
  // /* Mark the signal as activated. */
@@ -148,11 +150,13 @@ void hruby_sim_update_signals() {
148
150
  }
149
151
  /* Positive edge activation. */
150
152
  if (!zero_value(sig->c_value)) {
153
+ // printf("PAR: posedge for sig=%s with num_pos=%i\n",sig->name,sig->num_pos);
151
154
  for(i=0; i<sig->num_pos; ++i) {
152
155
  Object obj = sig->pos[i];
153
156
  if (obj->kind == BEHAVIOR) {
154
157
  /* Behavior case. */
155
158
  Behavior beh = (Behavior)obj;
159
+ // printf("Activating beh=%p.\n",beh);
156
160
  beh->activated = 1;
157
161
  add_list(activate_codes,get_element(beh));
158
162
  } else {
@@ -210,6 +214,7 @@ void hruby_sim_update_signals() {
210
214
  }
211
215
  /* Positive edge activation. */
212
216
  if (!zero_value(sig->c_value)) {
217
+ // printf("SEQ: posedge for sig=%s with num_pos=%i\n",sig->name,sig->num_pos);
213
218
  for(i=0; i<sig->num_pos; ++i) {
214
219
  Object obj = sig->pos[i];
215
220
  if (obj->kind == BEHAVIOR) {
@@ -253,10 +258,17 @@ void hruby_sim_update_signals() {
253
258
  if (obj->kind == BEHAVIOR) {
254
259
  /* Behavior case. */
255
260
  Behavior beh = (Behavior)obj;
261
+ // printf("beh=%p\n",beh);
256
262
  /* Is the code really enabled and activated? */
257
263
  if (beh->enabled && beh->activated) {
258
264
  /* Yes, execute it. */
265
+ #ifdef RCSIM
266
+ // printf("going to execute with beh=%p\n",beh);
267
+ // printf("going to execute: %p with kind=%d\n",beh->block,beh->block->kind);
268
+ execute_statement((Statement)(beh->block),0,beh);
269
+ #else
259
270
  beh->block->function();
271
+ #endif
260
272
  /* And deactivate it. */
261
273
  beh->activated = 0;
262
274
  }
@@ -284,9 +296,11 @@ void hruby_sim_advance_time() {
284
296
  int i;
285
297
  for(i=0; i<num_timed_behaviors; ++i) {
286
298
  unsigned long long beh_time = timed_behaviors[i]->active_time;
299
+ // printf("beh_time=%llu\n",beh_time);
287
300
  if (timed_behaviors[i]->timed == 1)
288
301
  if (beh_time < next_time) next_time = beh_time;
289
302
  }
303
+ // printf("hruby_sim_time=%llu next_time=%llu\n",hruby_sim_time,next_time);
290
304
  /* Sets the new activation time. */
291
305
  hruby_sim_time = next_time;
292
306
  // println_time(hruby_sim_time);
@@ -294,7 +308,7 @@ void hruby_sim_advance_time() {
294
308
  }
295
309
 
296
310
 
297
- /** Sets the enamble status of the behaviors of a scope.
311
+ /** Sets the enable status of the behaviors of a scope.
298
312
  * @param scope the scope to process.
299
313
  * @param status the enable status. */
300
314
  static void set_enable_scope(Scope scope, int status) {
@@ -334,7 +348,6 @@ void activate_behavior(Behavior behavior) {
334
348
  * time. */
335
349
  void hruby_sim_activate_behaviors_on_time() {
336
350
  int i;
337
- // printf("$1\n");
338
351
  pthread_mutex_lock(&hruby_sim_mutex);
339
352
  /* Count the number of behaviors that will be activated. */
340
353
  for(i=0; i<num_timed_behaviors; ++i) {
@@ -349,7 +362,6 @@ void hruby_sim_activate_behaviors_on_time() {
349
362
  }
350
363
  /* Activate the behaviors .*/
351
364
  behaviors_can_run = 1;
352
- // printf("$2\n");
353
365
  // pthread_cond_signal(&compute_cond); /* No behaviors. */
354
366
  // pthread_cond_signal(&hruby_beh_cond);
355
367
  pthread_mutex_unlock(&hruby_sim_mutex);
@@ -361,14 +373,12 @@ void hruby_sim_activate_behaviors_on_time() {
361
373
  void hruby_sim_wait_behaviors() {
362
374
  pthread_mutex_lock(&hruby_sim_mutex);
363
375
  while(num_active_behaviors > 0) {
364
- // printf("$3\n");
365
376
  // printf("num_active_behaviors = %d\n",num_active_behaviors);
366
377
  // pthread_cond_wait(&active_behaviors_cond, &hruby_sim_mutex);
367
378
  pthread_cond_wait(&hruby_sim_cond, &hruby_sim_mutex);
368
379
  }
369
380
  behaviors_can_run = 0;
370
381
  pthread_mutex_unlock(&hruby_sim_mutex);
371
- // printf("$4\n");
372
382
  }
373
383
 
374
384
 
@@ -377,7 +387,6 @@ void hruby_sim_wait_behaviors() {
377
387
  void* behavior_run(void* arg) {
378
388
  Behavior behavior = (Behavior)arg;
379
389
  /* First lock the behavior until the simulation engine starts. */
380
- // printf("#1\n");
381
390
  pthread_mutex_lock(&hruby_sim_mutex);
382
391
  num_active_behaviors -= 1;
383
392
  while(!behaviors_can_run) {
@@ -386,11 +395,16 @@ void* behavior_run(void* arg) {
386
395
  pthread_cond_wait(&hruby_beh_cond, &hruby_sim_mutex);
387
396
  }
388
397
  pthread_mutex_unlock(&hruby_sim_mutex);
389
- // printf("#2\n");
390
398
  /* Now can start the execution of the behavior. */
391
- if (behavior->enabled)
399
+ if (behavior->enabled) {
400
+ #ifdef RCSIM
401
+ // printf("going to execute with behavior=%p\n",behavior);
402
+ // printf("going to execute: %p with kind=%d\n",behavior->block,behavior->block->kind);
403
+ execute_statement((Statement)(behavior->block),0,behavior);
404
+ #else
392
405
  behavior->block->function();
393
- // printf("#3\n");
406
+ #endif
407
+ }
394
408
  /* Now can start the execution of the behavior. */
395
409
  /* Stops the behavior. */
396
410
  pthread_mutex_lock(&hruby_sim_mutex);
@@ -410,6 +424,8 @@ void* behavior_run(void* arg) {
410
424
  * @note create a thread per timed behavior. */
411
425
  void hruby_sim_start_timed_behaviors() {
412
426
  int i;
427
+ // printf("hruby_sim_start_timed_behaviors\n");fflush(stdout);
428
+ // printf("timed_behaviors=%p\n",timed_behaviors);fflush(stdout);
413
429
  pthread_mutex_lock(&hruby_sim_mutex);
414
430
  /* Sets the end flags to 0. */
415
431
  sim_end_flag = 0;
@@ -418,12 +434,11 @@ void hruby_sim_start_timed_behaviors() {
418
434
  /* Create and start the threads. */
419
435
  for(i=0; i<num_timed_behaviors; ++i) {
420
436
  num_run_behaviors += 1;
421
- // ++num_active_behaviors;
422
- // printf("0 num_run_behaviors = %d\n",num_run_behaviors);
423
437
  pthread_create(&timed_behaviors[i]->thread,NULL,
424
438
  &behavior_run,timed_behaviors[i]);
425
439
  }
426
440
  pthread_mutex_unlock(&hruby_sim_mutex);
441
+ // exit(0);
427
442
  }
428
443
 
429
444
  /** Ends waiting all the threads properly terminates. */
@@ -474,6 +489,7 @@ void hruby_sim_core(char* name, void (*init_vizualizer)(char*),
474
489
  /* Initially touch all the signals. */
475
490
  each_all_signal(&touch_signal);
476
491
  }
492
+ // printf("num_run_behavior=%d\n",num_run_behaviors);
477
493
  if (num_run_behaviors <= 0) break;
478
494
  /* Advance time to next timestep. */
479
495
  hruby_sim_advance_time();
@@ -499,7 +515,7 @@ void hruby_sim_core(char* name, void (*init_vizualizer)(char*),
499
515
 
500
516
 
501
517
  /** Makes the behavior wait for a given time.
502
- * @param delay the delay to wait in fs.
518
+ * @param delay the delay to wait in ps.
503
519
  * @param behavior the current behavior. */
504
520
  void hw_wait(unsigned long long delay, Behavior behavior) {
505
521
  /* Maybe the thread is to end immediatly. */
@@ -544,7 +560,6 @@ void touch_signal(SignalI signal) {
544
560
  * @param value the value to transmit
545
561
  * @param signal the signal to transmit the value to. */
546
562
  void transmit_to_signal(Value value, SignalI signal) {
547
- // printf("Tansmit to signal: %s(%p) with fading=%d\n",signal->name,signal,signal->fading);
548
563
  /* Copy the content. */
549
564
  if (signal->fading)
550
565
  signal->f_value = copy_value(value,signal->f_value);
@@ -584,6 +599,7 @@ void transmit_to_signal_range(Value value, RefRangeS ref) {
584
599
  * @param signal the signal to touch */
585
600
  void touch_signal_seq(SignalI signal) {
586
601
  // printf("touching signal seq: %p\n",signal);
602
+ // printf("signal->c_value=%p\n",signal->c_value);
587
603
  /* Is there a difference between the present and future value? */
588
604
  if (same_content_value(signal->c_value,signal->f_value)) return;
589
605
  /* Yes, add the signal to the list of touched sequential ones and update
@@ -601,6 +617,7 @@ void touch_signal_seq(SignalI signal) {
601
617
  * @param signal the signal to transmit the value to. */
602
618
  void transmit_to_signal_seq(Value value, SignalI signal) {
603
619
  // printf("Tansmit to signal seq: %s(%p)\n",signal->name,signal);
620
+ // printf("signal->f_value=%p\n",signal->f_value);
604
621
  /* Copy the content. */
605
622
  if (signal->fading)
606
623
  copy_value(value,signal->f_value);
File without changes
@@ -1,3 +1,6 @@
1
+ /* Not used for the C-Ruby hybrid simulator. */
2
+ #ifndef RCSIM
3
+
1
4
  #include <stdio.h>
2
5
  #include <stdarg.h>
3
6
  #include <stdlib.h>
@@ -5,7 +8,6 @@
5
8
  #include <limits.h>
6
9
  #include "hruby_sim.h"
7
10
 
8
-
9
11
  /**
10
12
  * The HDLRuby simulation stack calculation engine, to be used with C code
11
13
  * generated by hruby_low2c.
@@ -248,3 +250,4 @@ void transmitR_seq(RefRangeS ref) {
248
250
  transmit_to_signal_range_seq(pop(),ref);
249
251
  }
250
252
 
253
+ #endif
@@ -0,0 +1,375 @@
1
+ /* Used by the C-Ruby hybrid simulator only. */
2
+ #ifdef RCSIM
3
+
4
+ #include "extconf.h"
5
+
6
+ #include <stdio.h>
7
+ #include <stdarg.h>
8
+ #include <stdlib.h>
9
+ #include <string.h>
10
+ #include <limits.h>
11
+ #include "hruby_sim.h"
12
+
13
+
14
+ /**
15
+ * The HDLRuby simulation tree-based calculation engine.
16
+ **/
17
+
18
+
19
+
20
+ /** Calculates a tree expression.
21
+ * @param expr the expression to execute.
22
+ * @param res the expression where to write the result. */
23
+ Value calc_expression(Expression expr, Value res) {
24
+ // printf("calc_expression with kind=%d\n",expr->kind);
25
+ /* Depending on the kind of expression. */
26
+ switch(expr->kind) {
27
+ case VALUEE:
28
+ /* Assume it is a Value. */
29
+ // printf("value=%p type=%p\n",expr,((Value)expr)->type);
30
+ res = (Value)expr;
31
+ // res = copy_value((Value)expr,res);
32
+ break;
33
+ case UNARY:
34
+ {
35
+ Unary uexpr = (Unary)expr;
36
+ Value child = get_value();
37
+ child = calc_expression(uexpr->child,child);
38
+ res = uexpr->oper(child,res);
39
+ free_value();
40
+ break;
41
+ }
42
+ case BINARY:
43
+ {
44
+ Binary bexpr = (Binary)expr;
45
+ Value left = get_value();
46
+ Value right = get_value();
47
+ left = calc_expression(bexpr->left,left);
48
+ right = calc_expression(bexpr->right,right);
49
+ res = bexpr->oper(left,right,res);
50
+ free_value();
51
+ free_value();
52
+ break;
53
+ }
54
+ case CONCAT:
55
+ {
56
+ Concat cexpr = (Concat)expr;
57
+ /* Calculate the sub expressions. */
58
+ Value values[cexpr->num_exprs];
59
+ for(int i=0; i<cexpr->num_exprs; ++i) {
60
+ values[i] = get_value();
61
+ values[i] = calc_expression(cexpr->exprs[i],values[i]);
62
+ }
63
+ /* Use them for calculating the concat. */
64
+ res = concat_valueP(cexpr->num_exprs,cexpr->dir,res,values);
65
+ for(int i=0; i<cexpr->num_exprs; ++i) free_value();
66
+ break;
67
+ }
68
+ case CAST:
69
+ {
70
+ Cast cexpr = (Cast)expr;
71
+ Value child = get_value();
72
+ child = calc_expression(cexpr->child,child);
73
+ res = cast_value(child,cexpr->type,res);
74
+ free_value();
75
+ break;
76
+ }
77
+ case REF_OBJECT:
78
+ res = calc_expression((Expression)(((RefObject)expr)->object),res);
79
+ break;
80
+ case REF_INDEX:
81
+ {
82
+ RefIndex rexpr = (RefIndex)expr;
83
+ /* Compute the accessed value. */
84
+ Value value = get_value();
85
+ value = calc_expression((Expression)(rexpr->ref),value);
86
+ /* Compute the index. */
87
+ Value indexV = get_value();
88
+ indexV = calc_expression(rexpr->index,indexV);
89
+ /* Get its integer index. */
90
+ long long index = value2integer(indexV);
91
+ // printf("index=%llu\n",index);
92
+ free_value();
93
+ /* Performs the access. */
94
+ res = read_range(value,index,index,rexpr->type,res);
95
+ free_value();
96
+ break;
97
+ }
98
+ case REF_RANGE:
99
+ {
100
+ RefRangeE rexpr = (RefRangeE)expr;
101
+ /* Compute the accessed value. */
102
+ Value value = get_value();
103
+ value = calc_expression((Expression)(rexpr->ref),value);
104
+ /* Compute the range. */
105
+ Value firstV = get_value();
106
+ firstV = calc_expression(rexpr->first,firstV);
107
+ Value lastV = get_value();
108
+ lastV = calc_expression(rexpr->last,lastV);
109
+ /* Get its integer range. */
110
+ long long first = value2integer(firstV);
111
+ long long last = value2integer(lastV);
112
+ free_value();
113
+ free_value();
114
+ // printf("first=%lli last=%lli\n",first,last);
115
+ /* Performs the access. */
116
+ TypeS base_type = { rexpr->type->base, 1, rexpr->type->flags };
117
+ res = read_range(value,first,last,&base_type,res);
118
+ free_value();
119
+ break;
120
+ }
121
+ case REF_CONCAT:
122
+ {
123
+ RefConcat rexpr = (RefConcat)expr;
124
+ /* Process like a simple concat. */
125
+ /* Calculate the sub expressions. */
126
+ Value values[rexpr->num_refs];
127
+ for(int i=0; i<rexpr->num_refs; ++i) {
128
+ values[i] = get_value();
129
+ values[i] = calc_expression((Expression)(rexpr->refs[i]),values[i]);
130
+ }
131
+ /* Use them for calculating the concat. */
132
+ res = concat_valueP(rexpr->num_refs,rexpr->dir,res,values);
133
+ for(int i=0; i<rexpr->num_refs; ++i) free_value();
134
+ break;
135
+ }
136
+ case SIGNALI:
137
+ res = calc_expression((Expression)(((SignalI)expr)->c_value),res);
138
+ break;
139
+ default:
140
+ perror("Invalid expression kind.");
141
+ exit(1);
142
+ break;
143
+ }
144
+ return res;
145
+ }
146
+
147
+
148
+
149
+ /** Executes a statement.
150
+ * @param stmnt the statement to execute.
151
+ * @param mode blocking mode: 0: par, 1:seq
152
+ * @param behavior the behavior in execution. */
153
+ void execute_statement(Statement stmnt, int mode, Behavior behavior) {
154
+ /* Depending on the kind of statement. */
155
+ // printf("Executing statement=%p with kind=%d\n",stmnt,stmnt->kind);fflush(stdout);
156
+ switch(stmnt->kind) {
157
+ case TRANSMIT:
158
+ {
159
+ Transmit trans = (Transmit)stmnt;
160
+ // printf("trans=%p trans->left=%p trans->left->kind=%d\n",trans,trans->left,trans->left->kind);
161
+ /* Compute the right value. */
162
+ // Value right = calc_expression(trans->right);
163
+ Value right = get_value();
164
+ right = calc_expression(trans->right,right);
165
+ /* Depending on the left value. */
166
+ switch (trans->left->kind) {
167
+ case SIGNALI:
168
+ // printf("left->name=%s\n",((SignalI)(trans->left))->name);
169
+ fflush(stdout);
170
+ /* Simple transmission. */
171
+ if (mode)
172
+ transmit_to_signal_seq(right,(SignalI)(trans->left));
173
+ else
174
+ transmit_to_signal(right,(SignalI)(trans->left));
175
+ break;
176
+ case REF_INDEX:
177
+ {
178
+ /* Transmission to sub element. */
179
+ RefIndex refi = (RefIndex)(trans->left);
180
+ /* Compute the index. */
181
+ // Value indexV = calc_expression(refi->index);
182
+ Value indexV = get_value();
183
+ indexV = calc_expression(refi->index,indexV);
184
+ long long index = value2integer(indexV);
185
+ free_value();
186
+ /* Generate the reference inside the left value. */
187
+ RefRangeS ref =
188
+ make_ref_rangeS((SignalI)(refi->ref),refi->type,
189
+ index,index);
190
+ /* Perform the transmit. */
191
+ if(mode)
192
+ transmit_to_signal_range_seq(right,ref);
193
+ else
194
+ transmit_to_signal_range(right,ref);
195
+ break;
196
+ }
197
+ case REF_RANGE:
198
+ {
199
+ /* Transmission to range of sub elements. */
200
+ RefRangeE refr = (RefRangeE)(trans->left);
201
+ /* Compute the range. */
202
+ // Value firstV = calc_expression(refr->first);
203
+ Value firstV = get_value();
204
+ firstV = calc_expression(refr->first,firstV);
205
+ long long first = value2integer(firstV);
206
+ free_value();
207
+ // Value lastV = calc_expression(refr->last);
208
+ Value lastV = get_value();
209
+ lastV = calc_expression(refr->last,lastV);
210
+ long long last = value2integer(lastV);
211
+ free_value();
212
+ /* Generate the reference inside the left value. */
213
+ RefRangeS ref =
214
+ make_ref_rangeS((SignalI)(refr->ref),refr->type,
215
+ first,last);
216
+ /* Perform the transmit. */
217
+ if(mode)
218
+ transmit_to_signal_range_seq(right,ref);
219
+ else
220
+ transmit_to_signal_range(right,ref);
221
+ break;
222
+ }
223
+ case REF_CONCAT:
224
+ {
225
+ /* Transmit to each sub-reference. */
226
+ RefConcat refc = (RefConcat)(trans->left);
227
+ /* For that purpose use a temporary Transmit node. */
228
+ TransmitS subtrans = { TRANSMIT, NULL, NULL };
229
+ long long pos=0; /* The current position in the value
230
+ to assign */
231
+ /* For each sub reference. */
232
+ for(int i=0; i < refc->num_refs; ++i) {
233
+ /* Set up the transmit. */
234
+ subtrans.left = refc->refs[i];
235
+ long long size = type_width(subtrans.left->type);
236
+ subtrans.right = (Expression)get_value();
237
+ subtrans.right = (Expression)read_range(
238
+ right,pos,pos+size-1,
239
+ get_type_bit(),(Value)(subtrans.right));
240
+ /* Execute it. */
241
+ execute_statement((Statement)&subtrans,
242
+ mode,behavior);
243
+ /* Prepare the next step. */
244
+ free_value();
245
+ pos += size;
246
+ }
247
+ }
248
+ default:
249
+ perror("Invalid kind for a reference.");
250
+ }
251
+ break;
252
+ }
253
+ case PRINT:
254
+ {
255
+ Print prt = (Print)stmnt;
256
+ /* Prints each argument. */
257
+ for(int i=0; i<prt->num_args; ++i) {
258
+ Expression arg=prt->args[i];
259
+ switch(arg->kind) {
260
+ case SYSTEMT:
261
+ case SYSTEMI:
262
+ printer.print_string_name((Object)arg);
263
+ break;
264
+ case STRINGE:
265
+ printer.print_string(((StringE)arg)->str);
266
+ break;
267
+ default:
268
+ {
269
+ Value res = get_value();
270
+ res = calc_expression(arg,res);
271
+ printer.print_string_value(res);
272
+ free_value();
273
+ }
274
+ }
275
+ }
276
+ break;
277
+ }
278
+ case HIF:
279
+ {
280
+ HIf hif = (HIf)stmnt;
281
+ /* Calculation the condition. */
282
+ // Value condition = calc_expression(hif->condition);
283
+ Value condition = get_value();
284
+ condition = calc_expression(hif->condition,condition);
285
+ /* Is it true? */
286
+ if (is_defined_value(condition) && value2integer(condition)) {
287
+ /* Yes, execute the yes branch. */
288
+ execute_statement(hif->yes,mode,behavior);
289
+ } else {
290
+ /* No, maybe an alternate condition is met. */
291
+ int met = 0;/* Tell if an alternate condition has been met.*/
292
+ for(int i=0; i<hif->num_noifs; ++i) {
293
+ // Value subcond = calc_expression(hif->noconds[i]);
294
+ Value subcond = get_value();
295
+ subcond = calc_expression(hif->noconds[i],subcond);
296
+ if (is_defined_value(subcond) && value2integer(subcond)){
297
+ /* The subcondition is met, execute the corresponding
298
+ * substatement. */
299
+ execute_statement(hif->nostmnts[i],mode,behavior);
300
+ /* And remember it. */
301
+ met = 1;
302
+ free_value();
303
+ break;
304
+ }
305
+ free_value();
306
+ }
307
+ /* Where there a sub condition met? */
308
+ if (!met) {
309
+ /* No, execute the no statement. */
310
+ execute_statement(hif->no,mode,behavior);
311
+ }
312
+ }
313
+ free_value();
314
+ break;
315
+ }
316
+ case HCASE:
317
+ {
318
+ HCase hcase = (HCase)stmnt;
319
+ /* Calculation the value to check. */
320
+ // Value value = calc_expression(hcase->value);
321
+ Value value = get_value();
322
+ value = calc_expression(hcase->value,value);
323
+ /* Tell if a case if matched. */
324
+ int met = 0;
325
+ /* Check each case. */
326
+ Value cmp = get_value();
327
+ for(int i=0; i<hcase->num_whens; ++i) {
328
+ // cmp = equal_value_c(value,calc_expression(hcase->matches[i]),
329
+ // cmp);
330
+ Value match = get_value();
331
+ match = calc_expression(hcase->matches[i],match);
332
+ cmp = equal_value_c(value,match,cmp);
333
+ if (is_defined_value(cmp) && value2integer(cmp)) {
334
+ /* Found the right case, execute the corresponding
335
+ * statement. */
336
+ execute_statement(hcase->stmnts[i],mode,behavior);
337
+ /* And remeber it. */
338
+ met = 1;
339
+ free_value();
340
+ break;
341
+ }
342
+ free_value();
343
+ }
344
+ free_value();
345
+ free_value();
346
+ /* Was no case found and is there a default statement? */
347
+ if (!met && hcase->defolt) {
348
+ /* Yes, execute the default statement. */
349
+ execute_statement(hcase->defolt,mode,behavior);
350
+ }
351
+ break;
352
+ }
353
+ case TIME_WAIT:
354
+ {
355
+ /* Get the value of the delay. */
356
+ long long delay = ((TimeWait)stmnt)->delay;
357
+ /* Wait the given delay. */
358
+ hw_wait(delay,behavior);
359
+ break;
360
+ }
361
+ case BLOCK:
362
+ {
363
+ Block block = (Block)stmnt;
364
+ /* Execute each statement of the block. */
365
+ for(int i=0; i<block->num_stmnts; ++i)
366
+ execute_statement(block->stmnts[i],block->mode,behavior);
367
+ break;
368
+ }
369
+
370
+ default:
371
+ perror("Invalid kind for an expression.");
372
+ }
373
+ }
374
+
375
+ #endif
@@ -22,7 +22,7 @@ static unsigned long long vcd_timeunit = 1;
22
22
 
23
23
  /** Prints to the vcd file.
24
24
  * @param fmt the format for handling the variadic arguments. */
25
- static int vcd_print(char* fmt, ...) {
25
+ static int vcd_print(const char* fmt, ...) {
26
26
  int ret;
27
27
 
28
28
  /* Declare a va_list type variable */
@@ -94,7 +94,7 @@ static void vcd_print_name(Object object) {
94
94
  }
95
95
 
96
96
 
97
- /** Prints the name of an object incluing its heirarchy.
97
+ /** Prints the name of an object incluing its hierarchy.
98
98
  * @param object the object to print the name. */
99
99
  static void vcd_print_full_name(Object object) {
100
100
  /* Recurse on the owner if any. */
@@ -119,8 +119,8 @@ static void vcd_print_value(Value value) {
119
119
  }
120
120
  } else {
121
121
  /* Display a bitstring value. */
122
- int i;
123
- int width = type_width(value->type);
122
+ unsigned long long i;
123
+ unsigned long long width = type_width(value->type);
124
124
  char* data = value->data_str;
125
125
  if (value->capacity == 0) {
126
126
  /* The value is empty, therefore undefined. */
@@ -289,7 +289,6 @@ static void vcd_print_systemT_content(SystemT system) {
289
289
  /** Prints the hierarchy of a system type.
290
290
  * @param system the system to print. */
291
291
  static void vcd_print_systemT(SystemT system) {
292
- int i;
293
292
  /* Declares the module. */
294
293
  vcd_print("$scope module ");
295
294
  vcd_print_name((Object)system);
@@ -346,6 +345,7 @@ static void vcd_print_header() {
346
345
 
347
346
  /* The declaration of the hierarchy and the variables
348
347
  * from the top system. */
348
+ // printf("top_system=%p\n",top_system);
349
349
  vcd_print_systemT(top_system);
350
350
  /* Ends the declarations. */
351
351
  vcd_print("$enddefinitions $end\n");
@@ -89,8 +89,8 @@ void default_print_value(Value value) {
89
89
  }
90
90
  } else {
91
91
  /* Display a bitstring value. */
92
- int i;
93
- int width = type_width(value->type);
92
+ unsigned long long i;
93
+ unsigned long long width = type_width(value->type);
94
94
  char* data = value->data_str;
95
95
  if (value->capacity == 0) {
96
96
  /* The value is empty, therefore undefined. */