From 3637ab6d200e0d3bc2d9c5c6031efa7356779b21 Mon Sep 17 00:00:00 2001 From: Hokeun Kim Date: Fri, 7 Feb 2025 12:42:14 -0700 Subject: [PATCH 1/3] Fix lff formatting issues in zero delay cycles examples by running lff --- examples/C/src/zero-delay-cycles/Consistency.lf | 10 ++++------ examples/C/src/zero-delay-cycles/ZeroDelayCycle.lf | 14 +++++++------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/examples/C/src/zero-delay-cycles/Consistency.lf b/examples/C/src/zero-delay-cycles/Consistency.lf index 7f115f8c..5597af55 100644 --- a/examples/C/src/zero-delay-cycles/Consistency.lf +++ b/examples/C/src/zero-delay-cycles/Consistency.lf @@ -14,17 +14,15 @@ reactor Controller { state latest_control: double = 0.0 state first: bool = true - reaction c1(local_update, remote_update) {= - =} + reaction c1(local_update, remote_update) {= =} - reaction c2(local_update) -> control {= - =} + reaction c2(local_update) -> control {= =} } reactor Platform { input update: double output publish: double - + c = new Controller() p = new PhysicalPlant() p.sensor -> c.local_update @@ -36,7 +34,7 @@ reactor Platform { federated reactor { p1 = new Platform() p2 = new Platform() - + p1.publish -> p2.update p2.publish -> p1.update } diff --git a/examples/C/src/zero-delay-cycles/ZeroDelayCycle.lf b/examples/C/src/zero-delay-cycles/ZeroDelayCycle.lf index 08230aba..c2473134 100644 --- a/examples/C/src/zero-delay-cycles/ZeroDelayCycle.lf +++ b/examples/C/src/zero-delay-cycles/ZeroDelayCycle.lf @@ -1,8 +1,8 @@ target C -reactor A (Period:time = 1 msec) { - input in:int - output out:int +reactor A(Period: time = 1 msec) { + input in: int + output out: int timer t(0, Period) @@ -15,10 +15,10 @@ reactor A (Period:time = 1 msec) { =} } - reactor B { - input in:int - output out:int + input in: int + output out: int + reaction(in) -> out {= lf_set(out, in->value); =} @@ -30,4 +30,4 @@ federated reactor { a.out -> b.in b.out -> a.in -} \ No newline at end of file +} From e6b5495c25c385a7798fcd507d0b6023d4802fe0 Mon Sep 17 00:00:00 2001 From: Hokeun Kim Date: Fri, 7 Feb 2025 16:11:19 -0700 Subject: [PATCH 2/3] Move CausalityLoop.lf into failing directory. --- examples/C/src/zero-delay-cycles/{ => failing}/CausalityLoop.lf | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename examples/C/src/zero-delay-cycles/{ => failing}/CausalityLoop.lf (100%) diff --git a/examples/C/src/zero-delay-cycles/CausalityLoop.lf b/examples/C/src/zero-delay-cycles/failing/CausalityLoop.lf similarity index 100% rename from examples/C/src/zero-delay-cycles/CausalityLoop.lf rename to examples/C/src/zero-delay-cycles/failing/CausalityLoop.lf From ff417458c19fbba8f26b06349924bdbac8df0e7b Mon Sep 17 00:00:00 2001 From: Hokeun Kim Date: Fri, 7 Feb 2025 16:17:10 -0700 Subject: [PATCH 3/3] Add explanation for the failing example with a diagram. --- examples/C/src/zero-delay-cycles/README.md | 4 ++++ .../src/zero-delay-cycles/img/CausalityLoop.png | Bin 0 -> 22052 bytes 2 files changed, 4 insertions(+) create mode 100644 examples/C/src/zero-delay-cycles/img/CausalityLoop.png diff --git a/examples/C/src/zero-delay-cycles/README.md b/examples/C/src/zero-delay-cycles/README.md index 411d1346..502b7598 100644 --- a/examples/C/src/zero-delay-cycles/README.md +++ b/examples/C/src/zero-delay-cycles/README.md @@ -15,4 +15,8 @@ These examples show usage patterns for zero-delay cycles in Lingua Franca. ZeroDelayCycle ZeroDelayCycle.lf: Trivial test case. + + CausalityLoop + CausalityLoop.lf: Failing example due to a causality loop. + diff --git a/examples/C/src/zero-delay-cycles/img/CausalityLoop.png b/examples/C/src/zero-delay-cycles/img/CausalityLoop.png new file mode 100644 index 0000000000000000000000000000000000000000..2687627a5b6484ad7814ae56388278297049f42d GIT binary patch literal 22052 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 literal 0 HcmV?d00001