Flash
Safety properties
Below are the safety properties we want to verify, in negated form.
Control properties:
∃ p. ( CacheState_home = CACHE_E ∧ CacheState[p] = CACHE_E )
∃ i,j. i≠j ∧ ( CacheState[i] = CACHE_E ∧ CacheState[j] = CACHE_E )
Data properties:
Dir_Dirty = False ∧ MemData ≠ CurrData
CacheState_home = CACHE_E ∧ CacheData_home ≠ CurrData
∃ p. ( CacheState[p] = CACHE_E ∧ CacheData[p] ≠ CurrData )
CacheState_home = CACHE_S ∧ Collecting = True ∧
CacheData_home ≠ PrevData
∃ p. ( CacheState[p] = CACHE_S ∧ Collecting = True ∧
CacheData[p] ≠ PrevData )
CacheState_home = CACHE_S ∧ Collecting = False ∧
CacheData_home ≠ CurrData
∃ p. ( CacheState[p] = CACHE_S ∧ Collecting = False ∧
CacheData[p] ≠ CurrData )
Options used
-brab 3 -forward-depth 14
Inferred invariants
All invariants are shown in their negated form, where
#1 and #2
are distinct existentially quantified variables.
Home <> #1 &&
Sort[#1] = Proc &&
ProcCmd[#1] = NODE_Get &&
UniMsg_Cmd[#1] = UNI_GetX
Dir_ShrVld = False &&
Sort[#1] = Proc &&
Dir_ShrSet[#1] = True
Home <> #1 &&
Dir_ShrVld = False &&
Sort[#1] = Proc &&
Dir_ShrSet[#1] = True
CacheState_home <> CACHE_E &&
Dir_Local = True &&
Dir_Dirty = True
Dir_Pending = False &&
Dir_Dirty = True &&
CacheState[#1] = CACHE_S
CacheState_home = CACHE_S &&
Dir_Pending = True
Dir_HeadVld = False &&
CacheState[#1] = CACHE_S &&
Dir_InvSet[#1] = False
UniMsg_Cmd_home = UNI_GetX &&
Dir_Local = True
CacheState[#1] = CACHE_S &&
UniMsg_Cmd[#1] = UNI_Get
Sort[#1] = Proc &&
CacheState[#1] = CACHE_S &&
UniMsg_Cmd[#1] = UNI_GetX
UniMsg_Cmd_home = UNI_GetX &&
CacheState[#1] = CACHE_S
Home <> #2 &&
Dir_Pending = False &&
Dir_ShrVld = False &&
Sort[#1] = Proc &&
Sort[#2] = Proc &&
CacheState[#1] = CACHE_S &&
CacheState[#2] = CACHE_S
Home <> #1 &&
Sort[#1] = Proc &&
ProcCmd[#1] = NODE_None &&
InvMarked[#1] = True
Home <> #1 &&
Sort[#1] = Proc &&
CacheState[#1] = CACHE_S &&
UniMsg_Cmd[#1] = UNI_GetX
Home <> #1 &&
Sort[#1] = Proc &&
CacheState[#1] = CACHE_S &&
UniMsg_Cmd[#1] = UNI_Get
Home <> #1 &&
Dir_Pending = False &&
Dir_Dirty = True &&
Sort[#1] = Proc &&
CacheState[#1] = CACHE_S
Home <> #1 &&
Dir_Pending = False &&
Dir_Dirty = True &&
Sort[#1] = Proc &&
InvMarked[#1] = False &&
UniMsg_Cmd[#1] = UNI_Put
Home <> #1 &&
Sort[#1] = Proc &&
CacheState[#1] = CACHE_S &&
UniMsg_Cmd[#1] = UNI_Nak
Home <> #1 &&
UniMsg_Cmd_home = UNI_GetX &&
Sort[#1] = Proc &&
CacheState[#1] = CACHE_S
Home <> #1 &&
UniMsg_Cmd_home = UNI_GetX &&
Sort[#1] = Proc &&
InvMarked[#1] = False &&
UniMsg_Cmd[#1] = UNI_Put
ShWbMsg_Cmd = SHWB_FAck &&
CacheState[#1] = CACHE_S
NakcMsg_Cmd = NAKC_Nakc &&
CacheState[#1] = CACHE_S
Home <> #1 &&
ShWbMsg_Cmd = SHWB_FAck &&
Sort[#1] = Proc &&
InvMarked[#1] = False &&
UniMsg_Cmd[#1] = UNI_Put
Home <> #1 &&
NakcMsg_Cmd = NAKC_Nakc &&
Sort[#1] = Proc &&
InvMarked[#1] = False &&
UniMsg_Cmd[#1] = UNI_Put
Home <> #1 &&
Sort[#1] = Proc &&
UniMsg_Cmd[#1] = UNI_Put &&
RpMsg_Cmd[#1] = RP_Replace
Dir_Local = True &&
ShWbMsg_Cmd = SHWB_FAck
Home <> #1 &&
UniMsg_Cmd_home = UNI_Put &&
Sort[#1] = Proc &&
InvMarked[#1] = False &&
UniMsg_Cmd[#1] = UNI_Put
Dir_Local = True &&
NakcMsg_Cmd = NAKC_Nakc
Home <> #1 &&
Sort[#1] = Proc &&
CacheState[#1] = CACHE_E &&
UniMsg_Cmd[#1] = UNI_Nak
Home <> #2 &&
Collecting = False &&
Sort[#2] = Proc &&
CacheState[#1] = CACHE_S &&
UniMsg_Cmd[#2] = UNI_PutX
UniMsg_Cmd_home = UNI_PutX &&
CacheState[#1] = CACHE_S
Dir_HeadVld = False &&
Collecting = False &&
CacheState[#1] = CACHE_S
Dir_Pending = True &&
Dir_ShrVld = True
WbMsg_Cmd = WB_Wb &&
CacheState[#1] = CACHE_S &&
Dir_InvSet[#1] = False
CacheState_home = CACHE_E &&
CacheState[#1] = CACHE_S &&
Dir_InvSet[#1] = False
CacheState_home = CACHE_I &&
Dir_Local = True &&
Dir_Dirty = True
Home <> #1 &&
UniMsg_Cmd_home = UNI_PutX &&
Sort[#1] = Proc &&
InvMarked[#1] = False &&
UniMsg_Cmd[#1] = UNI_Put
Home <> #1 &&
Dir_HeadVld = False &&
Collecting = False &&
Sort[#1] = Proc &&
InvMarked[#1] = False &&
UniMsg_Cmd[#1] = UNI_Put
Home <> #1 &&
Dir_ShrVld = True &&
Sort[#1] = Proc &&
InvMsg_Cmd[#1] = INV_InvAck
Home <> #1 &&
Dir_Local = True &&
Sort[#1] = Proc &&
UniMsg_Cmd[#1] = UNI_PutX
UniMsg_Cmd_home = UNI_Put &&
Dir_Pending = False
UniMsg_Cmd_home = UNI_PutX &&
Dir_Pending = False
Home <> #1 &&
Sort[#1] = Proc &&
CacheState[#1] = CACHE_E &&
UniMsg_Cmd[#1] = UNI_Get
Home <> #1 &&
Sort[#1] = Proc &&
CacheState[#1] = CACHE_E &&
UniMsg_Cmd[#1] = UNI_GetX
Home <> #1 &&
Dir_ShrVld = True &&
Sort[#1] = Proc &&
InvMsg_Cmd[#1] = INV_Inv
Home <> #1 &&
Sort[#1] = Proc &&
UniMsg_Cmd[#1] = UNI_PutX &&
InvMsg_Cmd[#1] = INV_InvAck
Home <> #1 &&
Sort[#1] = Proc &&
UniMsg_Cmd[#1] = UNI_PutX &&
InvMsg_Cmd[#1] = INV_Inv
Home <> #1 &&
Dir_HeadVld = False &&
Sort[#1] = Proc &&
UniMsg_Cmd[#1] = UNI_PutX
CacheState_home = CACHE_S &&
Dir_Local = False
Dir_ShrSet_home = True
CacheState_home = CACHE_S &&
Sort[#1] = Proc &&
CacheState[#1] = CACHE_E
Collecting = False &&
Sort[#2] = Proc &&
CacheState[#1] = CACHE_S &&
CacheState[#2] = CACHE_E
CacheState_home = CACHE_E &&
Collecting = False &&
CacheState[#1] = CACHE_S
Dir_Pending = True &&
Dir_Dirty = False &&
CacheState[#1] = CACHE_S &&
Dir_InvSet[#1] = False
ProcCmd_home = NODE_Get &&
Dir_Local = True
Home <> #1 &&
Sort[#1] = Proc &&
CacheState[#1] = CACHE_E &&
UniMsg_Cmd[#1] = UNI_Put
Home <> #1 &&
CacheState_home = CACHE_E &&
Collecting = False &&
Sort[#1] = Proc &&
InvMarked[#1] = False &&
UniMsg_Cmd[#1] = UNI_Put
CacheState_home = CACHE_E &&
Dir_Dirty = False
UniMsg_Cmd_home = UNI_GetX &&
Collecting = True
Home <> #1 &&
Sort[#1] = Proc &&
Dir_InvSet[#1] = False &&
InvMsg_Cmd[#1] = INV_InvAck
Home <> #1 &&
Dir_Local = True &&
Sort[#1] = Proc &&
CacheState[#1] = CACHE_E
Home <> #1 &&
Sort[#1] = Proc &&
Dir_InvSet[#1] = False &&
InvMsg_Cmd[#1] = INV_Inv
Home <> #1 &&
Sort[#1] = Proc &&
CacheState[#1] = CACHE_E &&
InvMsg_Cmd[#1] = INV_InvAck
Home <> #1 &&
Sort[#1] = Proc &&
CacheState[#1] = CACHE_E &&
InvMsg_Cmd[#1] = INV_Inv
Home <> #1 &&
Dir_HeadVld = False &&
Sort[#1] = Proc &&
CacheState[#1] = CACHE_E
Dir_HeadVld = False &&
ShWbMsg_Cmd = SHWB_ShWb
Dir_HeadVld = False &&
Dir_ShrVld = True
UniMsg_Cmd_home = UNI_GetX &&
ShWbMsg_Cmd = SHWB_FAck
UniMsg_Cmd_home = UNI_GetX &&
ShWbMsg_Cmd = SHWB_ShWb
Dir_Dirty = True &&
Dir_ShrVld = True
UniMsg_Cmd_home = UNI_GetX &&
Dir_Pending = False
UniMsg_Cmd_home = UNI_GetX &&
Dir_ShrVld = True
Home <> #1 &&
UniMsg_Cmd_home = UNI_GetX &&
Sort[#1] = Proc &&
InvMsg_Cmd[#1] = INV_Inv
Home <> #1 &&
ShWbMsg_Cmd = SHWB_ShWb &&
Sort[#1] = Proc &&
InvMsg_Cmd[#1] = INV_Inv
Home <> #1 &&
ShWbMsg_Cmd = SHWB_FAck &&
Sort[#1] = Proc &&
InvMsg_Cmd[#1] = INV_Inv
Home <> #1 &&
UniMsg_Cmd_home = UNI_PutX &&
Sort[#1] = Proc &&
InvMsg_Cmd[#1] = INV_Inv
Home <> #1 &&
UniMsg_Cmd_home = UNI_Put &&
Sort[#1] = Proc &&
InvMsg_Cmd[#1] = INV_Inv
Home <> #1 &&
NakcMsg_Cmd = NAKC_Nakc &&
Sort[#1] = Proc &&
InvMsg_Cmd[#1] = INV_Inv
Home <> #1 &&
UniMsg_Cmd_home = UNI_GetX &&
Sort[#1] = Proc &&
InvMsg_Cmd[#1] = INV_InvAck
Home <> #1 &&
Sort[#1] = Proc &&
ProcCmd[#1] <> NODE_Get &&
UniMsg_Cmd[#1] = UNI_Get
Home <> #1 &&
ShWbMsg_Cmd = SHWB_ShWb &&
Sort[#1] = Proc &&
InvMsg_Cmd[#1] = INV_InvAck
Home <> #1 &&
ShWbMsg_Cmd = SHWB_FAck &&
Sort[#1] = Proc &&
InvMsg_Cmd[#1] = INV_InvAck
Home <> #1 &&
Dir_Pending = False &&
Sort[#1] = Proc &&
InvMsg_Cmd[#1] = INV_Inv
Home <> #1 &&
UniMsg_Cmd_home = UNI_Put &&
Sort[#1] = Proc &&
InvMsg_Cmd[#1] = INV_InvAck
Dir_Pending = False &&
ShWbMsg_Cmd = SHWB_ShWb
CacheState_home = CACHE_E &&
ShWbMsg_Cmd = SHWB_ShWb
UniMsg_Cmd_home = UNI_Put &&
ShWbMsg_Cmd = SHWB_FAck
ShWbMsg_Cmd = SHWB_ShWb &&
NakcMsg_Cmd = NAKC_Nakc
ShWbMsg_Cmd = SHWB_FAck &&
NakcMsg_Cmd = NAKC_Nakc
UniMsg_Cmd_home = UNI_Put &&
NakcMsg_Cmd = NAKC_Nakc
UniMsg_Cmd_home = UNI_PutX &&
ShWbMsg_Cmd = SHWB_ShWb
Dir_Local = True &&
ShWbMsg_Cmd = SHWB_ShWb
Dir_Dirty = False &&
WbMsg_Cmd = WB_Wb
Dir_HeadVld = False &&
WbMsg_Cmd = WB_Wb
Home <> #1 &&
Sort[#1] = Proc &&
ProcCmd[#1] <> NODE_Get &&
UniMsg_Cmd[#1] = UNI_Put
Home <> #1 &&
UniMsg_Cmd_home = UNI_Get &&
Sort[#1] = Proc &&
InvMsg_Cmd[#1] = INV_Inv
Home <> #1 &&
Dir_Pending = False &&
Sort[#1] = Proc &&
InvMsg_Cmd[#1] = INV_InvAck
UniMsg_Cmd_home = UNI_Get &&
ShWbMsg_Cmd = SHWB_ShWb
UniMsg_Cmd_home = UNI_Get &&
ShWbMsg_Cmd = SHWB_FAck
UniMsg_Cmd_home = UNI_Put &&
ShWbMsg_Cmd = SHWB_ShWb
CacheState_home = CACHE_E &&
UniMsg_Cmd_home = UNI_Put
Dir_Dirty = False &&
ShWbMsg_Cmd = SHWB_ShWb
Dir_Pending = False &&
ShWbMsg_Cmd = SHWB_FAck
Dir_Pending = False &&
NakcMsg_Cmd = NAKC_Nakc
Home <> #1 &&
Sort[#1] = Proc &&
CacheState[#1] = CACHE_E &&
UniMsg_Cmd[#1] = UNI_PutX
UniMsg_Cmd_home = UNI_PutX &&
Dir_Dirty = False
UniMsg_Cmd_home = UNI_PutX &&
Dir_HeadVld = False
Home <> #1 &&
ShWbMsg_Cmd = SHWB_ShWb &&
Sort[#1] = Proc &&
UniMsg_Cmd[#1] = UNI_PutX
Home <> #1 &&
UniMsg_Cmd_home = UNI_Put &&
Sort[#1] = Proc &&
UniMsg_Cmd[#1] = UNI_PutX
Home <> #1 &&
UniMsg_Cmd_home = UNI_Get &&
Sort[#1] = Proc &&
InvMsg_Cmd[#1] = INV_InvAck
UniMsg_Cmd_home = UNI_Get &&
Dir_Pending = False
UniMsg_Cmd_home = UNI_Put &&
Dir_Dirty = False
ShWbMsg_Cmd = SHWB_ShWb &&
Collecting = True
ShWbMsg_Cmd = SHWB_FAck &&
Collecting = True
Home <> #1 &&
Home <> #2 &&
Sort[#1] = Proc &&
Sort[#2] = Proc &&
UniMsg_Cmd[#1] = UNI_PutX &&
UniMsg_Cmd[#2] = UNI_PutX
CacheState_home = CACHE_E &&
Dir_HeadVld = True
Home <> #1 &&
UniMsg_Cmd_home = UNI_PutX &&
Sort[#1] = Proc &&
UniMsg_Cmd[#1] = UNI_PutX
ShWbMsg_Cmd = SHWB_ShWb &&
CacheState[#1] = CACHE_E
Home <> #1 &&
Dir_Dirty = False &&
Sort[#1] = Proc &&
UniMsg_Cmd[#1] = UNI_PutX
UniMsg_Cmd_home = UNI_Put &&
CacheState[#1] = CACHE_E
Home <> #1 &&
Sort[#1] = Proc &&
CacheState[#1] = CACHE_S &&
InvMsg_Cmd[#1] = INV_InvAck
Sort[#1] = Data &&
CacheState[#1] = CACHE_S
UniMsg_Cmd_home = UNI_Get &&
Collecting = True
UniMsg_Cmd_home = UNI_Put &&
Collecting = True
Dir_Pending = False &&
Collecting = True
ShWbMsg_Cmd = SHWB_ShWb &&
ShWbMsg_Proc = Home
InvMarked_home = True
Home <> #1 &&
Sort[#1] = Proc &&
CacheState[#2] = CACHE_E &&
UniMsg_Cmd[#1] = UNI_PutX
Home <> #1 &&
CacheState_home = CACHE_E &&
Sort[#1] = Proc &&
UniMsg_Cmd[#1] = UNI_PutX
Dir_Dirty = False &&
CacheState[#1] = CACHE_E
CacheState_home = CACHE_S &&
Collecting = True
You can find the list of all invariants that can be extracted from BRAB here (also in negated form), this collection being inductive.
Search graph
The algorithm starts from the formula located at the bottom,
inside a red
octagon. Variables #1, #2,
… that appear
in the nodes are distinct skolem variables so we show a formula
φ(#1, #2) as equivalent to ∃
z1, z2.
z1 ≠ z2 ∧ φ(z1,
z2). Plain black edges represent
pre-image relations and are annotated by the transition instance that
was considered. Black circles denote nodes that were obtained by
pre-image computation and were not covered by already visited
nodes. The nodes circled in gray are the one that were not
useful because they were subsumed by formulas pointed by the
gray dashed
arrows. Approximations are shown
in blue rectangles. Each approximation originates from the node that
connects its rectangle with a bold dashed blue edge.