Skip to content

Examples

This page contains some examples you can use to learn language features and see how they are used in practice.

Bell State - but a bit refactored

qfunc H(inout target: qbit);
qfunc CX(inout control: qbit, inout target: qbit);
qfunc allocate<num_qubits: int>(output out : qbit[num_qubits]);

qfunc main(output a: qbit, output b: qbit) {
    allocate<1>(a);
    allocate<1>(b);
    bell_state(a, b);
}

qfunc bell_state(inout a: qbit, inout b: qbit) {
   H(a);
   CX(a, b);
}

this is the same Bell state you can see in the default example, but with some logic extracted to a function

GHZ

qfunc H(inout target : qbit);
qfunc CX(inout control: qbit, inout target : qbit);
qfunc allocate<num_qubits: int>(output out : qbit[num_qubits]);

qfunc main(output a: qbit, output b: qbit, output c: qbit) {
    allocate<1>(a);
    allocate<1>(b);
    allocate<1>(c);
    ghz(a, b, c);
}

qfunc ghz(inout a: qbit, inout b: qbit, inout c: qbit) {
    bell_state(a, b);
    CX(b, c);
}

qfunc bell_state(inout ctrl: qbit, inout target: qbit) {
   H(ctrl);
   CX(ctrl, target);
}

Declaring Functions from the engine

In this example, non-default functions declarations are demonstrated

qfunc H(inout target : qbit);
qfunc CX(inout control: qbit, inout target : qbit);
qfunc X(inout target : qbit);
qfunc Y(inout target : qbit);
qfunc Z(inout target : qbit);
qfunc allocate<num_qubits: int>(output out : qbit[num_qubits]);

qfunc main(output a: qbit, output b: qbit, output c: qbit) {
    allocate<1>(a);
    allocate<1>(b);
    allocate<1>(c);
    ghz(a, b, c);
}

qfunc ghz(inout a: qbit, inout b: qbit, inout c: qbit) {
    bell_state(a, b);
    CX(b, c);
}

qfunc bell_state(inout ctrl: qbit, inout target: qbit) {
   H(ctrl);
   CX(ctrl, target);
}

this is the output circuit, after synthesis:

Declared Functions Example

The full set of supported declaration as of now is:

qfunc H(inout target : qbit);
qfunc X(inout target : qbit);
qfunc Y(inout target : qbit);
qfunc Z(inout target : qbit);
qfunc I(inout target : qbit);
qfunc S(inout target : qbit);
qfunc T(inout target : qbit);
qfunc SDG(inout target : qbit);
qfunc TDG(inout target : qbit);
qfunc PHASE<theta: real>(inout target: qbit);
qfunc RX<theta: real>(inout target: qbit);
qfunc RY<theta: real>(inout target: qbit);
qfunc RZ<theta: real>(inout target: qbit);
qfunc RXX<theta: real>(inout target: qbit[2]);
qfunc RYY<theta: real>(inout target: qbit[2]);
qfunc RZZ<theta: real>(inout target: qbit[2]);
qfunc CH(inout control: qbit, inout target : qbit);
qfunc CX(inout control: qbit, inout target : qbit);
qfunc CY(inout control: qbit, inout target : qbit);
qfunc CZ(inout control: qbit, inout target : qbit);
qfunc CRX<theta: real>(inout control: qbit, inout target : qbit);
qfunc CRY<theta: real>(inout control: qbit, inout target : qbit);
qfunc CRZ<theta: real>(inout control: qbit, inout target : qbit);
qfunc CPHASE<theta: real>(inout control: qbit, inout target : qbit);
qfunc SWAP(inout qbit0: qbit, inout qbit1 : qbit);
qfunc U<theta: real, phi: real, lam: real, gam: real>(inout target : qbit);
qfunc allocate<num_qubits: int>(output out : qbit[num_qubits]);