@@ -17,40 +17,42 @@ let init ?(nproc=99) ?(nsema=99) ?(nevent=99) ?(nbboard=99) () = (* TODO better
1717 let nsema = fst @@ var (Byte nsema) " nsema" in
1818 let nevent = fst @@ var (Byte nevent) " nevent" in
1919 let nbboard = fst @@ var (Byte nbboard) " nbboard" in
20+
2021 (* Pml.do_; (* ppx_monadic: from now on ; is bind *) *)
2122 (* switched to ocaml-monadic because ppx_monadic was constraining us to ocaml <4.08, now have to use ;%bind instead of just ; and `let%bind x = e in` instead of `x <-- e;` *)
23+ (* Dropped ocaml-monadic and used let* syntax introduced in OCaml 4.08. Use `let* () = e in` instead of `e;%bind` *)
2224
2325 (* type delcarations, TODO generate this? *)
2426 (* TODO might need adjustment if there are enums with gaps or enums not starting at 0 *)
25- enum return_code_of_enum show_return_code " return_code" ; % bind
26- enum partition_mode_of_enum show_partition_mode " partition_mode" ; % bind
27- enum status_of_enum show_status " status" ; % bind
28- enum waiting_for_of_enum show_waiting_for " waiting_for" ; % bind
29- enum queuing_discipline_of_enum show_queuing_discipline " queuing_discipline" ; % bind
27+ let * () = enum return_code_of_enum show_return_code " return_code" in
28+ let * () = enum partition_mode_of_enum show_partition_mode " partition_mode" in
29+ let * () = enum status_of_enum show_status " status" in
30+ let * () = enum waiting_for_of_enum show_waiting_for " waiting_for" in
31+ let * () = enum queuing_discipline_of_enum show_queuing_discipline " queuing_discipline" in
3032 (* variable declarations *)
3133 (* TODO inject: let%s status = arr nprocNOTCREATED in *)
32- let % bind partition_mode = var (Enum (COLD_START , show_partition_mode)) " partition_mode" in
33- let % bind lock_level = var (Byte 0 ) " lock_level" in (* scheduling only takes place if this is 0 *)
34- let % bind exclusive = var (Byte 0 ) " exclusive" in (* id of process that has exclusive privilige toecute if lockLevel > 0 *)
35- let % bind status = arr ! nproc (Enum (NOTCREATED , show_status)) " status" in
34+ let * partition_mode = var (Enum (COLD_START , show_partition_mode)) " partition_mode" in
35+ let * lock_level = var (Byte 0 ) " lock_level" in (* scheduling only takes place if this is 0 *)
36+ let * exclusive = var (Byte 0 ) " exclusive" in (* id of process that has exclusive privilige toecute if lockLevel > 0 *)
37+ let * status = arr ! nproc (Enum (NOTCREATED , show_status)) " status" in
3638 (* TODO type for structured data types *)
37- let % bind waiting_for = arr ! nproc (Enum (NONE , show_waiting_for)) " waiting_for" in
38- let % bind waiting_id = arr ! nproc (Byte 0 ) " waiting_id" in
39- Macro. _if ! nsema; % bind
40- let % bind semas = arr ! nsema (Byte 0 ) " semas" in
41- let % bind semas_max = arr ! nsema (Byte 0 ) " semas_max" in
42- let % bind semas_chan = arr ! nsema (Chan. create ! nproc (Byte 0 )) " semas_chan" in
43- Macro. _endif; % bind
44- Macro. _if ! nevent; % bind
45- let % bind events = arr ! nevent (Bool false ) " events" in
46- Macro. _endif; % bind
47- Macro. _if ! nbboard; % bind
48- let % bind bboards = arr ! nbboard (Bool false ) " bboards" in
49- Macro. _endif; % bind
39+ let * waiting_for = arr ! nproc (Enum (NONE , show_waiting_for)) " waiting_for" in
40+ let * waiting_id = arr ! nproc (Byte 0 ) " waiting_id" in
41+ let * () = Macro. _if ! nsema in
42+ let * semas = arr ! nsema (Byte 0 ) " semas" in
43+ let * semas_max = arr ! nsema (Byte 0 ) " semas_max" in
44+ let * semas_chan = arr ! nsema (Chan. create ! nproc (Byte 0 )) " semas_chan" in
45+ let * () = Macro. _endif in
46+ let * () = Macro. _if ! nevent in
47+ let * events = arr ! nevent (Bool false ) " events" in
48+ let * () = Macro. _endif in
49+ let * () = Macro. _if ! nbboard in
50+ let * bboards = arr ! nbboard (Bool false ) " bboards" in
51+ let * () = Macro. _endif in
5052
5153 (* just for asserts *)
52- let % bind tasks_created = var (Byte 0 ) " tasks_created" in
53- let % bind semas_created = var (Byte 0 ) " semas_created" in
54+ let * tasks_created = var (Byte 0 ) " tasks_created" in
55+ let * semas_created = var (Byte 0 ) " semas_created" in
5456
5557 (* dummy variables for use in arguments *)
5658 let tid,tid_decl = var (Byte 0 ) " tid" in (* this is the id we give out for every new task *)
@@ -60,21 +62,21 @@ let init ?(nproc=99) ?(nsema=99) ?(nevent=99) ?(nbboard=99) () = (* TODO better
6062 (* let r,_ = var (Enum (SUCCESS, show_return_code)) "r" in*)
6163
6264 (* macros - used in extracted pml *)
63- Macro. define " can_run" @@ A1 (id, fun id -> (! status ! id == e READY show_status) && (! lock_level == i 0 || ! exclusive == ! id) && (! partition_mode == e NORMAL show_partition_mode || ! id == i 0 )); % bind
65+ let * () = Macro. define " can_run" @@ A1 (id, fun id -> (! status ! id == e READY show_status) && (! lock_level == i 0 || ! exclusive == ! id) && (! partition_mode == e NORMAL show_partition_mode || ! id == i 0 )) in
6466
6567 (* helpers - these get inlined *)
6668 let task_info id = s " status[" ^ i2s id^ s " ] = " ^ e2s (! status id)^ s " , waiting_for[] = " ^ e2s (! waiting_for id)^ s " , waiting_id[] = " ^ i2s (! waiting_id id) in
6769 let sema_info id = s " semas[" ^ i2s id^ s " ] = " ^ i2s (! semas id) in
6870 let set_waiting id wfor wid =
69- println (s " set_waiting: process " ^ i2s id^ s " will wait for " ^ i2s wid); % bind
70- waiting_for := id, (e wfor show_waiting_for); % bind
71- waiting_id := id, wid; % bind
71+ let * () = println (s " set_waiting: process " ^ i2s id^ s " will wait for " ^ i2s wid) in
72+ let * () = waiting_for := id, (e wfor show_waiting_for) in
73+ let * () = waiting_id := id, wid in
7274 status := id, (e WAITING show_status)
7375 in
7476 let set_ready id =
75- println (s " set_ready: process " ^ i2s id^ s " set to ready. " ^ task_info id); % bind
76- waiting_for := id, (e NONE show_waiting_for); % bind
77- waiting_id := id, i 0 ; % bind
77+ let * () = println (s " set_ready: process " ^ i2s id^ s " set to ready. " ^ task_info id) in
78+ let * () = waiting_for := id, (e NONE show_waiting_for) in
79+ let * () = waiting_id := id, i 0 in
7880 status := id, (e READY show_status)
7981 in
8082 let is_waiting id wfor wid = ! status id == e WAITING show_status && ! waiting_for id == e wfor show_waiting_for && ! waiting_id id == wid in
@@ -83,68 +85,68 @@ let init ?(nproc=99) ?(nsema=99) ?(nevent=99) ?(nbboard=99) () = (* TODO better
8385 _foreach semas (fun j _ ->
8486 _ift (poll `Any (! semas_chan j) id) (recv `Any (! semas_chan j) id)
8587 )
86- else nop; % bind
88+ else let * () = nop in
8789 waiting_for := id, e NONE show_waiting_for
8890 in
8991
9092 (* preemption *)
9193 let mode,_ = var (Enum (COLD_START , show_partition_mode)) " mode" in
92- extract " LockPreemption" @@ A0 (
93- incr lock_level; % bind
94+ let * () = extract " LockPreemption" @@ A0 (
95+ let * () = incr lock_level in
9496 exclusive := ! tid (* TODO is this really changed if lock_level > 0? if yes, it is probably also restored... *)
95- ); % bind
96- extract " UnlockPreemption" @@ A0 (
97+ ) in
98+ let * () = extract " UnlockPreemption" @@ A0 (
9799 _ift (! lock_level > i 0 ) (decr lock_level)
98- ); % bind
99- extract " SetPartitionMode" @@ A1 (mode, fun mode ->
100+ ) in
101+ let * () = extract " SetPartitionMode" @@ A1 (mode, fun mode ->
100102 partition_mode := ! mode
101- ); % bind
103+ ) in
102104
103105 (* processes *)
104- extract " CreateProcess" @@ A1 (id(* ; pri; per; cap]*) , fun id ->
105- _assert (! status ! id == e NOTCREATED show_status); % bind
106- status := ! id, e STOPPED show_status; % bind
107- waiting_for := ! id, e NONE show_waiting_for; % bind
106+ let * () = extract " CreateProcess" @@ A1 (id(* ; pri; per; cap]*) , fun id ->
107+ let * () = _assert (! status ! id == e NOTCREATED show_status) in
108+ let * () = status := ! id, e STOPPED show_status in
109+ let * () = waiting_for := ! id, e NONE show_waiting_for in
108110 incr tasks_created
109- ); % bind
111+ ) in
110112 (* CreateErrorHandler *)
111- extract " Start" @@ A1 (id, fun id ->
112- _assert (! status ! id != e NOTCREATED show_status); % bind
113- remove_waiting ! id; % bind
113+ let * () = extract " Start" @@ A1 (id, fun id ->
114+ let * () = _assert (! status ! id != e NOTCREATED show_status) in
115+ let * () = remove_waiting ! id in
114116 status := ! id, e READY show_status
115- ); % bind
116- extract " Stop" @@ A1 (id, fun id ->
117- _assert (! status ! id != e NOTCREATED show_status); % bind
118- remove_waiting ! id; % bind
117+ ) in
118+ let * () = extract " Stop" @@ A1 (id, fun id ->
119+ let * () = _assert (! status ! id != e NOTCREATED show_status) in
120+ let * () = remove_waiting ! id in
119121 status := ! id, e STOPPED show_status
120- ); % bind
121- extract " Suspend" @@ A1 (id, fun id ->
122- _assert (! status ! id != e NOTCREATED show_status); % bind
122+ ) in
123+ let * () = extract " Suspend" @@ A1 (id, fun id ->
124+ let * () = _assert (! status ! id != e NOTCREATED show_status) in
123125 status := ! id, e SUSPENDED show_status
124- ); % bind
125- extract " Resume" @@ A1 (id, fun id ->
126- _assert (! status ! id != e NOTCREATED show_status); % bind
127- _ift (! status ! id == e SUSPENDED show_status) (
126+ ) in
127+ let * () = extract " Resume" @@ A1 (id, fun id ->
128+ let * () = _assert (! status ! id != e NOTCREATED show_status) in
129+ let * () = _ift (! status ! id == e SUSPENDED show_status) (
128130 _ifte (! waiting_for ! id == e NONE show_waiting_for)
129131 (status := ! id, e READY show_status)
130132 (status := ! id, e WAITING show_status)
131- ); % bind
133+ ) in
132134 status := ! id, e SUSPENDED show_status
133- ); % bind
135+ ) in
134136
135137 (* semaphores *)
136138 let cur,_ = var (Byte 0 ) " cur" in
137139 let max,_ = var (Byte 0 ) " max" in
138140 let queuing,_ = var (Enum (FIFO , show_queuing_discipline)) " queuing" in
139- extract " CreateSemaphore" ~id: (4 ,0 ," sema" ) @@ A5 (name,cur,max,queuing,id, fun name cur max queuing id ->
140- println (s " CreateSemaphore: " ^ ! name ^ s " , " ^ i2s ! cur ^ s " , " ^ i2s ! max ^ s " , " ^ e2s ! queuing); % bind
141- _assert (! queuing == e FIFO show_queuing_discipline); % bind
142- semas := ! id, ! cur; % bind
143- semas_max := ! id, ! max; % bind
141+ let * () = extract " CreateSemaphore" ~id: (4 ,0 ," sema" ) @@ A5 (name,cur,max,queuing,id, fun name cur max queuing id ->
142+ let * () = println (s " CreateSemaphore: " ^ ! name ^ s " , " ^ i2s ! cur ^ s " , " ^ i2s ! max ^ s " , " ^ e2s ! queuing) in
143+ let * () = _assert (! queuing == e FIFO show_queuing_discipline) in
144+ let * () = semas := ! id, ! cur in
145+ let * () = semas_max := ! id, ! max in
144146 incr semas_created
145- ); % bind
146- extract " GetSemaphoreId" ~id: (1 ,0 ," sema" ) @@ A2 (name, id, fun name id -> skip); % bind
147- extract " WaitSemaphore" @@ A1 (id, fun id ->
147+ ) in
148+ let * () = extract " GetSemaphoreId" ~id: (1 ,0 ," sema" ) @@ A2 (name, id, fun name id -> skip) in
149+ let * () = extract " WaitSemaphore" @@ A1 (id, fun id ->
148150 let id = ! id in
149151 let sema = ! semas id in
150152 let chan = ! semas_chan id in
@@ -162,7 +164,7 @@ let init ?(nproc=99) ?(nsema=99) ?(nevent=99) ?(nbboard=99) () = (* TODO better
162164 sema < i 0 ,
163165 fail (s " WaitSema: count<0: " ^ sema_info id)
164166 ]
165- ); % bind
167+ ) in
166168 extract " SignalSemaphore" @@ A1 (id, fun id ->
167169 let id = ! id in
168170 let sema = ! semas id in
0 commit comments