HDLRuby 2.3.7 → 2.4.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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
+ }