Files @ bdf284174817
Branch filter:

Location: CSY/reowolf/src/runtime2/tests/speculation.rs

bdf284174817 2.3 KiB application/rls-services+xml Show Annotation Show as Raw Download as Raw
MH
Update header in readme
// Testing speculation - Basic forms

use super::*;

#[test]
fn test_maybe_do_nothing() {
    // Three variants in which the behaviour in which nothing is performed is
    // somehow not allowed. Note that we "check" by seeing if the test finishes.
    // Only the branches in which ports fire increment the loop index
    const CODE: &'static str = "
    primitive only_puts(out<bool> output, u32 num_loops) {
        u32 index = 0;
        while (index < num_loops) {
            sync { put(output, true); }
            index += 1;
        }
    }

    primitive might_put(out<bool> output, u32 num_loops) {
        u32 index = 0;
        while (index < num_loops) {
            sync {
                fork { put(output, true); index += 1; }
                or   {}
            }
        }
    }

    primitive only_gets(in<bool> input, u32 num_loops) {
        u32 index = 0;
        while (index < num_loops) {
            sync { auto res = get(input); assert(res); }
            index += 1;
        }
    }

    primitive might_get(in<bool> input, u32 num_loops) {
        u32 index = 0;
        while (index < num_loops) {
            sync fork { auto res = get(input); assert(res); index += 1; } or {}
        }
    }
    ";

    // Construct all variants which should work and wait until the runtime exits
    run_test_in_runtime(CODE, |api| {
        // only putting -> maybe getting
        let channel = api.create_channel().unwrap();
        api.create_connector("", "only_puts", ValueGroup::new_stack(vec![
            Value::Output(PortId::new(channel.putter_id.index)),
            Value::UInt32(NUM_LOOPS),
        ])).unwrap();
        api.create_connector("", "might_get", ValueGroup::new_stack(vec![
            Value::Input(PortId::new(channel.getter_id.index)),
            Value::UInt32(NUM_LOOPS),
        ])).unwrap();

        // maybe putting -> only getting
        let channel = api.create_channel().unwrap();
        api.create_connector("", "might_put", ValueGroup::new_stack(vec![
            Value::Output(PortId::new(channel.putter_id.index)),
            Value::UInt32(NUM_LOOPS),
        ])).unwrap();
        api.create_connector("", "only_gets", ValueGroup::new_stack(vec![
            Value::Input(PortId::new(channel.getter_id.index)),
            Value::UInt32(NUM_LOOPS),
        ])).unwrap();
    })
}