Library zoo.iris.base_logic.lib.prop_spsc

Require Import iris.base_logic.lib.invariants.

Require Import zoo.prelude.
Require Import zoo.common.countable.
Require Export zoo.iris.base_logic.lib.base.
Require Import zoo.iris.base_logic.lib.excl.
Require Import zoo.iris.base_logic.lib.oneshot.
Require Import zoo.iris.diaframe.
Require Import zoo.options.

Class PropSpscG Σ `{inv۰G : !invGS Σ} :=
  { #[local] prop_spsc۰G۰state۰G :: OneshotG Σ () ()
  ; #[local] prop_spsc۰G۰consumer۰G :: ExclG Σ unitO
  }.

Definition prop_spsc۰Σ :=
  #[oneshot۰Σ () ()
  ; excl۰Σ unitO
  ].
#[global] Instance subGprop_spsc۰Σ Σ `{inv۰G : !invGS Σ} :
  subG prop_spsc۰Σ Σ
  PropSpscG Σ.

Section prop_spsc۰G.
  Context `{prop_spsc۰G : PropSpscG Σ}.

  Implicit Type P : iProp Σ.

  Record prop_spsc۰name :=
    { prop_spsc۰name۰state : gname
    ; prop_spsc۰name۰consumer : gname
    }.
  Implicit Type γ : prop_spsc۰name.

  #[global] Instance prop_spsc۰nameeq_dec : EqDecision prop_spsc۰name :=
    ltac:(solve_decision).
  #[global] Instance prop_spsc۰namecountable :
    Countable prop_spsc۰name.

  #[local] Definition state۰unset₁' γ_state :=
    oneshot۰pending γ_state (DfracOwn (2/3)) ().
  #[local] Definition state۰unset₁ γ :=
    state۰unset₁' γ.(prop_spsc۰name۰state).
  #[local] Definition state۰unset₂' γ_state :=
    oneshot۰pending γ_state (DfracOwn (1/3)) ().
  #[local] Definition state۰unset₂ γ :=
    state۰unset₂' γ.(prop_spsc۰name۰state).
  #[local] Definition state۰set' γ_state :=
    oneshot۰shot γ_state ().
  #[local] Definition state۰set γ :=
    state۰set' γ.(prop_spsc۰name۰state).

  #[local] Definition consumer' γ_consumer :=
    excl γ_consumer ().
  #[local] Definition consumer γ :=
    consumer' γ.(prop_spsc۰name۰consumer).

  #[local] Definition inv۰consumer γ P : iProp Σ :=
    P consumer γ.
  #[local] Instance : CustomIpat "inv۰consumer" :=
    " [ HP{_{!}} | >Hconsumer{_{!}} ] ".
  #[local] Definition inv۰inner γ P : iProp Σ :=
    ( state۰unset₂ γ
    ) (
      state۰set γ
      inv۰consumer γ P
    ).
  #[local] Instance : CustomIpat "inv۰inner" :=
    " [ >Hstate_unset₂ | ( >Hstate_set{_{!}} & Hinv_consumer ) ] ".
  Definition prop_spsc۰inv γ ι P :=
    inv ι (inv۰inner γ P).
  #[local] Instance : CustomIpat "inv" :=
    " #Hinv ".

  Definition prop_spsc۰producer :=
    state۰unset₁.
  #[local] Instance : CustomIpat "producer" :=
    " Hstate_unset₁ ".

  Definition prop_spsc۰consumer :=
    consumer.
  #[local] Instance : CustomIpat "consumer" :=
    " Hconsumer ".

  Definition prop_spsc۰resolved :=
    state۰set.
  #[local] Instance : CustomIpat "resolved" :=
    " #Hstate_set ".

  #[global] Instance prop_spsc۰invcontractive γ ι :
    Contractive (prop_spsc۰inv γ ι).
  #[global] Instance prop_spsc۰invne γ ι :
    NonExpansive (prop_spsc۰inv γ ι).
  #[global] Instance prop_spsc۰invproper γ ι :
    Proper ((≡) ==> (≡)) (prop_spsc۰inv γ ι).

  #[global] Instance prop_spsc۰producertimeless γ :
    Timeless (prop_spsc۰producer γ).
  #[global] Instance prop_spsc۰consumertimeless γ :
    Timeless (prop_spsc۰consumer γ).
  #[global] Instance prop_spsc۰resolvedtimeless γ :
    Timeless (prop_spsc۰resolved γ).

  #[global] Instance prop_spsc۰invpersistent γ ι P :
    Persistent (prop_spsc۰inv γ ι P).
  #[global] Instance prop_spsc۰resolvedpersistent γ :
    Persistent (prop_spsc۰resolved γ).

  #[local] Lemma statealloc :
     |==>
       γ_state,
      state۰unset₁' γ_state
      state۰unset₂' γ_state.
  #[local] Lemma state۰unset₁exclusive γ :
    state۰unset₁ γ -∗
    state۰unset₁ γ -∗
    False.
  #[local] Lemma state۰unset₁set γ :
    state۰unset₁ γ -∗
    state۰set γ -∗
    False.
  #[local] Lemma state۰unset₂set γ :
    state۰unset₂ γ -∗
    state۰set γ -∗
    False.
  #[local] Lemma stateupdate γ :
    state۰unset₁ γ -∗
    state۰unset₂ γ ==∗
    state۰set γ.

  #[local] Lemma consumeralloc :
     |==>
       γ_consumer,
      consumer' γ_consumer.
  #[local] Lemma consumerexclusive γ :
    consumer γ -∗
    consumer γ -∗
    False.

  Lemma prop_spscalloc ι P E :
     |={E}=>
       γ,
      prop_spsc۰inv γ ι P
      prop_spsc۰producer γ
      prop_spsc۰consumer γ.

  Lemma prop_spsc۰producerexclusive γ :
    prop_spsc۰producer γ -∗
    prop_spsc۰producer γ -∗
    False.
  Lemma spcc_prop۰producerresolved γ :
    prop_spsc۰producer γ -∗
    prop_spsc۰resolved γ -∗
    False.

  Lemma prop_spsc۰consumerexclusive γ :
    prop_spsc۰consumer γ -∗
    prop_spsc۰consumer γ -∗
    False.

  Lemma prop_spscproduce γ ι P E :
    ι E
    prop_spsc۰inv γ ι P -∗
    prop_spsc۰producer γ -∗
     P ={E}=∗
    prop_spsc۰resolved γ.
  Lemma prop_spscconsume γ ι P E :
    ι E
    prop_spsc۰inv γ ι P -∗
    prop_spsc۰consumer γ -∗
    prop_spsc۰resolved γ ={E}=∗
     P.
End prop_spsc۰G.

#[global] Opaque prop_spsc۰inv.
#[global] Opaque prop_spsc۰producer.
#[global] Opaque prop_spsc۰consumer.
#[global] Opaque prop_spsc۰resolved.