mirror of
https://github.com/fluencelabs/aquavm
synced 2024-12-13 03:05:32 +00:00
24f0d66bed
Intially, a fold instruction was designed based on idea that its iterable can't expand, so AIR was considered as a subtree. But after introducing recursive streams in #225, it's no more a subtree, but a subgraph.
42 lines
1.3 KiB
Markdown
42 lines
1.3 KiB
Markdown
## AIR trace handler
|
|
|
|
This crate contains implementation of the CRDT-based merging data algorithm. It exposes the `TraceHandler` struct that based on the visitor pattern and has public methods that should be called in certain places of AIR instructions execution. Internally `TraceHandler` contains several FSM and each of such public methods does state transitioning of one or more these FSMs. Below are state transition sequences for all instructions that caller must follow.
|
|
|
|
### Ap instruction
|
|
|
|
Expected sequence of `TraceHandler` calls for the `ap` instruction:
|
|
```
|
|
meet_ap_start
|
|
-> meet_ap_end
|
|
```
|
|
|
|
### Call instruction
|
|
|
|
Expected sequence of `TraceHandler` calls for the `call` instruction:
|
|
```
|
|
meet_call_start
|
|
-> meet_call_end
|
|
```
|
|
|
|
### Par instruction
|
|
|
|
Expected sequence of `TraceHandler` calls for the `par` instruction:
|
|
```
|
|
meet_par_start
|
|
-> meet_par_subgraph_end(..., SubgraphType::Left)
|
|
-> meet_par_subgraph_end(..., SubgraphType::Right)
|
|
```
|
|
|
|
### Fold instruction
|
|
|
|
Expected sequence of `TraceHandler` calls for the `fold` instruction:
|
|
```
|
|
meet_fold_start.1 ->
|
|
meet_generation_start.N ->
|
|
meet_next.M ->
|
|
meet_prev.M ->
|
|
meet_generation_end.N ->
|
|
meet_fold_end.1
|
|
```
|
|
where .T means that this function should be called exactly T times.
|