lf-lang / lingua-franca

Intuitive concurrent programming in any language
https://www.lf-lang.org
Other
220 stars 57 forks source link

Reactor naming mechanism in C target #2319

Open OmerMajNition opened 2 weeks ago

OmerMajNition commented 2 weeks ago
target C;

reactor A (bank_index:int = 0, name:string = "A", log_level:int = 0) {
    reaction (startup) {=
        fprintf (   stderr, "(%lld, %u) physical_time:%lld "
                    "%s [%d] Started\n",
                    lf_time_logical_elapsed(), lf_tag().microstep, lf_time_physical_elapsed(),
                    self->name, self->bank_index
        );
    =}

    reaction (shutdown) {=
        fprintf (   stderr, "(%lld, %u) physical_time:%lld "
                    "%s [%d] Terminated\n",
                    lf_time_logical_elapsed(), lf_tag().microstep, lf_time_physical_elapsed(),
                    self->name, self->bank_index
        );
    =}
}

reactor B (bank_index:int = 0, name:string = "B", log_level:int = 0) {
    a = new [3] A();
    reaction (startup) {=
        fprintf (   stderr, "(%lld, %u) physical_time:%lld "
                    "%s [%d] Started\n",
                    lf_time_logical_elapsed(), lf_tag().microstep, lf_time_physical_elapsed(),
                    self->name, self->bank_index
        );
    =}

    reaction (shutdown) {=
        fprintf (   stderr, "(%lld, %u) physical_time:%lld "
                    "%s [%d] Terminated\n",
                    lf_time_logical_elapsed(), lf_tag().microstep, lf_time_physical_elapsed(),
                    self->name, self->bank_index
        );
    =}
}

reactor C (bank_index:int = 0, name:string = "C", log_level:int = 0) {
    b = new [2] B();
    reaction (startup) {=
        fprintf (   stderr, "(%lld, %u) physical_time:%lld "
                    "%s [%d] Started\n",
                    lf_time_logical_elapsed(), lf_tag().microstep, lf_time_physical_elapsed(),
                    self->name, self->bank_index
        );
    =}

    reaction (shutdown) {=
        fprintf (   stderr, "(%lld, %u) physical_time:%lld "
                    "%s [%d] Terminated\n",
                    lf_time_logical_elapsed(), lf_tag().microstep, lf_time_physical_elapsed(),
                    self->name, self->bank_index
        );
    =}
}

reactor D (bank_index:int = 0, name:string = "D", log_level:int = 0) {
    a = new [2] A(name = "Another");
    reaction (startup) {=
        fprintf (   stderr, "(%lld, %u) physical_time:%lld "
                    "%s [%d] Started\n",
                    lf_time_logical_elapsed(), lf_tag().microstep, lf_time_physical_elapsed(),
                    self->name, self->bank_index
        );
    =}

    reaction (shutdown) {=
        fprintf (   stderr, "(%lld, %u) physical_time:%lld "
                    "%s [%d] Terminated\n",
                    lf_time_logical_elapsed(), lf_tag().microstep, lf_time_physical_elapsed(),
                    self->name, self->bank_index
        );
    =}
}

main reactor (name:string = "Base") {
    c = new [2] C(name = "C", log_level = 0);
    d = new [3] D(name = "D");
}

How to let user name reactors with hierarchy maintained in the name. This would also enable to have a unique name for each reactor.