---
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
================================================================================