Files @ 88611f9fd179
Branch filter:

Location: CSY/reowolf/testdata/examples/03_transmitting_ports_01.pdl

Max Henger
Merge branch 'feat-examples' into 'master'

feat: examples

See merge request nl-cwi-csy/reowolf!12
// Since this release transmitting ports is possible. This means that we can
// send ports through ports. In fact, we can send ports that may send ports that
// may send ports. But don't be fooled by the apparent complexity. The inner
// type `T` of a port like `in<T>` simply states that that is the message type.
// Should the type `T` contain one or more ports, then we kick off a bit of code
// that takes care of the transfer of the port. Should the port inside of `T`
// itself, after being received, send a port, then we simply kick off that same
// procedure again.
//
// In the simplest case, we have someone transmitting the receiving end of a
// channel to another component, which then uses that receiving end to receive a
// value.

comp port_sender(out<in<u32>> tx, in<u32> to_transmit) {
    sync put(tx, to_transmit);
}

comp port_receiver_and_value_getter(in<in<u32>> rx, u32 expected_value) {
    u32 got_value = 0;
    sync {
        auto port = get(rx);
        got_value = get(port);
    }
    if (expected_value == got_value) {
        print("got the expected value :)");
    } else {
        print("got a different value :(");
    }
}

comp value_sender(out<u32> tx, u32 to_send) {
    sync put(tx, to_send);
}

comp main() {
    u32 value = 1337_2392;

    channel port_tx -> port_rx;
    channel value_tx -> value_rx;
    new port_sender(port_tx, value_rx);
    new port_receiver_and_value_getter(port_rx, value);
    new value_sender(value_tx, value);
}