Home Reference Source

src/setups/decompositions/toffoli2cnotandtgate.js

// """ Decompose the Toffoli gate into CNOT, H, T, and Tdagger gates. """
import {tuple} from '../../libs/util';
import Gates, {H, NOT, T} from '../../ops/gates';
import {CNOT} from '../../ops/shortcuts';
;
import DecompositionRule from '../../cengines/replacer/decompositionrule';

const {Tdag} = Gates

const _decompose_toffoli = (cmd) => {
  const ctrl = cmd.controlQubits

  const target = cmd.qubits[0]
  const c1 = ctrl[0]
  const c2 = ctrl[1]

  H.or(target)
  CNOT.or(tuple(c1, target))
  T.or(c1)
  Tdag.or(target)
  CNOT.or(tuple(c2, target))
  CNOT.or(tuple(c2, c1))
  Tdag.or(c1)
  T.or(target)
  CNOT.or(tuple(c2, c1))
  CNOT.or(tuple(c1, target))
  Tdag.or(target)
  CNOT.or(tuple(c2, target))
  T.or(target)
  T.or(c2)
  H.or(target)
}

const _recognize_toffoli = cmd => cmd.controlCount === 2

export default [
  new DecompositionRule(NOT.constructor, _decompose_toffoli, _recognize_toffoli)
]