{-# LANGUAGE OverloadedStrings #-}
module CF ( ControlAnn (..)
, UD (..)
, Liveness (..)
, NLiveness (..)
, Live (..)
) where
import qualified Data.IntSet as IS
import Prettyprinter (Pretty (pretty), braces, punctuate, (<+>))
data Liveness = Liveness { Liveness -> IntSet
ins, Liveness -> IntSet
out, Liveness -> IntSet
fins, Liveness -> IntSet
fout :: !IS.IntSet } deriving Liveness -> Liveness -> Bool
(Liveness -> Liveness -> Bool)
-> (Liveness -> Liveness -> Bool) -> Eq Liveness
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Liveness -> Liveness -> Bool
== :: Liveness -> Liveness -> Bool
$c/= :: Liveness -> Liveness -> Bool
/= :: Liveness -> Liveness -> Bool
Eq
data NLiveness = NLiveness { NLiveness -> Int
nx :: Int, NLiveness -> Liveness
liveness :: !Liveness }
data Live = Live { Live -> IntSet
new, Live -> IntSet
done, Live -> IntSet
fnew, Live -> IntSet
fdone :: !IS.IntSet }
instance Pretty Liveness where
pretty :: forall ann. Liveness -> Doc ann
pretty (Liveness IntSet
is IntSet
os IntSet
fis IntSet
fos) = Live -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Live -> Doc ann
pretty (IntSet -> IntSet -> IntSet -> IntSet -> Live
Live IntSet
is IntSet
os IntSet
fis IntSet
fos)
instance Pretty Live where
pretty :: forall ann. Live -> Doc ann
pretty (Live IntSet
is IntSet
os IntSet
fis IntSet
fos) = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces (IntSet -> Doc ann
forall {ann}. IntSet -> Doc ann
pp (IntSet
isIntSet -> IntSet -> IntSet
forall a. Semigroup a => a -> a -> a
<>IntSet
fis) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
";" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> IntSet -> Doc ann
forall {ann}. IntSet -> Doc ann
pp (IntSet
osIntSet -> IntSet -> IntSet
forall a. Semigroup a => a -> a -> a
<>IntSet
fos))
where pp :: IntSet -> Doc ann
pp = [Doc ann] -> Doc ann
forall a. Monoid a => [a] -> a
mconcat ([Doc ann] -> Doc ann)
-> (IntSet -> [Doc ann]) -> IntSet -> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
"," ([Doc ann] -> [Doc ann])
-> (IntSet -> [Doc ann]) -> IntSet -> [Doc ann]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Doc ann) -> [Int] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Int -> Doc ann
forall ann. Int -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty ([Int] -> [Doc ann]) -> (IntSet -> [Int]) -> IntSet -> [Doc ann]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IntSet -> [Int]
IS.toList
data ControlAnn = ControlAnn { ControlAnn -> Int
node :: !Int
, ControlAnn -> [Int]
conn :: [Int]
, ControlAnn -> UD
ud :: !UD
}
data UD = UD { UD -> IntSet
usesNode, UD -> IntSet
usesFNode, UD -> IntSet
defsNode, UD -> IntSet
defsFNode :: !IS.IntSet }