abcBridge-0.14: src/Data/ABC/Internal/AIG.chs
{- |
Module : Data.ABC.Internal.AIG
Copyright : Galois, Inc. 2010
License : BSD3
Maintainer : jhendrix@galois.com
Stability : experimental
Portability : non-portable (c2hs, language extensions)
/Incomplete./ Binding of @aig\/aig\/aig.h@. This defines the
next-generation heavy-weight AIG representation (similar to the original
"Data.ABC.Internal.ABC") which is used in internal versions
(@base\/abci\/abc.c@) 8D, 8 and occasionally for 9 (during which the GIA
is temporarily converted into an AIG for some processing.)
-}
{-# LANGUAGE EmptyDataDecls #-}
{-# LANGUAGE ForeignFunctionInterface #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}
module Data.ABC.Internal.AIG (
-- * Types
-- ** Enums
Aig_Type_t(..)
-- ** Empty types
, Aig_Man_t_
, Aig_Obj_t_
-- ** Pointer types
, Aig_Man_t
, Aig_Obj_t
-- * Memory management
, aigRegular
, aigNot
, aigNotCond
, aigIsComplement
, aigManCiNum
, aigManCoNum
, aigManObjNumMax
, aigManConst0
, aigManConst1
, aigManCi
, aigManCo
, aigObjId
-- * aigMan.c
, aigManStart
, aigManStop
, p_aigManStop
-- * aigObj.c
, aigObjCreateCi
, aigObjCreateCo
-- * Re-exports
, CInt
) where
#include "aig.h"
#include "abcbridge.h"
import Foreign
import Foreign.C
{#import Data.ABC.Internal.VecPtr #}
{#enum Aig_Type_t {underscoreToCase} deriving (Show, Eq) #}
data Aig_Man_t_
data Aig_Obj_t_
{#pointer *Aig_Man_t -> Aig_Man_t_ #}
{#pointer *Aig_Obj_t -> Aig_Obj_t_ #}
aigObjWordPtr :: (WordPtr -> WordPtr) -> (Aig_Obj_t -> Aig_Obj_t)
aigObjWordPtr f = wordPtrToPtr . f . ptrToWordPtr
aigRegular :: Aig_Obj_t -> Aig_Obj_t
aigRegular = aigObjWordPtr (`clearBit` 0)
aigNot :: Aig_Obj_t -> Aig_Obj_t
aigNot = aigObjWordPtr (xor (bit 0))
aigNotCond :: Aig_Obj_t -> Bool -> Aig_Obj_t
aigNotCond o b = if b then aigNot o else o
aigIsComplement :: Aig_Obj_t -> Bool
aigIsComplement o = ptrToWordPtr o `testBit` 0
typeCInt :: Aig_Type_t -> CInt
typeCInt = fromIntegral . fromEnum
{#fun AbcBridge_Aig_ManNObj as aigManNObj
{ id `Aig_Man_t'
, typeCInt `Aig_Type_t'
} -> `CInt' id #}
aigManCiNum :: Aig_Man_t -> IO CInt
aigManCiNum = flip aigManNObj AigObjCi
aigManCoNum :: Aig_Man_t -> IO CInt
aigManCoNum = flip aigManNObj AigObjCo
aigManObjNumMax :: Aig_Man_t -> IO Int
aigManObjNumMax man =
vecPtrSize =<< {#get Aig_Man_t->vObjs #} man
aigManConst0 :: Aig_Man_t -> IO Aig_Obj_t
aigManConst0 m = aigNot `fmap` aigManConst1 m
aigManConst1 :: Aig_Man_t -> IO Aig_Obj_t
aigManConst1 = {#get Aig_Man_t->pConst1 #}
{#fun AbcBridge_Aig_ManCi as aigManCi
{ id `Aig_Man_t'
, id `CInt'
} -> `Aig_Obj_t' id #}
{#fun AbcBridge_Aig_ManCo as aigManCo
{ id `Aig_Man_t'
, id `CInt'
} -> `Aig_Obj_t' id #}
-- Note: We use a function rather rather than just #get, because Aig_Obj_t
-- is a bitfield, and offsets are computed incorrectly by c2hs.
{#fun AbcBridge_Aig_ObjId as aigObjId
{ id `Aig_Obj_t' } -> `CInt' id #}
{-
newAigManForeignPtr :: Ptr Aig_Man_t_ -> IO (Aig_Man_t)
newAigManForeignPtr ptr | ptr == nullPtr = throwIO NullPtrError
| otherwise = newForeignPtr p_aigManStop ptr
-}
foreign import ccall unsafe "&Aig_ManStop"
p_aigManStop :: FunPtr (Aig_Man_t -> IO ())
foreign import ccall unsafe "Aig_ManStop" aigManStop :: Aig_Man_t -> IO ()
{#fun Aig_ManStart as ^ { id `CInt' } -> `Aig_Man_t' id #}
{#fun Aig_ObjCreateCi as ^
{ id `Aig_Man_t' } -> `Aig_Obj_t' id #}
{#fun Aig_ObjCreateCo as ^
{ id `Aig_Man_t', id `Aig_Obj_t' } -> `Aig_Obj_t' id #}