Describe event declaration language
This commit is contained in:
parent
a2b2d11b0d
commit
bae38d1d26
101
doc/dev/events.md
Normal file
101
doc/dev/events.md
Normal file
@ -0,0 +1,101 @@
|
||||
# Emulator events
|
||||
|
||||
The events processed by the emulator are described in each model.
|
||||
Unrecognized events will cause a panic and stop the emulator in most
|
||||
cases.
|
||||
|
||||
The events may have additional arguments in the payload, which are also
|
||||
described. To this end, a simple language was created to specify the
|
||||
format of each event in a concise declaration.
|
||||
|
||||
Additionally, a printf-like string is declared for each event, so they
|
||||
can be explained in plain English. The values of the arguments are also
|
||||
substituted in the description of the event following a extended printf
|
||||
format described below.
|
||||
|
||||
## Event format
|
||||
|
||||
The events are defined by a small language that defines the MCV of an event, if
|
||||
is a jumbo and the arguments in the payload (if any).
|
||||
|
||||
The grammar of this language is as follows in [ABNF][abnf].
|
||||
|
||||
[abnf]: https://en.wikipedia.org/wiki/Augmented_Backus%E2%80%93Naur_form
|
||||
|
||||
```ABNF
|
||||
event-definition = event-mcv event-type [ "(" argument-list ")" ]
|
||||
event-mcv = VCHAR VCHAR VCHAR
|
||||
event-type = [ '+' ]
|
||||
argument-list = argument-type " " argument-name [ ", " argument-list ]
|
||||
argument-name = 1*(CHAR / DIGIT)
|
||||
argument-type = type-signed | type-unsigned | type-string
|
||||
type-signed = "i8" | "i16" | "i32" | "i64"
|
||||
type-unsigned = "u8" | "u16" | "u32" | "u64"
|
||||
type-string = "str"
|
||||
```
|
||||
|
||||
The `event-type` defines the type of event. Using the symbol `+` defines
|
||||
the event as jumbo. Otherwise, if not given it is considered a normal
|
||||
event.
|
||||
|
||||
Here are some examples:
|
||||
|
||||
- `OHp`: A normal event with `OHp` MCV and no payload.
|
||||
|
||||
- `OAs(i32 cpu)`: A normal event with `OAs` MCV that has the cpu stored in
|
||||
the payload as a 32 bits signed integer.
|
||||
|
||||
- `OHC(i32 cpu, u64 tag)`: A normal event with `OHC` MCV that has two
|
||||
arguments in the payload: the cpu stored as a 32 bit signed integer,
|
||||
and a tag stored as a 64 bit unsigned integer.
|
||||
|
||||
- `VYc+(u32 typeid, str label)`: A jumbo event with `VTc` MCV that has in the
|
||||
jumbo payload a 32 bits unsigned integer for the typeid followed by the label
|
||||
null-terminated string of variable size.
|
||||
|
||||
## Event description
|
||||
|
||||
To describe the meaning of each event, a description follows the event
|
||||
declaration. This description accepts printf-like format specifiers that
|
||||
are replaced with the value of the argument they refer to.
|
||||
|
||||
The formats are specified as follows:
|
||||
|
||||
```ABNF
|
||||
format-specifier = "%" [ printf-format] "{" argument-name "}"
|
||||
argument-name = 1*(CHAR / DIGIT)
|
||||
```
|
||||
|
||||
Where the optional `printf-format` is any string accepted by the format
|
||||
specifier of `printf()`, as defined in the manual `printf(3)`. If the
|
||||
`printf-format` is not given, the default format for the argument type
|
||||
is used.
|
||||
|
||||
Here are some examples of event descriptions of the previous events:
|
||||
|
||||
```c
|
||||
{ "OHp", "pauses the execution" },
|
||||
{ "OAs(i32 cpu)", "switches it's own affinity to the CPU %{cpu}" },
|
||||
{ "OHC(i32 cpu, u64 tag)", "creates a new thread on CPU %{cpu} with tag %#llx{tag}" },
|
||||
{ "VYc+(u32 typeid, str label)", "creates task type %{typeid} with label \"%{label}\"" },
|
||||
```
|
||||
|
||||
Which would be printed with ovnidump like:
|
||||
|
||||
```nohighlight
|
||||
OHp pauses the execution
|
||||
OAs switches it's own affinity to the CPU 7
|
||||
OHC creates a new thread on CPU 3 with tag 0x7f9239c6b6c0
|
||||
VYc creates task type 4 with label "block computation"
|
||||
```
|
||||
|
||||
## Model version
|
||||
|
||||
When adding new events of changing the format of already existing
|
||||
events, the version of the model that defines the event must be changed
|
||||
accordingly to the rules of [Semantic Versions](https://semver.org).
|
||||
|
||||
In general, adding new events will cause a minor increase in the
|
||||
version, while changing events will cause a major increase. Notice that
|
||||
the emulator will reject a stream which contains events from a model
|
||||
which is not compatible with the current model version.
|
@ -4,6 +4,9 @@ extra_css: [extra.css]
|
||||
theme:
|
||||
name: readthedocs
|
||||
sticky_navigation: false
|
||||
highlightjs: true
|
||||
hljs_languages:
|
||||
- abnf
|
||||
extra_javascript:
|
||||
- https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML
|
||||
markdown_extensions:
|
||||
@ -38,6 +41,7 @@ nav:
|
||||
- CHANGELOG.md
|
||||
- 'Developer guide':
|
||||
- dev/index.md
|
||||
- dev/events.md
|
||||
- dev/channels.md
|
||||
- dev/patchbay.md
|
||||
- dev/mux.md
|
||||
|
Loading…
Reference in New Issue
Block a user