1(* Copyright (C) 1997-2001 by Ken Friis Larsen and Jakob Lichtenberg. *)
2structure fdd :> fdd =
3struct
4
5    open MuddyCore
6
7    open bdd
8
9    type precision = int
10    type domain = int
11    type fddvar = int
12
13    local
14        val extDomain_ : int vector -> fddvar = app1 (symb "mlfdd_extdomain")
15
16        fun mkList(start, stop) =
17            if start > stop then []
18            else start::mkList(start+1, stop)
19    in
20        fun extDomain l =
21            let val i = extDomain_ (Vector.fromList(l))
22            in mkList(i,i-1+List.length l) end
23    end
24
25    val clearAll: unit -> unit = app1 (symb "mlfdd_clearall")
26    val domainNum: unit -> int = app1 (symb "mlfdd_domainnum")
27    val domainSize: fddvar -> int = app1 (symb "mlfdd_domainsize")
28    val varNum: fddvar -> int = app1 (symb "mlfdd_varnum")
29
30    local
31        fun vectorToList v = Vector.foldl op:: nil v
32    in
33        val vars: fddvar -> bdd.varnum list =
34            vectorToList o app1 (symb "mlfdd_vars")
35    end
36
37    val ithSet: fddvar -> varSet = app1 (symb "mlfdd_ithset")
38    val domain: fddvar -> bdd  = app1 (symb "mlfdd_domain")
39
40    val makeSet: fddvar list -> bdd.varSet =
41        (app1 (symb "mlfdd_makeset")) o Vector.fromList
42
43    local
44        val setPairs_: int vector -> int vector -> bdd.pairSet =
45            app2 (symb "mlfdd_setpairs")
46    in
47        fun setPairs l =
48            let val (l1,l2) = ListPair.unzip l
49            in setPairs_ (Vector.fromList l1) (Vector.fromList l2) end
50    end
51end
52