HDLRuby 3.9.1 → 3.9.3

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.
data/README.md CHANGED
@@ -71,7 +71,11 @@ hdrcc --get-tuto
71
71
 
72
72
  __What's New__
73
73
 
74
- For HDLRuby version 3.9.0:
74
+ For HDKRuby version 3.9.2:
75
+
76
+ * Added the `hbreak` command for exiting parallel enumerator loops.
77
+
78
+ For HDLRuby version 3.9.0/3.9.1:
75
79
 
76
80
  * Added the parallel enumerators to the software sequencers.
77
81
 
@@ -3981,6 +3985,10 @@ Parallel enumerators provide several control methods:
3981
3985
 
3982
3986
  * `+`: Concatenates two enumerators.
3983
3987
 
3988
+ Additionaly, it is possible to exit an enumeration loop using the following command:
3989
+
3990
+ * `hbreak`: Exits the current enumeration loop.
3991
+
3984
3992
  __Hardware Implementations of Enumerable Methods__
3985
3993
 
3986
3994
  Using parallel enumerators, HDLRuby provides hardware implementations of many Ruby Enumerable methods. These are available for any enumerable object and can be used inside or outside processes.
@@ -760,6 +760,8 @@ VALUE rcsim_make_unary(VALUE mod, VALUE type, VALUE operator, VALUE child) {
760
760
  switch(sym_to_char(operator)) {
761
761
  case (unsigned char)'~': unary->oper = not_value; break;
762
762
  case (unsigned char)('-'+'@'*2): unary->oper = neg_value; break;
763
+ case (unsigned char)'|': unary->oper = reduce_or_value; break;
764
+ case (unsigned char)'&': unary->oper = reduce_and_value; break;
763
765
  default: perror("Invalid operator for unary.");
764
766
  }
765
767
  value_to_rcsim(ExpressionS,child,unary->child);
@@ -252,6 +252,12 @@ extern Value not_value(Value src, Value dst);
252
252
  * @return dst */
253
253
  extern Value reduce_or_value(Value src, Value dst);
254
254
 
255
+ /** Compute the and of the bits a a value.
256
+ * @param src the source value
257
+ * @param dst the destination value
258
+ * @return dst */
259
+ extern Value reduce_and_value(Value src, Value dst);
260
+
255
261
  /** Computes the AND of two values.
256
262
  * @param src0 the first source value of the and
257
263
  * @param src1 the second source value of the and
@@ -1348,6 +1348,44 @@ Value reduce_or_value_bitstring(Value src, Value dst) {
1348
1348
  return dst;
1349
1349
  }
1350
1350
 
1351
+ /** Compute the and of the bits a bitstring value.
1352
+ * @param src the source value
1353
+ * @param dst the destination value
1354
+ * @return dst */
1355
+ Value reduce_and_value_bitstring(Value src, Value dst) {
1356
+ /* Compute the width of the result in bits. */
1357
+ unsigned long long width = type_width(src->type);
1358
+
1359
+ /* Update the destination capacity if required. */
1360
+ resize_value(dst,width);
1361
+ /* Set the type and size of the destination from the type of the source.*/
1362
+ dst->type = src->type;
1363
+ dst->numeric = 0;
1364
+
1365
+ /* Get access to the source and destination data. */
1366
+ char* src_data = src->data_str;
1367
+ char* dst_data = dst->data_str;
1368
+
1369
+ /* Performs the reduce or. */
1370
+ unsigned long long count;
1371
+ char res = 0;
1372
+ for(count = 0; count < width; ++count) {
1373
+ /* Performs the reduce and. */
1374
+ char d = src_data[count] - '0'; /* Get and convert to bit. */
1375
+ if ((d == (d&1)) && (res != 'x'-'0')) { /* d is defined. */
1376
+ res &= d;
1377
+ } else {
1378
+ /* res is undefined. */
1379
+ res = 'x' - '0';
1380
+ }
1381
+ /* Apart for the first bit, there are only 0, still we are in
1382
+ * the loop, set it. */
1383
+ dst_data[count] = '0';
1384
+ }
1385
+ dst_data[0] = res + '0';
1386
+ /* Return the destination. */
1387
+ return dst;
1388
+ }
1351
1389
 
1352
1390
  /** Computes the and of two bitstring values.
1353
1391
  * @param src0 the first source value of the and
@@ -2280,6 +2318,21 @@ Value reduce_or_value_numeric(Value src, Value dst) {
2280
2318
  return dst;
2281
2319
  }
2282
2320
 
2321
+ /** Compute the and of the bits a numeric value.
2322
+ * @param src the source value
2323
+ * @param dst the destination value
2324
+ * @return dst */
2325
+ Value reduce_and_value_numeric(Value src, Value dst) {
2326
+ /* Sets state of the destination using the first source. */
2327
+ dst->type = src->type;
2328
+ dst->numeric = 1;
2329
+
2330
+ /* Perform the reduce and. */
2331
+ unsigned long long mask = ~(-1LL << type_width(src->type));
2332
+ dst->data_int = fix_numeric_type(dst->type, (~src->data_int & mask) == 0);
2333
+ return dst;
2334
+ }
2335
+
2283
2336
 
2284
2337
  /** Computes the AND of two numeric values.
2285
2338
  * @param src0 the first source value of the addition
@@ -3061,6 +3114,20 @@ Value reduce_or_value(Value src, Value dst) {
3061
3114
  }
3062
3115
  }
3063
3116
 
3117
+ /** Compute the and of the bits a value.
3118
+ * @param src the source value
3119
+ * @param dst the destination value
3120
+ * @return dst */
3121
+ Value reduce_and_value(Value src, Value dst) {
3122
+ if (src->numeric) {
3123
+ /* The source is numeric. */
3124
+ return reduce_and_value_numeric(src,dst);
3125
+ } else {
3126
+ /* The source cannot be numeric, compute bitsitrings. */
3127
+ return reduce_and_value_bitstring(src,dst);
3128
+ }
3129
+ }
3130
+
3064
3131
 
3065
3132
  /** Computes the AND of two general values.
3066
3133
  * @param src0 the first source value of the addition