diff --git a/core/src/main/java/org/lflang/generator/c/CTriggerObjectsGenerator.java b/core/src/main/java/org/lflang/generator/c/CTriggerObjectsGenerator.java index 77e7eee22e..98aec56d80 100644 --- a/core/src/main/java/org/lflang/generator/c/CTriggerObjectsGenerator.java +++ b/core/src/main/java/org/lflang/generator/c/CTriggerObjectsGenerator.java @@ -814,6 +814,9 @@ private static String deferredInitializeNonNested( CTypes types) { var code = new CodeBuilder(); code.pr("// **** Start non-nested deferred initialize for " + reactor.getFullName()); + // Initialization within a for loop iterating + // over bank members of reactor + code.startScopedBlock(reactor); // Initialize the num_destinations fields of port structs on the self struct. // This needs to be outside the above scoped block because it performs // its own iteration over ranges. @@ -830,6 +833,7 @@ private static String deferredInitializeNonNested( for (ReactorInstance child : reactor.children) { code.pr(deferredInitializeNonNested(child, main, child.reactions, types)); } + code.endScopedBlock(); code.pr("// **** End of non-nested deferred initialize for " + reactor.getFullName()); return code.toString(); } diff --git a/test/C/src/multiport/MultiBank_UnconnectedOutput_Test.lf b/test/C/src/multiport/MultiBank_UnconnectedOutput_Test.lf new file mode 100644 index 0000000000..20e79de508 --- /dev/null +++ b/test/C/src/multiport/MultiBank_UnconnectedOutput_Test.lf @@ -0,0 +1,44 @@ +target C { + workers: 1 +} + +reactor echo(bank_index: int = 0) { + input request: entry_T + output response: entry_T + + output unconnected: entry_T + + reaction(request) -> response {= + int req = request->value; + lf_set (response, request->value); + =} +} + +reactor testing_echo(bank_index: int = 0) { + output req: int + input resp: int + + state seed: uint32_t = 0 + + reaction(startup) -> req {= + lf_set (req, 42 + self->bank_index); + =} + + reaction(resp) {= + int sum = self->bank_index + 42; + int received = resp->value; + printf("Bank index: %d, received: %d\n", self->bank_index, received); + if (received != sum) { + printf("Wrong value. Should have been %d.\n", sum); + exit(1); + } + =} +} + +main reactor MultiBank_UnconnectedOutput_Test { + test = new[2] testing_echo() + e = new[2] echo() + + test.req -> e.request + e.response -> test.resp +} diff --git a/test/C/src/multiport/MultiPort_MultiBankTest_UnconnectedOutput_Test.lf b/test/C/src/multiport/MultiPort_MultiBankTest_UnconnectedOutput_Test.lf new file mode 100644 index 0000000000..ed1864b906 --- /dev/null +++ b/test/C/src/multiport/MultiPort_MultiBankTest_UnconnectedOutput_Test.lf @@ -0,0 +1,52 @@ +target C { + workers: 1 +} + +reactor adder(n_ports: int = 1) { + input[n_ports] add_request: entry_T + output add_response: entry_T + + output[n_ports] unconnected: entry_T + + state sum: entry_T = 0 + + reaction(add_request) -> add_response {= + for (int i = 0; i < add_request_width; ++i) { + if (add_request[i]->is_present) { + self->sum += add_request[i]->value; + } + } + lf_set (add_response, self->sum); + self->sum = 0; + =} +} + +reactor testing_adder(bank_index: int = 0, bank_width: int = 1) { + output add_req: int + output result_req: int + + input add_resp: int + input unconnected: int + + reaction(startup) -> add_req {= + lf_set (add_req, 42); + =} + + reaction(add_resp) {= + int sum = self->bank_width * 42; + int received = add_resp->value; + printf("Bank index: %d, received: %d\n", self->bank_index, received); + if (received != sum) { + printf("Wrong value. Should have been %d.\n", sum); + exit(1); + } + =} +} + +main reactor MultiPort_MultiBankTest_UnconnectedOutput_Test { + test = new[2] testing_adder(bank_width=2) + a = new adder(n_ports=2) + + test.add_req -> a.add_request + (a.add_response)+ -> test.add_resp +}