Simuliris Coq development
This repository contains the Coq development of Simuliris (paper presented at POPL22: https://iris-project.org/pdfs/2022-popl-simuliris.pdf).
Prerequisites
This version is known to compile with:
- Coq 8.20.0
- A development version of Iris
- A recent version of Coq-Equations
Building from source
When building from source, we recommend to use opam (2.0.0 or newer) for installing the dependencies. This requires the following two repositories:
opam repo add coq-released https://coq.inria.fr/opam/released
opam repo add iris-dev https://gitlab.mpi-sws.org/iris/opam.git
Once you got opam set up, run make build-dep
to install the right versions
of the dependencies.
Structure
The project follows the following structure below the theories
folder:
-
logic
andbase_logic
contain libraries for defining fixpoints as well as general ghost state constructions. -
simulation
contains the language-generic parts of the framework, in particular the definition of the simulation relation and the general adequacy proof.-
language.v
contains our generic language interface. -
slsls.v
defines the simulation relation, weakest preconditions for source and target, and general rules for them. -
lifting.v
contains general lifting lemmas as well as the definition of the generic "source-safety" judgment for exploiting UB. -
closed_sim.v
contains the definition of the closed simulation (removing the call case) used in the adequacy proof. -
behavior.v
defines our notion of behavioral refinement and whole-program refinement. -
fairness.v
defines our notion of fairness and proves it equivalent to alternative definitions that are crucial for the fairness proof. -
fairness_adequacy.v
proves that the simulation relation is fair termination-preserving. -
adequacy.v
plugs this all together and shows that Simuliris's simulation in separation logic implies a meta-level simulation, and then derives our general adequacy statement. -
gen_log_rel.v
defines a language-generic version of our logical relation on open terms.
-
-
simulang
contains the definition of SimuLang and our program logics and examples for it. We have defined two program logics for SimuLang: a "simple" one without support for exploiting non-atomics, and a version extended with support for exploiting non-atomics.-
lang.v
contains the definition of SimuLang and its operational semantics, as well as its instantiation of the language interface. -
logical_heap.v
contains the ghost state for the heap. -
heapbij.v
contains the heap bijection ghost state that is used for both program logics. -
globalbij.v
contains support for global variables. -
primitive_laws.v
instantiates the simulation relation with SimuLang. It is parametric over an additional invariant on the state and proves basic proof rules for SimuLang. -
gen_val_rel.v
defines a generic value relation for SimuLang that is used by both program logics, but parametric over the notion of relatedness for locations. -
log_rel_structural.v
,gen_refl.v
, andpure_refl.v
contain conditions on the logical relation as well as general reflexivity proofs used by both program logics. -
behavior.v
defines our notion of behavior and contextual refinement for SimuLang. -
simple_inv
contains the simple program logic, with no support for exploiting non-atomics.-
inv.v
contains the invariant on the state (mainly the bijection, which does not allow to take out ownership) and basic laws. -
refl.v
contains the reflexivity theorem. -
adequacy.v
derives the adequacy proof of the logical relation (i.e., that it implies contextual refinement). -
examples
contains examples using this logic, see below for a list.
-
-
na_inv
contains the non-atomic program logic, with added support for exploiting non-atomics.-
na_locs.v
contains the pure invariants and reasoning about data races. -
inv.v
contains the invariant on the state (allowing to take out ownership from the bijection), basic laws, and rules for exploiting non-atomic accesses. -
refl.v
contains the reflexivity theorem. -
adequacy.v
derives the adequacy proof of the logical relation (i.e., that it implies contextual refinement). -
readonly_refl.v
contains a reflexivity theorem for read-only expressions which allows to thread through ownership of exploited locations. -
examples
contains examples using this logic, see below for a list.
-
-
-
stacked_borrows
contains the port of the Stacked Borrows language and optimizations to Simuliris.-
lang_base.v
,expr_semantics.v
,bor_semantics.v
, andlang.v
contain the language definition. -
logical_state.v
defines the invariants and instantiates the simulation relation. -
steps_refl.v
andsteps_opt.v
prove the main execution lemmas. -
behavior.v
defines the notion of contextual refinement and expression well-formedness. -
adequacy.v
contains the resulting adequacy proof. -
examples
contains example optimizations, see below.
-
-
tree_borrows
contains the Simuliris development of Tree Borrows. This development has its own README intree_borrows/README.md
.
Theorems, definitions, and examples referenced in the paper
We list the relevant theorems and definitions mentioned in the paper by section.
Section 2
Paper | Coq file | Coq name |
---|---|---|
SimuLang grammar (Figure 2) | theories/simulang/lang.v |
expr , val , prog , ectx_item , ectx
|
Example from 2.1 | theories/simulang/simple_inv/examples/paper.v |
ex_2_1 |
Hoare triples and quadruples from Figure 3 | theories/simulang/simple_inv/examples/derived.v |
(replace dashes by underscores) |
Example 1 from 2.2 | theories/simulang/simple_inv/examples/paper.v |
ex_2_2_1 |
Example 2 from 2.2 | theories/simulang/simple_inv/examples/paper.v |
ex_2_2_2 |
Value relation (Figure 4) | theories/simulang/simple_inv/inv.v |
val_rel |
Rule loc-escape (2.2) |
theories/simulang/simple_inv/examples/derived.v |
sim_insert_bij |
Rule sim-load-escaped (2.2) |
theories/simulang/simple_inv/examples/derived.v |
sim_load_public |
Rule sim-src-safe (2.3) |
theories/simulang/simple_inv/examples/derived.v |
sim_src_safe |
Rule safe-div-int-nonzero (2.3) |
theories/simulang/simple_inv/examples/derived.v |
safe_div_int_nonzero |
Example from 2.3 | theories/simulang/simple_inv/examples/paper.v |
ex_2_3 |
Example from 2.4 | theories/simulang/simple_inv/examples/paper.v |
ex_2_4 |
Rule while-coind (2.4) |
theories/simulang/simple_inv/examples/derived.v |
sim_while_simple |
Rule while-paco (2.4) |
theories/simulang/simple_inv/examples/derived.v |
sim_while |
Section 3
Paper | Coq file | Coq name |
---|---|---|
Rule exploit-store (Figure 7) |
theories/simulang/na_inv/examples/derived.v |
sim_exploit_store |
Rule exploit-load (Figure 7) |
theories/simulang/na_inv/examples/derived.v |
sim_exploit_load |
Rule release-exploit (Figure 7) |
theories/simulang/na_inv/examples/derived.v |
sim_exploit_release |
Example from 3.2 | theories/simulang/na_inv/examples/paper.v |
load_na_sc_sim , load_na_sc_log , and load_na_sc_ctx
|
Example from 3.2 with arbitrary read-only expressions (footnote 8) | theories/simulang/na_inv/examples/paper.v |
load_na_log , and load_na_ctx
|
Example from 1,3.3 | theories/simulang/na_inv/examples/paper.v |
hoist_load_both_log , hoist_load_both_ctx
|
Example from 1,3.3 with memory deallocation | theories/simulang/na_inv/examples/data_races.v |
hoist_load_both_log , hoist_load_both_ctx
|
Rules in Figure 8 | theories/simulang/na_inv/examples/derived.v |
sim_load_sc_public , sim_load_na_public , sim_store_sc_public , sim_call
|
Section 4
The definition of contextual refinement is language-specific as the contexts are language-specific.
Similarly, the specific logical relation is specific to the different program logics
(although we have factored out a common structure and other common components that can be re-used in a language-generic way,
see theories/simulation/gen_log_rel.v
).
They are instantiated for the fundamental theorems.
Paper | Coq file | Coq name |
---|---|---|
Possible behaviors ℬ
|
theories/simulation/behavior.v |
has_beh |
Behavioral refinement ⊑_beh
|
theories/simulation/behavior.v |
beh_ref |
program refinement ⊑_prog
|
theories/simulation/behavior.v |
prog_ref_alt |
Contextual refinement ⊑_ctx (language-specific), SimuLang |
theories/simulang/behavior.v |
ctx_ref |
Logical relation ≤_log (SimuLang, generic) |
theories/simulang/log_rel_structural.v |
log_rel |
Theorem 4.1 (for SimuLang, non-atomic logic) | theories/simulang/na_inv/refl.v |
log_rel_refl |
Theorem 4.2 (for SimuLang, non-atomic logic) | theories/simulang/na_inv/refl.v |
log_rel_ctx |
Theorem 4.3 (for SimuLang, non-atomic logic) | theories/simulang/na_inv/adequacy.v |
log_rel_adequacy |
Section 5
Paper | Coq file | Coq name |
---|---|---|
Simulation relation (Figure 11) (full version) | theories/simulation/slsls.v |
greatest_def , sim_expr_inner
|
Hoare quadruple definition | theories/simulang/hoare.v |
hoareSim |
source safety judgment e_s ⇝ Q (generalized) |
theories/simulation/lifting.v |
SafeImplies |
whole-program relation ≤_prog
|
theories/simulation/gen_log_rel.v |
prog_rel |
Lemma 5.1 | theories/simulation/adequacy.v |
slsls_adequacy |
program refinement ⊑_prog
|
theories/simulation/behavior.v |
prog_ref_alt |
closed simulation (proof of Lemma 5.1) | theories/simulation/closed_sim.v |
csim_expr_inner , closed_greatest_def
|
Theorem 5.2 (for SimuLang, non-atomic logic) | theories/simulang/na_inv/adequacy.v |
log_rel_adequacy |
Theorem 5.2 (for SimuLang, simple logic) | theories/simulang/simple_inv/adequacy.v |
log_rel_adequacy |
Section 6
Paper | Coq file | Coq name |
---|---|---|
heapbij (simplified) | theories/simulang/heapbij.v |
heapbij_interp |
P_h for simple state interpretation | theories/simulang/simple_inv/inv.v |
simple_inv |
P_h for non-atomic state interpretation | theories/simulang/na_inv/na_locs.v |
alloc_rel_pred |
exploit_wf (simplified) | theories/simulang/na_inv/na_locs.v |
na_locs_wf |
state interpretation for non-atomics | theories/simulang/na_inv/inv.v |
na_bij_interp |
proof of exploit-store | theories/simulang/na_inv/inv.v |
sim_bij_exploit_store |
preservation for sim-store-sc (Maintaining the state interpretation) | theories/simulang/na_inv/na_locs.v |
na_locs_wf_store |
Section 7
Paper | Coq file | Coq name |
---|---|---|
Adequacy (Theorem 5.2 for Stacked Borrows) | theories/stacked_borrows/adequacy.v |
log_rel_adequacy |
Loop example (Fig 12b) | theories/stacked_borrows/examples/coinductive.v |
sim_loop_ctx |
Moving read example (Fig 12a) | theories/stacked_borrows/examples/opt1.v |
sim_opt1' , sim_opt1'_ctx
|
The optimizations ported and extended to concurrency from the original Stacked Borrows paper can be found in the following files:
theories/stacked_borrows/examples/opt1.v
theories/stacked_borrows/examples/opt1_down.v
theories/stacked_borrows/examples/opt2.v
theories/stacked_borrows/examples/opt2_down.v
theories/stacked_borrows/examples/opt3.v
theories/stacked_borrows/examples/opt3_down.v
Section 8
As mentioned in the related work section, we have verified the reorderings and eliminations by [Ševčík, 2011]. They can be found in file theories/simulang/na_inv/examples/program_transformations_in_weak_memory_models.v
.
For further information on this, we refer to Section 5 of the technical appendix.