Next: A Simple State Machine, Up: Getting Started [Contents][Index]
Consider the trivial Dezyne interface ihello_world
interface ihello_world { in void hello (); out void world (); behavior { on hello: world; } }
It defines two events, named hello
and world
of type
void
and a trivial protocol in its behavior
: whenever the
hello
trigger is received (on hello:
), it responds
synchronously with a world
action.
This scenario can be explored using the simulator (See Invoking dzn simulate
):
$ dzn simulate doc/examples/ihello-world.dzn (header ((client) ihello_world provides) ((sut) ihello_world interface)) (state ((client)) ((sut))) labels: hello eligible: hello >
As expected, hello
is the only trigger that is eligible to
execute; entering hello
gives
> hello <external>.hello -> ... ... -> sut.hello ... <- sut.world <external>.world <- ... ... <- sut.return <external>.return <- ... (state ((client)) ((sut))) (trail "hello" "world" "return") labels: hello eligible: hello >
The simulator can also be run non-interactively to produce a friendlier trace view or sequence diagram
client ihello_world . : . : .hello : .----------------->: . : . world: .<-----------------: . : . return: .<-----------------:
Now consider a trivial component hello_world
import ihello-world.dzn; component hello_world { provides ihello_world p; behavior { on p.hello (): p.world (); } }
it provides the ihello_world
interface, which means that it
promises to behave according to the protocol specified in the interface.
The trigger p.hello
is the event hello
when communicated
over the port p
, similarly the action is named p.world
.
Simulation gives:
$ dzn simulate --trail=p.hello doc/examples/hello-world.dzn (header ((p) ihello_world provides) ((sut) hello_world component)) (state ((p)) ((sut))) <external>.p.hello -> ... ... -> sut.p.hello ... <- sut.p.world <external>.p.world <- ... ... <- sut.p.return <external>.p.return <- ... (state ((p)) ((sut))) (trail "p.hello" "p.world" "p.return") (state ((p)) ((sut))) (labels "p.hello") (eligible "p.hello")
with this trace diagram
p hello_world . : . : .hello : .-------------->: . : . world: .<--------------: . : . return: .<--------------:
From this component an executable program can be created (See Invoking dzn code
)
$ dzn code doc/examples/ihello-world.dzn $ dzn code --model=hello_world doc/examples/hello-world.dzn $ g++ hello-world.cc main.cc -ldzn-c++
When running this executable and feeding it the trail, we get
echo -e 'p.hello\np.world\np.return' | ./a.out <external>.p.hello -> sut.p.hello <external>.p.world <- sut.p.world <external>.p.return <- sut.p.return
Next: A Simple State Machine, Up: Getting Started [Contents][Index]