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/ChannelRefinement.tla
---
--------------------------- MODULE ChannelRefinement ---------------------------
EXTENDS Naturals, Sequences
VARIABLES h, l

ErrorVal == CHOOSE v: v \notin [val: 1..12, rdy: {0, 1}, ack: {0, 1}]

    BitSeqToNat[s \in Seq({0, 1})] ==
        IF s = <<>> THEN 0 ELSE Head(s) + 2 * BitSeqToNat[Tail(s)]

H == INSTANCE Channel WITH chan <- h, Data <- 1..12
L == INSTANCE Channel WITH chan <- l, Data <- {0,1}
--------------------------------- MODULE Inner ---------------------------------
VARIABLE bitsSent

Init ==
    /\ bitsSent = <<>>
    /\ IF L!Init THEN H!Init
        ELSE h = ErrorVal

SendBit == \E b \in {0, 1}:
    /\ L!Send(b)
    /\ IF Len(bitsSent) < 3
        THEN
            /\ bitsSent' = << b >> \o bitsSent
            /\ UNCHANGED h
        ELSE
            /\ bitsSent' = <<>>
            /\ H!Send(BitSeqToNat[<<b>> \o bitsSent])

RcvBit ==
    /\ L!Rcv
    /\ IF bitsSent = <<>> THEN H!Rcv
        ELSE UNCHANGED h
    /\ UNCHANGED bitsSent

Error ==
    /\ l' /= l
    /\ ~((\E b \in {0, 1}: L!Send(b) ) \/ L!Rcv )
    /\ h' = ErrorVal

Next == SendBit \/ RcvBit \/ Error

InnerIR == Init /\ [][Next]_<< l, h, bitsSent >>
================================================================================
I(bitsSent) == INSTANCE Inner
IR == \EE bitsSent : I(bitsSent)!InnerIR
================================================================================