libtlafmt 0.4.1

A formatter library for TLA+ specs, core of tlafmt
Documentation
---
source: libtlafmt/tests/format.rs
expression: output
input_file: libtlafmt/tests/corpus/InternalMemory.tla
---
---------------------------- MODULE InternalMemory -----------------------------
EXTENDS MemoryInterface
VARIABLES mem, ctl, buf
--------------------------------------------------------------------------------
IInit ==
    /\ mem \in [Adr -> Val]
    /\ ctl = [p \in Proc |-> "rdy"]
    /\ buf = [p \in Proc |-> NoVal]
    /\ memInt \in InitMemInt

TypeInvariant ==
    /\ mem \in [Adr -> Val]
    /\ ctl \in [Proc -> {"rdy", "busy", "done"}]
    /\ buf \in [Proc -> MReq \union Val \union {NoVal}]

Req(p) ==
    /\ ctl[p] = "rdy"
    /\ \E req \in MReq:
        /\ Send(p, req, memInt, memInt')
        /\ buf' = [buf EXCEPT ![p] = req]
        /\ ctl' = [ctl EXCEPT ![p] = "busy"]
    /\ UNCHANGED mem

Do(p) ==
    /\ ctl[p] = "busy"
    /\ mem' = IF buf[p].op = "Wr"
        THEN [mem EXCEPT ![buf[p].adr] = buf[p].val]
        ELSE mem
    /\ buf' = [buf EXCEPT ![p] = IF buf[p].op = "Wr"
        THEN NoVal
        ELSE mem[buf[p].adr]]
    /\ ctl' = [ctl EXCEPT ![p] = "done"]
    /\ UNCHANGED memInt

Rsp(p) ==
    /\ ctl[p] = "done"
    /\ Reply(p, buf[p], memInt, memInt')
    /\ ctl' = [ctl EXCEPT ![p] = "rdy"]
    /\ UNCHANGED << mem, buf >>

INext == \E p \in Proc: Req(p) \/ Do(p) \/ Rsp(p)

ISpec == IInit /\ [][INext]_<< memInt, mem, ctl, buf >>
--------------------------------------------------------------------------------
THEOREM ISpec => []TypeInvariant
================================================================================