Flash

Cubicle model

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.