random method

FxvType random(
  1. Random rv, {
  2. bool subNormal = false,
  3. bool genNormal = true,
  4. bool genSubNormal = true,
  5. FxvType? gt,
  6. FxvType? lt,
  7. FxvType? gte,
  8. FxvType? lte,
})

Generate a random FixedPointValue, using random seed rv.

This generates a valid FixedPointValue anywhere in the range specified. The range is interpreted as follows:

  • gt, lt: generate a value in the range ([gt], [lt])
  • gte, lt: generate a value in the range [[gte], [lt])
  • gt, lte: generate a value in the range ([gt], [lte]]
  • gte, lte: generate a value in the range [[gte], [lte]]
  • gt: generate a value in the range ([gt], ∞)
  • gte: generate a value in the range [[gte], ∞)
  • lt: generate a value in the range (-∞, [lt])
  • lte: generate a value in the range (-∞, [lte]]
  • none: generate a value in the range (-∞, ∞)

Implementation

FxvType random(Random rv,
    {bool subNormal = false, // if true generate only subnormal numbers
    bool genNormal = true,
    bool genSubNormal = true,
    FxvType? gt,
    FxvType? lt,
    FxvType? gte,
    FxvType? lte}) {
  _checkMatching('gt', gt);
  _checkMatching('lt', lt);
  _checkMatching('gte', gte);
  _checkMatching('lte', lte);

  if (gt != null) {
    if (lt != null) {
      if (gt.compareTo(lt) >= 0) {
        throw RohdHclException(
            'FloatingPointValuePopulator.random: cannot have $gt >= '
            '$lt');
      }
    } else if (lte != null) {
      if (gt.compareTo(lte) > 0) {
        throw RohdHclException(
            'FloatingPointValuePopulator.random: cannot have $gt > '
            '$lte');
      }
    }
  } else if (gte != null) {
    if (lt != null) {
      if (gte.compareTo(lt) >= 0) {
        throw RohdHclException(
            'FloatingPointValuePopulator.random: cannot have $gte >= '
            '$lt');
      }
    } else if (lte != null) {
      if (gte.compareTo(lte) > 0) {
        throw RohdHclException(
            'FloatingPointValuePopulator.random: cannot have $gte > '
            '$lte');
      }
    }
  }

  final gtSign =
      signed ? (gt ?? gte)?.value[-1] ?? LogicValue.one : LogicValue.zero;
  final ltSign =
      signed ? (lt ?? lte)?.value[-1] ?? LogicValue.zero : LogicValue.zero;

  final gtMagnitude = gt?.value.abs();
  final gteMagnitude = gte?.value.abs();
  final ltMagnitude = lt?.value.abs();
  final lteMagnitude = lte?.value.abs();

  final tgt = (gtMagnitude == null)
      ? null
      : SignMagnitudeValue(sign: gtSign, magnitude: gtMagnitude);
  final tgte = (gteMagnitude == null)
      ? null
      : SignMagnitudeValue(sign: gtSign, magnitude: gteMagnitude);
  final tlt = (ltMagnitude == null)
      ? null
      : SignMagnitudeValue(sign: ltSign, magnitude: ltMagnitude);
  final tlte = (lteMagnitude == null)
      ? null
      : SignMagnitudeValue(sign: ltSign, magnitude: lteMagnitude);

  final smv =
      SignMagnitudeValue.populator(width: integerWidth + fractionWidth)
          .random(rv, gt: tgt, gte: tgte, lt: tlt, lte: tlte);
  final newValue =
      signed ? [smv.sign, smv.magnitude].swizzle() : smv.magnitude;
  return ofLogicValue(newValue);
}