コード例 #1
0
def NEG(classical_reg: MemoryReferenceDesignator) -> ClassicalNeg:
    """
    Produce a NEG instruction.

    :param classical_reg: A classical memory address to modify.
    :return: A ClassicalNeg instance.
    """
    return ClassicalNeg(unpack_classical_reg(classical_reg))
コード例 #2
0
def unpack_reg_val_pair(
    classical_reg1: MemoryReferenceDesignator,
    classical_reg2: Union[MemoryReferenceDesignator, int, float],
) -> Tuple[MemoryReference, Union[MemoryReference, int, float]]:
    """
    Helper function for typechecking / type-coercing arguments to constructors for binary classical
    operators.

    :param classical_reg1: Specifier for the classical memory address to be modified.
    :param classical_reg2: Specifier for the second argument: a classical memory address or an
        immediate value.
    :return: A pair of pyQuil objects suitable for use as operands.
    """
    left = unpack_classical_reg(classical_reg1)
    if isinstance(classical_reg2, (float, int)):
        return left, classical_reg2
    return left, unpack_classical_reg(classical_reg2)
コード例 #3
0
def STORE(region_name, offset_reg, source):
    """
    Produce a STORE instruction.

    :param region_name: Named region of memory to store to.
    :param offset_reg: Offset into memory region. Must be a MemoryReference.
    :param source: Source data. Can be either a MemoryReference or a constant.
    :return: A ClassicalStore instance.
    """
    return ClassicalStore(region_name, unpack_classical_reg(offset_reg), source)
コード例 #4
0
def prepare_ternary_operands(classical_reg1, classical_reg2, classical_reg3):
    """
    Helper function for typechecking / type-coercing arguments to constructors for ternary classical operators.

    :param classical_reg1: Specifier for the classical memory address to be modified.
    :param classical_reg2: Specifier for the left operand: a classical memory address.
    :param classical_reg3: Specifier for the right operand: a classical memory address or an immediate value.
    :return: A triple of pyQuil objects suitable for use as operands.
    """
    if isinstance(classical_reg1, int):
        raise TypeError("Target operand of comparison must be a memory address")
    classical_reg1 = unpack_classical_reg(classical_reg1)
    if isinstance(classical_reg2, int):
        raise TypeError("Left operand of comparison must be a memory address")
    classical_reg2 = unpack_classical_reg(classical_reg2)
    if not isinstance(classical_reg3, int):
        classical_reg3 = unpack_classical_reg(classical_reg3)

    return classical_reg1, classical_reg2, classical_reg3
コード例 #5
0
def MEASURE(qubit, classical_reg=None):
    """
    Produce a MEASURE instruction.

    :param qubit: The qubit to measure.
    :param classical_reg: The classical register to measure into, or None.
    :return: A Measurement instance.
    """
    qubit = unpack_qubit(qubit)
    address = None if classical_reg is None else unpack_classical_reg(classical_reg)
    return Measurement(qubit, address)
コード例 #6
0
ファイル: gates.py プロジェクト: vishalbelsare/pyquil
def MEASURE(qubit: QubitDesignator, classical_reg: Optional[MemoryReferenceDesignator]) -> Measurement:
    """
    Produce a MEASURE instruction.

    :param qubit: The qubit to measure.
    :param classical_reg: The classical register to measure into, or None.
    :return: A Measurement instance.
    """
    qubit = unpack_qubit(qubit)
    if classical_reg is None:
        address = None
    else:
        address = unpack_classical_reg(classical_reg)
    return Measurement(qubit, address)
コード例 #7
0
ファイル: gates.py プロジェクト: vishalbelsare/pyquil
def RAW_CAPTURE(
    frame: Frame,
    duration: float,
    memory_region: MemoryReferenceDesignator,
    nonblocking: bool = False,
) -> RawCapture:
    """
    Produce a RAW-CAPTURE instruction.

    :param frame: The frame on which to capture raw values.
    :param duration: The duration of the capture, in seconds.
    :param memory_region: The classical memory region to store the resulting raw values.
    :param nonblocking: A flag indicating whether the capture is NONBLOCKING.
    :returns: A RawCapture instance.
    """
    memory_region = unpack_classical_reg(memory_region)
    return RawCapture(frame, duration, memory_region, nonblocking)
コード例 #8
0
ファイル: gates.py プロジェクト: vishalbelsare/pyquil
def CAPTURE(
    frame: Frame,
    kernel: Waveform,
    memory_region: MemoryReferenceDesignator,
    nonblocking: bool = False,
) -> Capture:
    """
    Produce a CAPTURE instruction.

    :param frame: The frame on which to capture an IQ value.
    :param kernel: The integrating kernel for the capture.
    :param memory_region: The classical memory region to store the resulting IQ value.
    :param nonblocking: A flag indicating whether the capture is NONBLOCKING.
    :returns: A Capture instance.
    """
    memory_region = unpack_classical_reg(memory_region)
    return Capture(frame, kernel, memory_region, nonblocking)
コード例 #9
0
ファイル: quil.py プロジェクト: lupify/pyquil
    def if_then(
        self,
        classical_reg: MemoryReferenceDesignator,
        if_program: "Program",
        else_program: Optional["Program"] = None,
    ) -> "Program":
        """
        If the classical register at index classical reg is 1, run if_program, else run
        else_program.

        Equivalent to the following construction:

        .. code::

            IF [c]:
               instrA...
            ELSE:
               instrB...
            =>
              JUMP-WHEN @THEN [c]
              instrB...
              JUMP @END
              LABEL @THEN
              instrA...
              LABEL @END

        :param classical_reg: The classical register to check as the condition
        :param if_program: A Quil program to execute if classical_reg is 1
        :param else_program: A Quil program to execute if classical_reg is 0. This
            argument is optional and defaults to an empty Program.
        :returns: The Quil Program with the branching instructions added.
        """
        else_program = else_program if else_program is not None else Program()

        label_then = LabelPlaceholder("THEN")
        label_end = LabelPlaceholder("END")
        self.inst(
            JumpWhen(target=label_then,
                     condition=unpack_classical_reg(classical_reg)))
        self.inst(else_program)
        self.inst(Jump(label_end))
        self.inst(JumpTarget(label_then))
        self.inst(if_program)
        self.inst(JumpTarget(label_end))
        return self
コード例 #10
0
ファイル: gates.py プロジェクト: timasq/pyquil
def MEASURE(qubit, classical_reg=None):
    """
    Produce a MEASURE instruction.

    :param qubit: The qubit to measure.
    :param classical_reg: The classical register to measure into, or None.
    :return: A Measurement instance.
    """
    qubit = unpack_qubit(qubit)
    if classical_reg is None:
        address = None
    elif isinstance(classical_reg, int):
        warn("Indexing measurement addresses by integers is deprecated. " +
             "Replacing this with the MemoryReference ro[i] instead.")
        address = MemoryReference("ro", classical_reg)
    else:
        address = unpack_classical_reg(classical_reg)
    return Measurement(qubit, address)