def asynchronous_con_milp_constraint_rule(backend_model, loc_tech, timestep):
    """
    BigM limit set on `carrier_con`, forcing it to either be zero or non-zero,
    depending on whether `con` is zero or one, respectively.

    .. container:: scrolling-wrapper

        .. math::
            - \\boldsymbol{carrier_con}[loc::tech::carrier, timestep] \\leq
            \\text{bigM} \\times (1 - \\boldsymbol{prod_con_switch}[loc::tech, timestep])
            \\forall loc::tech \\in loc::techs_{asynchronous_prod_con},
            \\forall timestep \\in timesteps

    """
    model_dict = backend_model.__calliope_model_data
    loc_tech_carrier = model_dict['data']['lookup_loc_techs'][loc_tech]
    return -1 * backend_model.carrier_con[loc_tech_carrier, timestep] <= (1 -
        backend_model.prod_con_switch[loc_tech, timestep]) * backend_model.bigM
