Source file constraints__le__C.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
type t = {
v1: Cp__Var0.ti;
v2: Cp__Var0.ti;
i: Z.t;
b: Cp__Var0.tb;
}
let compute_vars_ti (c: t) (si: Cp__Impl0.Si.t) : unit =
(Cp__Impl0.Si.add si (c.v1)); (Cp__Impl0.Si.add si (c.v2))
let compute_vars_tb (c: t) (sb: Cp__Impl0.Sb.t) : unit =
(Cp__Impl0.Sb.add sb (c.b))
let propagate (e: (Cp__DomI.t, Cp__DomB.t) Cp__Type.env) (c: t) : unit =
match Cp__Type.get_bool e c.b with
| Cp__DomB.V (true) ->
(let d1 = Cp__Type.get_int e c.v1 in let d2 = Cp__Type.get_int e c.v2 in
Cp__ConstraintHelpers.set_int e
c.v1
{ Cp__DomI.min = d1.Cp__DomI.min; Cp__DomI.max =
Z.add d2.Cp__DomI.max c.i };
Cp__ConstraintHelpers.set_int e
c.v2
{ Cp__DomI.min = Z.sub d1.Cp__DomI.min c.i; Cp__DomI.max =
d2.Cp__DomI.max })
| Cp__DomB.V (false) ->
(let d1 = Cp__Type.get_int e c.v1 in let d2 = Cp__Type.get_int e c.v2 in
Cp__ConstraintHelpers.set_int e
c.v1
{ Cp__DomI.min = Z.add (Z.add d2.Cp__DomI.min c.i) Z.one; Cp__DomI.max =
d1.Cp__DomI.max };
Cp__ConstraintHelpers.set_int e
c.v2
{ Cp__DomI.min = d2.Cp__DomI.min; Cp__DomI.max =
Z.sub (Z.sub d1.Cp__DomI.max c.i) Z.one })
| Cp__DomB.Top -> ()
let check_model (mo: (Z.t, bool) Cp__Type.model) (c: t) : bool =
Utils__extstd__Bool.eqb (Z.leq (Cp__Type.get_mod_int mo c.v1)
(Z.add (Cp__Type.get_mod_int mo c.v2) c.i))
(Cp__Type.get_mod_bool mo c.b)