From fd749300ed9b2613dc490b517acf57460f3d61fe Mon Sep 17 00:00:00 2001 From: Hugo Meens Date: Tue, 29 Apr 2025 18:38:04 +0200 Subject: [PATCH] TP4: obj1 - obj2 --- tp4-obj1-meens/Makefile | 28 ++++++++ tp4-obj1-meens/extern.c | 30 +++++++++ tp4-obj1-meens/extern.epi | 5 ++ tp4-obj1-meens/extern.h | 26 ++++++++ tp4-obj1-meens/extern_types.h | 6 ++ tp4-obj1-meens/main.c | 21 ++++++ tp4-obj1-meens/scheduler.ept | 104 +++++++++++++++++++++++++++++ tp4-obj1-meens/scheduler_data.ept | 28 ++++++++ tp4-obj2-meens/Makefile | 28 ++++++++ tp4-obj2-meens/extern.c | 30 +++++++++ tp4-obj2-meens/extern.epi | 5 ++ tp4-obj2-meens/extern.h | 26 ++++++++ tp4-obj2-meens/extern_types.h | 6 ++ tp4-obj2-meens/main.c | 21 ++++++ tp4-obj2-meens/scheduler.ept | 105 ++++++++++++++++++++++++++++++ tp4-obj2-meens/scheduler_data.ept | 28 ++++++++ 16 files changed, 497 insertions(+) create mode 100644 tp4-obj1-meens/Makefile create mode 100644 tp4-obj1-meens/extern.c create mode 100644 tp4-obj1-meens/extern.epi create mode 100644 tp4-obj1-meens/extern.h create mode 100644 tp4-obj1-meens/extern_types.h create mode 100644 tp4-obj1-meens/main.c create mode 100644 tp4-obj1-meens/scheduler.ept create mode 100644 tp4-obj1-meens/scheduler_data.ept create mode 100644 tp4-obj2-meens/Makefile create mode 100644 tp4-obj2-meens/extern.c create mode 100644 tp4-obj2-meens/extern.epi create mode 100644 tp4-obj2-meens/extern.h create mode 100644 tp4-obj2-meens/extern_types.h create mode 100644 tp4-obj2-meens/main.c create mode 100644 tp4-obj2-meens/scheduler.ept create mode 100644 tp4-obj2-meens/scheduler_data.ept diff --git a/tp4-obj1-meens/Makefile b/tp4-obj1-meens/Makefile new file mode 100644 index 0000000..9992953 --- /dev/null +++ b/tp4-obj1-meens/Makefile @@ -0,0 +1,28 @@ +LIB_PATH=$(shell heptc -where) +OBJ=extern.c scheduler_c/scheduler.c scheduler_data_c/scheduler_data_types.c + +aaa: + heptc -target c scheduler_data.ept + heptc extern.epi + heptc -target c scheduler.ept + gcc -I $(LIB_PATH)/c -I . main.c extern.c -I scheduler_data_c scheduler_c/scheduler.c scheduler_data_c/scheduler_data.c + +al: main + +a: extern.epi + heptc $< + +$(OBJ): scheduler_data.ept scheduler.ept a + heptc -target c scheduler_data.ept + heptc -target c scheduler.ept + +main: $(OBJ) + gcc -I $(LIB_PATH)/c -I . main.c $(OBJ) + +clean: + $(RM) *.log + $(RM) *.epci + $(RM) *.mls + $(RM) *.o *.obj *.obc + $(RM) -r *_c + $(RM) *.out diff --git a/tp4-obj1-meens/extern.c b/tp4-obj1-meens/extern.c new file mode 100644 index 0000000..4a994b0 --- /dev/null +++ b/tp4-obj1-meens/extern.c @@ -0,0 +1,30 @@ +#include "extern.h" +#include +#include +#include "scheduler_data_c/scheduler_data_types.h" + +void Extern__deadline_miss_log_step(int data, int task_id, Extern__deadline_miss_log_out *_out) +{ + printf("Deadline missed: task: %i, data: %i\n", task_id, data); +} + +int Extern__random_step(int max, Extern__random_out *_out) +{ + _out->v = (rand() % max) + 1; + /* _out->v = max; */ + return _out->v; +} + +void Extern__print_scheduler_state_step(Scheduler_data__scheduler_state s, Extern__print_scheduler_state_out *_out) +{ + printf("Scheduler state - current_date: %i\n", s.current_date); + for (size_t i = 0; i < Scheduler_data__ntasks; i++) { + int left = s.tasks[i].left; + if (s.tasks[i].status == 2) + left = 0; + printf("[%li] Task - status: %d - current_deadline: %i - left: %i\n", + i, s.tasks[i].status, s.tasks[i].current_deadline, left); + } + printf("\n"); + +} diff --git a/tp4-obj1-meens/extern.epi b/tp4-obj1-meens/extern.epi new file mode 100644 index 0000000..f65d2df --- /dev/null +++ b/tp4-obj1-meens/extern.epi @@ -0,0 +1,5 @@ +open Scheduler_data + +fun deadline_miss_log(date:int;task_id:int) returns () +fun random(max:int) returns (v:int) +fun print_scheduler_state(s:scheduler_state) returns () diff --git a/tp4-obj1-meens/extern.h b/tp4-obj1-meens/extern.h new file mode 100644 index 0000000..1bed978 --- /dev/null +++ b/tp4-obj1-meens/extern.h @@ -0,0 +1,26 @@ +#ifndef EXTERN_H +#define EXTERN_H + +#include "scheduler_data_c/scheduler_data_types.h" + +typedef struct { + int data; + int task_id; +} Extern__deadline_miss_log_out; + +typedef struct { + int max; + int v; +} Extern__random_out; + +typedef struct { +} Extern__print_scheduler_state_out; + + + +void Extern__deadline_miss_log_step(int data, int task_id, Extern__deadline_miss_log_out *_out); +int Extern__random_step(int max, Extern__random_out *_out); +void Extern__print_scheduler_state_step(Scheduler_data__scheduler_state s, Extern__print_scheduler_state_out *_out); + +#endif // EXTERN_H + diff --git a/tp4-obj1-meens/extern_types.h b/tp4-obj1-meens/extern_types.h new file mode 100644 index 0000000..863ab7d --- /dev/null +++ b/tp4-obj1-meens/extern_types.h @@ -0,0 +1,6 @@ +#ifndef EXTERN_TYPES_H +#define EXTERN_TYPES_H + + + +#endif /* EXTERN_TYPES_H */ diff --git a/tp4-obj1-meens/main.c b/tp4-obj1-meens/main.c new file mode 100644 index 0000000..cd308f7 --- /dev/null +++ b/tp4-obj1-meens/main.c @@ -0,0 +1,21 @@ +#include +/* #include "scheduler_data_c/scheduler_data.h" */ +/* #include "scheduler_data_c/scheduler_data_types.h" */ +#include "scheduler_c/scheduler.h" +#include "scheduler_c/scheduler_types.h" +#include "stdio.h" + +int main() { + Scheduler__main_out _out; + Scheduler__main_mem self; + char buffer[100]; + + + Scheduler__main_reset(&self); + + while (1) { + fgets(buffer, 10, stdin); + Scheduler__main_step(&_out, &self); + } + return 0; +} diff --git a/tp4-obj1-meens/scheduler.ept b/tp4-obj1-meens/scheduler.ept new file mode 100644 index 0000000..b663cab --- /dev/null +++ b/tp4-obj1-meens/scheduler.ept @@ -0,0 +1,104 @@ +open Scheduler_data +open Extern + +fun select_aux(ts:task_status; ta:task_attributes;tid:int ;acc:select_acc) + returns (acc_o:select_acc) +let + acc_o = + if (ts.status = Ready) and (ta.period < acc.speriod) then + { tid = tid; speriod = ta.period } + else acc +tel + +fun select_one_task(ts:task_status^ntasks) returns(selected:int) + var tmp : select_acc ; +let + tmp = foldi<> select_aux (ts,tasks,{ tid = ntasks; speriod = int_max }) ; + selected = tmp.tid ; +tel + +fun start_inst(current_date:int;tsi:task_status;ta:task_attributes) + returns (tso:task_status) + var c : bool ; +let + c = (current_date-ta.first_start)%ta.period = 0 ; + tso = merge c + (true -> { + status = Ready; + current_deadline = (current_date when c) + (ta.deadline when c); + left = random(ta.capacity when c) + }) + (false -> tsi whenot c) +tel + +fun update_selected(ts:task_status;selected:int;tid:int) returns (tso:task_status) +let + tso = + if tid = selected then + { ts with .status = Running } + else ts +tel + +fun rate_monotonic(ts:task_status^ntasks) returns (tso:task_status^ntasks) + var selected : int ; +let + selected = select_one_task(ts) ; + tso = mapi<> update_selected (ts, selected^ntasks) ; +tel + +fun check_deadline(current_date:int; tsi:task_status; tid:int) + returns (tso:task_status) + var c: bool ; +let + c = (tsi.status = Ready) + and (tsi.current_deadline = current_date) ; + () = deadline_miss_log(current_date when c, tid when c) ; + tso = if c then { tsi with .status = Waiting} else tsi ; +tel + +fun simulate(tsi:task_status) + returns (o:task_status) +let + o = + if tsi.status = Running then + if tsi.left <=1 then + (* Normal termination, move to Waiting state *) + { tsi with .status = Waiting } + else + (* No termination, yet *) + { + status = Ready; + current_deadline = tsi.current_deadline ; + left = tsi.left - 1 + } + else tsi +tel + +fun scheduler(si:scheduler_state) returns (so:scheduler_state) + var + new_date : int ; + tmp1,tmp2,tmp3,fin: task_status^ntasks ; +let + new_date = si.current_date + 1 ; (* advance time by 1 *) + tmp1 = map <> simulate (si.tasks) ; + tmp2 = mapi<> check_deadline (new_date^ntasks,tmp1); + tmp3 = map <> start_inst (new_date^ntasks,tmp2,tasks); + fin = rate_monotonic(tmp3) ; (* scheduling policy *) + so = { current_date = new_date; tasks = fin } +tel + + +const init_sstate : scheduler_state = { + current_date = -1 ; + tasks = { + status=Waiting;current_deadline=0;left=0 + }^2 +} + +node main() returns () + var sstate, new_sstate : scheduler_state ; +let + new_sstate = scheduler(sstate) ; + sstate = init_sstate fby new_sstate ; + () = print_scheduler_state(new_sstate) ; +tel diff --git a/tp4-obj1-meens/scheduler_data.ept b/tp4-obj1-meens/scheduler_data.ept new file mode 100644 index 0000000..3b11a0b --- /dev/null +++ b/tp4-obj1-meens/scheduler_data.ept @@ -0,0 +1,28 @@ +const ntasks : int = 2 +const int_max : int = 10 + +type task_attributes = { + period : int ; + capacity : int ; + deadline : int ; + first_start : int + } + +type task_state = Running | Ready | Waiting +type task_status = { + status : task_state ; + current_deadline : int ; + left : int +} + +type scheduler_state = { + current_date : int ; + tasks : task_status^ntasks +} + +type select_acc = { tid : int; speriod : int } + +const tasks : task_attributes^ntasks = [ + { period=5; capacity=2; deadline=5; first_start=0 }, + { period=7; capacity=2; deadline=7; first_start=3 } +] diff --git a/tp4-obj2-meens/Makefile b/tp4-obj2-meens/Makefile new file mode 100644 index 0000000..9992953 --- /dev/null +++ b/tp4-obj2-meens/Makefile @@ -0,0 +1,28 @@ +LIB_PATH=$(shell heptc -where) +OBJ=extern.c scheduler_c/scheduler.c scheduler_data_c/scheduler_data_types.c + +aaa: + heptc -target c scheduler_data.ept + heptc extern.epi + heptc -target c scheduler.ept + gcc -I $(LIB_PATH)/c -I . main.c extern.c -I scheduler_data_c scheduler_c/scheduler.c scheduler_data_c/scheduler_data.c + +al: main + +a: extern.epi + heptc $< + +$(OBJ): scheduler_data.ept scheduler.ept a + heptc -target c scheduler_data.ept + heptc -target c scheduler.ept + +main: $(OBJ) + gcc -I $(LIB_PATH)/c -I . main.c $(OBJ) + +clean: + $(RM) *.log + $(RM) *.epci + $(RM) *.mls + $(RM) *.o *.obj *.obc + $(RM) -r *_c + $(RM) *.out diff --git a/tp4-obj2-meens/extern.c b/tp4-obj2-meens/extern.c new file mode 100644 index 0000000..4a994b0 --- /dev/null +++ b/tp4-obj2-meens/extern.c @@ -0,0 +1,30 @@ +#include "extern.h" +#include +#include +#include "scheduler_data_c/scheduler_data_types.h" + +void Extern__deadline_miss_log_step(int data, int task_id, Extern__deadline_miss_log_out *_out) +{ + printf("Deadline missed: task: %i, data: %i\n", task_id, data); +} + +int Extern__random_step(int max, Extern__random_out *_out) +{ + _out->v = (rand() % max) + 1; + /* _out->v = max; */ + return _out->v; +} + +void Extern__print_scheduler_state_step(Scheduler_data__scheduler_state s, Extern__print_scheduler_state_out *_out) +{ + printf("Scheduler state - current_date: %i\n", s.current_date); + for (size_t i = 0; i < Scheduler_data__ntasks; i++) { + int left = s.tasks[i].left; + if (s.tasks[i].status == 2) + left = 0; + printf("[%li] Task - status: %d - current_deadline: %i - left: %i\n", + i, s.tasks[i].status, s.tasks[i].current_deadline, left); + } + printf("\n"); + +} diff --git a/tp4-obj2-meens/extern.epi b/tp4-obj2-meens/extern.epi new file mode 100644 index 0000000..f65d2df --- /dev/null +++ b/tp4-obj2-meens/extern.epi @@ -0,0 +1,5 @@ +open Scheduler_data + +fun deadline_miss_log(date:int;task_id:int) returns () +fun random(max:int) returns (v:int) +fun print_scheduler_state(s:scheduler_state) returns () diff --git a/tp4-obj2-meens/extern.h b/tp4-obj2-meens/extern.h new file mode 100644 index 0000000..1bed978 --- /dev/null +++ b/tp4-obj2-meens/extern.h @@ -0,0 +1,26 @@ +#ifndef EXTERN_H +#define EXTERN_H + +#include "scheduler_data_c/scheduler_data_types.h" + +typedef struct { + int data; + int task_id; +} Extern__deadline_miss_log_out; + +typedef struct { + int max; + int v; +} Extern__random_out; + +typedef struct { +} Extern__print_scheduler_state_out; + + + +void Extern__deadline_miss_log_step(int data, int task_id, Extern__deadline_miss_log_out *_out); +int Extern__random_step(int max, Extern__random_out *_out); +void Extern__print_scheduler_state_step(Scheduler_data__scheduler_state s, Extern__print_scheduler_state_out *_out); + +#endif // EXTERN_H + diff --git a/tp4-obj2-meens/extern_types.h b/tp4-obj2-meens/extern_types.h new file mode 100644 index 0000000..863ab7d --- /dev/null +++ b/tp4-obj2-meens/extern_types.h @@ -0,0 +1,6 @@ +#ifndef EXTERN_TYPES_H +#define EXTERN_TYPES_H + + + +#endif /* EXTERN_TYPES_H */ diff --git a/tp4-obj2-meens/main.c b/tp4-obj2-meens/main.c new file mode 100644 index 0000000..cd308f7 --- /dev/null +++ b/tp4-obj2-meens/main.c @@ -0,0 +1,21 @@ +#include +/* #include "scheduler_data_c/scheduler_data.h" */ +/* #include "scheduler_data_c/scheduler_data_types.h" */ +#include "scheduler_c/scheduler.h" +#include "scheduler_c/scheduler_types.h" +#include "stdio.h" + +int main() { + Scheduler__main_out _out; + Scheduler__main_mem self; + char buffer[100]; + + + Scheduler__main_reset(&self); + + while (1) { + fgets(buffer, 10, stdin); + Scheduler__main_step(&_out, &self); + } + return 0; +} diff --git a/tp4-obj2-meens/scheduler.ept b/tp4-obj2-meens/scheduler.ept new file mode 100644 index 0000000..edd5f7d --- /dev/null +++ b/tp4-obj2-meens/scheduler.ept @@ -0,0 +1,105 @@ +open Scheduler_data +open Extern + +fun select_aux(ts:task_status; ta:task_attributes;tid:int ;acc:select_acc) + returns (acc_o:select_acc) +let + acc_o = + if (ts.status = Ready) and (ta.period < acc.speriod) then + { tid = tid; speriod = ta.period } + else acc +tel + +fun select_one_task(ts:task_status^ntasks) returns(selected:int) + var tmp : select_acc ; +let + tmp = foldi<> select_aux (ts,tasks,{ tid = ntasks; speriod = int_max }) ; + selected = tmp.tid ; +tel + +fun start_inst(current_date:int;tsi:task_status;ta:task_attributes) + returns (tso:task_status) + var c : bool ; +let + c = (current_date-ta.first_start)%ta.period = 0 ; + tso = merge c + (true -> { + status = Ready; + current_deadline = + (current_date when c) + (ta.deadline when c); + left = (ta.capacity when c) + }) + (false -> tsi whenot c) +tel + +fun update_selected(ts:task_status;selected:int;tid:int) returns (tso:task_status) +let + tso = + if tid = selected then + { ts with .status = Running } + else ts +tel + +fun rate_monotonic(ts:task_status^ntasks) returns (tso:task_status^ntasks) + var selected : int ; +let + selected = select_one_task(ts) ; + tso = mapi<> update_selected (ts, selected^ntasks) ; +tel + +fun check_deadline(current_date:int; tsi:task_status; tid:int) + returns (tso:task_status) + var c: bool ; +let + c = (tsi.status = Ready) + and (tsi.current_deadline = current_date) ; + () = deadline_miss_log(current_date when c, tid when c) ; + tso = if c then { tsi with .status = Waiting} else tsi ; +tel + +fun simulate(tsi:task_status) + returns (o:task_status) +let + o = + if tsi.status = Running then + if tsi.left <=1 then + (* Normal termination, move to Waiting state *) + { tsi with .status = Waiting } + else + (* No termination, yet *) + { + status = Ready; + current_deadline = tsi.current_deadline ; + left = tsi.left - 1 + } + else tsi +tel + +fun scheduler(si:scheduler_state) returns (so:scheduler_state) + var + new_date : int ; + tmp1,tmp2,tmp3,fin: task_status^ntasks ; +let + new_date = si.current_date + 1 ; (* advance time by 1 *) + tmp1 = map <> simulate (si.tasks) ; + tmp2 = mapi<> check_deadline (new_date^ntasks,tmp1); + tmp3 = map <> start_inst (new_date^ntasks,tmp2,tasks); + fin = rate_monotonic(tmp3) ; (* scheduling policy *) + so = { current_date = new_date; tasks = fin } +tel + + +const init_sstate : scheduler_state = { + current_date = -1 ; + tasks = { + status=Waiting;current_deadline=0;left=0 + }^2 +} + +node main() returns () + var sstate, new_sstate : scheduler_state ; +let + new_sstate = scheduler(sstate) ; + sstate = init_sstate fby new_sstate ; + () = print_scheduler_state(new_sstate) ; +tel diff --git a/tp4-obj2-meens/scheduler_data.ept b/tp4-obj2-meens/scheduler_data.ept new file mode 100644 index 0000000..71cf6f0 --- /dev/null +++ b/tp4-obj2-meens/scheduler_data.ept @@ -0,0 +1,28 @@ +const ntasks : int = 2 +const int_max : int = 10 + +type task_attributes = { + period : int ; + capacity : int ; + deadline : int ; + first_start : int + } + +type task_state = Running | Ready | Waiting +type task_status = { + status : task_state ; + current_deadline : int ; + left : int +} + +type scheduler_state = { + current_date : int ; + tasks : task_status^ntasks +} + +type select_acc = { tid : int; speriod : int } + +const tasks : task_attributes^ntasks = [ + { period=5; capacity=2; deadline=5; first_start=0 }, + { period=7; capacity=4; deadline=7; first_start=3 } +]