Created
February 16, 2018 13:46
-
-
Save prepor/3e8885c2495ed1c921c5c707a152f38a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module OAM-SYNTAX | |
syntax Ints ::= List{Int,","} | |
syntax Op ::= "#parallel" Int Int | |
| "#otherwise" Int Int | |
| "#pruning" Int Int Int | |
| "#sequential" Int Int Int | |
| "#callFun" Int "[" Ints "]" | |
| "#callDynamic" Int "[" Ints "]" | |
| "#ffi" Int "[" Ints "]" | |
| "#coeffect" Int | |
| "#stop" | |
| "#constInt" Int | |
| "#constBool" Bool | |
| "#constString" String | |
| "#closure" Int Int | |
| "#label" Int | |
syntax SourceOp ::= Int ":" Op | |
syntax SourceOps ::= List{SourceOp, " "} | |
syntax SourceFun ::= Int Int "{" SourceOps "}" | |
syntax SourceFuns ::= List{SourceFun, " "} | |
syntax SourceFFI ::= Int String | |
syntax SourceFFIs ::= List{SourceFFI, " "} | |
syntax Source ::= "ffi" "{" SourceFFIs "}" SourceFuns | |
endmodule | |
module OAM | |
imports OAM-SYNTAX | |
syntax Stack ::= stack(List) | |
syntax Op ::= "#ffiReady" Int | |
| "#tickWait" Int | |
syntax List ::= #reverseList(List, List) [function] | |
rule #reverseList(Res, .List) => Res | |
rule #reverseList((.List => ListItem(I)) _, (ListItem(I) => .List) _) | |
syntax Stack ::= #incrementInstances(List, List) | |
rule <stack> | |
#incrementInstances(Acc, .List) => stack(#reverseList(.List, Acc)) | |
</stack> | |
rule <stack> | |
#incrementInstances(Acc, | |
(ListItem(fOtherwise(Id, Fun, Op))) XS) | |
=> stack(#reverseList(.List, Acc) ListItem(fOtherwise(Id, Fun, Op)) XS) | |
</stack> | |
<instances>... Id |-> (I => I +Int 1) ...</instances> | |
rule <stack> | |
(#incrementInstances(Acc, | |
(ListItem(fPruning(Id))) XS) | |
=> stack(#reverseList(.List, Acc) ListItem(fPruning(Id)) XS)) | |
</stack> | |
<instances>... Id |-> (I => I +Int 1) ...</instances> | |
rule <stack> | |
(#incrementInstances(Acc, | |
(ListItem(fSequential(Id, Param, Fun, Op))) XS) | |
=> stack(#reverseList(.List, Acc) ListItem(fSequential(Id, Param, Fun, Op)) XS)) | |
</stack> | |
<instances>... Id |-> (I => I +Int 1) ...</instances> | |
rule <stack> | |
#incrementInstances((.List => ListItem(fCall(Env))) _, | |
(ListItem(fCall(Env)) => .List) _) | |
</stack> | |
rule <stack> | |
#incrementInstances((.List => ListItem($fResult)) _, | |
(ListItem($fResult) => .List) _) | |
</stack> | |
syntax PendValue ::= "pendStopped" | |
| "pend" | |
syntax Frame ::= fPruning(Int) | |
| fOtherwise(Int, Int, Int) | |
| fSequential(Int, Int, Int, Int) | |
| fCall(Int) | |
| "$fResult" | |
syntax RealVal ::= Int | |
| Bool | |
| String | |
| List | |
| Map | |
| "signal" | |
| closure(Int, Int, Int) | |
| label(Int) | |
syntax Val ::= pending(Int) | val(RealVal) | |
syntax OrcToken ::= OrcToken(Int, Int, Map, Stack) | |
syntax KResult ::= Val | |
syntax Stage ::= "INIT" | "RUNNING" | "STOPPED" | |
configuration <T> | |
<stage>INIT</stage> | |
<threads> | |
<thread multiplicity="*"> | |
<currentFun>0</currentFun> | |
<pc>-1</pc> | |
<k>.:Op</k> | |
<result>.:Val</result> | |
<stack>stack(.List)</stack> | |
<currentEnv>0</currentEnv> | |
<waitEnv>.Map</waitEnv> | |
<waitEnvKey>0</waitEnvKey> | |
</thread> | |
</threads> | |
<values>.List</values> | |
<tick>0</tick> | |
<instances>.Map</instances> | |
<firstValues>.Map</firstValues> | |
<pendingValues>.Map</pendingValues> | |
<envs> | |
<env multiplicity="*"> | |
<envId>0</envId> | |
<envContent>.Map</envContent> | |
</env> | |
</envs> | |
<ops> | |
<op multiplicity="*"> | |
<opFunId>0</opFunId> | |
<opId>0</opId> | |
<body>#stop</body> | |
</op> | |
</ops> | |
<initOps>.Map</initOps> | |
<ffi>.Map</ffi> | |
<source>$PGM:Source</source> | |
</T> | |
rule <source>ffi { _ } Id _ { (OpId : Body) XS => XS } _</source> | |
<ops> | |
... (.Bag => | |
<op> | |
<opFunId>Id</opFunId> | |
<opId>OpId</opId> | |
<body>Body</body> | |
</op>) | |
...</ops> | |
rule <source>ffi { _ } (Id (InitId => -1) { _ }) _</source> | |
<initOps>... .Map => Id |-> InitId ...</initOps> | |
requires InitId =/=Int -1 | |
rule <source>ffi { Id Def:String XS => XS } _</source> | |
<ffi>... .Map => Id |-> Def ...</ffi> | |
rule <source>ffi { _ } (_ -1 { .SourceOps } XS:SourceFuns => XS)</source> | |
rule <source>ffi { .SourceFFIs } .SourceFuns => .:Source</source> | |
// Main thread | |
rule <threads> | |
.Bag => <thread> | |
<currentFun>0</currentFun> | |
<pc>-1</pc> | |
<k>.:Op</k> | |
<result>.:Val</result> | |
<stack>stack(ListItem($fResult))</stack> | |
<currentEnv>!EnvId:Int</currentEnv> | |
<waitEnv>.Map</waitEnv> | |
<waitEnvKey>0</waitEnvKey> | |
</thread> | |
</threads> | |
<envs>... | |
(.Bag => | |
<env><envId>!EnvId</envId><envContent>.Map</envContent></env>) | |
...</envs> | |
<stage>INIT => RUNNING</stage> | |
rule <threads>.Bag</threads> | |
<stage>RUNNING => STOPPED</stage> | |
// Init op | |
rule <thread>... | |
<currentFun>FunId:Int</currentFun> | |
<pc>-1 => OpId</pc> | |
...</thread> | |
<initOps>... FunId |-> OpId ...</initOps> | |
// Place actual op | |
rule <thread>... | |
<pc>OpId</pc> | |
<currentFun>FunId</currentFun> | |
<k>. => Body</k> | |
...</thread> | |
<op>... | |
<opFunId>FunId</opFunId> | |
<opId>OpId</opId> | |
<body>Body</body> | |
...</op> | |
// Tick | |
// const | |
rule <thread>... | |
<k>#constInt I</k> | |
<result>.:Val => val(I)</result> | |
...</thread> | |
rule <thread>... | |
<k>#constBool V</k> | |
<result>.:Val => val(V)</result> | |
...</thread> | |
rule <thread>... | |
<k>#constString S</k> | |
<result>.:Val => val(S)</result> | |
...</thread> | |
// parallel | |
rule <threads>... | |
<thread>... | |
<currentFun>Fun</currentFun> | |
<pc>_ => Op1</pc> | |
<k>#parallel Op1 Op2 => .</k> | |
<stack> stack(Stack) => #incrementInstances(.List, Stack)</stack> | |
<currentEnv>Env</currentEnv> | |
...</thread> | |
(.Bag => <thread> | |
<currentFun>Fun</currentFun> | |
<pc>Op2</pc> | |
<k>.:Op</k> | |
<result>.:Val</result> | |
<stack>stack(Stack)</stack> | |
<currentEnv>!NewEnv</currentEnv> | |
<waitEnv>.Map</waitEnv> | |
<waitEnvKey>0</waitEnvKey> | |
</thread>) | |
...</threads> | |
<envs>... | |
<env><envId>Env</envId><envContent>EnvContent</envContent></env> | |
(.Bag => <env><envId>!NewEnv:Int</envId><envContent>EnvContent</envContent></env>) | |
...</envs> | |
// pruning | |
rule <threads>... | |
<thread>... | |
<currentFun>Fun</currentFun> | |
<pc>_ => Op1</pc> | |
<k>#pruning Op1 Param Op2 => .</k> | |
<stack> stack(Stack) => #incrementInstances(.List, Stack)</stack> | |
<currentEnv>Env</currentEnv> | |
...</thread> | |
(.Bag => <thread> | |
<currentFun>Fun</currentFun> | |
<pc>Op2</pc> | |
<k>.:Op</k> | |
<result>.:Val</result> | |
<stack>stack(ListItem(fPruning(!Id)) Stack)</stack> | |
<currentEnv>Env</currentEnv> | |
<waitEnv>.Map</waitEnv> | |
<waitEnvKey>0</waitEnvKey> | |
</thread>) | |
...</threads> | |
<instances>... .Map => !Id |-> 1 ...</instances> | |
<pendingValues>... .Map => !Id |-> pend ...</pendingValues> | |
<envs>... | |
<env> | |
<envId>Env</envId> | |
<envContent>M => M[Param <- pending(!Id)]</envContent> | |
</env> | |
...</envs> | |
requires Param =/=Int -1 | |
// Otherwise | |
rule <thread>... | |
<currentFun>Fun</currentFun> | |
<pc>_ => Op1</pc> | |
<k>#otherwise Op1 Op2 => .</k> | |
<stack>stack(Stack => ListItem(fOtherwise(!Id, Fun, Op2)) Stack)</stack> | |
...</thread> | |
<instances>... .Map => !Id |-> 1 ...</instances> | |
<firstValues>... .Map => !Id |-> false ...</firstValues> | |
// Sequential | |
rule <thread>... | |
<currentFun>Fun</currentFun> | |
<pc>_ => Op1</pc> | |
<k>#sequential Op1 Param Op2 => .</k> | |
<stack>stack(Stack => ListItem(fSequential(!Id, Param, Fun, Op2)) Stack)</stack> | |
...</thread> | |
<instances>... .Map => !Id |-> 1 ...</instances> | |
// Call | |
rule <thread>... | |
<k>#callFun Fun [ Param, _ ]</k> | |
<currentEnv>Env</currentEnv> | |
...</thread> | |
<pendingValues>... Id |-> val(Val) ...</pendingValues> | |
<envs>... | |
<env> | |
<envId>Env</envId> | |
<envContent>... Param |-> (pending(Id) => val(Val)) ...</envContent> | |
</env> | |
...</envs> | |
rule <thread>... | |
<k>#callFun Fun [ Param, Params => Params ]</k> | |
<currentEnv>Env</currentEnv> | |
<waitEnv>... .Map => WaitEnvKey |-> val(Val) ...</waitEnv> | |
<waitEnvKey>WaitEnvKey => WaitEnvKey +Int 1</waitEnvKey> | |
...</thread> | |
<envs>... | |
<env> | |
<envId>Env</envId> | |
<envContent>... Param |-> val(Val) ...</envContent> | |
</env> | |
...</envs> | |
rule <thread>... | |
<currentFun>_ => Fun</currentFun> | |
<pc> _ => -1</pc> | |
<k>#callFun Fun [ .Ints ] => .:Op</k> | |
<currentEnv>Env => !NewEnv</currentEnv> | |
<waitEnv>NewEnvContent => .Map</waitEnv> | |
<waitEnvKey>_ => 0</waitEnvKey> | |
<stack>stack(Stack) => stack(ListItem(fCall(Env)) Stack)</stack> | |
...</thread> | |
<envs>... | |
(.Bag => <env> | |
<envId>!NewEnv:Int</envId> | |
<envContent>NewEnvContent</envContent> | |
</env>) | |
...</envs> | |
// Dynamic Call | |
rule <thread>... | |
<k>#callDynamic Target [ _ ]</k> | |
<currentEnv>Env</currentEnv> | |
...</thread> | |
<pendingValues>... Id |-> val(Val) ...</pendingValues> | |
<envs>... | |
<env> | |
<envId>Env</envId> | |
<envContent>... Target |-> (pending(Id) => val(Val)) ...</envContent> | |
</env> | |
...</envs> | |
rule <thread>... | |
<k>#callDynamic Target [ Params ] => #callFun Fun [ Params ]</k> | |
<currentEnv>Env</currentEnv> | |
...</thread> | |
<envs>... | |
<env> | |
<envId>Env</envId> | |
<envContent>... Target |-> val(label(Fun)) ...</envContent> | |
</env> | |
...</envs> | |
rule <thread>... | |
<k>#callDynamic Target [ _ ]</k> | |
<currentEnv>Env</currentEnv> | |
<waitEnv>... .Map => Key |-> Val ...</waitEnv> | |
<waitEnvKey>Key => Key +Int 1</waitEnvKey> | |
...</thread> | |
<envs>... | |
<env> | |
<envId>Env</envId> | |
<envContent>... | |
Target |-> val(closure(Fun, ToCopy => ToCopy -Int 1, ClosureEnv)) | |
...</envContent> | |
</env> | |
<env> | |
<envId>ClosureEnv</envId> | |
<envContent>... Key |-> Val ...</envContent> | |
</env> | |
...</envs> | |
requires ToCopy >Int 0 | |
// Special case when closure env and caller env are same | |
rule <thread>... | |
<k>#callDynamic Target [ _ ]</k> | |
<currentEnv>Env</currentEnv> | |
<waitEnv>... .Map => Key |-> Val ...</waitEnv> | |
<waitEnvKey>Key => Key +Int 1</waitEnvKey> | |
...</thread> | |
<envs>... | |
<env> | |
<envId>Env</envId> | |
<envContent>... | |
Target |-> val(closure(Fun, ToCopy => ToCopy -Int 1, Env)) | |
Key |-> Val | |
...</envContent> | |
</env> | |
...</envs> | |
requires ToCopy >Int 0 | |
rule <thread>... | |
<k>#callDynamic Target [ Params ] => #callFun Fun [ Params ]</k> | |
<currentEnv>Env</currentEnv> | |
...</thread> | |
<envs>... | |
<env> | |
<envId>Env</envId> | |
<envContent>... | |
Target |-> val(closure(Fun, ToCopy, _)) | |
Key |-> Val | |
...</envContent> | |
</env> | |
...</envs> | |
requires ToCopy =Int 0 | |
// Closure | |
rule <thread>... | |
<k>#closure Fun ToCopy</k> | |
<currentEnv>Env</currentEnv> | |
<result>.:Val => val(closure(Fun, ToCopy, Env))</result> | |
...</thread> | |
// FFI | |
rule <thread>... | |
<k>#ffi _ [ Param, Params => Params ]</k> | |
<currentEnv>Env</currentEnv> | |
<waitEnv>... .Map => WaitEnvKey |-> val(Val)</waitEnv> | |
<waitEnvKey>WaitEnvKey => WaitEnvKey +Int 1</waitEnvKey> | |
...</thread> | |
<envs>... | |
<env> | |
<envId>Env</envId> | |
<envContent>... Param |-> val(Val) ...</envContent> | |
</env> | |
...</envs> | |
rule <thread>... | |
<k>#ffi _ [ Param, Params => Params ]</k> | |
<currentEnv>Env</currentEnv> | |
<waitEnv>... .Map => WaitEnvKey |-> val(Val)</waitEnv> | |
<waitEnvKey>WaitEnvKey => WaitEnvKey +Int 1</waitEnvKey> | |
...</thread> | |
<pendingValues>... Id |-> val(Val) ...</pendingValues> | |
<envs>... | |
<env> | |
<envId>Env</envId> | |
<envContent>... Param |-> pending(Id) ...</envContent> | |
</env> | |
...</envs> | |
rule <thread>... | |
<k>#ffi Id [ .Ints ] => #ffiReady Id</k> | |
<waitEnv>Content => .Map</waitEnv> | |
<waitEnvKey>_ => 0</waitEnvKey> | |
<currentEnv>_ => !Env:Int</currentEnv> | |
...</thread> | |
<envs>... | |
(.Bag => <env> | |
<envId>!Env</envId> | |
<envContent>Content</envContent> | |
</env>) | |
...</envs> | |
// Coeffect | |
rule <thread>... | |
<k>#coeffect Param</k> | |
<currentEnv>Env</currentEnv> | |
...</thread> | |
<envs>... | |
<env> | |
<envId>Env</envId> | |
<envContent>... Param |-> (pending(Id) => val(Val)) ...</envContent> | |
</env> | |
...</envs> | |
<pendingValues>... Id |-> val(Val) ...</pendingValues> | |
// Publish | |
rule <thread>... | |
<result>val(V)</result> | |
<stack>stack(ListItem($fResult) XS => XS)</stack> | |
...</thread> | |
<values>.List => ListItem(V) ...</values> | |
requires V =/=K .:Val | |
rule <thread>... | |
<result>pending(Id) => val(Val)</result> | |
<stack>stack(ListItem($fResult) XS)</stack> | |
...</thread> | |
<pendingValues>... Id |-> val(Val) ...</pendingValues> | |
rule <thread>... | |
<result>V</result> | |
<stack>stack(ListItem(fPruning(Id)) XS => .List)</stack> | |
...</thread> | |
<pendingValues>... Id |-> (pend => V) ...</pendingValues> | |
<instances>... Id |-> (I => I -Int 1) ...</instances> | |
requires V =/=K .:Val [pruningTransition] | |
rule <thread>... | |
<result>V</result> | |
<stack>stack(ListItem(fPruning(Id)) XS => .List)</stack> | |
...</thread> | |
<pendingValues>... Id |-> val(_) ...</pendingValues> | |
<instances>... Id |-> (I => I -Int 1) ...</instances> | |
requires V =/=K .:Val | |
rule <thread>... | |
<result>V</result> | |
<stack>stack(ListItem(fOtherwise(Id, _, _)) XS => XS)</stack> | |
...</thread> | |
<firstValues>... Id |-> (_ => true) ...</firstValues> | |
<instances>... Id |-> (I => I -Int 1) ...</instances> | |
requires V =/=K .:Val | |
rule <thread>... | |
<currentFun>_ => Fun</currentFun> | |
<pc>_ => Op</pc> | |
<k>_ => .:Op</k> | |
<result>V:Val => .</result> | |
<stack>stack(ListItem(fSequential(Id, Param, Fun, Op)) XS => XS)</stack> | |
<currentEnv>Env</currentEnv> | |
...</thread> | |
<envs>... | |
<env> | |
<envId>Env</envId> | |
<envContent>M => M[Param <- V]</envContent> | |
</env> | |
...</envs> | |
requires V =/=K .:Val | |
rule <thread>... | |
<result>V</result> | |
<stack>stack(ListItem(fCall(Env)) XS => XS)</stack> | |
<currentEnv>_ => Env</currentEnv> | |
...</thread> | |
requires V =/=K .:Val | |
rule <threads>... | |
<thread>... | |
<stack>stack(.List)</stack> | |
...</thread> => .Bag | |
</threads> | |
// Stop | |
rule <thread>... | |
<k>#stop</k> | |
<stack>stack(ListItem(fCall(Env)) XS => XS)</stack> | |
...</thread> | |
rule <thread>... | |
<k>#stop</k> | |
<stack>stack(ListItem($fResult) XS => XS)</stack> | |
...</thread> | |
rule <thread>... | |
<k>#stop</k> | |
<stack>stack(ListItem(fPruning(Id)) XS) => .</stack> | |
...</thread> | |
<pendingValues>... Id |-> (pend => pendStopped) ...</pendingValues> | |
<instances>... Id |-> 1 ...</instances> | |
rule <thread>... | |
<k>#stop</k> | |
<stack>stack(ListItem(fPruning(Id)) XS) => .</stack> | |
...</thread> | |
<instances>... Id |-> (I => I -Int 1)...</instances> | |
requires I >Int 1 | |
rule <thread>... | |
<k>#stop</k> | |
<stack>stack(ListItem(fSequential(Id, _, _, _)) XS => XS)</stack> | |
...</thread> | |
<instances>... Id |-> 1 ...</instances> | |
rule <thread>... | |
<k>#stop</k> | |
<stack>stack(ListItem(fSequential(Id, _, _, _)) XS) => .</stack> | |
...</thread> | |
<instances>... Id |-> (I => I -Int 1)...</instances> | |
requires I >Int 1 | |
rule <threads>... | |
<thread>... | |
<k>#stop</k> | |
<stack>stack(ListItem(fOtherwise(Id, Fun, Op)) Stack => .List)</stack> | |
<currentEnv>Env</currentEnv> | |
...</thread> | |
(.Bag => <thread> | |
<currentFun>Fun</currentFun> | |
<pc>Op</pc> | |
<k>.:Op</k> | |
<result>.:Val</result> | |
<stack>stack(Stack)</stack> | |
<currentEnv>Env</currentEnv> | |
</thread>) | |
...</threads> | |
<firstValues>... Id |-> false ...</firstValues> | |
<instances>... Id |-> 1 ...</instances> | |
rule <thread>... | |
<k>#stop</k> | |
<stack>stack(ListItem(fOtherwise(Id, _, _)) _ => .List)</stack> | |
...</thread> | |
<firstValues>... Id |-> false ...</firstValues> | |
<instances>... Id |-> (I => I -Int 1)...</instances> | |
requires I >Int 1 | |
rule <thread>... | |
<k>#stop</k> | |
<stack>stack(ListItem(fOtherwise(Id, _, _)) XS => XS)</stack> | |
...</thread> | |
<firstValues>... Id |-> false ...</firstValues> | |
<instances>... Id |-> I...</instances> | |
requires I =Int 1 | |
// Prims | |
// "core.let" | |
rule <thread>... | |
<k>#ffiReady Id</k> | |
<result>.:Val => Val</result> | |
<currentEnv>Env</currentEnv> | |
...</thread> | |
<ffi>... Id |-> "core.let" ...</ffi> | |
<env><envId>Env</envId><envContent>0 |-> Val</envContent></env> | |
// "core.add" | |
rule <thread>... | |
<k>#ffiReady Id</k> | |
<result>.:Val => val(X +Int Y) </result> | |
<currentEnv>Env</currentEnv> | |
...</thread> | |
<ffi>... Id |-> "core.add" ...</ffi> | |
<env> | |
<envId>Env</envId> | |
<envContent>0 |-> val(X:Int) 1 |-> val(Y:Int)</envContent> | |
</env> | |
// "core.sub" | |
rule <thread>... | |
<k>#ffiReady Id</k> | |
<result>.:Val => val(X -Int Y) </result> | |
<currentEnv>Env</currentEnv> | |
...</thread> | |
<ffi>... Id |-> "core.sub" ...</ffi> | |
<env> | |
<envId>Env</envId> | |
<envContent>0 |-> val(X:Int) 1 |-> val(Y:Int)</envContent> | |
</env> | |
// "core.mult" | |
rule <thread>... | |
<k>#ffiReady Id</k> | |
<result>.:Val => val(X *Int Y) </result> | |
<currentEnv>Env</currentEnv> | |
...</thread> | |
<ffi>... Id |-> "core.mult" ...</ffi> | |
<env> | |
<envId>Env</envId> | |
<envContent>0 |-> val(X:Int) 1 |-> val(Y:Int)</envContent> | |
</env> | |
// "core.div" | |
rule <thread>... | |
<k>#ffiReady Id</k> | |
<result>.:Val => val(X /Int Y) </result> | |
<currentEnv>Env</currentEnv> | |
...</thread> | |
<ffi>... Id |-> "core.div" ...</ffi> | |
<env> | |
<envId>Env</envId> | |
<envContent>0 |-> val(X:Int) 1 |-> val(Y:Int)</envContent> | |
</env> | |
// "core.eq" | |
rule <thread>... | |
<k>#ffiReady Id</k> | |
<result>.:Val => val(X ==K Y) </result> | |
<currentEnv>Env</currentEnv> | |
...</thread> | |
<ffi>... Id |-> "core.eq" ...</ffi> | |
<env> | |
<envId>Env</envId> | |
<envContent>0 |-> val(X) 1 |-> val(Y)</envContent> | |
</env> | |
// "core.not-eq" | |
rule <thread>... | |
<k>#ffiReady Id</k> | |
<result>.:Val => val(X =/=K Y) </result> | |
<currentEnv>Env</currentEnv> | |
...</thread> | |
<ffi>... Id |-> "core.not-eq" ...</ffi> | |
<env> | |
<envId>Env</envId> | |
<envContent>0 |-> val(X) 1 |-> val(Y)</envContent> | |
</env> | |
// "core.gt" | |
rule <thread>... | |
<k>#ffiReady Id</k> | |
<result>.:Val => val(X >Int Y) </result> | |
<currentEnv>Env</currentEnv> | |
...</thread> | |
<ffi>... Id |-> "core.gt" ...</ffi> | |
<env> | |
<envId>Env</envId> | |
<envContent>0 |-> val(X:Int) 1 |-> val(Y:Int)</envContent> | |
</env> | |
// "core.gte" | |
rule <thread>... | |
<k>#ffiReady Id</k> | |
<result>.:Val => val(X >=Int Y) </result> | |
<currentEnv>Env</currentEnv> | |
...</thread> | |
<ffi>... Id |-> "core.gte" ...</ffi> | |
<env> | |
<envId>Env</envId> | |
<envContent>0 |-> val(X:Int) 1 |-> val(Y:Int)</envContent> | |
</env> | |
// "core.lt" | |
rule <thread>... | |
<k>#ffiReady Id</k> | |
<result>.:Val => val(X <Int Y) </result> | |
<currentEnv>Env</currentEnv> | |
...</thread> | |
<ffi>... Id |-> "core.lt" ...</ffi> | |
<env> | |
<envId>Env</envId> | |
<envContent>0 |-> val(X:Int) 1 |-> val(Y:Int)</envContent> | |
</env> | |
// "core.lte" | |
rule <thread>... | |
<k>#ffiReady Id</k> | |
<result>.:Val => val(X <=Int Y) </result> | |
<currentEnv>Env</currentEnv> | |
...</thread> | |
<ffi>... Id |-> "core.lte" ...</ffi> | |
<env> | |
<envId>Env</envId> | |
<envContent>0 |-> val(X:Int) 1 |-> val(Y:Int)</envContent> | |
</env> | |
// "core.and" | |
rule <thread>... | |
<k>#ffiReady Id</k> | |
<result>.:Val => val(X andBool Y) </result> | |
<currentEnv>Env</currentEnv> | |
...</thread> | |
<ffi>... Id |-> "core.and" ...</ffi> | |
<env> | |
<envId>Env</envId> | |
<envContent>0 |-> val(X:Bool) 1 |-> val(Y:Bool)</envContent> | |
</env> | |
// "core.or" | |
rule <thread>... | |
<k>#ffiReady Id</k> | |
<result>.:Val => val(X orBool Y) </result> | |
<currentEnv>Env</currentEnv> | |
...</thread> | |
<ffi>... Id |-> "core.or" ...</ffi> | |
<env> | |
<envId>Env</envId> | |
<envContent>0 |-> val(X:Bool) 1 |-> val(Y:Bool)</envContent> | |
</env> | |
// "core.not" | |
rule <thread>... | |
<k>#ffiReady Id</k> | |
<result>.:Val => val(notBool X) </result> | |
<currentEnv>Env</currentEnv> | |
...</thread> | |
<ffi>... Id |-> "core.not" ...</ffi> | |
<env> | |
<envId>Env</envId> | |
<envContent>0 |-> val(X:Bool)</envContent> | |
</env> | |
// "core.ift" | |
rule <thread>... | |
<k>#ffiReady Id</k> | |
<result>.:Val => val(signal) </result> | |
<currentEnv>Env</currentEnv> | |
...</thread> | |
<ffi>... Id |-> "core.ift" ...</ffi> | |
<env> | |
<envId>Env</envId> | |
<envContent>0 |-> val(true)</envContent> | |
</env> | |
rule <thread>... | |
<k>#ffiReady Id => #stop</k> | |
<currentEnv>Env</currentEnv> | |
...</thread> | |
<ffi>... Id |-> "core.ift" ...</ffi> | |
<env> | |
<envId>Env</envId> | |
<envContent>0 |-> val(false)</envContent> | |
</env> | |
// "core.iff" | |
rule <thread>... | |
<k>#ffiReady Id</k> | |
<result>.:Val => val(signal) </result> | |
<currentEnv>Env</currentEnv> | |
...</thread> | |
<ffi>... Id |-> "core.iff" ...</ffi> | |
<env> | |
<envId>Env</envId> | |
<envContent>0 |-> val(false)</envContent> | |
</env> | |
rule <thread>... | |
<k>#ffiReady Id => #stop</k> | |
<currentEnv>Env</currentEnv> | |
...</thread> | |
<ffi>... Id |-> "core.iff" ...</ffi> | |
<env> | |
<envId>Env</envId> | |
<envContent>0 |-> val(true)</envContent> | |
</env> | |
// "core.make-record" | |
syntax RealVal ::= #makeRecord(Map, Int, Map) [function] | |
rule #makeRecord(Res, _, .Map) => Res | |
rule #makeRecord(Res => Res[Env[I] <- Env[I +Int 1]], I => I +Int 2, Env => removeAll(Env, SetItem(I) SetItem(I +Int 1))) | |
requires Env =/=K .Map | |
rule <thread>... | |
<k>#ffiReady Id</k> | |
<result>.:Val => val(#makeRecord(.Map, 0, Content)) </result> | |
<currentEnv>Env</currentEnv> | |
...</thread> | |
<ffi>... Id |-> "core.make-record" ...</ffi> | |
<env> | |
<envId>Env</envId> | |
<envContent>Content</envContent> | |
</env> | |
// coeffects | |
rule <thread>... | |
<k>#coeffect Param => #tickWait (Tick +Int Timeout)</k> | |
<result>.:Val </result> | |
<currentEnv>Env</currentEnv> | |
...</thread> | |
<tick>Tick</tick> | |
<env> | |
<envId>Env</envId> | |
<envContent>... Param |-> val(val("kind") |-> val("rwait") val("timeout") |-> val(Timeout) _) ...</envContent> | |
</env> | |
rule <thread>... | |
<k>#tickWait Tick</k> | |
<result>.:Val => val(signal)</result> | |
...</thread> | |
<tick>Tick</tick> | |
rule <thread>... | |
<k>#tickWait Tick</k> | |
...</thread> | |
<tick>CurrentTick => CurrentTick +Int 1</tick> | |
requires Tick =/=Int CurrentTick | |
endmodule |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment