Skip to content

Commit b441d53

Browse files
Merge pull request #281 from goblint/ocaml-monadic
OCaml's `let*` instead of `ocaml-monadic` ppx
2 parents 7d502b6 + 32eaea7 commit b441d53

File tree

6 files changed

+77
-77
lines changed

6 files changed

+77
-77
lines changed

dune-project

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
ppx_deriving_hash
3636
ppx_deriving_yojson
3737
(ppx_blob (>= 0.6.0))
38-
(ocaml-monadic (>= 0.5))
3938
(ounit2 :with-test)
4039
(qcheck-ounit :with-test)
4140
(odoc :with-doc)

goblint.opam

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ depends: [
3131
"ppx_deriving_hash"
3232
"ppx_deriving_yojson"
3333
"ppx_blob" {>= "0.6.0"}
34-
"ocaml-monadic" {>= "0.5"}
3534
"ounit2" {with-test}
3635
"qcheck-ounit" {with-test}
3736
"odoc" {with-doc}

goblint.opam.locked

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@ depends: [
6262
"ocaml-base-compiler" {= "4.14.0"}
6363
"ocaml-compiler-libs" {= "v0.12.4"}
6464
"ocaml-config" {= "2"}
65-
"ocaml-monadic" {= "0.5"}
6665
"ocaml-options-vanilla" {= "1"}
6766
"ocaml-syntax-shims" {= "1.0.0"}
6867
"ocamlbuild" {= "0.14.1"}

src/dune

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
)
3636
(preprocess
3737
(pps ppx_deriving.std ppx_deriving_hash ppx_deriving_yojson
38-
ppx_distr_guards ocaml-monadic ppx_blob))
38+
ppx_distr_guards ppx_blob))
3939
(preprocessor_deps (file util/options.schema.json))
4040
)
4141

@@ -53,31 +53,31 @@
5353
(modes byte native) ; https://dune.readthedocs.io/en/stable/dune-files.html#linking-modes
5454
(modules goblint mainarinc mainspec)
5555
(libraries goblint.lib goblint.sites.dune)
56-
(preprocess (pps ppx_deriving.std ppx_deriving_hash ppx_deriving_yojson ppx_distr_guards ocaml-monadic))
56+
(preprocess (pps ppx_deriving.std ppx_deriving_hash ppx_deriving_yojson ppx_distr_guards))
5757
(flags :standard -linkall)
5858
)
5959

6060
(executable
6161
(name privPrecCompare)
6262
(modules privPrecCompare)
6363
(libraries goblint.lib goblint.sites.dune)
64-
(preprocess (pps ppx_deriving.std ppx_deriving_hash ppx_deriving_yojson ppx_distr_guards ocaml-monadic))
64+
(preprocess (pps ppx_deriving.std ppx_deriving_hash ppx_deriving_yojson ppx_distr_guards))
6565
(flags :standard -linkall)
6666
)
6767

6868
(executable
6969
(name apronPrecCompare)
7070
(modules apronPrecCompare)
7171
(libraries goblint.lib goblint.sites.dune)
72-
(preprocess (pps ppx_deriving.std ppx_deriving_hash ppx_deriving_yojson ppx_distr_guards ocaml-monadic))
72+
(preprocess (pps ppx_deriving.std ppx_deriving_hash ppx_deriving_yojson ppx_distr_guards))
7373
(flags :standard -linkall)
7474
)
7575

7676
(executable
7777
(name messagesCompare)
7878
(modules messagesCompare)
7979
(libraries goblint.lib goblint.sites.dune)
80-
(preprocess (pps ppx_deriving.std ppx_deriving_hash ppx_deriving_yojson ppx_distr_guards ocaml-monadic))
80+
(preprocess (pps ppx_deriving.std ppx_deriving_hash ppx_deriving_yojson ppx_distr_guards))
8181
(flags :standard -linkall)
8282
)
8383

src/extract/pml.ml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ end
120120
let (>>) a b = fst b, snd a^"\n"^snd b
121121
let bind x f = x >> f (fst x)
122122
let (>>=) = bind
123+
let (let*) = bind (* introduced in OCaml 4.08.0: https://ocaml.org/manual/bindingops.html *)
123124
let return x = x (* ? *)
124125

125126
let indent x = String.split_on_string ~by:"\n" x |> List.map (fun x -> " "^x) |> String.concat "\n"

src/extract/pml_arinc.ml

Lines changed: 71 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)