ReductionTree constructor
Generate a tree based on dividing the input sequence
of a node into
segments, recursively constructing radix
child nodes to operate
on each segment.
sequence
is the input sequence to be reduced using the tree of operations.- Logic Function(List
inputs, {String name}) operation
is the operation to be performed at each node. Note thatoperation
can widen the output. The logic function must support the operation for 2 to radix inputs. radix
is the width of reduction at each node in the tree (e.g., binary: radix=2).signExtend
if true, use sign-extension to widen Logic values as needed in the tree, otherwise use zero-extension (default).
Optional parameters to be used for creating a pipelined computation tree:
clk
,reset
,enable
are optionally provided to allow for flopping.depthToFlop
specifies how many nodes deep separate flops.
Implementation
ReductionTree(List<Logic> sequence, this.operation,
{this.radix = 2,
this.signExtend = false,
this.depthToFlop,
Logic? clk,
Logic? enable,
Logic? reset,
super.name = 'reduction_tree'})
: super(definitionName: 'ReductionTree_R${radix}_L${sequence.length}}') {
if (sequence.isEmpty) {
throw RohdHclException("Don't use ReductionTree "
'with an empty sequence');
}
sequence = [
for (var i = 0; i < sequence.length; i++)
addInput('seq$i', sequence[i], width: sequence[i].width)
];
this.clk = (clk != null) ? addInput('clk', clk) : null;
this.enable = (enable != null) ? addInput('enable', enable) : null;
this.reset = (reset != null) ? addInput('reset', reset) : null;
_computed = reductionTreeRecurse(sequence);
addOutput('out', width: _computed.value.width) <= _computed.value;
}