struct: analyzer_rw: rw tags gen tests, 2nd test from presentation

This commit is contained in:
ProgramSnail 2026-05-21 11:56:13 +00:00
parent 98d3d56a13
commit 194a3e1b22

View file

@ -1,4 +1,4 @@
module Functional = module FunctionalRW =
struct struct
open GT open GT
@ -535,6 +535,14 @@ struct
(* - function evaluation *) (* - function evaluation *)
let rec replace_rw_undef_with_r_aw (t : atype) : atype = match t with
| UnitT (r, w) -> let r' = if r == UndefRd then Rd else r in
let w' = if w == UndefWr then AlwaysWr else w in
UnitT (r', w')
| RefT (c, t) -> RefT (c, replace_rw_undef_with_r_aw t)
| TupleT ts -> TupleT (List.map replace_rw_undef_with_r_aw ts)
| FunT ts -> FunT ts (* NOTE: can't properly deduce *)
(* NOTE: in analyzer rw replaces read & write tags with calculated ones *) (* NOTE: in analyzer rw replaces read & write tags with calculated ones *)
let rec func_eval (state : state) (d : decl) : decl = let rec func_eval (state : state) (d : decl) : decl =
match d with match d with
@ -552,7 +560,8 @@ struct
(0, []) ts in (0, []) ts in
(* TODO: FIXME: isure that need reverse ? *) (* TODO: FIXME: isure that need reverse ? *)
FunD (List.rev ts', stmt)) FunD (List.rev ts', stmt))
| VarD _ -> d (* NOTE: tags for globals not checked and not important in current implementation *)
| VarD t -> VarD (replace_rw_undef_with_r_aw t)
(* --- program execution --- *) (* --- program execution --- *)
@ -677,6 +686,86 @@ struct
(v_memval_is (mem_get mem id3) SmthMV); (v_memval_is (mem_get mem id3) SmthMV);
[%expect {| 0 1 2 true true true true true true |}] [%expect {| 0 1 2 true true true true true true |}]
(* - simple rw tags gen tests *)
let%expect_test "simple call with read, dsl, rw gen" =
let prog' = prog_eval (
[
defg (rfT uT_r_mw);
FunD (
[moded @@ cpT @@ uT_undef],
rdS @@ drf @@ v0
)
],
callS vg1 [pE vg0]
) in
prog_eval_noret prog';
print_endline @@ show(prog) prog';
[%expect {| ([VarD (RefT (Rf, UnitT (Rd, MayWr))); FunD ([((In, NOut), RefT (Cp, UnitT (Rd, NeverWr)))], ReadS (DerefP (VarP (0))))], CallS (VarP (1001), [PathE (VarP (1000))])) |}]
let%expect_test "presentation test 1 (simple types), dsl, rw gen" =
let prog' = prog_eval (
[
defg (rfT uT_r_aw); (* x *)
defg (rfT uT_r_aw); (* y *)
defg (rfT uT_r_aw); (* z *)
defg (rfT uT_r_aw); (* k *)
FunD ( (* f *)
[
(moded @@ rfT @@ uT_undef);
(moded @@ rfT @@ uT_undef);
],
(rdS @@ drf @@ v0) #.
(wrS @@ drf @@ v0) #.
(rdS @@ drf @@ v1)
);
FunD ( (* w *)
[
(moded @@ cpT @@ uT_undef);
],
(wrS @@ drf @@ v0) |. skp
);
FunD ( (* g *)
[
(moded @@ rfT @@ uT_undef);
(moded @@ cpT @@ uT_undef);
],
(wrS @@ drf @@ v0) #.
((wrS @@ drf @@ v1) |. (wrS @@ drf @@ v0)) #.
(rdS @@ drf @@ v0) #.
(rdS @@ drf @@ v1)
);
FunD ( (* r *)
[
(moded @@ rfT @@ uT_undef);
],
(rdS @@ drf @@ v0)
)
],
let xV = vg0 in
let yV = vg1 in
let zV = vg2 in
let kV = vg3 in
let fF = vg4 in
let wF = vg5 in
let gF = vg6 in
let rF = vg7 in
(callS wF [pE xV]) #.
(callS rF [pE xV]) #.
(callS fF [pE xV; pE yV]) #.
(callS rF [pE yV]) #.
(callS gF [pE zV; pE kV]) #.
(wrS @@ drf @@ zV) #.
(callS wF [pE zV]) #.
(callS fF [pE yV; pE zV]) #.
(callS rF [pE kV])
) in
prog_eval_noret prog';
print_endline @@ show(prog) prog';
[%expect {| ([VarD (RefT (Rf, UnitT (Rd, AlwaysWr))); VarD (RefT (Rf, UnitT (Rd, AlwaysWr))); VarD (RefT (Rf, UnitT (Rd, AlwaysWr))); VarD (RefT (Rf, UnitT (Rd, AlwaysWr))); FunD ([((In, NOut), RefT (Rf, UnitT (Rd, AlwaysWr))); ((In, NOut), RefT (Rf, UnitT (Rd, NeverWr)))], SeqS (SeqS (ReadS (DerefP (VarP (0))), WriteS (DerefP (VarP (0)))), ReadS (DerefP (VarP (1))))); FunD ([((In, NOut), RefT (Cp, UnitT (NRd, MayWr)))], ChoiceS (WriteS (DerefP (VarP (0))), SkipS)); FunD ([((In, NOut), RefT (Rf, UnitT (NRd, AlwaysWr))); ((In, NOut), RefT (Cp, UnitT (Rd, MayWr)))], SeqS (SeqS (SeqS (WriteS (DerefP (VarP (0))), ChoiceS (WriteS (DerefP (VarP (1))), WriteS (DerefP (VarP (0))))), ReadS (DerefP (VarP (0)))), ReadS (DerefP (VarP (1))))); FunD ([((In, NOut), RefT (Rf, UnitT (Rd, NeverWr)))], ReadS (DerefP (VarP (0))))], SeqS (SeqS (SeqS (SeqS (SeqS (SeqS (SeqS (SeqS (CallS (VarP (1005), [PathE (VarP (1000))]), CallS (VarP (1007), [PathE (VarP (1000))])), CallS (VarP (1004), [PathE (VarP (1000)); PathE (VarP (1001))])), CallS (VarP (1007), [PathE (VarP (1001))])), CallS (VarP (1006), [PathE (VarP (1002)); PathE (VarP (1003))])), WriteS (DerefP (VarP (1002)))), CallS (VarP (1005), [PathE (VarP (1002))])), CallS (VarP (1004), [PathE (VarP (1001)); PathE (VarP (1002))])), CallS (VarP (1007), [PathE (VarP (1003))]))) |}]
(* TODO *)
(* - basic var tests *) (* - basic var tests *)
let%expect_test "empty" = let%expect_test "empty" =
@ -1086,50 +1175,42 @@ struct
Printf.printf "done!"; Printf.printf "done!";
[%expect {| done! |}] [%expect {| done! |}]
(* TODO tags, access *) let%expect_test "presentation test 2 (complex types), dsl, rw gen" =
(* let%expect_test "presentation test 2 (complex types), dsl" = *) let prog' = prog_eval (
(* prog_eval_noret ( *) let userT = TupleT [uT_undef; uT_undef; uT_undef] in
(* let userT = TupleT [uT_r_aw; uT_r_aw; uT_r_aw] in *) let dataT = TupleT [uT_undef; uT_undef] in
(* let dataT = TupleT [uT_r_aw; uT_r_aw] in *) let requestT = TupleT [cpT userT;
(* let requestT = TupleT [cpT userT; *) cpT dataT;
(* cpT dataT; *) cpT uT_undef] in
(* cpT dataT] in *) let requestArgsT = TupleT [cpT userT;
(* let requestArgsT = TupleT [cpT userT; (* TODO: tags *) *) cpT dataT;
(* cpT dataT; *) cpT uT_undef] in
(* cpT dataT] in *) [
(* let userE = TupleE [UnitE; UnitE; UnitE] in *) defg requestT;
(* let dataE = TupleE [UnitE; UnitE] in *) FunD ( (* send *)
(* let requestE = TupleE [rfg0E; rfg1E; rfg2E] in *) [
(* [ *) (moded @@ requestArgsT)
(* defg userT userE; *) ],
(* defg dataT dataE; *) ((
(* defg uT_r_aw; (* time *) *) (rdS @@ drf @@ access 1 @@ v0) #.
(* defg requestT requestE; *) (wrS @@ drf @@ access 1 @@ v0) #.
(* FunD ( (* send *) *) (rdS v0) #.
(* [ *) (wrS @@ access 1 @@ drf @@ access 0 @@ v0)
(* (moded @@ requestArgsT) *) ) |.
(* ], *) skp) #.
(* ( *) (wrS @@ drf @@ access 2 @@ v0) #.
(* ( (* TODO access *) *) (rdS v0)
(* (rdS @@ drf @@ v0) #. *) );
(* (wrS @@ drf @@ v0) #. *) ],
(* (rdS @@ drf @@ v0) #. *) (callS vg1 [pE vg0]) #.
(* (wrS @@ drf @@ v0) *) (wrS @@ drf @@ access 2 @@ vg0) #.
(* ) |. *) ((rdS @@ access 1 @@ drf @@ access 0 @@ vg0) |.
(* skp) #. *) (rdS @@ access 2 @@ drf @@ access 0 @@ vg0)) #.
(* TODO access *) (rdS @@ drf @@ access 2 @@ vg0)
(* (wrS @@ drf @@ v0) #. *) ) in
(* (rdS @@ drf @@ v1) *) prog_eval_noret prog';
(* ); *) print_endline @@ show(prog) prog';
(* ], *) [%expect {| ([VarD (TupleT ([RefT (Cp, TupleT ([UnitT (Rd, AlwaysWr); UnitT (Rd, AlwaysWr); UnitT (Rd, AlwaysWr)])); RefT (Cp, TupleT ([UnitT (Rd, AlwaysWr); UnitT (Rd, AlwaysWr)])); RefT (Cp, UnitT (Rd, AlwaysWr))])); FunD ([((In, NOut), TupleT ([RefT (Cp, TupleT ([UnitT (Rd, NeverWr); UnitT (Rd, MayWr); UnitT (Rd, NeverWr)])); RefT (Cp, TupleT ([UnitT (Rd, MayWr); UnitT (Rd, MayWr)])); RefT (Cp, UnitT (Rd, AlwaysWr))]))], SeqS (SeqS (ChoiceS (SeqS (SeqS (SeqS (ReadS (DerefP (AccessP (VarP (0), 1))), WriteS (DerefP (AccessP (VarP (0), 1)))), ReadS (VarP (0))), WriteS (AccessP (DerefP (AccessP (VarP (0), 0)), 1))), SkipS), WriteS (DerefP (AccessP (VarP (0), 2)))), ReadS (VarP (0))))], SeqS (SeqS (SeqS (CallS (VarP (1001), [PathE (VarP (1000))]), WriteS (DerefP (AccessP (VarP (1000), 2)))), ChoiceS (ReadS (AccessP (DerefP (AccessP (VarP (1000), 0)), 1)), ReadS (AccessP (DerefP (AccessP (VarP (1000), 0)), 2)))), ReadS (DerefP (AccessP (VarP (1000), 2))))) |}]
(* (callS vg4 [pE vg3]) #. *)
(* TODO access *)
(* (wrS @@ drf @@ vg3) #. *)
(* ((rdS @@ drf @@ vg3) |. (rdS @@ drf @@ vg3)) #. *)
(* (rdS @@ drf @@ vg3) *)
(* ); *)
(* Printf.printf "done!"; *)
(* [%expect {| done! |}] *)
(* - complex tests *) (* - complex tests *)