Skip to content

Instantly share code, notes, and snippets.

@gterzian
Last active March 17, 2025 16:37
Show Gist options
  • Save gterzian/60a5b17a031ada33425f04d46e7ed353 to your computer and use it in GitHub Desktop.
Save gterzian/60a5b17a031ada33425f04d46e7ed353 to your computer and use it in GitHub Desktop.
-------------------------- MODULE CanvasRenderingBlocking --------------------------
EXTENDS FiniteSets, Integers, Sequences
VARIABLES images_updated, display_lists_applied, compositor_messages, canvas_state
CONSTANT N
----------------------------------------------------------------------------
Messages == {"DISPLAY_LIST", "UPDATE_IMAGE"}
CanvasState == {"PENDING", "UPDATED"}
TypeOk == /\ images_updated \in Int
/\ display_lists_applied \in Int
/\ compositor_messages \in Seq(Messages)
/\ canvas_state \in CanvasState
ImageUpdatesAndDisplayListsInSync == \/ images_updated = display_lists_applied
\/ images_updated = display_lists_applied + 1
Init == /\ images_updated = 0
/\ display_lists_applied = 0
/\ compositor_messages = <<>>
/\ canvas_state = "PENDING"
\* Layout blocks on canvas update.
LayoutSendsDisplayList == /\ compositor_messages' = Append(compositor_messages, "DISPLAY_LIST")
/\ canvas_state = "UPDATED"
/\ canvas_state' = "PENDING"
/\ UNCHANGED<<images_updated, display_lists_applied>>
CanvasSendsUpdateImage ==
\* Limiting model size with first two conditions.
/\ images_updated < N
/\ Len(compositor_messages) < 2
/\ compositor_messages' = Append(compositor_messages, "UPDATE_IMAGE")
/\ canvas_state' = "UPDATED"
/\ canvas_state = "PENDING"
/\ UNCHANGED<<images_updated, display_lists_applied>>
CompositorReceivesMessage ==
LET msg == Head(compositor_messages)
IN /\ Len(compositor_messages) # 0
/\ CASE msg = "DISPLAY_LIST" ->
/\ display_lists_applied' = display_lists_applied + 1
/\ UNCHANGED<<images_updated, canvas_state>>
[] msg = "UPDATE_IMAGE" ->
/\ images_updated' = images_updated + 1
/\ UNCHANGED<<display_lists_applied, canvas_state>>
/\ compositor_messages' = Tail(compositor_messages)
\* End with infinite stuttering steps.
Done == /\ images_updated = N
/\ UNCHANGED<<images_updated,
display_lists_applied,
compositor_messages,
canvas_state>>
Next == \/ LayoutSendsDisplayList
\/ CanvasSendsUpdateImage
\/ CompositorReceivesMessage
\/ Done
Spec == Init /\ [][Next]_<<images_updated,
display_lists_applied,
compositor_messages,
canvas_state>>
----------------------------------------------------------------------------
THEOREM Spec => [](TypeOk /\ ImageUpdatesAndDisplayListsInSync)
=============================================================================
@gterzian
Copy link
Author

gterzian commented Mar 16, 2025

Screenshot 2025-03-16 at 5 57 32 PM

Results OK, with N = 3

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment