Wallace tree

basic principle known from manual multiplication
Example of reduction on 8x8 multiplier

A Wallace tree is an efficient hardware implementation of a digital circuit that multiplies two integers, devised by Australian Computer Scientist Chris Wallace in 1964.[1]

The Wallace tree has three steps:

  1. Multiply (that is - AND) each bit of one of the arguments, by each bit of the other, yielding n^2 results. Depending on position of the multiplied bits, the wires carry different weights, for example wire of bit carrying result of a_2 b_3 is 32 (see explanation of weights below).
  2. Reduce the number of partial products to two by layers of full and half adders.
  3. Group the wires in two numbers, and add them with a conventional adder.[2]

The second phase works as follows. As long as there are three or more wires with the same weight add a following layer:

The benefit of the Wallace tree is that there are only O(\log n) reduction layers, and each layer has O(1) propagation delay. As making the partial products is O(1) and the final addition is O(\log n), the multiplication is only O(\log n), not much slower than addition (however, much more expensive in the gate count). Naively adding partial products with regular adders would require O(\log^2n) time. From a complexity theoretic perspective, the Wallace tree algorithm puts multiplication in the class NC1.

These computations only consider gate delays and don't deal with wire delays, which can also be very substantial.

The Wallace tree can be also represented by a tree of 3/2 or 4/2 adders.

It is sometimes combined with Booth encoding.[3][4]

Weights explained

The weight of a wire is the radix (to base 2) of the digit that the wire carries. In general, a_nb_m have indexes of n and m; and since 2^n 2^m = 2^{n + m} the weight of a_n b_m is 2^{n + m}.

Example

n=4, multiplying a_3a_2a_1a_0 by b_3b_2b_1b_0:

  1. First we multiply every bit by every bit:
    • weight 1 - a_0b_0
    • weight 2 - a_0b_1, a_1b_0
    • weight 4 - a_0b_2, a_1b_1, a_2b_0
    • weight 8 - a_0b_3, a_1b_2, a_2b_1, a_3b_0
    • weight 16 - a_1b_3, a_2b_2, a_3b_1
    • weight 32 - a_2b_3, a_3b_2
    • weight 64 - a_3b_3
  2. Reduction layer 1:
    • Pass the only weight-1 wire through, output: 1 weight-1 wire
    • Add a half adder for weight 2, outputs: 1 weight-2 wire, 1 weight-4 wire
    • Add a full adder for weight 4, outputs: 1 weight-4 wire, 1 weight-8 wire
    • Add a full adder for weight 8, and pass the remaining wire through, outputs: 2 weight-8 wires, 1 weight-16 wire
    • Add a full adder for weight 16, outputs: 1 weight-16 wire, 1 weight-32 wire
    • Add a half adder for weight 32, outputs: 1 weight-32 wire, 1 weight-64 wire
    • Pass the only weight-64 wire through, output: 1 weight-64 wire
  3. Wires at the output of reduction layer 1:
    • weight 1 - 1
    • weight 2 - 1
    • weight 4 - 2
    • weight 8 - 3
    • weight 16 - 2
    • weight 32 - 2
    • weight 64 - 2
  4. Reduction layer 2:
    • Add a full adder for weight 8, and half adders for weights 4, 16, 32, 64
  5. Outputs:
    • weight 1 - 1
    • weight 2 - 1
    • weight 4 - 1
    • weight 8 - 2
    • weight 16 - 2
    • weight 32 - 2
    • weight 64 - 2
    • weight 128 - 1
  6. Group the wires into a pair of integers and an adder to add them.

See also

References

  1. C. S. Wallace, A suggestion for a fast multiplier, IEEE Trans. on Electronic Comp. EC-13(1): 14-17 (1964)
  2. Veech engineering Archived February 15, 2010 at the Wayback Machine
  3. Tufts university Archived June 17, 2010 at the Wayback Machine
  4. University of Massachusetts, Amherst Archived February 6, 2011 at the Wayback Machine

External links

This article is issued from Wikipedia - version of the Monday, February 15, 2016. The text is available under the Creative Commons Attribution/Share Alike but additional terms may apply for the media files.