Skip to content

Commit

Permalink
Merge 0ded7b4 into fc72dee
Browse files Browse the repository at this point in the history
  • Loading branch information
tomerarnon committed Sep 6, 2019
2 parents fc72dee + 0ded7b4 commit 1460d04
Show file tree
Hide file tree
Showing 8 changed files with 82 additions and 141 deletions.
5 changes: 4 additions & 1 deletion .travis.yml
@@ -1,10 +1,13 @@
## Documentation: http://docs.travis-ci.com/user/languages/julia/
language: julia
os:
- linux
- osx
- linux
julia:
- 0.6
- 1.0
- 1.1
- 1.2
- nightly
notifications:
email: false
Expand Down
15 changes: 15 additions & 0 deletions Project.toml
@@ -0,0 +1,15 @@
name = "CUDD"
uuid = "345a2cc7-28d8-58b2-abdf-cff77ea7d7f1"

[deps]
Compat = "34da2185-b29b-5c13-b0c7-acf172513d20"
Libdl = "8f399da3-3557-5675-b5ff-fb832c97cbdb"

[compat]
julia = "≥ 0.6.0"

[extras]
Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"

[targets]
test = ["Test"]
1 change: 1 addition & 0 deletions REQUIRE
@@ -1 +1,2 @@
julia 0.6
Compat
6 changes: 4 additions & 2 deletions deps/build.jl
@@ -1,12 +1,14 @@
if is_unix()
using Compat

if Compat.Sys.isunix()
download("https://github.com/kozross/cudd/archive/v3.0.0.tar.gz", "cudd-3.0.0.tar.gz")
run(`tar -zxvf cudd-3.0.0.tar.gz`)
rm("cudd-3.0.0.tar.gz")
cd("cudd-3.0.0/")

run(`autoreconf -fi`)
run(`./configure --enable-silent-rules --enable-shared --enable-obj`)
run(`make -j$(Sys.CPU_CORES) check`)
run(`make -j$(length(Sys.cpu_info())) check`)

# rename the shared library if it's ended with dylib...
cd("cudd/.libs")
Expand Down
6 changes: 3 additions & 3 deletions src/ADD.jl
Expand Up @@ -94,15 +94,15 @@ function evaluate(mgr::Ptr{Manager}, f::Ptr{Node}, assignment::Array{Cint})
end

function ref(n::Ptr{Node})
ccall((:Cudd_Ref, _LIB_CUDD), Void, (Ptr{Node},), n)
ccall((:Cudd_Ref, _LIB_CUDD), Cvoid, (Ptr{Node},), n)
end

function deref(n::Ptr{Node})
ccall((:Cudd_Deref, _LIB_CUDD), Void, (Ptr{Node},), n)
ccall((:Cudd_Deref, _LIB_CUDD), Cvoid, (Ptr{Node},), n)
end

function recursive_deref(table::Ptr{Manager}, n::Ptr{Node})
ccall((:Cudd_RecursiveDeref, _LIB_CUDD), Void, (Ptr{Manager}, Ptr{Node}), table, n)
ccall((:Cudd_RecursiveDeref, _LIB_CUDD), Cvoid, (Ptr{Manager}, Ptr{Node}), table, n)
end

function get_value(c::Ptr{Node})
Expand Down
152 changes: 33 additions & 119 deletions src/ADD_apply.jl
Expand Up @@ -5,130 +5,44 @@ export add_minimum_c, add_maximum_c, add_one_zero_maximum_c
export add_or_c, add_nand_c, add_nor_c, add_xor_c, add_xnor_c
export add_log_c

function add_apply(mgr::Ptr{Manager}, op::Ptr{Void}, f::Ptr{Node}, g::Ptr{Node})
function add_apply(mgr::Ptr{Manager}, op::Ref, f::Ptr{Node}, g::Ptr{Node})
res = ccall((:Cudd_addApply, _LIB_CUDD),
Ptr{Node}, (Ptr{Manager}, Ptr{Void}, Ptr{Node}, Ptr{Node}), mgr, op, f, g)
Ptr{Node}, (Ptr{Manager}, Ptr{Cvoid}, Ptr{Node}, Ptr{Node}), mgr, op[], f, g)
if res == C_NULL # Fails to compute a result
throw(OutOfMemoryError())
end
return res
end

function add_plus(mgr::Ptr{Manager}, f_pp::Ptr{Ptr{Node}}, g_pp::Ptr{Ptr{Node}})
func = ccall((:Cudd_addPlus, _LIB_CUDD),
Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}), mgr, f_pp, g_pp)
return func
end
add_plus_c = cfunction(add_plus, Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}))

function add_minus(mgr::Ptr{Manager}, f_pp::Ptr{Ptr{Node}}, g_pp::Ptr{Ptr{Node}})
func = ccall((:Cudd_addMinus, _LIB_CUDD),
Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}), mgr, f_pp, g_pp)
return func
end
add_minus_c = cfunction(add_minus, Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}))

function add_times(mgr::Ptr{Manager}, f_pp::Ptr{Ptr{Node}}, g_pp::Ptr{Ptr{Node}})
func = ccall((:Cudd_addTimes, _LIB_CUDD),
Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}), mgr, f_pp, g_pp)
return func
end
add_times_c = cfunction(add_times, Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}))

function add_divide(mgr::Ptr{Manager}, f_pp::Ptr{Ptr{Node}}, g_pp::Ptr{Ptr{Node}})
func = ccall((:Cudd_addDivide, _LIB_CUDD),
Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}), mgr, f_pp, g_pp)
return func
end
add_divide_c = cfunction(add_divide, Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}))

function add_diff(mgr::Ptr{Manager}, f_pp::Ptr{Ptr{Node}}, g_pp::Ptr{Ptr{Node}})
func = ccall((:Cudd_addDiff, _LIB_CUDD),
Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}), mgr, f_pp, g_pp)
return func
end
add_diff_c = cfunction(add_diff, Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}))

function add_threshold(mgr::Ptr{Manager}, f_pp::Ptr{Ptr{Node}}, g_pp::Ptr{Ptr{Node}})
func = ccall((:Cudd_addThreshold, _LIB_CUDD),
Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}), mgr, f_pp, g_pp)
return func
end
add_threshold_c = cfunction(add_threshold, Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}))

function add_setNZ(mgr::Ptr{Manager}, f_pp::Ptr{Ptr{Node}}, g_pp::Ptr{Ptr{Node}})
func = ccall((:Cudd_addSetNZ, _LIB_CUDD),
Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}), mgr, f_pp, g_pp)
return func
end
add_setnz_c = cfunction(add_setNZ, Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}))

function add_minimum(mgr::Ptr{Manager}, f_pp::Ptr{Ptr{Node}}, g_pp::Ptr{Ptr{Node}})
func = ccall((:Cudd_addMinimum, _LIB_CUDD),
Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}), mgr, f_pp, g_pp)
return func
end
add_minimum_c = cfunction(add_minimum, Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}))

function add_maximum(mgr::Ptr{Manager}, f_pp::Ptr{Ptr{Node}}, g_pp::Ptr{Ptr{Node}})
func = ccall((:Cudd_addMaximum, _LIB_CUDD),
Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}), mgr, f_pp, g_pp)
return func
end
add_maximum_c = cfunction(add_maximum, Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}))

function add_one_zero_maximum(mgr::Ptr{Manager}, f_pp::Ptr{Ptr{Node}}, g_pp::Ptr{Ptr{Node}})
func = ccall((:Cudd_addOneZeroMaximum, _LIB_CUDD),
Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}), mgr, f_pp, g_pp)
return func
end
add_one_zero_maximum_c = cfunction(add_one_zero_maximum, Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}))

function add_agreement(mgr::Ptr{Manager}, f_pp::Ptr{Ptr{Node}}, g_pp::Ptr{Ptr{Node}})
func = ccall((:Cudd_addAgreement, _LIB_CUDD),
Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}), mgr, f_pp, g_pp)
return func
end
add_agreement_c = cfunction(add_agreement, Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}))

function add_or(mgr::Ptr{Manager}, f_pp::Ptr{Ptr{Node}}, g_pp::Ptr{Ptr{Node}})
func = ccall((:Cudd_addOr, _LIB_CUDD),
Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}), mgr, f_pp, g_pp)
return func
end
add_or_c = cfunction(add_or, Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}))

function add_nand(mgr::Ptr{Manager}, f_pp::Ptr{Ptr{Node}}, g_pp::Ptr{Ptr{Node}})
func = ccall((:Cudd_addNand, _LIB_CUDD),
Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}), mgr, f_pp, g_pp)
return func
end
add_nand_c = cfunction(add_nand, Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}))

function add_nor(mgr::Ptr{Manager}, f_pp::Ptr{Ptr{Node}}, g_pp::Ptr{Ptr{Node}})
func = ccall((:Cudd_addNor, _LIB_CUDD),
Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}), mgr, f_pp, g_pp)
return func
end
add_nor_c = cfunction(add_nor, Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}))

function add_xor(mgr::Ptr{Manager}, f_pp::Ptr{Ptr{Node}}, g_pp::Ptr{Ptr{Node}})
func = ccall((:Cudd_addXor, _LIB_CUDD),
Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}), mgr, f_pp, g_pp)
return func
end
add_xor_c = cfunction(add_xor, Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}))

function add_xnor(mgr::Ptr{Manager}, f_pp::Ptr{Ptr{Node}}, g_pp::Ptr{Ptr{Node}})
func = ccall((:Cudd_addXnor, _LIB_CUDD),
Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}), mgr, f_pp, g_pp)
return func
end
add_xnor_c = cfunction(add_xnor, Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}))

function add_log(mgr::Ptr{Manager}, f_pp::Ptr{Ptr{Node}}, g_pp::Ptr{Ptr{Node}})
func = ccall((:Cudd_addLog, _LIB_CUDD),
Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}), mgr, f_pp, g_pp)
return func
add_apply_func_names = [(:add_plus, :Cudd_addPlus),
(:add_minus, :Cudd_addMinus),
(:add_times, :Cudd_addTimes),
(:add_divide, :Cudd_addDivide),
(:add_diff, :Cudd_addDiff),
(:add_threshold, :Cudd_addThreshold),
(:add_setNZ, :Cudd_addSetNZ),
(:add_minimum, :Cudd_addMinimum),
(:add_maximum, :Cudd_addMaximum),
(:add_one_zero_maximum, :Cudd_addOneZeroMaximum),
(:add_agreement, :Cudd_addAgreement),
(:add_or, :Cudd_addOr),
(:add_nand, :Cudd_addNand),
(:add_nor, :Cudd_addNor),
(:add_xor, :Cudd_addXor),
(:add_xnor, :Cudd_addXnor),
(:add_log, :Cudd_addLog)]

for (name, Cudd_name) in add_apply_func_names
@eval $name(mgr::Ptr{Manager}, f_pp::Ptr{Ptr{Node}}, g_pp::Ptr{Ptr{Node}}) =
ccall(($(QuoteNode(Cudd_name)), _LIB_CUDD),
Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}), mgr, f_pp, g_pp)

# these Refs should get filled in __init__()
@eval const $(Symbol(name, "_c")) = Ref{Ptr{Cvoid}}()
end

function __init__()
for (name, _) in add_apply_func_names
@eval $(Symbol(name, "_c"))[] = Compat.@cfunction($name, Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}))
end
end
add_log_c = cfunction(add_log, Ptr{Node}, (Ptr{Manager}, Ptr{Ptr{Node}}, Ptr{Ptr{Node}}))
35 changes: 20 additions & 15 deletions src/CUDD.jl
@@ -1,19 +1,24 @@
module CUDD
cudd_path = joinpath(dirname(@__FILE__), "..", "deps", "cudd-3.0.0", "cudd", ".libs")
using Compat
using Compat.Libdl

if isempty(Libdl.find_library(collect(["libcudd.so"]), collect([cudd_path])))
warn("Could not communicate with libcudd. Make sure it exists and that it is on the path.")
else
# load the shared CUDD library
global const _LIB_CUDD = Libdl.find_library(collect(["libcudd.so"]), collect([cudd_path]))
cudd_path = joinpath(dirname(@__FILE__), "..", "deps", "cudd-3.0.0", "cudd", ".libs")

if isempty(Libdl.find_library(collect(["libcudd.so"]), collect([cudd_path])))
Compat.@warn("Could not communicate with libcudd. Make sure it exists and that it is on the path.")
else
# load the shared CUDD library
global const _LIB_CUDD = Libdl.find_library(collect(["libcudd.so"]), collect([cudd_path]))

include("ADD.jl")
include("ADD_apply.jl")
include("ADD_find.jl")
include("ADD_abs.jl")
include("ADD_inverse.jl")
include("ADD_ITE.jl")
include("ADD_negate.jl")
include("ADD_walsh.jl")

include("ADD.jl")
include("ADD_apply.jl")
include("ADD_find.jl")
include("ADD_abs.jl")
include("ADD_inverse.jl")
include("ADD_ITE.jl")
include("ADD_negate.jl")
include("ADD_walsh.jl")
end
end

end # module
3 changes: 2 additions & 1 deletion test/runtests.jl
@@ -1,5 +1,5 @@
using CUDD
using Base.Test
using CUDD.Compat.Test

@testset "addind vars" begin
for i = 1:10
Expand Down Expand Up @@ -41,6 +41,7 @@ end
end

@testset "applying constant functions" begin

manager = initialize_cudd()
x1, x2 = rand(1:50), rand(51:100)
f = add_const(manager, x1)
Expand Down

0 comments on commit 1460d04

Please sign in to comment.