SignMagnitudeDualAdder constructor
/// 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);
}