HDLRuby 2.3.7 → 2.4.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -145,6 +145,7 @@ module HDLRuby::Low
145
145
  # puts "Resolve with #{self} and name=#{self.name}"
146
146
  # First resolve the sub reference if possible.
147
147
  if self.ref.is_a?(RefName) then
148
+ # puts "ref name=#{self.ref.name}"
148
149
  obj = self.ref.resolve
149
150
  # Look into the object for the name.
150
151
  return obj.get_by_name(self.name)
@@ -31,6 +31,7 @@ module HDLRuby::Low
31
31
  outputs_blk = Block.new(:par)
32
32
  timed_blk = TimeBlock.new(:seq)
33
33
  scope.each_connection do |connection|
34
+ # puts "For connection: #{connection}"
34
35
  # Check the left and right of the connection
35
36
  # for input or output port.
36
37
  left = connection.left
@@ -50,8 +50,9 @@ typedef enum {
50
50
 
51
51
  /* The interface to the type engine. */
52
52
  typedef struct FlagsS_ {
53
- unsigned int all;
54
- unsigned int sign : 1; /* Tells if the type is signed or not. */
53
+ // unsigned int all;
54
+ // unsigned int sign : 1; /* Tells if the type is signed or not. */
55
+ unsigned int sign; /* Tells if the type is signed or not. */
55
56
  } FlagsS;
56
57
 
57
58
  /** The type structure. */
@@ -170,6 +171,12 @@ extern Value mod_value(Value src0, Value src1, Value dst);
170
171
  * @return dst */
171
172
  extern Value not_value(Value src, Value dst);
172
173
 
174
+ /** Compute the or of the bits a a value.
175
+ * @param src the source value
176
+ * @param dst the destination value
177
+ * @return dst */
178
+ extern Value reduce_or_value(Value src, Value dst);
179
+
173
180
  /** Computes the AND of two values.
174
181
  * @param src0 the first source value of the and
175
182
  * @param src1 the second source value of the and
@@ -185,43 +192,43 @@ extern Value and_value(Value src0, Value src1, Value dst);
185
192
  extern Value or_value(Value src0, Value src1, Value dst);
186
193
 
187
194
  /** Computes the XOR of two values.
188
- * @param src0 the first source value of the or
189
- * @param src1 the second source value of the or
195
+ * @param src0 the first source value of the xor
196
+ * @param src1 the second source value of the xor
190
197
  * @param dst the destination value
191
198
  * @return dst */
192
199
  extern Value xor_value(Value src0, Value src1, Value dst);
193
200
 
194
201
  /** Computes the left shift of two general values.
195
- * @param src0 the first source value of the addition
196
- * @param src1 the second source value of the addition
202
+ * @param src0 the first source value of the shift
203
+ * @param src1 the second source value of the shift
197
204
  * @param dst the destination
198
205
  * @return dst */
199
206
  Value shift_left_value(Value src0, Value src1, Value dst);
200
207
 
201
208
  /** Computes the right shift of two general values.
202
- * @param src0 the first source value of the addition
203
- * @param src1 the second source value of the addition
209
+ * @param src0 the first source value of the shift
210
+ * @param src1 the second source value of the shift
204
211
  * @param dst the destination
205
212
  * @return dst */
206
213
  Value shift_right_value(Value src0, Value src1, Value dst);
207
214
 
208
215
  /** Computes the equal (NXOR) of two values.
209
- * @param src0 the first source value of the addition
210
- * @param src1 the second source value of the addition
216
+ * @param src0 the first source value of the comparison
217
+ * @param src1 the second source value of the comparison
211
218
  * @param dst the destination value
212
219
  * @return dst */
213
220
  extern Value equal_value(Value src0, Value src1, Value dst);
214
221
 
215
222
  /** Computes the lesser comparision of two values.
216
- * @param src0 the first source value of the addition
217
- * @param src1 the second source value of the addition
223
+ * @param src0 the first source value of the comparison
224
+ * @param src1 the second source value of the comparison
218
225
  * @param dst the destination value
219
226
  * @return dst */
220
227
  extern Value lesser_value(Value src0, Value src1, Value dst);
221
228
 
222
229
  /** Computes the greater comparision of two values.
223
- * @param src0 the first source value of the addition
224
- * @param src1 the second source value of the addition
230
+ * @param src0 the first source value of the comparison
231
+ * @param src1 the second source value of the comparison
225
232
  * @param dst the destination value
226
233
  * @return dst */
227
234
  extern Value greater_value(Value src0, Value src1, Value dst);
@@ -468,6 +475,7 @@ typedef struct BlockS_ {
468
475
  Kind kind; /* The kind of object. */
469
476
  Object owner; /* The owner if any. */
470
477
 
478
+ char* name; /* The name of the block. */
471
479
  int num_inners; /* The number of inners. */
472
480
  SignalI* inners; /* The inners of the scope. */
473
481
  void (*function)(); /* The function to execute for the block. */
@@ -490,6 +498,9 @@ typedef struct EventS_ {
490
498
  /* The time units. */
491
499
  typedef enum { S, MS, US, NS, PS, FS } Unit;
492
500
 
501
+ /** The top system. */
502
+ extern SystemT top_system;
503
+
493
504
  /** Adds a timed behavior for processing.
494
505
  * @param behavior the timed behavior to register */
495
506
  extern void register_timed_behavior(Behavior behavior);
@@ -555,39 +566,71 @@ extern unsigned long long make_delay(int value, Unit unit);
555
566
 
556
567
 
557
568
 
569
+ /* Iterate over all the signals.
570
+ * @param func function to applie on each signal. */
571
+ extern void each_all_signal(void (*func)(SignalI));
558
572
 
559
573
  /* Interface to the visualization engine. */
560
574
 
561
- /** Prints the time.
562
- * @param time the time to show. */
563
- extern void print_time(unsigned long long time);
564
-
565
- /** Prints the time and goes to the next line.
566
- * @param time the time to show. */
567
- extern void println_time(unsigned long long time);
568
-
569
- /** Prints the name of an object.
570
- * @param object the object to print the name. */
571
- extern void print_name(Object object);
572
-
573
- /** Prints a value.
574
- * @param value the value to print */
575
- extern void print_value(Value value);
576
-
577
- /** Prints a signal.
578
- * @param signal the signal to show */
579
- extern void print_signal(SignalI signal);
580
-
581
- /** Prints a signal and goes to the next line.
582
- * @param signal the signal to show */
583
- extern void println_signal(SignalI signal);
584
-
575
+ typedef struct {
576
+ void (*print_time)(unsigned long long);
577
+ void (*print_name)(Object);
578
+ void (*print_value)(Value);
579
+ void (*print_signal)(SignalI);
580
+ } PrinterS;
581
+
582
+ extern PrinterS printer;
583
+
584
+ /** Initializes the visualization printer engine.
585
+ * @param print_time the time printer
586
+ * @param print_name the name printer
587
+ * @param print_value the value printer
588
+ * @param print_signal the signal state printer. */
589
+ extern void init_visualizer(void (*print_time)(unsigned long long),
590
+ void (*print_name)(Object),
591
+ void (*print_value)(Value),
592
+ void (*print_signal)(SignalI));
593
+
594
+ // /** Prints the time.
595
+ // * @param time the time to show. */
596
+ // extern void print_time(unsigned long long time);
597
+ //
598
+ // // /** Prints the time and goes to the next line.
599
+ // // * @param time the time to show. */
600
+ // // extern void println_time(unsigned long long time);
601
+ //
602
+ // /** Prints the name of an object.
603
+ // * @param object the object to print the name. */
604
+ // extern void print_name(Object object);
605
+ //
606
+ // /** Prints a value.
607
+ // * @param value the value to print */
608
+ // extern void print_value(Value value);
609
+ //
610
+ // /** Prints a signal.
611
+ // * @param signal the signal to show */
612
+ // extern void print_signal(SignalI signal);
613
+ //
614
+ // // /** Prints a signal and goes to the next line.
615
+ // // * @param signal the signal to show */
616
+ // // extern void println_signal(SignalI signal);
617
+
618
+ /** Sets up the default vizualization engine.
619
+ * @param name the name of the vizualization. */
620
+ extern void init_default_visualizer(char* name);
621
+
622
+ /** Sets up the vcd vizualization engine.
623
+ * @param name the name of the vizualization. */
624
+ extern void init_vcd_visualizer(char* name);
585
625
 
586
626
  /* The interface to the simulator core. */
587
627
 
588
628
  /** The simulation core function.
629
+ * @param name the name of the simulation.
630
+ * @param init_vizualizer the vizualizer engine initializer.
589
631
  * @param limit the time limit in fs. */
590
- extern void hruby_sim_core(unsigned long long limit);
632
+ extern void hruby_sim_core(char* name, void (*init_vizualizer)(char*),
633
+ unsigned long long limit);
591
634
 
592
635
 
593
636
 
@@ -70,7 +70,8 @@ static List hash_type[HASH_TYPE_SIZE] = {};
70
70
  * @return the resulting type. */
71
71
  static int hash_value(unsigned long long base, unsigned long long number,
72
72
  FlagsS flags) {
73
- return ((base+flags.all)^(number)) & 1023;
73
+ // return ((base+flags.all)^(number)) & 1023;
74
+ return ((base+flags.sign)^(number)) & 1023;
74
75
  }
75
76
 
76
77
  /** Adds a type to the hash of types.
@@ -109,7 +110,8 @@ static Type get_hash_type(Type base, unsigned long long number) {
109
110
  while(elem) {
110
111
  Type type = elem->data;
111
112
  if ((type->base == bw) && (type->number == number) &&
112
- (type->flags.all == flags.all)) {
113
+ // (type->flags.all == flags.all)) {
114
+ (type->flags.sign == flags.sign)) {
113
115
  /* The type is found. */
114
116
  return type;
115
117
  }
@@ -243,8 +245,10 @@ void resize_value(Value value, int size) {
243
245
  void set_value(Value value, int numeric, void* data) {
244
246
  value->numeric = numeric;
245
247
  if (numeric) {
248
+ // printf("set_value with data=%llx\n",*(unsigned long long*)data);
246
249
  value->data_int = *((unsigned long long*)data);
247
250
  } else {
251
+ // printf("data=%s\n",(char*)data);
248
252
  memcpy(value->data_str,data,type_width(value->type)*sizeof(char));
249
253
  }
250
254
  }
@@ -254,6 +258,7 @@ void set_value(Value value, int numeric, void* data) {
254
258
  * @param numeric tell if the value is in numeric form or in bitstring form
255
259
  * @param data the source data */
256
260
  Value make_set_value(Type type, int numeric, void* data) {
261
+ // printf("make_set_value with type->flags.sign=%x\n",type->flags.sign);
257
262
  Value value = make_value(type,numeric);
258
263
  set_value(value,numeric,data);
259
264
  return value;
@@ -307,6 +312,7 @@ Value copy_value(Value src, Value dst) {
307
312
  /* Numeric copy. */
308
313
  dst->data_int = fix_numeric_type(dst->type,src->data_int);
309
314
  } else {
315
+ // printf("copy_value with bit string: %s\n",src->data_str);
310
316
  /* Resize the destination if required. */
311
317
  resize_value(dst,type_width(dst->type));
312
318
  /* Bitstring copy up to the end of dst or src. */
@@ -603,12 +609,14 @@ static Value sub_value_bitstring(Value src0, Value src1, Value dst) {
603
609
  * @param dst the destination value
604
610
  * @return dst */
605
611
  static Value mul_value_defined_bitstring(Value src0, Value src1, Value dst) {
612
+ // printf("mul_value_defined_bitstring with src0=%llx src1=%llx\n",value2integer(src0),value2integer(src1));
606
613
  /* Sets state of the destination using the first source. */
607
614
  dst->type = src0->type;
608
615
  dst->numeric = 1;
609
616
 
610
617
  /* Perform the multiplication. */
611
618
  dst->data_int = value2integer(src0) * value2integer(src1);
619
+ // printf("dst->data_int=%llx\n",dst->data_int);
612
620
  return dst;
613
621
  }
614
622
 
@@ -714,6 +722,45 @@ static Value not_value_bitstring(Value src, Value dst) {
714
722
  return dst;
715
723
  }
716
724
 
725
+ /** Compute the or of the bits a bitstring value.
726
+ * @param src the source value
727
+ * @param dst the destination value
728
+ * @return dst */
729
+ Value reduce_or_value_bitstring(Value src, Value dst) {
730
+ /* Compute the width of the result in bits. */
731
+ unsigned long long width = type_width(src->type);
732
+
733
+ /* Update the destination capacity if required. */
734
+ resize_value(dst,width);
735
+ /* Set the type and size of the destination from the type of the source.*/
736
+ dst->type = src->type;
737
+ dst->numeric = 0;
738
+
739
+ /* Get access to the source and destination data. */
740
+ char* src_data = src->data_str;
741
+ char* dst_data = dst->data_str;
742
+
743
+ /* Performs the reduce or. */
744
+ unsigned long long count;
745
+ char res;
746
+ for(count = 0; count < width; ++count) {
747
+ /* Performs the reduce or. */
748
+ char d = src_data[count] - '0'; /* Get and convert to bit. */
749
+ if ((d == (d&1)) && (res != 'x'-'0')) { /* d is defined. */
750
+ res |= d;
751
+ } else {
752
+ /* res is undefined. */
753
+ res = 'x' - '0';
754
+ }
755
+ /* Apart for the first bit, there are only 0, still we are in
756
+ * the loop, set it. */
757
+ dst_data[count] = '0';
758
+ }
759
+ dst_data[0] = res + '0';
760
+ /* Return the destination. */
761
+ return dst;
762
+ }
763
+
717
764
 
718
765
  /** Computes the and of two bitstring values.
719
766
  * @param src0 the first source value of the and
@@ -1133,7 +1180,7 @@ static Value equal_value_bitstring(Value src0, Value src1, Value dst) {
1133
1180
  static Value select_value_bitstring(Value cond, Value dst, unsigned int num,
1134
1181
  va_list args)
1135
1182
  {
1136
- printf("select_value_bitstring with cond=%s\n",cond->data_str);
1183
+ // printf("select_value_bitstring with cond=%s\n",cond->data_str);
1137
1184
  /* Get the first alternative for sizing the result. */
1138
1185
  Value src = va_arg(args,Value);
1139
1186
  /* Compute the width of the result in bits. */
@@ -1517,6 +1564,7 @@ static Value sub_value_numeric(Value src0, Value src1, Value dst) {
1517
1564
  * @param dst the destination value
1518
1565
  * @return dst */
1519
1566
  static Value mul_value_numeric(Value src0, Value src1, Value dst) {
1567
+ // printf("mul_value_numeric with src0->data_int=%llx src1->data_int=%llx\n",src0->data_int, src1->data_int);
1520
1568
  /* Sets state of the destination using the first source. */
1521
1569
  dst->type = src0->type;
1522
1570
  dst->numeric = 1;
@@ -1575,6 +1623,21 @@ static Value not_value_numeric(Value src, Value dst) {
1575
1623
  }
1576
1624
 
1577
1625
 
1626
+ /** Compute the or of the bits a numeric value.
1627
+ * @param src the source value
1628
+ * @param dst the destination value
1629
+ * @return dst */
1630
+ Value reduce_or_value_numeric(Value src, Value dst) {
1631
+ /* Sets state of the destination using the first source. */
1632
+ dst->type = src->type;
1633
+ dst->numeric = 1;
1634
+
1635
+ /* Perform the reduce or. */
1636
+ dst->data_int = fix_numeric_type(dst->type, src->data_int != 0);
1637
+ return dst;
1638
+ }
1639
+
1640
+
1578
1641
  /** Computes the AND of two numeric values.
1579
1642
  * @param src0 the first source value of the addition
1580
1643
  * @param src1 the second source value of the addition
@@ -1769,7 +1832,7 @@ static Value concat_value_numeric_array(int num, int dir,
1769
1832
  * @param dst the destination value
1770
1833
  * @return dst */
1771
1834
  static Value cast_value_numeric(Value src, Type type, Value dst) {
1772
- // printf("cast_value_numeric with src=%llx",src->data_int);
1835
+ // printf("cast_value_numeric with src=%llx\n",src->data_int);
1773
1836
  /* Copy the source to the destination. */
1774
1837
  dst->data_int = src->data_int;
1775
1838
  /* Update the destination type to the cast. */
@@ -2093,6 +2156,21 @@ Value not_value(Value src, Value dst) {
2093
2156
  }
2094
2157
 
2095
2158
 
2159
+ /** Compute the or of the bits a value.
2160
+ * @param src the source value
2161
+ * @param dst the destination value
2162
+ * @return dst */
2163
+ Value reduce_or_value(Value src, Value dst) {
2164
+ if (src->numeric) {
2165
+ /* The source is numeric. */
2166
+ return reduce_or_value_numeric(src,dst);
2167
+ } else {
2168
+ /* The source cannot be numeric, compute bitsitrings. */
2169
+ return reduce_or_value_bitstring(src,dst);
2170
+ }
2171
+ }
2172
+
2173
+
2096
2174
  /** Computes the AND of two general values.
2097
2175
  * @param src0 the first source value of the addition
2098
2176
  * @param src1 the second source value of the addition
@@ -2596,6 +2674,7 @@ unsigned long long value2integer(Value value) {
2596
2674
  char bit;
2597
2675
  /* Access the bitstring data. */
2598
2676
  char* data_str = value->data_str;
2677
+ // printf("value2integer with data_str=%s\n",data_str);
2599
2678
  /* Copy the bits. */
2600
2679
  for (i=0; i<width && i<LONG_LONG_BIT; ++i) {
2601
2680
  /* Get the bit. */
@@ -2607,12 +2686,17 @@ unsigned long long value2integer(Value value) {
2607
2686
  /* Write the bit. */
2608
2687
  res = (res << 1) | bit;
2609
2688
  }
2689
+ // printf("first res=%llx\n",res);
2690
+ unsigned long long bit0 = (data_str[width-1]-'0') << i;
2610
2691
  /* Perform the sign extension if required. */
2611
2692
  if (i>=width && value->type->flags.sign) {
2612
2693
  for(; i<LONG_LONG_BIT; ++i) {
2613
- res = (res << 1) | bit;
2694
+ // res = (res << 1) | bit;
2695
+ res |= bit0;
2696
+ bit0 <<= 1;
2614
2697
  }
2615
2698
  }
2699
+ // printf("then res=%llx\n",res);
2616
2700
  return res;
2617
2701
  }
2618
2702
 
@@ -12,6 +12,9 @@
12
12
  * hruby_low2c.
13
13
  * */
14
14
 
15
+ /** The top system. */
16
+ SystemT top_system;
17
+
15
18
  /** The number of all the signals. */
16
19
  static int num_all_signals = 0;
17
20
  /** The capacity of the set of signals. */
@@ -118,9 +121,10 @@ void hruby_sim_update_signals() {
118
121
  /* Is there a change? */
119
122
  if (same_content_value(sig->c_value,sig->f_value)) continue;
120
123
  /* Yes, process the signal. */
121
- println_signal(sig);
122
- // printf("c_value="); print_value(sig->c_value);
123
- // printf("\nf_value="); print_value(sig->f_value); printf("\n");
124
+ // println_signal(sig);
125
+ printer.print_signal(sig);
126
+ // printf("c_value="); printer.print_value(sig->c_value);
127
+ // printf("\nf_value="); printer.print_value(sig->f_value); printf("\n");
124
128
  // printf("Touched signal: %p (%s)\n",sig,sig->name);
125
129
  /* Update the current value of the signal. */
126
130
  copy_value(sig->f_value,sig->c_value);
@@ -185,7 +189,8 @@ void hruby_sim_update_signals() {
185
189
  SignalI sig = e->data;
186
190
  delete_element(e);
187
191
  /* Yes, process the signal. */
188
- println_signal(sig);
192
+ // println_signal(sig);
193
+ printer.print_signal(sig);
189
194
  /* Update the current value of the signal. */
190
195
  /* Mark the corresponding code as activated. */
191
196
  /* Any edge activation. */
@@ -284,7 +289,8 @@ void hruby_sim_advance_time() {
284
289
  }
285
290
  /* Sets the new activation time. */
286
291
  hruby_sim_time = next_time;
287
- println_time(hruby_sim_time);
292
+ // println_time(hruby_sim_time);
293
+ printer.print_time(hruby_sim_time);
288
294
  }
289
295
 
290
296
 
@@ -393,9 +399,18 @@ void hruby_sim_end_timed_behaviors() {
393
399
 
394
400
 
395
401
 
402
+ // /** The simulation core function.
403
+ // * @param limit the time limit in fs. */
404
+ // void hruby_sim_core(unsigned long long limit) {
396
405
  /** The simulation core function.
406
+ * @param name the name of the simulation.
407
+ * @param vizualizer the vizualizer engine initializer.
397
408
  * @param limit the time limit in fs. */
398
- void hruby_sim_core(unsigned long long limit) {
409
+ void hruby_sim_core(char* name, void (*init_vizualizer)(char*),
410
+ unsigned long long limit) {
411
+ /* Initilize the vizualizer. */
412
+ init_vizualizer(name);
413
+
399
414
  /* Initialize the time to 0. */
400
415
  hruby_sim_time = 0;
401
416
 
@@ -597,3 +612,14 @@ unsigned long long make_delay(int value, Unit unit) {
597
612
  return -1;
598
613
  }
599
614
 
615
+
616
+
617
+
618
+ /* Iterate over all the signals.
619
+ * @param func function to applie on each signal. */
620
+ void each_all_signal(void (*func)(SignalI)) {
621
+ int i;
622
+ for(i = 0; i<num_all_signals; ++i) {
623
+ func(all_signals[i]);
624
+ }
625
+ }