From 23f6f2d333d94f80176451210f6988c4c9d72dce Mon Sep 17 00:00:00 2001 From: "Desmond A. Kirkpatrick" Date: Sat, 18 Jan 2025 11:14:26 -0800 Subject: [PATCH] Using Logic.named() for key components --- lib/src/arithmetic/addend_compressor.dart | 6 +- lib/src/arithmetic/adder.dart | 13 +- .../floating_point/floating_point_adder.dart | 15 +- .../floating_point_adder_round.dart | 279 +++++++++--------- .../floating_point_adder_simple.dart | 52 ++-- .../floating_point_multiplier_simple.dart | 57 ++-- lib/src/arithmetic/multiplicand_selector.dart | 24 +- lib/src/arithmetic/multiplier_encoder.dart | 61 ++-- lib/src/arithmetic/ones_complement_adder.dart | 11 +- .../parallel_prefix_operations.dart | 62 ++-- .../arithmetic/partial_product_generator.dart | 5 +- .../partial_product_sign_extend.dart | 111 +++---- .../arithmetic/signals/fixed_point_logic.dart | 1 + .../signals/floating_point_logic.dart | 48 ++- lib/src/encodings/tree_one_hot_to_binary.dart | 4 +- lib/src/utils.dart | 5 - 16 files changed, 362 insertions(+), 392 deletions(-) diff --git a/lib/src/arithmetic/addend_compressor.dart b/lib/src/arithmetic/addend_compressor.dart index c69b8c8a8..5cca11a35 100644 --- a/lib/src/arithmetic/addend_compressor.dart +++ b/lib/src/arithmetic/addend_compressor.dart @@ -247,7 +247,8 @@ class ColumnCompressor { } final t = CompressTerm( CompressTermType.sum, - nameLogic('cmp_sum_iter${iteration}_c$col', compressor.sum), + compressor.sum.named('cmp_sum_iter${iteration}_c$col', + naming: Naming.mergeable), inputs, 0, col); @@ -256,7 +257,8 @@ class ColumnCompressor { if (col < columns.length - 1) { final t = CompressTerm( CompressTermType.carry, - nameLogic('cmp_carry_iter${iteration}_c$col', compressor.carry), + compressor.carry.named('cmp_carry_iter${iteration}_c$col', + naming: Naming.mergeable), inputs, 0, col); diff --git a/lib/src/arithmetic/adder.dart b/lib/src/arithmetic/adder.dart index ca80e8ddc..98a2f386e 100644 --- a/lib/src/arithmetic/adder.dart +++ b/lib/src/arithmetic/adder.dart @@ -76,13 +76,16 @@ class NativeAdder extends Adder { if (a.width != b.width) { throw RohdHclException('inputs of a and b should have same width.'); } + final ax = a.zeroExtend(a.width + 1).named('ax', naming: Naming.mergeable); + final bx = b.zeroExtend(a.width + 1).named('bx', naming: Naming.mergeable); + final apb = (ax + bx).named('ax_plus_bx', naming: Naming.mergeable); if (carryIn == null) { - sum <= a.zeroExtend(a.width + 1) + b.zeroExtend(b.width + 1); + sum <= apb; } else { - sum <= - a.zeroExtend(a.width + 1) + - b.zeroExtend(b.width + 1) + - carryIn!.zeroExtend(a.width + 1); + final cinx = carryIn! + .zeroExtend(a.width + 1) + .named('carryInx', naming: Naming.mergeable); + sum <= (apb + cinx).named('ax_plus_bx_plus_cx', naming: Naming.mergeable); } } } diff --git a/lib/src/arithmetic/floating_point/floating_point_adder.dart b/lib/src/arithmetic/floating_point/floating_point_adder.dart index 2eb99b957..e007c1997 100644 --- a/lib/src/arithmetic/floating_point/floating_point_adder.dart +++ b/lib/src/arithmetic/floating_point/floating_point_adder.dart @@ -76,11 +76,11 @@ abstract class FloatingPointAdder extends Module { @protected (FloatingPoint, FloatingPoint) swap( Logic swap, (FloatingPoint, FloatingPoint) toSwap) { - final in1 = nameLogic('swap_in_${toSwap.$1.name}', toSwap.$1); - final in2 = nameLogic('swap_in_${toSwap.$2.name}', toSwap.$2); + final in1 = toSwap.$1.named('swap_in_${toSwap.$1.name}'); + final in2 = toSwap.$2.named('swap_in_${toSwap.$2.name}'); - final out1 = nameLogic('swap_out_larger', mux(swap, in2, in1)); - final out2 = nameLogic('swap_out_smaller', mux(swap, in1, in2)); + final out1 = mux(swap, in2, in1).named('swap_out_larger'); + final out2 = mux(swap, in1, in2).named('swap_out_smaller'); final first = a.clone(name: 'larger')..gets(out1); final second = a.clone(name: 'smaller')..gets(out2); return (first, second); @@ -94,11 +94,10 @@ abstract class FloatingPointAdder extends Module { final be = toSort.$2.exponent; final am = toSort.$1.mantissa; final bm = toSort.$2.mantissa; - final doSwap = nameLogic( - 'doSwap', - ae.lt(be) | + final doSwap = (ae.lt(be) | (ae.eq(be) & am.lt(bm)) | - ((ae.eq(be) & am.eq(bm)) & toSort.$1.sign)); + ((ae.eq(be) & am.eq(bm)) & toSort.$1.sign)) + .named('doSwap'); final swapped = swap(doSwap, toSort); diff --git a/lib/src/arithmetic/floating_point/floating_point_adder_round.dart b/lib/src/arithmetic/floating_point/floating_point_adder_round.dart index 36680d3a4..cc2d5c024 100644 --- a/lib/src/arithmetic/floating_point/floating_point_adder_round.dart +++ b/lib/src/arithmetic/floating_point/floating_point_adder_round.dart @@ -36,50 +36,43 @@ class FloatingPointAdderRound extends FloatingPointAdder { output('sum') <= outputSum; // Seidel: S.EFF = effectiveSubtraction - final effectiveSubtraction = Logic(name: 'eff_subtract') - ..gets(a.sign ^ b.sign ^ (subtract ?? Const(0))); - final isNaN = Logic(name: 'isNaN') - ..gets(a.isNaN | - b.isNaN | - (a.isInfinity & b.isInfinity & effectiveSubtraction)); - final isInf = Logic(name: 'isInf')..gets(a.isInfinity | b.isInfinity); + final effectiveSubtraction = + (a.sign ^ b.sign ^ (subtract ?? Const(0))).named('effSubtraction'); + final isNaN = (a.isNaN | + b.isNaN | + (a.isInfinity & b.isInfinity & effectiveSubtraction)) + .named('isNaN'); + final isInf = (a.isInfinity | b.isInfinity).named('isInf'); final exponentSubtractor = OnesComplementAdder( super.a.exponent, super.b.exponent, subtract: true, adderGen: adderGen, name: 'exponent_sub'); - final signDelta = Logic(name: 'signDelta')..gets(exponentSubtractor.sign); + final signDelta = exponentSubtractor.sign.named('signDelta'); - final delta = Logic(name: 'expdelta', width: exponentSubtractor.sum.width) - ..gets(exponentSubtractor.sum); + final delta = exponentSubtractor.sum.named('expDelta'); // Seidel: (sl, el, fl) = larger; (ss, es, fs) = smaller final (larger, smaller) = swap(signDelta, (a, b)); - final fl = nameLogic( - 'full_larger', - mux( - larger.isNormal, - [larger.isNormal, larger.mantissa].swizzle(), - [larger.mantissa, Const(0)].swizzle(), - )); - final fs = nameLogic( - 'full_smaller', - mux( - smaller.isNormal, - [smaller.isNormal, smaller.mantissa].swizzle(), - [smaller.mantissa, Const(0)].swizzle(), - )); + final fl = mux( + larger.isNormal, + [larger.isNormal, larger.mantissa].swizzle(), + [larger.mantissa, Const(0)].swizzle(), + ).named('fullLarger'); + final fs = mux( + smaller.isNormal, + [smaller.isNormal, smaller.mantissa].swizzle(), + [smaller.mantissa, Const(0)].swizzle(), + ).named('fullSmaller'); // Seidel: flp larger preshift, normally in [2,4) final sigWidth = fl.width + 1; - final largeShift = nameLogic( - 'largeShift', - mux(effectiveSubtraction, fl.zeroExtend(sigWidth) << 1, - fl.zeroExtend(sigWidth))); - final smallShift = nameLogic( - 'largeShift', - mux(effectiveSubtraction, fs.zeroExtend(sigWidth) << 1, - fs.zeroExtend(sigWidth))); + final largeShift = mux(effectiveSubtraction, fl.zeroExtend(sigWidth) << 1, + fl.zeroExtend(sigWidth)) + .named('largeShift'); + final smallShift = mux(effectiveSubtraction, fs.zeroExtend(sigWidth) << 1, + fs.zeroExtend(sigWidth)) + .named('smallShift'); final zeroExp = a.zeroExponent; final largeOperand = largeShift; @@ -89,15 +82,16 @@ class FloatingPointAdderRound extends FloatingPointAdder { final extendWidthRPath = min(mantissaWidth + 3, pow(2, exponentWidth).toInt() - 3); - final smallerFullRPath = nameLogic('smallerfull_rpath', - [smallShift, Const(0, width: extendWidthRPath)].swizzle()); + final smallerFullRPath = [smallShift, Const(0, width: extendWidthRPath)] + .swizzle() + .named('smallerFull_rpath'); - final smallerAlignRPath = nameLogic( - 'smaller_align_rpath', smallerFullRPath >>> exponentSubtractor.sum); - final smallerOperandRPath = nameLogic( - 'smaller_operand_rpath', - smallerAlignRPath.slice(smallerAlignRPath.width - 1, - smallerAlignRPath.width - largeOperand.width)); + final smallerAlignRPath = (smallerFullRPath >>> exponentSubtractor.sum) + .named('smallerAligned_rpath'); + final smallerOperandRPath = smallerAlignRPath + .slice(smallerAlignRPath.width - 1, + smallerAlignRPath.width - largeOperand.width) + .named('smallerOperand_rpath'); /// R Pipestage here: final aIsNormalFlopped = localFlop(a.isNormal); @@ -119,73 +113,83 @@ class FloatingPointAdderRound extends FloatingPointAdder { adderGen: adderGen, name: 'rpath_significand_adder'); - final lowBitsRPath = nameLogic('lowbits_rpath', - smallerAlignRPathFlopped.slice(extendWidthRPath - 1, 0)); + final lowBitsRPath = smallerAlignRPathFlopped + .slice(extendWidthRPath - 1, 0) + .named('lowbits_rpath'); + + final lowAdderRPathSum = OnesComplementAdder( + carryRPath.zeroExtend(extendWidthRPath), + mux(effectiveSubtractionFlopped, ~lowBitsRPath, lowBitsRPath), + adderGen: adderGen, + name: 'rpath_lowadder') + .sum + .named('lowAdderSum_rpath'); + + final preStickyRPath = lowAdderRPathSum + .slice(lowAdderRPathSum.width - 4, 0) + .or() + .named('preSticky_rpath'); + final stickyBitRPath = + (lowAdderRPathSum[-3] | preStickyRPath).named('stickyBit_rpath'); - final lowAdderRPathSum = nameLogic( - 'lowadder_sum_rpath', - OnesComplementAdder(carryRPath.zeroExtend(extendWidthRPath), - mux(effectiveSubtractionFlopped, ~lowBitsRPath, lowBitsRPath), - adderGen: adderGen, name: 'rpath_lowadder') - .sum); + final earlyGRSRPath = [ + lowAdderRPathSum.slice( + lowAdderRPathSum.width - 2, lowAdderRPathSum.width - 3), + preStickyRPath + ].swizzle().named('earlyGRS_rpath'); - final preStickyRPath = nameLogic('presticky_rpath', - lowAdderRPathSum.slice(lowAdderRPathSum.width - 4, 0).or()); - final stickyBitRPath = - nameLogic('stickybit_rpath', lowAdderRPathSum[-3] | preStickyRPath); - - final earlyGRSRPath = nameLogic( - 'earlyGRS_rpath', - [ - lowAdderRPathSum.slice( - lowAdderRPathSum.width - 2, lowAdderRPathSum.width - 3), - preStickyRPath - ].swizzle()); - - final sumRPath = nameLogic( - 'sum_rpath', significandAdderRPath.sum.slice(mantissaWidth + 1, 0)); + final sumRPath = significandAdderRPath.sum + .slice(mantissaWidth + 1, 0) + .named('sum_rpath'); // TODO(desmonddak): we should use a compound adder here - final sumP1RPath = nameLogic('sump1_rpath', - (significandAdderRPath.sum + 1).slice(mantissaWidth + 1, 0)); - - final sumLeadZeroRPath = nameLogic('sumlead0_rpath', - ~sumRPath[-1] & (aIsNormalFlopped | bIsNormalFlopped)); - final sumP1LeadZeroRPath = nameLogic('sump1lead0_rpath', - ~sumP1RPath[-1] & (aIsNormalFlopped | bIsNormalFlopped)); - - final selectRPath = nameLogic('select_rpath', lowAdderRPathSum[-1]); - final shiftGRSRPath = nameLogic( - 'shiftGRS_rpath', [earlyGRSRPath[2], stickyBitRPath].swizzle()); - final mergedSumRPath = nameLogic( - 'mergedsum_rpath', - mux( + final sumP1RPath = (significandAdderRPath.sum + 1) + .named('sumPlusOne_rpath') + .slice(mantissaWidth + 1, 0); + + final sumLeadZeroRPath = + (~sumRPath[-1] & (aIsNormalFlopped | bIsNormalFlopped)) + .named('sumlead0_rpath'); + final sumP1LeadZeroRPath = + (~sumP1RPath[-1] & (aIsNormalFlopped | bIsNormalFlopped)) + .named('sumP1lead0_rpath'); + + final selectRPath = lowAdderRPathSum[-1].named('selectRpath'); + final shiftGRSRPath = + [earlyGRSRPath[2], stickyBitRPath].swizzle().named('shiftGRS_rpath'); + final mergedSumRPath = mux( sumLeadZeroRPath, - [sumRPath, earlyGRSRPath].swizzle().slice(sumRPath.width + 1, 0), - [sumRPath, shiftGRSRPath].swizzle())); - - final mergedSumP1RPath = nameLogic( - 'mergedsump1_rpath', - mux( + [sumRPath, earlyGRSRPath] + .swizzle() + .named('sum_earlyGRS_rpath') + .slice(sumRPath.width + 1, 0), + [sumRPath, shiftGRSRPath].swizzle()) + .named('mergedSum_rpath'); + + final mergedSumP1RPath = mux( sumP1LeadZeroRPath, - [sumP1RPath, earlyGRSRPath].swizzle().slice(sumRPath.width + 1, 0), - [sumP1RPath, shiftGRSRPath].swizzle())); - - final finalSumLGRSRPath = nameLogic('finalsumLGRS_rpath', - mux(selectRPath, mergedSumP1RPath, mergedSumRPath)); + [sumP1RPath, earlyGRSRPath] + .swizzle() + .named('sump1_earlyGRS') + .slice(sumRPath.width + 1, 0), + [sumP1RPath, shiftGRSRPath].swizzle()) + .named('mergedSumP1'); + + final finalSumLGRSRPath = mux(selectRPath, mergedSumP1RPath, mergedSumRPath) + .named('finalSumLGRS_rpath'); // RNE: guard & (lsb | round | sticky) - final rndRPath = nameLogic( - 'rnd_rpath', - finalSumLGRSRPath[2] & + final rndRPath = (finalSumLGRSRPath[2] & (finalSumLGRSRPath[3] | finalSumLGRSRPath[1] | - finalSumLGRSRPath[0])); + finalSumLGRSRPath[0])) + .named('rnd_rpath'); // Rounding from 1111 to 0000. - final incExpRPath = nameLogic('inc_exp_rpath', - rndRPath & sumLeadZeroRPath.eq(Const(1)) & sumP1LeadZeroRPath.eq(0)); + final incExpRPath = + (rndRPath & sumLeadZeroRPath.eq(Const(1)) & sumP1LeadZeroRPath.eq(0)) + .named('inc_exp_rpath'); - final firstZeroRPath = nameLogic( - 'firstzero_rpath', mux(selectRPath, ~sumP1RPath[-1], ~sumRPath[-1])); + final firstZeroRPath = mux(selectRPath, ~sumP1RPath[-1], ~sumRPath[-1]) + .named('firstZero_rpath'); final expDecr = ParallelPrefixDecr(largerExpFlopped, ppGen: ppTree, name: 'exp_decrement'); @@ -209,20 +213,21 @@ class FloatingPointAdderRound extends FloatingPointAdder { ]) ]); - final sumMantissaRPath = nameLogic( - 'summantissa_rpath', - mux(selectRPath, sumP1RPath, sumRPath) + - rndRPath.zeroExtend(sumRPath.width)); - final mantissaRPath = nameLogic( - 'mantissa_rpath', - sumMantissaRPath << - mux(selectRPath, sumP1LeadZeroRPath, sumLeadZeroRPath)); + final sumMantissaRPath = + mux(selectRPath, sumP1RPath, sumRPath).named('selectSumMantissa_rpath'); + // TODO(desmonddak): the '+' operator fails to pick up names directly + final sumMantissaRPathRnd = (sumMantissaRPath + + rndRPath.zeroExtend(sumRPath.width).named('rndExtend_rpath')) + .named('sumMantissaRnd_rpath'); + final mantissaRPath = (sumMantissaRPathRnd << + mux(selectRPath, sumP1LeadZeroRPath, sumLeadZeroRPath)) + .named('mantissa_rpath'); // // N Datapath here: close exponents, subtraction // - final smallOperandNPath = nameLogic( - 'smalloperand', smallShift >>> (a.exponent[0] ^ b.exponent[0])); + final smallOperandNPath = + (smallShift >>> (a.exponent[0] ^ b.exponent[0])).named('smallOperand'); final significandSubtractorNPath = OnesComplementAdder( largeOperand, smallOperandNPath, @@ -230,8 +235,9 @@ class FloatingPointAdderRound extends FloatingPointAdder { adderGen: adderGen, name: 'npath_significand_sub'); - final significandNPath = nameLogic('significand_npath', - significandSubtractorNPath.sum.slice(smallOperandNPath.width - 1, 0)); + final significandNPath = significandSubtractorNPath.sum + .slice(smallOperandNPath.width - 1, 0) + .named('significand_npath'); final validLeadOneNPath = Logic(name: 'valid_lead1_npath'); final leadOneNPathPre = ParallelPrefixPriorityEncoder( @@ -241,15 +247,14 @@ class FloatingPointAdderRound extends FloatingPointAdder { name: 'npath_leadingOne') .out; // Limit leadOne to exponent range and match widths - final leadOneNPath = nameLogic( - 'lead1_npath', - (leadOneNPathPre.width > exponentWidth) + final leadOneNPath = ((leadOneNPathPre.width > exponentWidth) ? mux( leadOneNPathPre .gte(a.inf().exponent.zeroExtend(leadOneNPathPre.width)), a.inf().exponent, leadOneNPathPre.getRange(0, exponentWidth)) - : leadOneNPathPre.zeroExtend(exponentWidth)); + : leadOneNPathPre.zeroExtend(exponentWidth)) + .named('leadOne_npath'); // N pipestage here: final significandNPathFlopped = localFlop(significandNPath); @@ -267,41 +272,41 @@ class FloatingPointAdderRound extends FloatingPointAdder { name: 'npath_expcalc'); final preExpNPath = - nameLogic('preexp_npath', expCalcNPath.sum.slice(exponentWidth - 1, 0)); + expCalcNPath.sum.slice(exponentWidth - 1, 0).named('preExp_npath'); - final posExpNPath = nameLogic('posexp_npath', - preExpNPath.or() & ~expCalcNPath.sign & validLeadOneNPathFlopped); + final posExpNPath = + (preExpNPath.or() & ~expCalcNPath.sign & validLeadOneNPathFlopped) + .named('posexp_npath'); final exponentNPath = - nameLogic('exp_npath', mux(posExpNPath, preExpNPath, zeroExp)); + mux(posExpNPath, preExpNPath, zeroExp).named('exponent_npath'); - final preMinShiftNPath = nameLogic('preminshift_npath', - ~leadOneNPathFlopped.or() | ~largerExpFlopped.or()); + final preMinShiftNPath = + (~leadOneNPathFlopped.or() | ~largerExpFlopped.or()) + .named('preminshift_npath'); - final minShiftNPath = nameLogic('minshift_npath', - mux(posExpNPath | preMinShiftNPath, leadOneNPathFlopped, expDecr.out)); + final minShiftNPath = + mux(posExpNPath | preMinShiftNPath, leadOneNPathFlopped, expDecr.out) + .named('minShift_npath'); final notSubnormalNPath = aIsNormalFlopped | bIsNormalFlopped; - final shiftedSignificandNPath = nameLogic('shifted_significand_npath', - (significandNPathFlopped << minShiftNPath).slice(mantissaWidth, 1)); + final shiftedSignificandNPath = (significandNPathFlopped << minShiftNPath) + .named('shiftedSignificand_npath') + .slice(mantissaWidth, 1); - final finalSignificandNPath = nameLogic( - 'final_significand_npath', - mux( + final finalSignificandNPath = mux( notSubnormalNPath, shiftedSignificandNPath, - significandNPathFlopped.slice( - significandNPathFlopped.width - 1, 2))); - - final signNPath = nameLogic( - 'sign_npath', - mux(significandSubtractorNPathSignFlopped, smallerSignFlopped, - largerSignFlopped)); - - final isR = nameLogic( - 'isR', - deltaFlopped.gte(Const(2, width: delta.width)) | - ~effectiveSubtractionFlopped); + significandNPathFlopped.slice(significandNPathFlopped.width - 1, 2)) + .named('finalSignificand_npath'); + + final signNPath = mux(significandSubtractorNPathSignFlopped, + smallerSignFlopped, largerSignFlopped) + .named('sign_npath'); + + final isR = (deltaFlopped.gte(Const(2, width: delta.width)) | + ~effectiveSubtractionFlopped) + .named('isR'); Combinational([ If(isNaNFlopped, then: [ diff --git a/lib/src/arithmetic/floating_point/floating_point_adder_simple.dart b/lib/src/arithmetic/floating_point/floating_point_adder_simple.dart index 4f094ad56..a9514d1cc 100644 --- a/lib/src/arithmetic/floating_point/floating_point_adder_simple.dart +++ b/lib/src/arithmetic/floating_point/floating_point_adder_simple.dart @@ -37,17 +37,16 @@ class FloatingPointAdderSimple extends FloatingPointAdder { final (larger, smaller) = sortFp((super.a, super.b)); - final isInf = nameLogic('isInf', larger.isInfinity | smaller.isInfinity); - final isNaN = nameLogic( - 'isNaN', - larger.isNaN | + final isInf = (larger.isInfinity | smaller.isInfinity).named('isInf'); + final isNaN = (larger.isNaN | smaller.isNaN | (larger.isInfinity & smaller.isInfinity & - (larger.sign ^ smaller.sign))); + (larger.sign ^ smaller.sign))) + .named('isNaN'); // Align and add mantissas - final expDiff = larger.exponent - smaller.exponent; + final expDiff = (larger.exponent - smaller.exponent).named('expDiff'); final aMantissa = mux( larger.isNormal, [Const(1), larger.mantissa, Const(0, width: mantissaWidth + 1)] @@ -62,7 +61,7 @@ class FloatingPointAdderSimple extends FloatingPointAdder { final adder = SignMagnitudeAdder( larger.sign, aMantissa, smaller.sign, bMantissa >>> expDiff, adderGen); - final intSum = nameLogic('intsum', adder.sum.slice(adder.sum.width - 1, 0)); + final intSum = adder.sum.slice(adder.sum.width - 1, 0).named('intsum'); final aSignLatched = localFlop(larger.sign); final aExpLatched = localFlop(larger.exponent); @@ -70,37 +69,36 @@ class FloatingPointAdderSimple extends FloatingPointAdder { final isInfLatched = localFlop(isInf); final isNaNLatched = localFlop(isNaN); - final mantissa = nameLogic('mantissa', - sumLatched.reversed.getRange(0, min(intSum.width, intSum.width))); - final leadOneValid = Logic(name: 'leadone_valid'); + final mantissa = sumLatched.reversed + .getRange(0, min(intSum.width, intSum.width)) + .named('mantissa'); + final leadOneValid = Logic(name: 'leadOne_valid'); final leadOnePre = ParallelPrefixPriorityEncoder(mantissa, ppGen: ppTree, valid: leadOneValid) .out; // Limit leadOne to exponent range and match widths final infExponent = outputSum.inf(sign: aSignLatched).exponent; - final leadOne = nameLogic( - 'leadone', - (leadOnePre.width > exponentWidth) + final leadOne = ((leadOnePre.width > exponentWidth) ? mux(leadOnePre.gte(infExponent.zeroExtend(leadOnePre.width)), infExponent, leadOnePre.getRange(0, exponentWidth)) - : leadOnePre.zeroExtend(exponentWidth)); + : leadOnePre.zeroExtend(exponentWidth)) + .named('leadOne'); final leadOneDominates = - nameLogic('leadone_dominates', leadOne.gt(aExpLatched) | ~leadOneValid); - final outExp = nameLogic('outexponent', - mux(leadOneDominates, larger.zeroExponent, aExpLatched - leadOne + 1)); + (leadOne.gt(aExpLatched) | ~leadOneValid).named('leadone_dominates'); + final normalExp = (aExpLatched - leadOne + 1).named('normalExponent'); + final outExp = mux(leadOneDominates, larger.zeroExponent, normalExp) + .named('outExponent'); final realIsInf = - nameLogic('realisinf', isInfLatched | outExp.eq(infExponent)); + (isInfLatched | outExp.eq(infExponent)).named('realIsInf'); - final shiftMantissabyExp = nameLogic( - 'shiftmantissa_exp', - (sumLatched << aExpLatched + 1) - .getRange(intSum.width - mantissaWidth, intSum.width)); - final shiftMantissabyLeadOne = nameLogic( - 'shiftmantissa_leadone', - (sumLatched << leadOne + 1) - .getRange(intSum.width - mantissaWidth, intSum.width)); + final shiftMantissabyExp = (sumLatched << aExpLatched + 1) + .named('shiftMantissaExp', naming: Naming.mergeable) + .getRange(intSum.width - mantissaWidth, intSum.width); + final shiftMantissabyLeadOne = (sumLatched << leadOne + 1) + .getRange(intSum.width - mantissaWidth, intSum.width) + .named('shiftMantissa_leadone', naming: Naming.mergeable); Combinational([ If.block([ @@ -117,7 +115,7 @@ class FloatingPointAdderSimple extends FloatingPointAdder { ]), Else([ outputSum.sign < aSignLatched, - outputSum.exponent < aExpLatched - leadOne + 1, + outputSum.exponent < normalExp, outputSum.mantissa < shiftMantissabyLeadOne, ]) ]) diff --git a/lib/src/arithmetic/floating_point/floating_point_multiplier_simple.dart b/lib/src/arithmetic/floating_point/floating_point_multiplier_simple.dart index 958d62156..3a04cf3ef 100644 --- a/lib/src/arithmetic/floating_point/floating_point_multiplier_simple.dart +++ b/lib/src/arithmetic/floating_point/floating_point_multiplier_simple.dart @@ -42,20 +42,16 @@ class FloatingPointMultiplierSimple extends FloatingPointMultiplier { name: 'product'); output('product') <= product; - final aMantissa = nameLogic( - 'a_mantissa', - mux(a.isNormal, [a.isNormal, a.mantissa].swizzle(), - [a.mantissa, Const(0)].swizzle())); - final bMantissa = nameLogic( - 'a_mantissa', - mux(b.isNormal, [b.isNormal, b.mantissa].swizzle(), - [b.mantissa, Const(0)].swizzle())); + final aMantissa = mux(a.isNormal, [a.isNormal, a.mantissa].swizzle(), + [a.mantissa, Const(0)].swizzle()) + .named('aMantissa'); + final bMantissa = mux(b.isNormal, [b.isNormal, b.mantissa].swizzle(), + [b.mantissa, Const(0)].swizzle()) + .named('bMantissa'); - final productExp = nameLogic( - 'productExp', - a.exponent.zeroExtend(exponentWidth + 2) + - b.exponent.zeroExtend(exponentWidth + 2) - - a.bias.zeroExtend(exponentWidth + 2)); + final productExp = a.exponent.zeroExtend(exponentWidth + 2) + + b.exponent.zeroExtend(exponentWidth + 2) - + a.bias.zeroExtend(exponentWidth + 2).named('productExp'); final pp = PartialProductGenerator(aMantissa, bMantissa, RadixEncoder(radix)); @@ -64,19 +60,18 @@ class FloatingPointMultiplierSimple extends FloatingPointMultiplier { ColumnCompressor(pp, clk: clk, reset: reset, enable: enable) ..compress(); - final row0 = nameLogic('row0', compressor.extractRow(0)); - final row1 = nameLogic('row1', compressor.extractRow(1)); + final row0 = compressor.extractRow(0).named('row0'); + final row1 = compressor.extractRow(1).named('row1'); final adder = adderGen(row0, row1); // Input mantissas have implicit lead: product mantissa width is (mw+1)*2) final mantissa = - nameLogic('mantissa', adder.sum.getRange(0, (mantissaWidth + 1) * 2)); + adder.sum.getRange(0, (mantissaWidth + 1) * 2).named('mantissa'); - final isInf = nameLogic('isInf', a.isInfinity | b.isInfinity); - final isNaN = nameLogic( - 'isNaN', - a.isNaN | + final isInf = (a.isInfinity | b.isInfinity).named('isInf'); + final isNaN = (a.isNaN | b.isNaN | - ((a.isInfinity | b.isInfinity) & (a.isZero | b.isZero))); + ((a.isInfinity | b.isInfinity) & (a.isZero | b.isZero))) + .named('isNaN'); final productExpLatch = localFlop(productExp); final aSignLatch = localFlop(a.sign); @@ -84,12 +79,11 @@ class FloatingPointMultiplierSimple extends FloatingPointMultiplier { final isInfLatch = localFlop(isInf); final isNaNLatch = localFlop(isNaN); - final leadingOnePos = nameLogic( - 'leadingone', - ParallelPrefixPriorityEncoder(mantissa.reversed, - ppGen: ppTree, name: 'leading_one_encoder') - .out - .zeroExtend(exponentWidth + 2)); + final leadingOnePos = ParallelPrefixPriorityEncoder(mantissa.reversed, + ppGen: ppTree, name: 'leading_one_encoder') + .out + .zeroExtend(exponentWidth + 2) + .named('leadingOne'); final shifter = SignedShifter( mantissa, @@ -98,15 +92,14 @@ class FloatingPointMultiplierSimple extends FloatingPointMultiplier { name: 'mantissa_shifter'); final remainingExp = - nameLogic('remainingExp', productExpLatch - leadingOnePos + 1); + (productExpLatch - leadingOnePos + 1).named('remainingExp'); - final overFlow = nameLogic( - 'overflow', - isInfLatch | + final overFlow = (isInfLatch | (~remainingExp[-1] & remainingExp.abs().gte( Const(1, width: exponentWidth, fill: true) - .zeroExtend(exponentWidth + 2)))); + .zeroExtend(exponentWidth + 2)))) + .named('overflow'); Combinational([ If(isNaNLatch, then: [ diff --git a/lib/src/arithmetic/multiplicand_selector.dart b/lib/src/arithmetic/multiplicand_selector.dart index 7844aef2b..23b077023 100644 --- a/lib/src/arithmetic/multiplicand_selector.dart +++ b/lib/src/arithmetic/multiplicand_selector.dart @@ -87,13 +87,10 @@ class MultiplicandSelector { /// Compute the multiples of the multiplicand at current bit position Logic getMultiples(int col) { - final columnMultiples = nameLogic( - 'multiples_c$col', - naming: Naming.mergeable, - [ - for (var i = 0; i < multiples.elements.length; i++) - multiples.elements[i][col] - ].swizzle()); + final columnMultiples = [ + for (var i = 0; i < multiples.elements.length; i++) + multiples.elements[i][col] + ].swizzle().named('multiples_c$col', naming: Naming.mergeable); return columnMultiples.reversed; } @@ -102,18 +99,17 @@ class MultiplicandSelector { // _select attempts to name signals that RadixEncode cannot due to trace Logic _select(Logic multiples, RadixEncode encode) { - final eMultiples = nameLogic( - 'encoded_multiple_r${encode.row}', encode.multiples, - naming: Naming.mergeable); - final eSign = nameLogic('encode_sign_r${encode.row}', encode.sign, - naming: Naming.mergeable); + final eMultiples = encode.multiples + .named('encoded_multiple_r${encode.row}', naming: Naming.mergeable); + final eSign = encode.sign + .named('encode_sign_r${encode.row}', naming: Naming.mergeable); return (eMultiples & multiples).or() ^ eSign; } /// Select the partial product term from the multiples using a RadixEncode Logic select(int col, RadixEncode encode) { - final mults = nameLogic('select_r${encode.row}_c$col', fetchMultiples(col), - naming: Naming.mergeable); + final mults = fetchMultiples(col) + .named('select_r${encode.row}_c$col', naming: Naming.mergeable); return _select(mults, encode); } } diff --git a/lib/src/arithmetic/multiplier_encoder.dart b/lib/src/arithmetic/multiplier_encoder.dart index f6754fb31..cb7892a7a 100644 --- a/lib/src/arithmetic/multiplier_encoder.dart +++ b/lib/src/arithmetic/multiplier_encoder.dart @@ -64,10 +64,9 @@ class RadixEncoder { final width = log2Ceil(radix) + 1; final inputXor = Logic(width: width); inputXor <= - nameLogic( - '${multiplierSlice.name}_xor', - (multiplierSlice ^ (multiplierSlice >>> 1)) - .slice(multiplierSlice.width - 1, 0)); + (multiplierSlice ^ (multiplierSlice >>> 1)) + .slice(multiplierSlice.width - 1, 0) + .named('${multiplierSlice.name}_xor', naming: Naming.mergeable); final multiples = []; for (var i = 2; i < radix + 1; i += 2) { @@ -80,20 +79,17 @@ class RadixEncoder { // Where multiples agree, we need the sense or direction (1 or 0) final senseMultiples = xorA & xorB; - multiples.add(nameLogic( - 'multiple${i}_of_${multiplierSlice.name}', - naming: Naming.mergeable, - [ - for (var j = 0; j < width - 1; j++) - if (multiplesDisagree[j].isZero) - if (senseMultiples[j].isZero) ~inputXor[j] else inputXor[j] - ].swizzle().and())); + multiples.add([ + for (var j = 0; j < width - 1; j++) + if (multiplesDisagree[j].isZero) + if (senseMultiples[j].isZero) ~inputXor[j] else inputXor[j] + ].swizzle().and().named('multiple${i}_of_${multiplierSlice.name}', + naming: Naming.mergeable)); } - final multiplesR = nameLogic( - 'multiples_reversed_r$row', - naming: Naming.mergeable, - multiples.rswizzle()); + final multiplesR = multiples + .rswizzle() + .named('multiples_reversed_r$row', naming: Naming.mergeable); return RadixEncode._(multiplesR, multiplesR.or() & multiplierSlice[multiplierSlice.width - 1], row); @@ -142,11 +138,10 @@ class MultiplierEncoder { } // slices overlap by 1 and start at -1a if (selectSignedMultiplier == null) { - _extendedMultiplier = nameLogic( - 'extended_multiplier', - (signedMultiplier + _extendedMultiplier = (signedMultiplier ? multiplier.signExtend(rows * (log2Ceil(radixEncoder.radix))) - : multiplier.zeroExtend(rows * (log2Ceil(radixEncoder.radix))))); + : multiplier.zeroExtend(rows * (log2Ceil(radixEncoder.radix)))) + .named('extended_multiplier', naming: Naming.mergeable); } else { final len = multiplier.width; final sign = multiplier[len - 1]; @@ -154,8 +149,9 @@ class MultiplierEncoder { for (var i = len - 1; i < (rows * (log2Ceil(radixEncoder.radix))); i++) mux(selectSignedMultiplier, sign, Const(0)) ]; - _extendedMultiplier = nameLogic( - 'extended_multiplier', (multiplier.elements + extension).rswizzle()); + _extendedMultiplier = (multiplier.elements + extension) + .rswizzle() + .named('extended_multiplier', naming: Naming.mergeable); } for (var i = 0; i < rows; i++) { _encodings.add(getEncoding(i)); @@ -168,20 +164,15 @@ class MultiplierEncoder { throw RohdHclException('row $row is not < number of encoding rows $rows'); } final base = row * log2Ceil(_encoder.radix); - final multiplierSlice = nameLogic( - 'mult_slice_r$row', - naming: Naming.mergeable, + final multiplierSlice = [ + if (row > 0) + _extendedMultiplier.slice(base + log2Ceil(_encoder.radix) - 1, base - 1) + else [ - if (row > 0) - _extendedMultiplier.slice( - base + log2Ceil(_encoder.radix) - 1, base - 1) - else - [ - _extendedMultiplier.slice( - base + log2Ceil(_encoder.radix) - 1, base), - Const(0) - ].swizzle() - ].first); + _extendedMultiplier.slice(base + log2Ceil(_encoder.radix) - 1, base), + Const(0) + ].swizzle() + ].first.named('mult_slice_r$row', naming: Naming.mergeable); return _encoder.encode(multiplierSlice, row); } diff --git a/lib/src/arithmetic/ones_complement_adder.dart b/lib/src/arithmetic/ones_complement_adder.dart index 09fe1fa30..8b8dd6088 100644 --- a/lib/src/arithmetic/ones_complement_adder.dart +++ b/lib/src/arithmetic/ones_complement_adder.dart @@ -54,8 +54,9 @@ class OnesComplementAdder extends Adder { 'generation time configuration, but not both.'); } - final doSubtract = nameLogic('dosubtract', - subtractIn ?? (subtract != null ? Const(subtract) : Const(0))); + final doSubtract = + (subtractIn ?? (subtract != null ? Const(subtract) : Const(0))) + .named('dosubtract', naming: Naming.mergeable); final adder = adderGen(a, mux(doSubtract, ~b, b), carryIn: carryIn ?? Const(0)); @@ -63,11 +64,11 @@ class OnesComplementAdder extends Adder { if (this.carryOut != null) { this.carryOut! <= adder.sum[-1]; } - final endAround = nameLogic('endaround', adder.sum[-1]); - final magnitude = nameLogic('magnitude', adder.sum.slice(a.width - 1, 0)); + final endAround = adder.sum[-1].named('endaround'); + final magnitude = adder.sum.slice(a.width - 1, 0).named('magnitude'); final incrementer = ParallelPrefixIncr(magnitude); - final magnitudep1 = nameLogic('magnitude_p1', incrementer.out); + final magnitudep1 = incrementer.out.named('magnitude_plus1'); sum <= mux( diff --git a/lib/src/arithmetic/parallel_prefix_operations.dart b/lib/src/arithmetic/parallel_prefix_operations.dart index 1e49dd4ee..f1cec58a7 100644 --- a/lib/src/arithmetic/parallel_prefix_operations.dart +++ b/lib/src/arithmetic/parallel_prefix_operations.dart @@ -103,13 +103,14 @@ class KoggeStone extends ParallelPrefix { while (skip < inps.length) { for (var i = inps.length - 1; i >= skip; --i) { - iseq[i] = nameLogic('ks$i', op(iseq[i - skip], iseq[i])); + iseq[i] = op(iseq[i - skip], iseq[i]) + .named('ks_skip${skip}_i$i', naming: Naming.mergeable); } skip *= 2; } iseq.forEachIndexed((i, el) { - _oseq[i] <= (nameLogic('o', el)); + _oseq[i] <= el.named('o_$i', naming: Naming.mergeable); }); } } @@ -130,7 +131,8 @@ class BrentKung extends ParallelPrefix { var skip = 2; while (skip <= inps.length) { for (var i = skip - 1; i < inps.length; i += skip) { - iseq[i] = nameLogic('reduce$i', op(iseq[i - skip ~/ 2], iseq[i])); + iseq[i] = op(iseq[i - skip ~/ 2], iseq[i]) + .named('reduce_$i', naming: Naming.mergeable); } skip *= 2; } @@ -139,18 +141,20 @@ class BrentKung extends ParallelPrefix { skip = largestPow2LessThan(inps.length); while (skip > 2) { for (var i = 3 * (skip ~/ 2) - 1; i < inps.length; i += skip) { - iseq[i] = nameLogic('prefix$i', op(iseq[i - skip ~/ 2], iseq[i])); + iseq[i] = op(iseq[i - skip ~/ 2], iseq[i]) + .named('prefix_$i', naming: Naming.mergeable); } skip ~/= 2; } // Final row for (var i = 2; i < inps.length; i += 2) { - iseq[i] = nameLogic('final$i', op(iseq[i - 1], iseq[i])); + iseq[i] = + op(iseq[i - 1], iseq[i]).named('final_$i', naming: Naming.mergeable); } iseq.forEachIndexed((i, el) { - _oseq[i] <= (nameLogic('o', el)); + _oseq[i] <= el.named('o_$i', naming: Naming.mergeable); }); } } @@ -186,7 +190,8 @@ class ParallelPrefixPriorityFinder extends Module { super.name = 'parallel_prefix_finder'}) { inp = addInput('inp', inp, width: inp.width); final u = ParallelPrefixOrScan(inp, ppGen: ppGen); - addOutput('out', width: inp.width) <= (u.out & ~(u.out << Const(1))); + addOutput('out', width: inp.width) <= + (u.out & ~(u.out << Const(1))).named('pos', naming: Naming.mergeable); } } @@ -223,11 +228,16 @@ class ParallelPrefixPriorityEncoder extends Module { valid <= this.valid!; } final u = ParallelPrefixPriorityFinder(inp, ppGen: ppGen); - final pos = nameLogic('pos', OneHotToBinary(u.out).binary.zeroExtend(sz)); + final pos = OneHotToBinary(u.out) + .binary + .zeroExtend(sz) + .named('pos', naming: Naming.mergeable); if (this.valid != null) { this.valid! <= pos.or() | inp[0]; } - out <= mux(pos.or() | inp[0], pos, Const(inp.width + 1, width: sz)); + out <= + mux(pos.or() | inp[0], pos, Const(inp.width + 1, width: sz)) + .named('encoded_pos', naming: Naming.mergeable); } } @@ -246,24 +256,22 @@ class ParallelPrefixAdder extends Adder { // ignore: cascade_invocations l.insert( 0, - nameLogic( - 'pg', - [(a[0] & b[0]) | (a[0] & cin) | (b[0] & cin), a[0] | b[0] | cin] - .swizzle())); + [(a[0] & b[0]) | (a[0] & cin) | (b[0] & cin), a[0] | b[0] | cin] + .swizzle() + .named('pg_base', naming: Naming.mergeable)); final u = ppGen( l, - (lhs, rhs) => nameLogic( - 'pg', [rhs[1] | rhs[0] & lhs[1], rhs[0] & lhs[0]].swizzle())); + (lhs, rhs) => [rhs[1] | rhs[0] & lhs[1], rhs[0] & lhs[0]] + .swizzle() + .named('pg', naming: Naming.mergeable)); sum <= [ u.val[a.width - 1][1], List.generate( a.width, - (i) => nameLogic( - 't$i', - (i == 0) - ? a[i] ^ b[i] ^ cin - : a[i] ^ b[i] ^ u.val[i - 1][1])).rswizzle() + (i) => + ((i == 0) ? a[i] ^ b[i] ^ cin : a[i] ^ b[i] ^ u.val[i - 1][1]) + .named('t_$i')).rswizzle() ].swizzle(); } } @@ -283,9 +291,10 @@ class ParallelPrefixIncr extends Module { final u = ppGen(inp.elements, (lhs, rhs) => rhs & lhs); addOutput('out', width: inp.width) <= (List.generate( - inp.width, - (i) => nameLogic( - 'o$i', (i == 0) ? ~inp[i] : inp[i] ^ u.val[i - 1])).rswizzle()); + inp.width, + (i) => + ((i == 0) ? ~inp[i] : inp[i] ^ u.val[i - 1]).named('o_$i')) + .rswizzle()); } } @@ -304,8 +313,9 @@ class ParallelPrefixDecr extends Module { final u = ppGen((~inp).elements, (lhs, rhs) => rhs & lhs); addOutput('out', width: inp.width) <= (List.generate( - inp.width, - (i) => nameLogic( - 'o$i', (i == 0) ? ~inp[i] : inp[i] ^ u.val[i - 1])).rswizzle()); + inp.width, + (i) => + ((i == 0) ? ~inp[i] : inp[i] ^ u.val[i - 1]).named('o_$i')) + .rswizzle()); } } diff --git a/lib/src/arithmetic/partial_product_generator.dart b/lib/src/arithmetic/partial_product_generator.dart index 5cfb9c315..42d383741 100644 --- a/lib/src/arithmetic/partial_product_generator.dart +++ b/lib/src/arithmetic/partial_product_generator.dart @@ -268,8 +268,9 @@ abstract class PartialProductGeneratorBase extends PartialProductArray { for (var row = 0; row < encoder.rows; row++) { partialProducts.add(List.generate( selector.width, - (i) => nameLogic('pp_r${row}_c$i', - selector.select(i, encoder.fetchEncoding(row))))); + (i) => selector + .select(i, encoder.fetchEncoding(row)) + .named('pp_r${row}_c$i', naming: Naming.mergeable))); } for (var row = 0; row < rows; row++) { rowShift.add(row * shift); diff --git a/lib/src/arithmetic/partial_product_sign_extend.dart b/lib/src/arithmetic/partial_product_sign_extend.dart index bc6093d69..03dd678a9 100644 --- a/lib/src/arithmetic/partial_product_sign_extend.dart +++ b/lib/src/arithmetic/partial_product_sign_extend.dart @@ -199,8 +199,10 @@ class BruteSignExtension extends PartialProductSignExtension { isSignExtended = true; final signs = [ for (var r = 0; r < rows; r++) - nameLogic( - 'sign_r$r', naming: Naming.mergeable, encoder.fetchEncoding(r).sign) + encoder + .fetchEncoding(r) + .sign + .named('sign_r$r', naming: Naming.mergeable) ]; for (var row = 0; row < rows; row++) { final addend = partialProducts[row]; @@ -282,8 +284,10 @@ class CompactSignExtension extends PartialProductSignExtension { final signs = [ for (var r = 0; r < rows; r++) - nameLogic( - 'sign_r$r', naming: Naming.mergeable, encoder.fetchEncoding(r).sign) + encoder + .fetchEncoding(r) + .sign + .named('sign_r$r', naming: Naming.mergeable) ]; final propagate = @@ -292,10 +296,8 @@ class CompactSignExtension extends PartialProductSignExtension { for (var row = 0; row < rows; row++) { propagate[row].add(signs[row]); for (var col = 0; col < 2 * (shift - 1); col++) { - propagate[row].add(nameLogic( - 'propagate_r${row}_c$col', - naming: Naming.mergeable, - partialProducts[row][col])); + propagate[row].add(partialProducts[row][col] + .named('propagate_r${row}_c$col', naming: Naming.mergeable)); } // Last row has extend sign propagation to Q start if (row == lastRow) { @@ -305,20 +307,16 @@ class CompactSignExtension extends PartialProductSignExtension { } } for (var col = 1; col < propagate[row].length; col++) { - propagate[row][col] = nameLogic( - 'propagate_r${row}_c$col', - naming: Naming.mergeable, - propagate[row][col] & propagate[row][col - 1]); + propagate[row][col] = (propagate[row][col] & propagate[row][col - 1]) + .named('propagate_r${row}_c$col', naming: Naming.mergeable); } } final m = List.generate(rows, (i) => List.filled(0, Logic(), growable: true)); for (var row = 0; row < rows; row++) { for (var c = 0; c < shift - 1; c++) { - m[row].add(nameLogic( - 'm_r${row}_c$c', - naming: Naming.mergeable, - partialProducts[row][c] ^ propagate[row][c])); + m[row].add((partialProducts[row][c] ^ propagate[row][c]) + .named('m_r${row}_c$c', naming: Naming.mergeable)); } m[row].addAll(List.filled(shift - 1, Logic())); } @@ -327,25 +325,19 @@ class CompactSignExtension extends PartialProductSignExtension { } // TODO(desmonddak): this seems unused when looking at Verilog output for (var i = shift - 1; i < m[lastRow].length; i++) { - m[lastRow][i] = nameLogic( - 'm_lastr_c$i', - naming: Naming.mergeable, - lastAddend[i] ^ - (i < alignRow0Sign ? propagate[lastRow][i] : Const(0))); + m[lastRow][i] = (lastAddend[i] ^ + (i < alignRow0Sign ? propagate[lastRow][i] : Const(0))) + .named('m_lastr_c$i', naming: Naming.mergeable); } final remainders = List.filled(rows, Logic()); for (var row = 0; row < lastRow; row++) { - remainders[row] = nameLogic( - 'remainders_r$row', - naming: Naming.mergeable, - propagate[row][shift - 1]); + remainders[row] = propagate[row][shift - 1] + .named('remainders_r$row', naming: Naming.mergeable); } remainders[lastRow] <= - nameLogic( - 'remainders_lastrow', - naming: Naming.mergeable, - propagate[lastRow][max(alignRow0Sign, 0)]); + propagate[lastRow][max(alignRow0Sign, 0)] + .named('remainders_lastrow', naming: Naming.mergeable); // Compute Sign extension for row==0 final firstSign = Logic(name: 'firstsign', naming: Naming.mergeable); @@ -357,8 +349,10 @@ class CompactSignExtension extends PartialProductSignExtension { SignBit(mux(selectSignedMultiplicand!, firstAddend.last, signs[0])); } final q = [ - nameLogic('q0', firstSign ^ remainders[lastRow]), - nameLogic('q1', ~(firstSign & ~remainders[lastRow])), + (firstSign ^ remainders[lastRow]) + .named('qfirst', naming: Naming.mergeable), + (~(firstSign & ~remainders[lastRow])) + .named('q_last', naming: Naming.mergeable), ]; q.insertAll(1, List.filled(shift - 1, ~q[1])); @@ -452,11 +446,10 @@ class StopBitsSignExtension extends PartialProductSignExtension { final signs = [ for (var r = 0; r < rows; r++) - nameLogic( - 'sign_r$r', - naming: Naming.mergeable, - encoder.fetchEncoding(r).sign, - ) + encoder + .fetchEncoding(r) + .sign + .named('sign_r$r', naming: Naming.mergeable) ]; for (var row = 0; row < rows; row++) { @@ -592,11 +585,10 @@ class CompactRectSignExtension extends PartialProductSignExtension { final signs = [ for (var r = 0; r < rows; r++) - nameLogic( - 'sign_r$r', - naming: Naming.mergeable, - encoder.fetchEncoding(r).sign, - ) + encoder + .fetchEncoding(r) + .sign + .named('sign_r$r', naming: Naming.mergeable) ]; // Compute propgation info for folding sign bits into main rows @@ -606,10 +598,8 @@ class CompactRectSignExtension extends PartialProductSignExtension { for (var row = 0; row < rows; row++) { propagate[row].add(SignBit(signs[row])); for (var col = 0; col < 2 * (shift - 1); col++) { - propagate[row].add(nameLogic( - 'propagate_r${row}_c$col', - naming: Naming.mergeable, - partialProducts[row][col])); + propagate[row].add(partialProducts[row][col] + .named('propagate_r${row}_c$col', naming: Naming.mergeable)); } // Last row has extend sign propagation to Q start if (row == lastRow) { @@ -620,10 +610,8 @@ class CompactRectSignExtension extends PartialProductSignExtension { } // Now compute the propagation logic for (var col = 1; col < propagate[row].length; col++) { - propagate[row][col] = nameLogic( - 'propagate_r${row}_c$col', - naming: Naming.mergeable, - propagate[row][col] & propagate[row][col - 1]); + propagate[row][col] = (propagate[row][col] & propagate[row][col - 1]) + .named('propagate_r${row}_c$col', naming: Naming.mergeable); } } @@ -632,8 +620,8 @@ class CompactRectSignExtension extends PartialProductSignExtension { List.generate(rows, (i) => List.filled(0, Logic(), growable: true)); for (var row = 0; row < rows; row++) { for (var c = 0; c < shift - 1; c++) { - m[row].add(nameLogic( - 'm_r${row}_c$c', partialProducts[row][c] ^ propagate[row][c])); + m[row].add((partialProducts[row][c] ^ propagate[row][c]) + .named('m_r${row}_c$c', naming: Naming.mergeable)); } m[row].addAll(List.filled(shift - 1, Logic())); } @@ -642,23 +630,18 @@ class CompactRectSignExtension extends PartialProductSignExtension { m[lastRow].add(Logic()); } for (var i = shift - 1; i < m[lastRow].length; i++) { - m[lastRow][i] = nameLogic( - 'm_lastrow_$i', - naming: Naming.mergeable, - lastAddend[i] ^ (i < align ? propagate[lastRow][i] : Const(0))); + m[lastRow][i] = + (lastAddend[i] ^ (i < align ? propagate[lastRow][i] : Const(0))) + .named('m_lastrow_$i', naming: Naming.mergeable); } final remainders = List.filled(rows, Logic()); for (var row = 0; row < lastRow; row++) { - remainders[row] = nameLogic( - 'remainder_r$row', - naming: Naming.mergeable, - propagate[row][shift - 1]); - } - remainders[lastRow] = nameLogic( - 'remainder_lastrow', - naming: Naming.mergeable, - propagate[lastRow][align > 0 ? align : 0]); + remainders[row] = propagate[row][shift - 1] + .named('remainder_r$row', naming: Naming.mergeable); + } + remainders[lastRow] = propagate[lastRow][align > 0 ? align : 0] + .named('remainder_lastrow', naming: Naming.mergeable); // Merge 'm' into the LSBs of each addend for (var row = 0; row < rows; row++) { diff --git a/lib/src/arithmetic/signals/fixed_point_logic.dart b/lib/src/arithmetic/signals/fixed_point_logic.dart index 9c24e1126..099830067 100644 --- a/lib/src/arithmetic/signals/fixed_point_logic.dart +++ b/lib/src/arithmetic/signals/fixed_point_logic.dart @@ -43,6 +43,7 @@ class FixedPoint extends Logic { } /// Clone for I/O ports. + @override FixedPoint clone({String? name}) => FixedPoint(signed: signed, m: m, n: n); /// Cast logic to fixed point diff --git a/lib/src/arithmetic/signals/floating_point_logic.dart b/lib/src/arithmetic/signals/floating_point_logic.dart index f2de02ff3..93dc69fb5 100644 --- a/lib/src/arithmetic/signals/floating_point_logic.dart +++ b/lib/src/arithmetic/signals/floating_point_logic.dart @@ -57,54 +57,46 @@ class FloatingPoint extends LogicStructure { /// Return a Logic true if this FloatingPoint contains a normal number, /// defined as having mantissa in the range [1,2) - late final Logic isNormal = nameLogic( - 'isNormal', - naming: Naming.mergeable, - exponent.neq(LogicValue.zero.zeroExtend(exponent.width))); + late final Logic isNormal = exponent + .neq(LogicValue.zero.zeroExtend(exponent.width)) + .named('isNormal', naming: Naming.mergeable); /// Return a Logic true if this FloatingPoint is Not a Number (NaN) /// by having its exponent field set to the NaN value (typically all /// ones) and a non-zero mantissa. - late final isNaN = nameLogic( - 'isNaN', - naming: Naming.mergeable, - exponent.eq(floatingPointValue.nan.exponent) & mantissa.or()); + late final isNaN = exponent.eq(floatingPointValue.nan.exponent) & + mantissa.or().named( + 'isNaN', + naming: Naming.mergeable, + ); /// Return a Logic true if this FloatingPoint is an infinity /// by having its exponent field set to the NaN value (typically all /// ones) and a zero mantissa. - late final isInfinity = nameLogic( - _nameJoin('isInfinity', name), - naming: Naming.mergeable, - exponent.eq(floatingPointValue.infinity.exponent) & ~mantissa.or()); + late final isInfinity = + (exponent.eq(floatingPointValue.infinity.exponent) & ~mantissa.or()) + .named(_nameJoin('isInfinity', name), naming: Naming.mergeable); /// Return a Logic true if this FloatingPoint is an zero /// by having its exponent field set to the NaN value (typically all /// ones) and a zero mantissa. - late final isZero = nameLogic( - 'isZero', - naming: Naming.mergeable, - exponent.eq(floatingPointValue.zero.exponent) & ~mantissa.or()); + late final isZero = + (exponent.eq(floatingPointValue.zero.exponent) & ~mantissa.or()) + .named('isZero', naming: Naming.mergeable); /// Return the zero exponent representation for this type of FloatingPoint - late final zeroExponent = nameLogic( - 'zeroExponent', - naming: Naming.mergeable, - Const(LogicValue.zero, width: exponent.width)); + late final zeroExponent = Const(LogicValue.zero, width: exponent.width) + .named('zeroExponent', naming: Naming.mergeable); /// Return the one exponent representation for this type of FloatingPoint - late final oneExponent = nameLogic( - 'oneExponent', - naming: Naming.mergeable, - Const(LogicValue.one, width: exponent.width)); + late final oneExponent = Const(LogicValue.one, width: exponent.width) + .named('oneExponent', naming: Naming.mergeable); /// Return the exponent Logic value representing the true zero exponent /// 2^0 = 1 often termed [bias] or the offset of the stored exponent. - late final bias = nameLogic( - 'bias', - naming: Naming.mergeable, - Const((1 << exponent.width - 1) - 1, width: exponent.width)); + late final bias = Const((1 << exponent.width - 1) - 1, width: exponent.width) + .named('bias', naming: Naming.mergeable); /// Construct a FloatingPoint that represents infinity for this FP type. FloatingPoint inf({Logic? sign, bool negative = false}) => FloatingPoint.inf( diff --git a/lib/src/encodings/tree_one_hot_to_binary.dart b/lib/src/encodings/tree_one_hot_to_binary.dart index a79a28518..1ee6f3746 100644 --- a/lib/src/encodings/tree_one_hot_to_binary.dart +++ b/lib/src/encodings/tree_one_hot_to_binary.dart @@ -41,8 +41,8 @@ class _NodeOneHotToBinary extends Module { } else { final mid = 1 << (log2Ceil(wid) - 1); addOutput('binary', width: log2Ceil(mid + 1)); - final hi = nameLogic('hi', onehot.getRange(mid).zeroExtend(mid)); - final lo = nameLogic('hi', onehot.getRange(0, mid).zeroExtend(mid)); + final hi = onehot.getRange(mid).zeroExtend(mid).named('hi'); + final lo = onehot.getRange(0, mid).zeroExtend(mid).named('lo'); final recurse = lo | hi; final response = _NodeOneHotToBinary(recurse).binary; binary <= [hi.or(), response].swizzle(); diff --git a/lib/src/utils.dart b/lib/src/utils.dart index 629944ac7..2001a4cfc 100644 --- a/lib/src/utils.dart +++ b/lib/src/utils.dart @@ -95,8 +95,3 @@ Logic condFlop( reset: reset, resetValue: resetValue, asyncReset: asyncReset))); - -/// Wrapper for constructing a new Logic with a name to bind to a Logic -/// operation. -Logic nameLogic(String name, Logic logic, {Naming? naming}) => - Logic(name: name, width: logic.width, naming: naming)..gets(logic);