SignMagnitudeDualAdder constructor

SignMagnitudeDualAdder(
  1. Logic aSign,
  2. Logic a,
  3. Logic bSign,
  4. Logic b, {
  5. Adder adderGen(
    1. Logic a,
    2. Logic b, {
    3. Logic? carryIn,
    }) = NativeAdder.new,
  6. String name = 'sign_magnitude_dualadder',
  7. bool reserveName = false,
  8. bool reserveDefinitionName = false,
  9. String? definitionName,
})

/// SignMagnitudeDualAdder constructor with an adder functor adderGen.

Inputs are (sign, magnitude) pairs: (aSign, a) and (bSign, b). The caller need not guarantee the order of inputs as this adder performs two ones-complement subtractions and selects the appropriate one to compute magnitude.

Implementation

SignMagnitudeDualAdder(super.aSign, super.a, super.bSign, super.b,
    {Adder Function(Logic a, Logic b, {Logic? carryIn}) adderGen =
        NativeAdder.new,
    super.name = 'sign_magnitude_dualadder',
    super.reserveName,
    super.reserveDefinitionName,
    String? definitionName})
    : super(
          definitionName:
              definitionName ?? 'SignMagnitudeAdder_W${a.width}') {
  final adderForward = SignMagnitudeAdder(Const(0), a, aSign ^ bSign, b,
      generateEndAroundCarry: true,
      largestMagnitudeFirst: true,
      adderGen: adderGen);

  final adderReverse = SignMagnitudeAdder(Const(0), b, aSign ^ bSign, a,
      generateEndAroundCarry: true,
      largestMagnitudeFirst: true,
      adderGen: adderGen);

  // Not having the endAroundCarry means the second argument is bigger
  // and that is also indicates the correct sign to choose.
  sum <=
      mux(adderForward.endAroundCarry!, adderReverse.sum, adderForward.sum);
  sign <= mux(adderForward.endAroundCarry!, aSign, bSign);
}