cmake_minimum_required(VERSION 2.6)
project(simplic3)

set(ENABLE_GOOGLE_PROFILER 0 CACHE BOOL
    "If true, link with the Google profiler")

set(ENABLE_MINISAT 1 CACHE BOOL
    "If true, enable the picosat backend")

set(ENABLE_PICOSAT 0 CACHE BOOL
    "If true, enable the picosat backend")

if (ENABLE_MINISAT)  
    set(MINISAT_SOURCE_DIR "" CACHE PATH "Directory of MiniSat")
    set(MINISAT_BUILD_DIR "" CACHE PATH
        "Directory where MiniSat has been built")
    
    if(NOT MINISAT_SOURCE_DIR)
        message(FATAL_ERROR "Please set the MINISAT_SOURCE_DIR variable")
    endif()
    if(NOT MINISAT_BUILD_DIR)
        message(FATAL_ERROR "Please set the MINISAT_BUILD_DIR variable")
    endif()
endif()    

include_directories(${PROJECT_SOURCE_DIR})

if(ENABLE_PICOSAT)
    set(PICOSAT_SOURCE_DIR "" CACHE PATH "Directory of PicoSAT")
    set(PICOSAT_BUILD_DIR "" CACHE PATH
        "Directory where PicoSAT has been built")
    
    if(NOT PICOSAT_SOURCE_DIR)
        message(FATAL_ERROR "Please set the PICOSAT_SOURCE_DIR variable")
    endif()
    if(NOT PICOSAT_BUILD_DIR)
        message(FATAL_ERROR "Please set the PICOSAT_BUILD_DIR variable")
    endif()
endif()


if(ENABLE_GOOGLE_PROFILER)
    add_definitions(-DSIMPLIC3_ENABLE_GOOGLE_PROFILER)
endif()    

if(ENABLE_MINISAT)
    include_directories(${MINISAT_SOURCE_DIR})
    include_directories(${MINISAT_SOURCE_DIR}/minisat)
endif()

if(ENABLE_PICOSAT)
    include_directories(${PICOSAT_SOURCE_DIR})
endif()    

if(ENABLE_MINISAT)
    find_library(_minisat_lib minisat ${MINISAT_BUILD_DIR})
    add_definitions(-DSIMPLIC3_ENABLE_MINISAT -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS)
endif()    

if(ENABLE_PICOSAT)
    find_library(_picosat_lib picosat ${PICOSAT_BUILD_DIR})
    add_definitions(-DSIMPLIC3_ENABLE_PICOSAT)
endif()

if(ENABLE_GOOGLE_PROFILER)
    find_library(_google_profiler_lib profiler)
endif()    


set(simplic3_SOURCES
  simplic3/aig.cpp
  simplic3/model.cpp
  simplic3/unroll.cpp
  simplic3/cnf.cpp
  simplic3/ic3.cpp
  simplic3/aic3.cpp
  simplic3/ic3helpers.cpp
  simplic3/opts.cpp
  simplic3/miscutils.cpp
  simplic3/satsolver.cpp
  simplic3/aiger.c
  simplic3/simplic3.cpp
  simplic3/bmc.cpp
  simplic3/prover.cpp
  simplic3/aigsopdata.cpp
  simplic3/kinduction.cpp
  simplic3/modelsim.cpp
  simplic3/tdecomp.cpp
)

if(ENABLE_MINISAT)
    set(simplic3_SOURCES
        ${simplic3_SOURCES}
        simplic3/minisatsolver.cpp
        )
endif()      

if(ENABLE_PICOSAT)
    set(simplic3_SOURCES
        ${simplic3_SOURCES}
        simplic3/picosatsolver.cpp
        )
endif()


add_library(simplic3
  ${simplic3_SOURCES}
  )

add_executable(simplic3_main
  main.cpp
  )
set_target_properties(simplic3_main PROPERTIES OUTPUT_NAME simplic3)

if(ENABLE_MINISAT)
    target_link_libraries(simplic3_main
      simplic3
      ${_minisat_lib}
      )
endif()    

if(ENABLE_PICOSAT)
    target_link_libraries(simplic3_main
      ${_picosat_lib}
      )
endif()

if(ENABLE_GOOGLE_PROFILER)
    target_link_libraries(simplic3_main
      ${_google_profiler_lib}
      )
endif()
