abcBridge-0.10.0.0: src/Data/ABC/Internal/CNF.chs
{-# OPTIONS_GHC -fno-warn-unused-matches #-}
{- |
Module : Data.ABC.Internal.CNF
Copyright : Galois, Inc. 2010-2014
License : BSD3
Maintainer : jhendrix@galois.com
Stability : experimental
Portability : non-portable (c2hs, language extensions)
-}
module Data.ABC.Internal.CNF
( Cnf_Dat_t
, cnfVarNums
, withCnfDerive
, cnfDataWriteIntoFile
, Cnf_Man_t
, Cnf_Man_t_
, cnfManStart
, cnfDeriveWithMan
, cnfDataFree
, cnfDataWriteIntoFileWithHeader
) where
import Control.Exception (bracket)
import Data.ABC.Internal.AIG
import Foreign
import Foreign.C
#include "cnfheader.h"
data Cnf_Man_t_
{#pointer *Aig_Man_t -> Aig_Man_t_ nocode #}
{#pointer *Cnf_Man_t foreign -> Cnf_Man_t_ #}
foreign import ccall unsafe "&Cnf_ManStop"
p_cnfManStop :: FunPtr (Ptr Cnf_Man_t_ -> IO ())
newCnfMan :: Ptr Cnf_Man_t_ -> IO Cnf_Man_t
newCnfMan = newForeignPtr p_cnfManStop
-- | Create a new CNF manager.
{#fun Cnf_ManStart as ^
{} -> `Cnf_Man_t' newCnfMan* #}
data Cnf_Dat_t_
{#pointer *Cnf_Dat_t -> Cnf_Dat_t_ #}
cnfVarNums :: Cnf_Dat_t -> IO (Ptr CInt)
cnfVarNums = {#get Cnf_Dat_t->pVarNums #}
{#fun Cnf_Derive as ^
{ id `Aig_Man_t'
, id `CInt'
}
-> `Cnf_Dat_t' id #}
-- | Use results on cnfDerive in a comptuation, then free them.
withCnfDerive :: Aig_Man_t -> CInt -> (Cnf_Dat_t -> IO a) -> IO a
withCnfDerive mgr outputCount h =
bracket (cnfDerive mgr outputCount) cnfDataFree h
{#fun Cnf_DeriveWithMan as ^ -- output
{ withForeignPtr* `Cnf_Man_t'
, id `Aig_Man_t'
, id `CInt'
} -> `Cnf_Dat_t' id #}
{#fun Cnf_DataWriteIntoFile as ^
{ id `Cnf_Dat_t'
, `String'
, `Int'
, id `Ptr ()'
, id `Ptr ()'
} -> `()' #}
{#fun Cnf_DataWriteIntoFileWithHeader as ^
{ id `Cnf_Dat_t'
, `String' -- Filename
, `String' -- Header
, `Int'
} -> `()' #}
{#fun Cnf_DataFree as ^
{ id `Cnf_Dat_t'
} -> `()' #}