def implicitly_declare_ro(instructions: List[AbstractInstruction]):
    """
    Implicitly declare a register named ``ro`` for backwards compatibility with Quil 1.

    There used to be one un-named hunk of classical memory. Now there are variables with
    declarations. Instead of::

        MEASURE 0 [0]

    You must now measure into a named register, idiomatically::

        MEASURE 0 ro[0]

    The ``MEASURE`` instruction will emit this (with a deprecation warning) if you're still
    using bare integers for classical addresses. However, you must also declare memory in the
    new scheme::

        DECLARE ro BIT[8]
        MEASURE 0 ro[0]

    This method will determine if you are in "backwards compatibility mode" and will declare
    a read-out ``ro`` register for you. If you program contains any DECLARE commands or if it
    does not have any MEASURE x ro[x], this will not do anything.

    This behavior is included for backwards compatibility and will be removed in future releases
    of PyQuil. Please DECLARE all memory including ``ro``.
    """
    ro_addrs: List[int] = []
    for instr in instructions:
        if isinstance(instr, Declare):
            # The user has declared their own memory
            # so they are responsible for all declarations and memory references.
            return instructions

        if isinstance(instr, Measurement):
            if instr.classical_reg is None:
                continue

            if instr.classical_reg.name == 'ro':
                ro_addrs += [instr.classical_reg.offset]
            else:
                # The user has used a classical register named something other than "ro"
                # so they are responsible for all declarations and memory references.
                return instructions

    if len(ro_addrs) == 0:
        return instructions

    warnings.warn("Please DECLARE all memory. I'm adding a declaration for the `ro` register, "
                  "but I won't do this for you in the future.")

    new_instr = instructions.copy()
    new_instr.insert(0, Declare(name='ro', memory_type='BIT', memory_size=max(ro_addrs) + 1))
    return new_instr
Implicitly declare a register named ``ro`` for backwards compatibility with Quil 1.

    There used to be one un-named hunk of classical memory. Now there are variables with
    declarations. Instead of::

        MEASURE 0 [0]

    You must now measure into a named register, idiomatically::

        MEASURE 0 ro[0]

    The ``MEASURE`` instruction will emit this (with a deprecation warning) if you're still
    using bare integers for classical addresses. However, you must also declare memory in the
    new scheme::

        DECLARE ro BIT[8]
        MEASURE 0 ro[0]

    This method will determine if you are in "backwards compatibility mode" and will declare
    a read-out ``ro`` register for you. If you program contains any DECLARE commands or if it
    does not have any MEASURE x ro[x], this will not do anything.

    This behavior is included for backwards compatibility and will be removed in future releases
    of PyQuil. Please DECLARE all memory including ``ro``.