clash-lib 0.6 → 0.6.1
raw patch · 15 files changed
+720/−50 lines, 15 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
- CLaSH.Core.DataCon: [MkData] :: !DcName -> !ConTag -> !Type -> [TyName] -> [TyName] -> [Type] -> DataCon
- CLaSH.Core.DataCon: instance Alpha DataCon
- CLaSH.Core.DataCon: instance Constructor C1_0DataCon
- CLaSH.Core.DataCon: instance Datatype D1DataCon
- CLaSH.Core.DataCon: instance Eq DataCon
- CLaSH.Core.DataCon: instance Generic DataCon
- CLaSH.Core.DataCon: instance NFData DataCon
- CLaSH.Core.DataCon: instance Ord DataCon
- CLaSH.Core.DataCon: instance Selector S1_0_0DataCon
- CLaSH.Core.DataCon: instance Selector S1_0_1DataCon
- CLaSH.Core.DataCon: instance Selector S1_0_2DataCon
- CLaSH.Core.DataCon: instance Selector S1_0_3DataCon
- CLaSH.Core.DataCon: instance Selector S1_0_4DataCon
- CLaSH.Core.DataCon: instance Selector S1_0_5DataCon
- CLaSH.Core.DataCon: instance Show DataCon
- CLaSH.Core.DataCon: instance Subst a DataCon
- CLaSH.Core.Literal: [IntegerLiteral] :: !Integer -> Literal
- CLaSH.Core.Literal: [RationalLiteral] :: !Rational -> Literal
- CLaSH.Core.Literal: [StringLiteral] :: !String -> Literal
- CLaSH.Core.Literal: instance Alpha Literal
- CLaSH.Core.Literal: instance Constructor C1_0Literal
- CLaSH.Core.Literal: instance Constructor C1_1Literal
- CLaSH.Core.Literal: instance Constructor C1_2Literal
- CLaSH.Core.Literal: instance Datatype D1Literal
- CLaSH.Core.Literal: instance Eq Literal
- CLaSH.Core.Literal: instance Generic Literal
- CLaSH.Core.Literal: instance NFData Literal
- CLaSH.Core.Literal: instance Ord Literal
- CLaSH.Core.Literal: instance Show Literal
- CLaSH.Core.Literal: instance Subst a Literal
- CLaSH.Core.Pretty: instance Eq TypePrec
- CLaSH.Core.Pretty: instance Ord TypePrec
- CLaSH.Core.Pretty: instance Pretty (Id, Term)
- CLaSH.Core.Pretty: instance Pretty (Name a)
- CLaSH.Core.Pretty: instance Pretty (Var Term)
- CLaSH.Core.Pretty: instance Pretty (Var Type)
- CLaSH.Core.Pretty: instance Pretty DataCon
- CLaSH.Core.Pretty: instance Pretty LitTy
- CLaSH.Core.Pretty: instance Pretty Literal
- CLaSH.Core.Pretty: instance Pretty Pat
- CLaSH.Core.Pretty: instance Pretty Term
- CLaSH.Core.Pretty: instance Pretty TyCon
- CLaSH.Core.Pretty: instance Pretty Type
- CLaSH.Core.Pretty: instance Pretty a => Pretty [a]
- CLaSH.Core.Term: [App] :: !Term -> !Term -> Term
- CLaSH.Core.Term: [Case] :: !Term -> !Type -> [Bind Pat Term] -> Term
- CLaSH.Core.Term: [DataPat] :: !(Embed DataCon) -> !(Rebind [TyVar] [Id]) -> Pat
- CLaSH.Core.Term: [Data] :: !DataCon -> Term
- CLaSH.Core.Term: [DefaultPat] :: Pat
- CLaSH.Core.Term: [Lam] :: !(Bind Id Term) -> Term
- CLaSH.Core.Term: [Letrec] :: !(Bind (Rec [LetBinding]) Term) -> Term
- CLaSH.Core.Term: [LitPat] :: !(Embed Literal) -> Pat
- CLaSH.Core.Term: [Literal] :: !Literal -> Term
- CLaSH.Core.Term: [Prim] :: !Text -> !Type -> Term
- CLaSH.Core.Term: [TyApp] :: !Term -> !Type -> Term
- CLaSH.Core.Term: [TyLam] :: !(Bind TyVar Term) -> Term
- CLaSH.Core.Term: [Var] :: !Type -> !TmName -> Term
- CLaSH.Core.Term: instance Alpha Pat
- CLaSH.Core.Term: instance Alpha Term
- CLaSH.Core.Term: instance Constructor C1_0Pat
- CLaSH.Core.Term: instance Constructor C1_0Term
- CLaSH.Core.Term: instance Constructor C1_1Pat
- CLaSH.Core.Term: instance Constructor C1_1Term
- CLaSH.Core.Term: instance Constructor C1_2Pat
- CLaSH.Core.Term: instance Constructor C1_2Term
- CLaSH.Core.Term: instance Constructor C1_3Term
- CLaSH.Core.Term: instance Constructor C1_4Term
- CLaSH.Core.Term: instance Constructor C1_5Term
- CLaSH.Core.Term: instance Constructor C1_6Term
- CLaSH.Core.Term: instance Constructor C1_7Term
- CLaSH.Core.Term: instance Constructor C1_8Term
- CLaSH.Core.Term: instance Constructor C1_9Term
- CLaSH.Core.Term: instance Datatype D1Pat
- CLaSH.Core.Term: instance Datatype D1Term
- CLaSH.Core.Term: instance Eq Term
- CLaSH.Core.Term: instance Generic Pat
- CLaSH.Core.Term: instance Generic Term
- CLaSH.Core.Term: instance NFData Pat
- CLaSH.Core.Term: instance NFData Term
- CLaSH.Core.Term: instance Ord Term
- CLaSH.Core.Term: instance Show Pat
- CLaSH.Core.Term: instance Show Term
- CLaSH.Core.Term: instance Subst Term Pat
- CLaSH.Core.Term: instance Subst Term Term
- CLaSH.Core.Term: instance Subst Type Pat
- CLaSH.Core.Term: instance Subst Type Term
- CLaSH.Core.TyCon: [AlgTyCon] :: !TyConName -> !Kind -> !Int -> !AlgTyConRhs -> TyCon
- CLaSH.Core.TyCon: [DataTyCon] :: [DataCon] -> AlgTyConRhs
- CLaSH.Core.TyCon: [FunTyCon] :: !TyConName -> !Kind -> !Int -> [([Type], Type)] -> TyCon
- CLaSH.Core.TyCon: [NewTyCon] :: !DataCon -> ([TyName], Type) -> AlgTyConRhs
- CLaSH.Core.TyCon: [PrimTyCon] :: !TyConName -> !Kind -> !Int -> TyCon
- CLaSH.Core.TyCon: [SuperKindTyCon] :: !TyConName -> TyCon
- CLaSH.Core.TyCon: instance Alpha AlgTyConRhs
- CLaSH.Core.TyCon: instance Alpha TyCon
- CLaSH.Core.TyCon: instance Constructor C1_0AlgTyConRhs
- CLaSH.Core.TyCon: instance Constructor C1_0TyCon
- CLaSH.Core.TyCon: instance Constructor C1_1AlgTyConRhs
- CLaSH.Core.TyCon: instance Constructor C1_1TyCon
- CLaSH.Core.TyCon: instance Constructor C1_2TyCon
- CLaSH.Core.TyCon: instance Constructor C1_3TyCon
- CLaSH.Core.TyCon: instance Datatype D1AlgTyConRhs
- CLaSH.Core.TyCon: instance Datatype D1TyCon
- CLaSH.Core.TyCon: instance Eq TyCon
- CLaSH.Core.TyCon: instance Generic AlgTyConRhs
- CLaSH.Core.TyCon: instance Generic TyCon
- CLaSH.Core.TyCon: instance NFData AlgTyConRhs
- CLaSH.Core.TyCon: instance NFData TyCon
- CLaSH.Core.TyCon: instance Ord TyCon
- CLaSH.Core.TyCon: instance Selector S1_0_0AlgTyConRhs
- CLaSH.Core.TyCon: instance Selector S1_0_0TyCon
- CLaSH.Core.TyCon: instance Selector S1_0_1TyCon
- CLaSH.Core.TyCon: instance Selector S1_0_2TyCon
- CLaSH.Core.TyCon: instance Selector S1_0_3TyCon
- CLaSH.Core.TyCon: instance Selector S1_1_0AlgTyConRhs
- CLaSH.Core.TyCon: instance Selector S1_1_0TyCon
- CLaSH.Core.TyCon: instance Selector S1_1_1AlgTyConRhs
- CLaSH.Core.TyCon: instance Selector S1_1_1TyCon
- CLaSH.Core.TyCon: instance Selector S1_1_2TyCon
- CLaSH.Core.TyCon: instance Selector S1_1_3TyCon
- CLaSH.Core.TyCon: instance Selector S1_2_0TyCon
- CLaSH.Core.TyCon: instance Selector S1_2_1TyCon
- CLaSH.Core.TyCon: instance Selector S1_2_2TyCon
- CLaSH.Core.TyCon: instance Selector S1_3_0TyCon
- CLaSH.Core.TyCon: instance Show AlgTyConRhs
- CLaSH.Core.TyCon: instance Show TyCon
- CLaSH.Core.Type: [AppTy] :: !Type -> !Type -> Type
- CLaSH.Core.Type: [Arrow] :: ConstTy
- CLaSH.Core.Type: [ConstTy] :: !ConstTy -> Type
- CLaSH.Core.Type: [ForAllTy] :: !(Bind TyVar Type) -> Type
- CLaSH.Core.Type: [FunTy] :: !Type -> !Type -> TypeView
- CLaSH.Core.Type: [LitTy] :: !LitTy -> Type
- CLaSH.Core.Type: [NumTy] :: !Int -> LitTy
- CLaSH.Core.Type: [OtherType] :: !Type -> TypeView
- CLaSH.Core.Type: [SymTy] :: !String -> LitTy
- CLaSH.Core.Type: [TyConApp] :: !TyConName -> [Type] -> TypeView
- CLaSH.Core.Type: [TyCon] :: !TyConName -> ConstTy
- CLaSH.Core.Type: [VarTy] :: !Kind -> !TyName -> Type
- CLaSH.Core.Type: instance Alpha ConstTy
- CLaSH.Core.Type: instance Alpha LitTy
- CLaSH.Core.Type: instance Alpha Type
- CLaSH.Core.Type: instance Constructor C1_0ConstTy
- CLaSH.Core.Type: instance Constructor C1_0LitTy
- CLaSH.Core.Type: instance Constructor C1_0Type
- CLaSH.Core.Type: instance Constructor C1_1ConstTy
- CLaSH.Core.Type: instance Constructor C1_1LitTy
- CLaSH.Core.Type: instance Constructor C1_1Type
- CLaSH.Core.Type: instance Constructor C1_2Type
- CLaSH.Core.Type: instance Constructor C1_3Type
- CLaSH.Core.Type: instance Constructor C1_4Type
- CLaSH.Core.Type: instance Datatype D1ConstTy
- CLaSH.Core.Type: instance Datatype D1LitTy
- CLaSH.Core.Type: instance Datatype D1Type
- CLaSH.Core.Type: instance Eq Type
- CLaSH.Core.Type: instance Generic ConstTy
- CLaSH.Core.Type: instance Generic LitTy
- CLaSH.Core.Type: instance Generic Type
- CLaSH.Core.Type: instance NFData ConstTy
- CLaSH.Core.Type: instance NFData LitTy
- CLaSH.Core.Type: instance NFData Type
- CLaSH.Core.Type: instance Ord Type
- CLaSH.Core.Type: instance Show ConstTy
- CLaSH.Core.Type: instance Show LitTy
- CLaSH.Core.Type: instance Show Type
- CLaSH.Core.Type: instance Show TypeView
- CLaSH.Core.Type: instance Subst Term Type
- CLaSH.Core.Type: instance Subst Type Type
- CLaSH.Core.Type: instance Subst a ConstTy
- CLaSH.Core.Type: instance Subst a LitTy
- CLaSH.Core.Var: [Id] :: Name a -> Embed Type -> Var a
- CLaSH.Core.Var: [TyVar] :: Name a -> Embed Kind -> Var a
- CLaSH.Core.Var: instance (Typeable a, Alpha a) => Alpha (Var a)
- CLaSH.Core.Var: instance Constructor C1_0Var
- CLaSH.Core.Var: instance Constructor C1_1Var
- CLaSH.Core.Var: instance Datatype D1Var
- CLaSH.Core.Var: instance Eq (Var a)
- CLaSH.Core.Var: instance Generic (Var a)
- CLaSH.Core.Var: instance Generic b => Subst Term (Var b)
- CLaSH.Core.Var: instance Generic b => Subst Type (Var b)
- CLaSH.Core.Var: instance NFData (Var a)
- CLaSH.Core.Var: instance Selector S1_0_0Var
- CLaSH.Core.Var: instance Selector S1_0_1Var
- CLaSH.Core.Var: instance Selector S1_1_0Var
- CLaSH.Core.Var: instance Selector S1_1_1Var
- CLaSH.Core.Var: instance Show (Var a)
- CLaSH.Driver.Types: [CLaSHOpts] :: Int -> Int -> Int -> DebugLevel -> CLaSHOpts
- CLaSH.Netlist.BlackBox.Types: [C] :: !Text -> Element
- CLaSH.Netlist.BlackBox.Types: [Clk] :: !(Maybe Int) -> Element
- CLaSH.Netlist.BlackBox.Types: [CompName] :: Element
- CLaSH.Netlist.BlackBox.Types: [D] :: !Decl -> Element
- CLaSH.Netlist.BlackBox.Types: [Decl] :: !Int -> [(BlackBoxTemplate, BlackBoxTemplate)] -> Decl
- CLaSH.Netlist.BlackBox.Types: [Err] :: !(Maybe Int) -> Element
- CLaSH.Netlist.BlackBox.Types: [FilePath] :: !Element -> Element
- CLaSH.Netlist.BlackBox.Types: [Gen] :: !Bool -> Element
- CLaSH.Netlist.BlackBox.Types: [IF] :: !Element -> [Element] -> [Element] -> Element
- CLaSH.Netlist.BlackBox.Types: [I] :: !Int -> Element
- CLaSH.Netlist.BlackBox.Types: [IndexType] :: !Element -> Element
- CLaSH.Netlist.BlackBox.Types: [L] :: !Int -> Element
- CLaSH.Netlist.BlackBox.Types: [Length] :: !Element -> Element
- CLaSH.Netlist.BlackBox.Types: [O] :: Element
- CLaSH.Netlist.BlackBox.Types: [Rst] :: !(Maybe Int) -> Element
- CLaSH.Netlist.BlackBox.Types: [SigD] :: [Element] -> !(Maybe Int) -> Element
- CLaSH.Netlist.BlackBox.Types: [Size] :: !Element -> Element
- CLaSH.Netlist.BlackBox.Types: [Sym] :: !Int -> Element
- CLaSH.Netlist.BlackBox.Types: [TypElem] :: !Element -> Element
- CLaSH.Netlist.BlackBox.Types: [TypM] :: !(Maybe Int) -> Element
- CLaSH.Netlist.BlackBox.Types: [Typ] :: !(Maybe Int) -> Element
- CLaSH.Netlist.BlackBox.Types: instance Show Decl
- CLaSH.Netlist.BlackBox.Types: instance Show Element
- CLaSH.Netlist.Types: [Assignment] :: !Identifier -> !Expr -> Declaration
- CLaSH.Netlist.Types: [BitLit] :: !Bit -> Literal
- CLaSH.Netlist.Types: [BitVector] :: !Size -> HWType
- CLaSH.Netlist.Types: [BlackBoxD] :: !Text -> !BlackBoxTemplate -> BlackBoxContext -> Declaration
- CLaSH.Netlist.Types: [BlackBoxE] :: !Text -> !BlackBoxTemplate -> !BlackBoxContext -> !Bool -> Expr
- CLaSH.Netlist.Types: [BoolLit] :: !Bool -> Literal
- CLaSH.Netlist.Types: [Bool] :: HWType
- CLaSH.Netlist.Types: [Clock] :: !Identifier -> !Int -> HWType
- CLaSH.Netlist.Types: [Component] :: !Identifier -> [(Identifier, HWType)] -> [(Identifier, HWType)] -> [(Identifier, HWType)] -> [Declaration] -> Component
- CLaSH.Netlist.Types: [CondAssignment] :: !Identifier -> !HWType -> !Expr -> [(Maybe Expr, Expr)] -> Declaration
- CLaSH.Netlist.Types: [Context] :: (SyncExpr, HWType) -> [(SyncExpr, HWType, Bool)] -> IntMap (Either BlackBoxTemplate Declaration, BlackBoxContext) -> BlackBoxContext
- CLaSH.Netlist.Types: [DC] :: (HWType, Int) -> Modifier
- CLaSH.Netlist.Types: [DataCon] :: !HWType -> !Modifier -> [Expr] -> Expr
- CLaSH.Netlist.Types: [DataTag] :: !HWType -> !(Either Identifier Identifier) -> Expr
- CLaSH.Netlist.Types: [H] :: Bit
- CLaSH.Netlist.Types: [Identifier] :: !Identifier -> !(Maybe Modifier) -> Expr
- CLaSH.Netlist.Types: [Index] :: !Size -> HWType
- CLaSH.Netlist.Types: [Indexed] :: (HWType, Int, Int) -> Modifier
- CLaSH.Netlist.Types: [InstDecl] :: !Identifier -> !Identifier -> [(Identifier, Expr)] -> Declaration
- CLaSH.Netlist.Types: [Integer] :: HWType
- CLaSH.Netlist.Types: [L] :: Bit
- CLaSH.Netlist.Types: [Literal] :: !(Maybe (HWType, Size)) -> !Literal -> Expr
- CLaSH.Netlist.Types: [NetDecl] :: !Identifier -> !HWType -> Declaration
- CLaSH.Netlist.Types: [NetlistMonad] :: WriterT (Set (Identifier, HWType)) (StateT NetlistState (FreshMT IO)) a -> NetlistMonad a
- CLaSH.Netlist.Types: [NetlistState] :: HashMap TmName (Type, Term) -> Gamma -> !Int -> !Int -> HashMap TmName Component -> PrimMap -> (HashMap TyConName TyCon -> Type -> Maybe (Either String HWType)) -> HashMap TyConName TyCon -> !String -> !Identifier -> [(String, FilePath)] -> NetlistState
- CLaSH.Netlist.Types: [NumLit] :: !Integer -> Literal
- CLaSH.Netlist.Types: [Product] :: !Identifier -> [HWType] -> HWType
- CLaSH.Netlist.Types: [Reset] :: !Identifier -> !Int -> HWType
- CLaSH.Netlist.Types: [SP] :: !Identifier -> [(Identifier, [HWType])] -> HWType
- CLaSH.Netlist.Types: [Signed] :: !Size -> HWType
- CLaSH.Netlist.Types: [StringLit] :: !String -> Literal
- CLaSH.Netlist.Types: [Sum] :: !Identifier -> [Identifier] -> HWType
- CLaSH.Netlist.Types: [U] :: Bit
- CLaSH.Netlist.Types: [Unsigned] :: !Size -> HWType
- CLaSH.Netlist.Types: [VecAppend] :: Modifier
- CLaSH.Netlist.Types: [VecLit] :: [Literal] -> Literal
- CLaSH.Netlist.Types: [Vector] :: !Size -> !HWType -> HWType
- CLaSH.Netlist.Types: [Void] :: HWType
- CLaSH.Netlist.Types: [Z] :: Bit
- CLaSH.Netlist.Types: instance Applicative NetlistMonad
- CLaSH.Netlist.Types: instance Constructor C1_0HWType
- CLaSH.Netlist.Types: instance Constructor C1_10HWType
- CLaSH.Netlist.Types: instance Constructor C1_11HWType
- CLaSH.Netlist.Types: instance Constructor C1_12HWType
- CLaSH.Netlist.Types: instance Constructor C1_1HWType
- CLaSH.Netlist.Types: instance Constructor C1_2HWType
- CLaSH.Netlist.Types: instance Constructor C1_3HWType
- CLaSH.Netlist.Types: instance Constructor C1_4HWType
- CLaSH.Netlist.Types: instance Constructor C1_5HWType
- CLaSH.Netlist.Types: instance Constructor C1_6HWType
- CLaSH.Netlist.Types: instance Constructor C1_7HWType
- CLaSH.Netlist.Types: instance Constructor C1_8HWType
- CLaSH.Netlist.Types: instance Constructor C1_9HWType
- CLaSH.Netlist.Types: instance Datatype D1HWType
- CLaSH.Netlist.Types: instance Eq HWType
- CLaSH.Netlist.Types: instance Fresh NetlistMonad
- CLaSH.Netlist.Types: instance Functor NetlistMonad
- CLaSH.Netlist.Types: instance Generic HWType
- CLaSH.Netlist.Types: instance Hashable HWType
- CLaSH.Netlist.Types: instance Monad NetlistMonad
- CLaSH.Netlist.Types: instance MonadIO NetlistMonad
- CLaSH.Netlist.Types: instance MonadState NetlistState NetlistMonad
- CLaSH.Netlist.Types: instance MonadWriter (Set (Identifier, HWType)) NetlistMonad
- CLaSH.Netlist.Types: instance NFData Component
- CLaSH.Netlist.Types: instance NFData Declaration
- CLaSH.Netlist.Types: instance NFData HWType
- CLaSH.Netlist.Types: instance Ord HWType
- CLaSH.Netlist.Types: instance Show Bit
- CLaSH.Netlist.Types: instance Show BlackBoxContext
- CLaSH.Netlist.Types: instance Show Component
- CLaSH.Netlist.Types: instance Show Declaration
- CLaSH.Netlist.Types: instance Show Expr
- CLaSH.Netlist.Types: instance Show HWType
- CLaSH.Netlist.Types: instance Show Literal
- CLaSH.Netlist.Types: instance Show Modifier
- CLaSH.Normalize: [CBranch] :: (TmName, (Type, Term)) -> [CallTree] -> CallTree
- CLaSH.Normalize: [CLeaf] :: (TmName, (Type, Term)) -> CallTree
- CLaSH.Normalize.Types: [NormalizeState] :: HashMap TmName (Type, Term) -> Map (TmName, Int, Either Term Type) (TmName, Type) -> HashMap TmName Int -> !Int -> HashMap TmName (HashMap TmName Int) -> !Int -> !Int -> NormalizeState
- CLaSH.Primitives.Types: [BlackBox] :: !Text -> !(Either Text Text) -> Primitive
- CLaSH.Primitives.Types: [Primitive] :: !Text -> !Text -> Primitive
- CLaSH.Primitives.Types: instance FromJSON Primitive
- CLaSH.Primitives.Types: instance Show Primitive
- CLaSH.Rewrite.Types: [AppArg] :: CoreContext
- CLaSH.Rewrite.Types: [AppFun] :: CoreContext
- CLaSH.Rewrite.Types: [CaseAlt] :: [Id] -> CoreContext
- CLaSH.Rewrite.Types: [CaseScrut] :: CoreContext
- CLaSH.Rewrite.Types: [DebugAll] :: DebugLevel
- CLaSH.Rewrite.Types: [DebugApplied] :: DebugLevel
- CLaSH.Rewrite.Types: [DebugFinal] :: DebugLevel
- CLaSH.Rewrite.Types: [DebugName] :: DebugLevel
- CLaSH.Rewrite.Types: [DebugNone] :: DebugLevel
- CLaSH.Rewrite.Types: [LamBody] :: Id -> CoreContext
- CLaSH.Rewrite.Types: [LetBinding] :: [Id] -> CoreContext
- CLaSH.Rewrite.Types: [LetBody] :: [Id] -> CoreContext
- CLaSH.Rewrite.Types: [R] :: (RewriteEnv -> RewriteState extra -> (a, RewriteState extra, Any)) -> RewriteMonad extra a
- CLaSH.Rewrite.Types: [RewriteEnv] :: DebugLevel -> (HashMap TyConName TyCon -> Type -> Maybe (Either String HWType)) -> HashMap TyConName TyCon -> (HashMap TyConName TyCon -> Bool -> Term -> Term) -> RewriteEnv
- CLaSH.Rewrite.Types: [RewriteState] :: {-# UNPACK #-} !Int -> !(HashMap TmName (Type, Term)) -> !Supply -> TmName -> {-# UNPACK #-} !Int -> !extra -> RewriteState extra
- CLaSH.Rewrite.Types: [TyAppC] :: CoreContext
- CLaSH.Rewrite.Types: [TyLamBody] :: TyVar -> CoreContext
- CLaSH.Rewrite.Types: instance Applicative (RewriteMonad extra)
- CLaSH.Rewrite.Types: instance Eq CoreContext
- CLaSH.Rewrite.Types: instance Eq DebugLevel
- CLaSH.Rewrite.Types: instance Fresh (RewriteMonad extra)
- CLaSH.Rewrite.Types: instance Functor (RewriteMonad extra)
- CLaSH.Rewrite.Types: instance Monad (RewriteMonad extra)
- CLaSH.Rewrite.Types: instance MonadReader RewriteEnv (RewriteMonad extra)
- CLaSH.Rewrite.Types: instance MonadState (RewriteState extra) (RewriteMonad extra)
- CLaSH.Rewrite.Types: instance MonadUnique (RewriteMonad extra)
- CLaSH.Rewrite.Types: instance MonadWriter Any (RewriteMonad extra)
- CLaSH.Rewrite.Types: instance Ord DebugLevel
- CLaSH.Rewrite.Types: instance Read DebugLevel
- CLaSH.Rewrite.Types: instance Show CoreContext
- CLaSH.Util: instance Monad m => MonadUnique (StateT Int m)
+ CLaSH.Core.DataCon: MkData :: !DcName -> !ConTag -> !Type -> [TyName] -> [TyName] -> [Type] -> DataCon
+ CLaSH.Core.DataCon: instance Control.DeepSeq.NFData CLaSH.Core.DataCon.DataCon
+ CLaSH.Core.DataCon: instance GHC.Classes.Eq CLaSH.Core.DataCon.DataCon
+ CLaSH.Core.DataCon: instance GHC.Classes.Ord CLaSH.Core.DataCon.DataCon
+ CLaSH.Core.DataCon: instance GHC.Generics.Constructor CLaSH.Core.DataCon.C1_0DataCon
+ CLaSH.Core.DataCon: instance GHC.Generics.Datatype CLaSH.Core.DataCon.D1DataCon
+ CLaSH.Core.DataCon: instance GHC.Generics.Generic CLaSH.Core.DataCon.DataCon
+ CLaSH.Core.DataCon: instance GHC.Generics.Selector CLaSH.Core.DataCon.S1_0_0DataCon
+ CLaSH.Core.DataCon: instance GHC.Generics.Selector CLaSH.Core.DataCon.S1_0_1DataCon
+ CLaSH.Core.DataCon: instance GHC.Generics.Selector CLaSH.Core.DataCon.S1_0_2DataCon
+ CLaSH.Core.DataCon: instance GHC.Generics.Selector CLaSH.Core.DataCon.S1_0_3DataCon
+ CLaSH.Core.DataCon: instance GHC.Generics.Selector CLaSH.Core.DataCon.S1_0_4DataCon
+ CLaSH.Core.DataCon: instance GHC.Generics.Selector CLaSH.Core.DataCon.S1_0_5DataCon
+ CLaSH.Core.DataCon: instance GHC.Show.Show CLaSH.Core.DataCon.DataCon
+ CLaSH.Core.DataCon: instance Unbound.Generics.LocallyNameless.Alpha.Alpha CLaSH.Core.DataCon.DataCon
+ CLaSH.Core.DataCon: instance Unbound.Generics.LocallyNameless.Subst.Subst a CLaSH.Core.DataCon.DataCon
+ CLaSH.Core.Literal: IntegerLiteral :: !Integer -> Literal
+ CLaSH.Core.Literal: RationalLiteral :: !Rational -> Literal
+ CLaSH.Core.Literal: StringLiteral :: !String -> Literal
+ CLaSH.Core.Literal: instance Control.DeepSeq.NFData CLaSH.Core.Literal.Literal
+ CLaSH.Core.Literal: instance GHC.Classes.Eq CLaSH.Core.Literal.Literal
+ CLaSH.Core.Literal: instance GHC.Classes.Ord CLaSH.Core.Literal.Literal
+ CLaSH.Core.Literal: instance GHC.Generics.Constructor CLaSH.Core.Literal.C1_0Literal
+ CLaSH.Core.Literal: instance GHC.Generics.Constructor CLaSH.Core.Literal.C1_1Literal
+ CLaSH.Core.Literal: instance GHC.Generics.Constructor CLaSH.Core.Literal.C1_2Literal
+ CLaSH.Core.Literal: instance GHC.Generics.Datatype CLaSH.Core.Literal.D1Literal
+ CLaSH.Core.Literal: instance GHC.Generics.Generic CLaSH.Core.Literal.Literal
+ CLaSH.Core.Literal: instance GHC.Show.Show CLaSH.Core.Literal.Literal
+ CLaSH.Core.Literal: instance Unbound.Generics.LocallyNameless.Alpha.Alpha CLaSH.Core.Literal.Literal
+ CLaSH.Core.Literal: instance Unbound.Generics.LocallyNameless.Subst.Subst a CLaSH.Core.Literal.Literal
+ CLaSH.Core.Pretty: instance CLaSH.Core.Pretty.Pretty (CLaSH.Core.Var.Id, CLaSH.Core.Term.Term)
+ CLaSH.Core.Pretty: instance CLaSH.Core.Pretty.Pretty (CLaSH.Core.Var.Var CLaSH.Core.Term.Term)
+ CLaSH.Core.Pretty: instance CLaSH.Core.Pretty.Pretty (CLaSH.Core.Var.Var CLaSH.Core.Type.Type)
+ CLaSH.Core.Pretty: instance CLaSH.Core.Pretty.Pretty (Unbound.Generics.LocallyNameless.Name.Name a)
+ CLaSH.Core.Pretty: instance CLaSH.Core.Pretty.Pretty CLaSH.Core.DataCon.DataCon
+ CLaSH.Core.Pretty: instance CLaSH.Core.Pretty.Pretty CLaSH.Core.Literal.Literal
+ CLaSH.Core.Pretty: instance CLaSH.Core.Pretty.Pretty CLaSH.Core.Term.Pat
+ CLaSH.Core.Pretty: instance CLaSH.Core.Pretty.Pretty CLaSH.Core.Term.Term
+ CLaSH.Core.Pretty: instance CLaSH.Core.Pretty.Pretty CLaSH.Core.TyCon.TyCon
+ CLaSH.Core.Pretty: instance CLaSH.Core.Pretty.Pretty CLaSH.Core.Type.LitTy
+ CLaSH.Core.Pretty: instance CLaSH.Core.Pretty.Pretty CLaSH.Core.Type.Type
+ CLaSH.Core.Pretty: instance CLaSH.Core.Pretty.Pretty a => CLaSH.Core.Pretty.Pretty [a]
+ CLaSH.Core.Pretty: instance GHC.Classes.Eq CLaSH.Core.Pretty.TypePrec
+ CLaSH.Core.Pretty: instance GHC.Classes.Ord CLaSH.Core.Pretty.TypePrec
+ CLaSH.Core.Term: App :: !Term -> !Term -> Term
+ CLaSH.Core.Term: Case :: !Term -> !Type -> [Bind Pat Term] -> Term
+ CLaSH.Core.Term: Data :: !DataCon -> Term
+ CLaSH.Core.Term: DataPat :: !(Embed DataCon) -> !(Rebind [TyVar] [Id]) -> Pat
+ CLaSH.Core.Term: DefaultPat :: Pat
+ CLaSH.Core.Term: Lam :: !(Bind Id Term) -> Term
+ CLaSH.Core.Term: Letrec :: !(Bind (Rec [LetBinding]) Term) -> Term
+ CLaSH.Core.Term: LitPat :: !(Embed Literal) -> Pat
+ CLaSH.Core.Term: Literal :: !Literal -> Term
+ CLaSH.Core.Term: Prim :: !Text -> !Type -> Term
+ CLaSH.Core.Term: TyApp :: !Term -> !Type -> Term
+ CLaSH.Core.Term: TyLam :: !(Bind TyVar Term) -> Term
+ CLaSH.Core.Term: Var :: !Type -> !TmName -> Term
+ CLaSH.Core.Term: instance Control.DeepSeq.NFData CLaSH.Core.Term.Pat
+ CLaSH.Core.Term: instance Control.DeepSeq.NFData CLaSH.Core.Term.Term
+ CLaSH.Core.Term: instance GHC.Classes.Eq CLaSH.Core.Term.Pat
+ CLaSH.Core.Term: instance GHC.Classes.Eq CLaSH.Core.Term.Term
+ CLaSH.Core.Term: instance GHC.Classes.Ord CLaSH.Core.Term.Term
+ CLaSH.Core.Term: instance GHC.Generics.Constructor CLaSH.Core.Term.C1_0Pat
+ CLaSH.Core.Term: instance GHC.Generics.Constructor CLaSH.Core.Term.C1_0Term
+ CLaSH.Core.Term: instance GHC.Generics.Constructor CLaSH.Core.Term.C1_1Pat
+ CLaSH.Core.Term: instance GHC.Generics.Constructor CLaSH.Core.Term.C1_1Term
+ CLaSH.Core.Term: instance GHC.Generics.Constructor CLaSH.Core.Term.C1_2Pat
+ CLaSH.Core.Term: instance GHC.Generics.Constructor CLaSH.Core.Term.C1_2Term
+ CLaSH.Core.Term: instance GHC.Generics.Constructor CLaSH.Core.Term.C1_3Term
+ CLaSH.Core.Term: instance GHC.Generics.Constructor CLaSH.Core.Term.C1_4Term
+ CLaSH.Core.Term: instance GHC.Generics.Constructor CLaSH.Core.Term.C1_5Term
+ CLaSH.Core.Term: instance GHC.Generics.Constructor CLaSH.Core.Term.C1_6Term
+ CLaSH.Core.Term: instance GHC.Generics.Constructor CLaSH.Core.Term.C1_7Term
+ CLaSH.Core.Term: instance GHC.Generics.Constructor CLaSH.Core.Term.C1_8Term
+ CLaSH.Core.Term: instance GHC.Generics.Constructor CLaSH.Core.Term.C1_9Term
+ CLaSH.Core.Term: instance GHC.Generics.Datatype CLaSH.Core.Term.D1Pat
+ CLaSH.Core.Term: instance GHC.Generics.Datatype CLaSH.Core.Term.D1Term
+ CLaSH.Core.Term: instance GHC.Generics.Generic CLaSH.Core.Term.Pat
+ CLaSH.Core.Term: instance GHC.Generics.Generic CLaSH.Core.Term.Term
+ CLaSH.Core.Term: instance GHC.Show.Show CLaSH.Core.Term.Pat
+ CLaSH.Core.Term: instance GHC.Show.Show CLaSH.Core.Term.Term
+ CLaSH.Core.Term: instance Unbound.Generics.LocallyNameless.Alpha.Alpha CLaSH.Core.Term.Pat
+ CLaSH.Core.Term: instance Unbound.Generics.LocallyNameless.Alpha.Alpha CLaSH.Core.Term.Term
+ CLaSH.Core.Term: instance Unbound.Generics.LocallyNameless.Subst.Subst CLaSH.Core.Term.Term CLaSH.Core.Term.Pat
+ CLaSH.Core.Term: instance Unbound.Generics.LocallyNameless.Subst.Subst CLaSH.Core.Term.Term CLaSH.Core.Term.Term
+ CLaSH.Core.Term: instance Unbound.Generics.LocallyNameless.Subst.Subst CLaSH.Core.Type.Type CLaSH.Core.Term.Pat
+ CLaSH.Core.Term: instance Unbound.Generics.LocallyNameless.Subst.Subst CLaSH.Core.Type.Type CLaSH.Core.Term.Term
+ CLaSH.Core.TyCon: AlgTyCon :: !TyConName -> !Kind -> !Int -> !AlgTyConRhs -> TyCon
+ CLaSH.Core.TyCon: DataTyCon :: [DataCon] -> AlgTyConRhs
+ CLaSH.Core.TyCon: FunTyCon :: !TyConName -> !Kind -> !Int -> [([Type], Type)] -> TyCon
+ CLaSH.Core.TyCon: NewTyCon :: !DataCon -> ([TyName], Type) -> AlgTyConRhs
+ CLaSH.Core.TyCon: PrimTyCon :: !TyConName -> !Kind -> !Int -> TyCon
+ CLaSH.Core.TyCon: SuperKindTyCon :: !TyConName -> TyCon
+ CLaSH.Core.TyCon: instance Control.DeepSeq.NFData CLaSH.Core.TyCon.AlgTyConRhs
+ CLaSH.Core.TyCon: instance Control.DeepSeq.NFData CLaSH.Core.TyCon.TyCon
+ CLaSH.Core.TyCon: instance GHC.Classes.Eq CLaSH.Core.TyCon.TyCon
+ CLaSH.Core.TyCon: instance GHC.Classes.Ord CLaSH.Core.TyCon.TyCon
+ CLaSH.Core.TyCon: instance GHC.Generics.Constructor CLaSH.Core.TyCon.C1_0AlgTyConRhs
+ CLaSH.Core.TyCon: instance GHC.Generics.Constructor CLaSH.Core.TyCon.C1_0TyCon
+ CLaSH.Core.TyCon: instance GHC.Generics.Constructor CLaSH.Core.TyCon.C1_1AlgTyConRhs
+ CLaSH.Core.TyCon: instance GHC.Generics.Constructor CLaSH.Core.TyCon.C1_1TyCon
+ CLaSH.Core.TyCon: instance GHC.Generics.Constructor CLaSH.Core.TyCon.C1_2TyCon
+ CLaSH.Core.TyCon: instance GHC.Generics.Constructor CLaSH.Core.TyCon.C1_3TyCon
+ CLaSH.Core.TyCon: instance GHC.Generics.Datatype CLaSH.Core.TyCon.D1AlgTyConRhs
+ CLaSH.Core.TyCon: instance GHC.Generics.Datatype CLaSH.Core.TyCon.D1TyCon
+ CLaSH.Core.TyCon: instance GHC.Generics.Generic CLaSH.Core.TyCon.AlgTyConRhs
+ CLaSH.Core.TyCon: instance GHC.Generics.Generic CLaSH.Core.TyCon.TyCon
+ CLaSH.Core.TyCon: instance GHC.Generics.Selector CLaSH.Core.TyCon.S1_0_0AlgTyConRhs
+ CLaSH.Core.TyCon: instance GHC.Generics.Selector CLaSH.Core.TyCon.S1_0_0TyCon
+ CLaSH.Core.TyCon: instance GHC.Generics.Selector CLaSH.Core.TyCon.S1_0_1TyCon
+ CLaSH.Core.TyCon: instance GHC.Generics.Selector CLaSH.Core.TyCon.S1_0_2TyCon
+ CLaSH.Core.TyCon: instance GHC.Generics.Selector CLaSH.Core.TyCon.S1_0_3TyCon
+ CLaSH.Core.TyCon: instance GHC.Generics.Selector CLaSH.Core.TyCon.S1_1_0AlgTyConRhs
+ CLaSH.Core.TyCon: instance GHC.Generics.Selector CLaSH.Core.TyCon.S1_1_0TyCon
+ CLaSH.Core.TyCon: instance GHC.Generics.Selector CLaSH.Core.TyCon.S1_1_1AlgTyConRhs
+ CLaSH.Core.TyCon: instance GHC.Generics.Selector CLaSH.Core.TyCon.S1_1_1TyCon
+ CLaSH.Core.TyCon: instance GHC.Generics.Selector CLaSH.Core.TyCon.S1_1_2TyCon
+ CLaSH.Core.TyCon: instance GHC.Generics.Selector CLaSH.Core.TyCon.S1_1_3TyCon
+ CLaSH.Core.TyCon: instance GHC.Generics.Selector CLaSH.Core.TyCon.S1_2_0TyCon
+ CLaSH.Core.TyCon: instance GHC.Generics.Selector CLaSH.Core.TyCon.S1_2_1TyCon
+ CLaSH.Core.TyCon: instance GHC.Generics.Selector CLaSH.Core.TyCon.S1_2_2TyCon
+ CLaSH.Core.TyCon: instance GHC.Generics.Selector CLaSH.Core.TyCon.S1_3_0TyCon
+ CLaSH.Core.TyCon: instance GHC.Show.Show CLaSH.Core.TyCon.AlgTyConRhs
+ CLaSH.Core.TyCon: instance GHC.Show.Show CLaSH.Core.TyCon.TyCon
+ CLaSH.Core.TyCon: instance Unbound.Generics.LocallyNameless.Alpha.Alpha CLaSH.Core.TyCon.AlgTyConRhs
+ CLaSH.Core.TyCon: instance Unbound.Generics.LocallyNameless.Alpha.Alpha CLaSH.Core.TyCon.TyCon
+ CLaSH.Core.Type: AppTy :: !Type -> !Type -> Type
+ CLaSH.Core.Type: Arrow :: ConstTy
+ CLaSH.Core.Type: ConstTy :: !ConstTy -> Type
+ CLaSH.Core.Type: ForAllTy :: !(Bind TyVar Type) -> Type
+ CLaSH.Core.Type: FunTy :: !Type -> !Type -> TypeView
+ CLaSH.Core.Type: LitTy :: !LitTy -> Type
+ CLaSH.Core.Type: NumTy :: !Int -> LitTy
+ CLaSH.Core.Type: OtherType :: !Type -> TypeView
+ CLaSH.Core.Type: SymTy :: !String -> LitTy
+ CLaSH.Core.Type: TyCon :: !TyConName -> ConstTy
+ CLaSH.Core.Type: TyConApp :: !TyConName -> [Type] -> TypeView
+ CLaSH.Core.Type: VarTy :: !Kind -> !TyName -> Type
+ CLaSH.Core.Type: instance Control.DeepSeq.NFData CLaSH.Core.Type.ConstTy
+ CLaSH.Core.Type: instance Control.DeepSeq.NFData CLaSH.Core.Type.LitTy
+ CLaSH.Core.Type: instance Control.DeepSeq.NFData CLaSH.Core.Type.Type
+ CLaSH.Core.Type: instance GHC.Classes.Eq CLaSH.Core.Type.Type
+ CLaSH.Core.Type: instance GHC.Classes.Ord CLaSH.Core.Type.Type
+ CLaSH.Core.Type: instance GHC.Generics.Constructor CLaSH.Core.Type.C1_0ConstTy
+ CLaSH.Core.Type: instance GHC.Generics.Constructor CLaSH.Core.Type.C1_0LitTy
+ CLaSH.Core.Type: instance GHC.Generics.Constructor CLaSH.Core.Type.C1_0Type
+ CLaSH.Core.Type: instance GHC.Generics.Constructor CLaSH.Core.Type.C1_1ConstTy
+ CLaSH.Core.Type: instance GHC.Generics.Constructor CLaSH.Core.Type.C1_1LitTy
+ CLaSH.Core.Type: instance GHC.Generics.Constructor CLaSH.Core.Type.C1_1Type
+ CLaSH.Core.Type: instance GHC.Generics.Constructor CLaSH.Core.Type.C1_2Type
+ CLaSH.Core.Type: instance GHC.Generics.Constructor CLaSH.Core.Type.C1_3Type
+ CLaSH.Core.Type: instance GHC.Generics.Constructor CLaSH.Core.Type.C1_4Type
+ CLaSH.Core.Type: instance GHC.Generics.Datatype CLaSH.Core.Type.D1ConstTy
+ CLaSH.Core.Type: instance GHC.Generics.Datatype CLaSH.Core.Type.D1LitTy
+ CLaSH.Core.Type: instance GHC.Generics.Datatype CLaSH.Core.Type.D1Type
+ CLaSH.Core.Type: instance GHC.Generics.Generic CLaSH.Core.Type.ConstTy
+ CLaSH.Core.Type: instance GHC.Generics.Generic CLaSH.Core.Type.LitTy
+ CLaSH.Core.Type: instance GHC.Generics.Generic CLaSH.Core.Type.Type
+ CLaSH.Core.Type: instance GHC.Show.Show CLaSH.Core.Type.ConstTy
+ CLaSH.Core.Type: instance GHC.Show.Show CLaSH.Core.Type.LitTy
+ CLaSH.Core.Type: instance GHC.Show.Show CLaSH.Core.Type.Type
+ CLaSH.Core.Type: instance GHC.Show.Show CLaSH.Core.Type.TypeView
+ CLaSH.Core.Type: instance Unbound.Generics.LocallyNameless.Alpha.Alpha CLaSH.Core.Type.ConstTy
+ CLaSH.Core.Type: instance Unbound.Generics.LocallyNameless.Alpha.Alpha CLaSH.Core.Type.LitTy
+ CLaSH.Core.Type: instance Unbound.Generics.LocallyNameless.Alpha.Alpha CLaSH.Core.Type.Type
+ CLaSH.Core.Type: instance Unbound.Generics.LocallyNameless.Subst.Subst CLaSH.Core.Term.Term CLaSH.Core.Type.Type
+ CLaSH.Core.Type: instance Unbound.Generics.LocallyNameless.Subst.Subst CLaSH.Core.Type.Type CLaSH.Core.Type.Type
+ CLaSH.Core.Type: instance Unbound.Generics.LocallyNameless.Subst.Subst a CLaSH.Core.Type.ConstTy
+ CLaSH.Core.Type: instance Unbound.Generics.LocallyNameless.Subst.Subst a CLaSH.Core.Type.LitTy
+ CLaSH.Core.Var: Id :: Name a -> Embed Type -> Var a
+ CLaSH.Core.Var: TyVar :: Name a -> Embed Kind -> Var a
+ CLaSH.Core.Var: instance (Data.Typeable.Internal.Typeable a, Unbound.Generics.LocallyNameless.Alpha.Alpha a) => Unbound.Generics.LocallyNameless.Alpha.Alpha (CLaSH.Core.Var.Var a)
+ CLaSH.Core.Var: instance Control.DeepSeq.NFData (CLaSH.Core.Var.Var a)
+ CLaSH.Core.Var: instance GHC.Classes.Eq (CLaSH.Core.Var.Var a)
+ CLaSH.Core.Var: instance GHC.Generics.Constructor CLaSH.Core.Var.C1_0Var
+ CLaSH.Core.Var: instance GHC.Generics.Constructor CLaSH.Core.Var.C1_1Var
+ CLaSH.Core.Var: instance GHC.Generics.Datatype CLaSH.Core.Var.D1Var
+ CLaSH.Core.Var: instance GHC.Generics.Generic (CLaSH.Core.Var.Var a)
+ CLaSH.Core.Var: instance GHC.Generics.Generic b => Unbound.Generics.LocallyNameless.Subst.Subst CLaSH.Core.Term.Term (CLaSH.Core.Var.Var b)
+ CLaSH.Core.Var: instance GHC.Generics.Generic b => Unbound.Generics.LocallyNameless.Subst.Subst CLaSH.Core.Type.Type (CLaSH.Core.Var.Var b)
+ CLaSH.Core.Var: instance GHC.Generics.Selector CLaSH.Core.Var.S1_0_0Var
+ CLaSH.Core.Var: instance GHC.Generics.Selector CLaSH.Core.Var.S1_0_1Var
+ CLaSH.Core.Var: instance GHC.Generics.Selector CLaSH.Core.Var.S1_1_0Var
+ CLaSH.Core.Var: instance GHC.Generics.Selector CLaSH.Core.Var.S1_1_1Var
+ CLaSH.Core.Var: instance GHC.Show.Show (CLaSH.Core.Var.Var a)
+ CLaSH.Driver.Types: CLaSHOpts :: Int -> Int -> Int -> DebugLevel -> CLaSHOpts
+ CLaSH.Netlist.BlackBox.Types: C :: !Text -> Element
+ CLaSH.Netlist.BlackBox.Types: Clk :: !(Maybe Int) -> Element
+ CLaSH.Netlist.BlackBox.Types: CompName :: Element
+ CLaSH.Netlist.BlackBox.Types: D :: !Decl -> Element
+ CLaSH.Netlist.BlackBox.Types: Decl :: !Int -> [(BlackBoxTemplate, BlackBoxTemplate)] -> Decl
+ CLaSH.Netlist.BlackBox.Types: Err :: !(Maybe Int) -> Element
+ CLaSH.Netlist.BlackBox.Types: FilePath :: !Element -> Element
+ CLaSH.Netlist.BlackBox.Types: Gen :: !Bool -> Element
+ CLaSH.Netlist.BlackBox.Types: I :: !Int -> Element
+ CLaSH.Netlist.BlackBox.Types: IF :: !Element -> [Element] -> [Element] -> Element
+ CLaSH.Netlist.BlackBox.Types: IndexType :: !Element -> Element
+ CLaSH.Netlist.BlackBox.Types: L :: !Int -> Element
+ CLaSH.Netlist.BlackBox.Types: Length :: !Element -> Element
+ CLaSH.Netlist.BlackBox.Types: O :: Element
+ CLaSH.Netlist.BlackBox.Types: Rst :: !(Maybe Int) -> Element
+ CLaSH.Netlist.BlackBox.Types: SigD :: [Element] -> !(Maybe Int) -> Element
+ CLaSH.Netlist.BlackBox.Types: Size :: !Element -> Element
+ CLaSH.Netlist.BlackBox.Types: Sym :: !Int -> Element
+ CLaSH.Netlist.BlackBox.Types: Typ :: !(Maybe Int) -> Element
+ CLaSH.Netlist.BlackBox.Types: TypElem :: !Element -> Element
+ CLaSH.Netlist.BlackBox.Types: TypM :: !(Maybe Int) -> Element
+ CLaSH.Netlist.BlackBox.Types: instance GHC.Show.Show CLaSH.Netlist.BlackBox.Types.Decl
+ CLaSH.Netlist.BlackBox.Types: instance GHC.Show.Show CLaSH.Netlist.BlackBox.Types.Element
+ CLaSH.Netlist.Types: Assignment :: !Identifier -> !Expr -> Declaration
+ CLaSH.Netlist.Types: BitLit :: !Bit -> Literal
+ CLaSH.Netlist.Types: BitVector :: !Size -> HWType
+ CLaSH.Netlist.Types: BlackBoxD :: !Text -> !BlackBoxTemplate -> BlackBoxContext -> Declaration
+ CLaSH.Netlist.Types: BlackBoxE :: !Text -> !BlackBoxTemplate -> !BlackBoxContext -> !Bool -> Expr
+ CLaSH.Netlist.Types: Bool :: HWType
+ CLaSH.Netlist.Types: BoolLit :: !Bool -> Literal
+ CLaSH.Netlist.Types: Clock :: !Identifier -> !Int -> HWType
+ CLaSH.Netlist.Types: Component :: !Identifier -> [(Identifier, HWType)] -> [(Identifier, HWType)] -> [(Identifier, HWType)] -> [Declaration] -> Component
+ CLaSH.Netlist.Types: CondAssignment :: !Identifier -> !HWType -> !Expr -> !HWType -> [(Maybe Literal, Expr)] -> Declaration
+ CLaSH.Netlist.Types: Context :: (SyncExpr, HWType) -> [(SyncExpr, HWType, Bool)] -> IntMap (Either BlackBoxTemplate Declaration, BlackBoxContext) -> BlackBoxContext
+ CLaSH.Netlist.Types: DC :: (HWType, Int) -> Modifier
+ CLaSH.Netlist.Types: DataCon :: !HWType -> !Modifier -> [Expr] -> Expr
+ CLaSH.Netlist.Types: DataTag :: !HWType -> !(Either Identifier Identifier) -> Expr
+ CLaSH.Netlist.Types: H :: Bit
+ CLaSH.Netlist.Types: Identifier :: !Identifier -> !(Maybe Modifier) -> Expr
+ CLaSH.Netlist.Types: Index :: !Size -> HWType
+ CLaSH.Netlist.Types: Indexed :: (HWType, Int, Int) -> Modifier
+ CLaSH.Netlist.Types: InstDecl :: !Identifier -> !Identifier -> [(Identifier, Expr)] -> Declaration
+ CLaSH.Netlist.Types: Integer :: HWType
+ CLaSH.Netlist.Types: L :: Bit
+ CLaSH.Netlist.Types: Literal :: !(Maybe (HWType, Size)) -> !Literal -> Expr
+ CLaSH.Netlist.Types: NetDecl :: !Identifier -> !HWType -> Declaration
+ CLaSH.Netlist.Types: NetlistMonad :: WriterT (Set (Identifier, HWType)) (StateT NetlistState (FreshMT IO)) a -> NetlistMonad a
+ CLaSH.Netlist.Types: NetlistState :: HashMap TmName (Type, Term) -> Gamma -> !Int -> !Int -> HashMap TmName Component -> PrimMap -> (HashMap TyConName TyCon -> Type -> Maybe (Either String HWType)) -> HashMap TyConName TyCon -> !String -> !Identifier -> [(String, FilePath)] -> NetlistState
+ CLaSH.Netlist.Types: NumLit :: !Integer -> Literal
+ CLaSH.Netlist.Types: Product :: !Identifier -> [HWType] -> HWType
+ CLaSH.Netlist.Types: Reset :: !Identifier -> !Int -> HWType
+ CLaSH.Netlist.Types: SP :: !Identifier -> [(Identifier, [HWType])] -> HWType
+ CLaSH.Netlist.Types: Signed :: !Size -> HWType
+ CLaSH.Netlist.Types: String :: HWType
+ CLaSH.Netlist.Types: StringLit :: !String -> Literal
+ CLaSH.Netlist.Types: Sum :: !Identifier -> [Identifier] -> HWType
+ CLaSH.Netlist.Types: U :: Bit
+ CLaSH.Netlist.Types: Unsigned :: !Size -> HWType
+ CLaSH.Netlist.Types: VecAppend :: Modifier
+ CLaSH.Netlist.Types: VecLit :: [Literal] -> Literal
+ CLaSH.Netlist.Types: Vector :: !Size -> !HWType -> HWType
+ CLaSH.Netlist.Types: Void :: HWType
+ CLaSH.Netlist.Types: Z :: Bit
+ CLaSH.Netlist.Types: instance Control.DeepSeq.NFData CLaSH.Netlist.Types.Component
+ CLaSH.Netlist.Types: instance Control.DeepSeq.NFData CLaSH.Netlist.Types.Declaration
+ CLaSH.Netlist.Types: instance Control.DeepSeq.NFData CLaSH.Netlist.Types.HWType
+ CLaSH.Netlist.Types: instance Control.Monad.IO.Class.MonadIO CLaSH.Netlist.Types.NetlistMonad
+ CLaSH.Netlist.Types: instance Control.Monad.State.Class.MonadState CLaSH.Netlist.Types.NetlistState CLaSH.Netlist.Types.NetlistMonad
+ CLaSH.Netlist.Types: instance Control.Monad.Writer.Class.MonadWriter (Data.Set.Base.Set (CLaSH.Netlist.Types.Identifier, CLaSH.Netlist.Types.HWType)) CLaSH.Netlist.Types.NetlistMonad
+ CLaSH.Netlist.Types: instance Data.Hashable.Class.Hashable CLaSH.Netlist.Types.HWType
+ CLaSH.Netlist.Types: instance GHC.Base.Applicative CLaSH.Netlist.Types.NetlistMonad
+ CLaSH.Netlist.Types: instance GHC.Base.Functor CLaSH.Netlist.Types.NetlistMonad
+ CLaSH.Netlist.Types: instance GHC.Base.Monad CLaSH.Netlist.Types.NetlistMonad
+ CLaSH.Netlist.Types: instance GHC.Classes.Eq CLaSH.Netlist.Types.HWType
+ CLaSH.Netlist.Types: instance GHC.Classes.Ord CLaSH.Netlist.Types.HWType
+ CLaSH.Netlist.Types: instance GHC.Generics.Constructor CLaSH.Netlist.Types.C1_0HWType
+ CLaSH.Netlist.Types: instance GHC.Generics.Constructor CLaSH.Netlist.Types.C1_10HWType
+ CLaSH.Netlist.Types: instance GHC.Generics.Constructor CLaSH.Netlist.Types.C1_11HWType
+ CLaSH.Netlist.Types: instance GHC.Generics.Constructor CLaSH.Netlist.Types.C1_12HWType
+ CLaSH.Netlist.Types: instance GHC.Generics.Constructor CLaSH.Netlist.Types.C1_13HWType
+ CLaSH.Netlist.Types: instance GHC.Generics.Constructor CLaSH.Netlist.Types.C1_1HWType
+ CLaSH.Netlist.Types: instance GHC.Generics.Constructor CLaSH.Netlist.Types.C1_2HWType
+ CLaSH.Netlist.Types: instance GHC.Generics.Constructor CLaSH.Netlist.Types.C1_3HWType
+ CLaSH.Netlist.Types: instance GHC.Generics.Constructor CLaSH.Netlist.Types.C1_4HWType
+ CLaSH.Netlist.Types: instance GHC.Generics.Constructor CLaSH.Netlist.Types.C1_5HWType
+ CLaSH.Netlist.Types: instance GHC.Generics.Constructor CLaSH.Netlist.Types.C1_6HWType
+ CLaSH.Netlist.Types: instance GHC.Generics.Constructor CLaSH.Netlist.Types.C1_7HWType
+ CLaSH.Netlist.Types: instance GHC.Generics.Constructor CLaSH.Netlist.Types.C1_8HWType
+ CLaSH.Netlist.Types: instance GHC.Generics.Constructor CLaSH.Netlist.Types.C1_9HWType
+ CLaSH.Netlist.Types: instance GHC.Generics.Datatype CLaSH.Netlist.Types.D1HWType
+ CLaSH.Netlist.Types: instance GHC.Generics.Generic CLaSH.Netlist.Types.HWType
+ CLaSH.Netlist.Types: instance GHC.Show.Show CLaSH.Netlist.Types.Bit
+ CLaSH.Netlist.Types: instance GHC.Show.Show CLaSH.Netlist.Types.BlackBoxContext
+ CLaSH.Netlist.Types: instance GHC.Show.Show CLaSH.Netlist.Types.Component
+ CLaSH.Netlist.Types: instance GHC.Show.Show CLaSH.Netlist.Types.Declaration
+ CLaSH.Netlist.Types: instance GHC.Show.Show CLaSH.Netlist.Types.Expr
+ CLaSH.Netlist.Types: instance GHC.Show.Show CLaSH.Netlist.Types.HWType
+ CLaSH.Netlist.Types: instance GHC.Show.Show CLaSH.Netlist.Types.Literal
+ CLaSH.Netlist.Types: instance GHC.Show.Show CLaSH.Netlist.Types.Modifier
+ CLaSH.Netlist.Types: instance Unbound.Generics.LocallyNameless.Fresh.Fresh CLaSH.Netlist.Types.NetlistMonad
+ CLaSH.Normalize: CBranch :: (TmName, (Type, Term)) -> [CallTree] -> CallTree
+ CLaSH.Normalize: CLeaf :: (TmName, (Type, Term)) -> CallTree
+ CLaSH.Normalize.DEC: collectGlobals :: Set TmName -> [(Term, Term)] -> [Term] -> Term -> RewriteMonad NormalizeState (Term, [(Term, CaseTree [(Either Term Type)])])
+ CLaSH.Normalize.DEC: instance Data.Foldable.Foldable CLaSH.Normalize.DEC.CaseTree
+ CLaSH.Normalize.DEC: instance GHC.Base.Functor CLaSH.Normalize.DEC.CaseTree
+ CLaSH.Normalize.DEC: instance GHC.Classes.Eq a => GHC.Classes.Eq (CLaSH.Normalize.DEC.CaseTree a)
+ CLaSH.Normalize.DEC: instance GHC.Show.Show a => GHC.Show.Show (CLaSH.Normalize.DEC.CaseTree a)
+ CLaSH.Normalize.DEC: isDisjoint :: CaseTree ([Either Term Type]) -> Bool
+ CLaSH.Normalize.DEC: mkDisjointGroup :: Set TmName -> (Term, CaseTree [(Either Term Type)]) -> RewriteMonad NormalizeState Term
+ CLaSH.Normalize.Transformations: caseFlat :: NormRewrite
+ CLaSH.Normalize.Transformations: disjointExpressionConsolidation :: NormRewrite
+ CLaSH.Normalize.Types: NormalizeState :: HashMap TmName (Type, Term) -> Map (TmName, Int, Either Term Type) (TmName, Type) -> HashMap TmName Int -> !Int -> HashMap TmName (HashMap TmName Int) -> !Int -> !Int -> NormalizeState
+ CLaSH.Primitives.Types: BlackBox :: !Text -> !(Either Text Text) -> Primitive
+ CLaSH.Primitives.Types: Primitive :: !Text -> !Text -> Primitive
+ CLaSH.Primitives.Types: instance Data.Aeson.Types.Class.FromJSON CLaSH.Primitives.Types.Primitive
+ CLaSH.Primitives.Types: instance GHC.Show.Show CLaSH.Primitives.Types.Primitive
+ CLaSH.Rewrite.Types: AppArg :: CoreContext
+ CLaSH.Rewrite.Types: AppFun :: CoreContext
+ CLaSH.Rewrite.Types: CaseAlt :: [Id] -> CoreContext
+ CLaSH.Rewrite.Types: CaseScrut :: CoreContext
+ CLaSH.Rewrite.Types: DebugAll :: DebugLevel
+ CLaSH.Rewrite.Types: DebugApplied :: DebugLevel
+ CLaSH.Rewrite.Types: DebugFinal :: DebugLevel
+ CLaSH.Rewrite.Types: DebugName :: DebugLevel
+ CLaSH.Rewrite.Types: DebugNone :: DebugLevel
+ CLaSH.Rewrite.Types: LamBody :: Id -> CoreContext
+ CLaSH.Rewrite.Types: LetBinding :: [Id] -> CoreContext
+ CLaSH.Rewrite.Types: LetBody :: [Id] -> CoreContext
+ CLaSH.Rewrite.Types: R :: (RewriteEnv -> RewriteState extra -> (a, RewriteState extra, Any)) -> RewriteMonad extra a
+ CLaSH.Rewrite.Types: RewriteEnv :: DebugLevel -> (HashMap TyConName TyCon -> Type -> Maybe (Either String HWType)) -> HashMap TyConName TyCon -> IntMap TyConName -> (HashMap TyConName TyCon -> Bool -> Term -> Term) -> RewriteEnv
+ CLaSH.Rewrite.Types: RewriteState :: {-# UNPACK #-} !Int -> !(HashMap TmName (Type, Term)) -> !Supply -> TmName -> {-# UNPACK #-} !Int -> !extra -> RewriteState extra
+ CLaSH.Rewrite.Types: TyAppC :: CoreContext
+ CLaSH.Rewrite.Types: TyLamBody :: TyVar -> CoreContext
+ CLaSH.Rewrite.Types: [_tupleTcCache] :: RewriteEnv -> IntMap TyConName
+ CLaSH.Rewrite.Types: instance CLaSH.Util.MonadUnique (CLaSH.Rewrite.Types.RewriteMonad extra)
+ CLaSH.Rewrite.Types: instance Control.Monad.Reader.Class.MonadReader CLaSH.Rewrite.Types.RewriteEnv (CLaSH.Rewrite.Types.RewriteMonad extra)
+ CLaSH.Rewrite.Types: instance Control.Monad.State.Class.MonadState (CLaSH.Rewrite.Types.RewriteState extra) (CLaSH.Rewrite.Types.RewriteMonad extra)
+ CLaSH.Rewrite.Types: instance Control.Monad.Writer.Class.MonadWriter Data.Monoid.Any (CLaSH.Rewrite.Types.RewriteMonad extra)
+ CLaSH.Rewrite.Types: instance GHC.Base.Applicative (CLaSH.Rewrite.Types.RewriteMonad extra)
+ CLaSH.Rewrite.Types: instance GHC.Base.Functor (CLaSH.Rewrite.Types.RewriteMonad extra)
+ CLaSH.Rewrite.Types: instance GHC.Base.Monad (CLaSH.Rewrite.Types.RewriteMonad extra)
+ CLaSH.Rewrite.Types: instance GHC.Classes.Eq CLaSH.Rewrite.Types.CoreContext
+ CLaSH.Rewrite.Types: instance GHC.Classes.Eq CLaSH.Rewrite.Types.DebugLevel
+ CLaSH.Rewrite.Types: instance GHC.Classes.Ord CLaSH.Rewrite.Types.DebugLevel
+ CLaSH.Rewrite.Types: instance GHC.Read.Read CLaSH.Rewrite.Types.DebugLevel
+ CLaSH.Rewrite.Types: instance GHC.Show.Show CLaSH.Rewrite.Types.CoreContext
+ CLaSH.Rewrite.Types: instance Unbound.Generics.LocallyNameless.Fresh.Fresh (CLaSH.Rewrite.Types.RewriteMonad extra)
+ CLaSH.Rewrite.Types: tupleTcCache :: Lens' RewriteEnv (IntMap TyConName)
+ CLaSH.Util: instance GHC.Base.Monad m => CLaSH.Util.MonadUnique (Control.Monad.Trans.State.Lazy.StateT GHC.Types.Int m)
- CLaSH.Driver: generateHDL :: Backend backend => BindingMap -> Maybe backend -> PrimMap -> HashMap TyConName TyCon -> (HashMap TyConName TyCon -> Type -> Maybe (Either String HWType)) -> (HashMap TyConName TyCon -> Bool -> Term -> Term) -> Maybe TopEntity -> CLaSHOpts -> IO ()
+ CLaSH.Driver: generateHDL :: Backend backend => BindingMap -> Maybe backend -> PrimMap -> HashMap TyConName TyCon -> IntMap TyConName -> (HashMap TyConName TyCon -> Type -> Maybe (Either String HWType)) -> (HashMap TyConName TyCon -> Bool -> Term -> Term) -> Maybe TopEntity -> CLaSHOpts -> IO ()
- CLaSH.Driver.TestbenchGen: genTestBench :: CLaSHOpts -> Supply -> PrimMap -> (HashMap TyConName TyCon -> Type -> Maybe (Either String HWType)) -> HashMap TyConName TyCon -> (HashMap TyConName TyCon -> Bool -> Term -> Term) -> Int -> HashMap TmName (Type, Term) -> Maybe TmName -> Maybe TmName -> String -> [(String, FilePath)] -> Component -> IO ([Component], [(String, FilePath)])
+ CLaSH.Driver.TestbenchGen: genTestBench :: CLaSHOpts -> Supply -> PrimMap -> (HashMap TyConName TyCon -> Type -> Maybe (Either String HWType)) -> HashMap TyConName TyCon -> IntMap TyConName -> (HashMap TyConName TyCon -> Bool -> Term -> Term) -> Int -> HashMap TmName (Type, Term) -> Maybe TmName -> Maybe TmName -> String -> [(String, FilePath)] -> Component -> IO ([Component], [(String, FilePath)])
- CLaSH.Netlist.Util: dcToLiteral :: HWType -> Int -> Expr
+ CLaSH.Netlist.Util: dcToLiteral :: HWType -> Int -> Literal
- CLaSH.Normalize: runNormalization :: CLaSHOpts -> Supply -> HashMap TmName (Type, Term) -> (HashMap TyConName TyCon -> Type -> Maybe (Either String HWType)) -> HashMap TyConName TyCon -> (HashMap TyConName TyCon -> Bool -> Term -> Term) -> NormalizeSession a -> a
+ CLaSH.Normalize: runNormalization :: CLaSHOpts -> Supply -> HashMap TmName (Type, Term) -> (HashMap TyConName TyCon -> Type -> Maybe (Either String HWType)) -> HashMap TyConName TyCon -> IntMap TyConName -> (HashMap TyConName TyCon -> Bool -> Term -> Term) -> NormalizeSession a -> a
- CLaSH.Rewrite.Types: bindings :: Lens' (RewriteState extra_a3bLd) (HashMap TmName (Type, Term))
+ CLaSH.Rewrite.Types: bindings :: Lens' (RewriteState extra_a3zEK) (HashMap TmName (Type, Term))
- CLaSH.Rewrite.Types: curFun :: Lens' (RewriteState extra_a3bLd) TmName
+ CLaSH.Rewrite.Types: curFun :: Lens' (RewriteState extra_a3zEK) TmName
- CLaSH.Rewrite.Types: extra :: Lens (RewriteState extra_a3bLd) (RewriteState extra_a3bOA) extra_a3bLd extra_a3bOA
+ CLaSH.Rewrite.Types: extra :: Lens (RewriteState extra_a3zEK) (RewriteState extra_a3zI7) extra_a3zEK extra_a3zI7
- CLaSH.Rewrite.Types: nameCounter :: Lens' (RewriteState extra_a3bLd) Int
+ CLaSH.Rewrite.Types: nameCounter :: Lens' (RewriteState extra_a3zEK) Int
- CLaSH.Rewrite.Types: transformCounter :: Lens' (RewriteState extra_a3bLd) Int
+ CLaSH.Rewrite.Types: transformCounter :: Lens' (RewriteState extra_a3zEK) Int
- CLaSH.Rewrite.Types: uniqSupply :: Lens' (RewriteState extra_a3bLd) Supply
+ CLaSH.Rewrite.Types: uniqSupply :: Lens' (RewriteState extra_a3zEK) Supply
- CLaSH.Rewrite.Util: mkSelectorCase :: (Functor m, Monad m, MonadUnique m, Fresh m) => String -> HashMap TyConName TyCon -> [CoreContext] -> Term -> Int -> Int -> m Term
+ CLaSH.Rewrite.Util: mkSelectorCase :: (Functor m, Monad m, MonadUnique m, Fresh m) => String -> HashMap TyConName TyCon -> Term -> Int -> Int -> m Term
Files
- CHANGELOG.md +27/−0
- clash-lib.cabal +4/−1
- src/CLaSH/Core/Term.hs +1/−1
- src/CLaSH/Driver.hs +5/−3
- src/CLaSH/Driver/TestbenchGen.hs +5/−3
- src/CLaSH/Netlist.hs +4/−4
- src/CLaSH/Netlist/Types.hs +4/−1
- src/CLaSH/Netlist/Util.hs +5/−4
- src/CLaSH/Normalize.hs +5/−1
- src/CLaSH/Normalize/DEC.hs +434/−0
- src/CLaSH/Normalize/PrimitiveReductions.hs +29/−15
- src/CLaSH/Normalize/Strategy.hs +7/−2
- src/CLaSH/Normalize/Transformations.hs +169/−7
- src/CLaSH/Rewrite/Types.hs +3/−0
- src/CLaSH/Rewrite/Util.hs +18/−8
CHANGELOG.md view
@@ -1,5 +1,32 @@ # Changelog for the [`clash-lib`](http://hackage.haskell.org/package/clash-lib) package +## 0.6.1 *October 16th 2015*+* New features:+ * Support for `clash-prelude` 0.10.1+ * Transformation that lifts applications of the same function out of alternatives of case-statements. e.g.++ ```haskell+ case x of+ A -> f 3 y+ B -> f x x+ C -> h x+ ```++ is transformed into:++ ```haskell+ let f_arg0 = case x of {A -> 3; B -> x}+ f_arg1 = case x of {A -> y; B -> x}+ f_out = f f_arg0 f_arg1+ in case x of+ A -> f_out+ B -> f_out+ C -> h x+ ```++* Fixes bugs:+ * Case-statements acting like normal decoder circuits are erroneously synthesised to priority decoder circuits.+ ## 0.6 *October 3rd 2015* * New features: * Support for `clash-prelude` 0.10
clash-lib.cabal view
@@ -1,5 +1,5 @@ Name: clash-lib-Version: 0.6+Version: 0.6.1 Synopsis: CAES Language for Synchronous Hardware - As a Library Description: CλaSH (pronounced ‘clash’) is a functional hardware description language that@@ -72,6 +72,8 @@ other-extensions: CPP DeriveAnyClass DeriveGeneric+ DeriveFoldable+ DeriveFunctor FlexibleContexts FlexibleInstances GeneralizedNewtypeDeriving@@ -140,6 +142,7 @@ CLaSH.Netlist.Util CLaSH.Normalize+ CLaSH.Normalize.DEC CLaSH.Normalize.PrimitiveReductions CLaSH.Normalize.Strategy CLaSH.Normalize.Transformations
src/CLaSH/Core/Term.hs view
@@ -57,7 +57,7 @@ -- ^ Literal pattern | DefaultPat -- ^ Default pattern- deriving (Show,Generic,NFData,Alpha)+ deriving (Eq,Show,Generic,NFData,Alpha) instance Eq Term where (==) = aeq
src/CLaSH/Driver.hs view
@@ -10,6 +10,7 @@ import Data.HashMap.Strict (HashMap) import qualified Data.HashMap.Strict as HashMap import qualified Data.HashSet as HashSet+import Data.IntMap (IntMap) import Data.List (isSuffixOf) import Data.Maybe (fromMaybe, listToMaybe) import qualified Data.Text.Lazy as Text@@ -41,12 +42,13 @@ -> Maybe backend -> PrimMap -- ^ Primitive / BlackBox Definitions -> HashMap TyConName TyCon -- ^ TyCon cache+ -> IntMap TyConName -- ^ Tuple TyCon cache -> (HashMap TyConName TyCon -> Type -> Maybe (Either String HWType)) -- ^ Hardcoded 'Type' -> 'HWType' translator -> (HashMap TyConName TyCon -> Bool -> Term -> Term) -- ^ Hardcoded evaluator (delta-reduction) -> Maybe TopEntity -> CLaSHOpts -- ^ Debug information level for the normalization process -> IO ()-generateHDL bindingsMap hdlState primMap tcm typeTrans eval teM opts = do+generateHDL bindingsMap hdlState primMap tcm tupTcm typeTrans eval teM opts = do start <- Clock.getCurrentTime prepTime <- start `deepseq` bindingsMap `deepseq` tcm `deepseq` Clock.getCurrentTime let prepStartDiff = Clock.diffUTCTime prepTime start@@ -75,7 +77,7 @@ let doNorm = do norm <- normalize [fst topEntity] let normChecked = checkNonRecursive (fst topEntity) norm cleanupGraph (fst topEntity) normChecked- transformedBindings = runNormalization opts supplyN bindingsMap typeTrans tcm eval doNorm+ transformedBindings = runNormalization opts supplyN bindingsMap typeTrans tcm tupTcm eval doNorm normTime <- transformedBindings `deepseq` Clock.getCurrentTime let prepNormDiff = Clock.diffUTCTime normTime prepTime@@ -96,7 +98,7 @@ netlist (testBench,dfiles') <- genTestBench opts supplyTB primMap- typeTrans tcm eval cmpCnt bindingsMap+ typeTrans tcm tupTcm eval cmpCnt bindingsMap (listToMaybe $ map fst $ HashMap.toList testInputs) (listToMaybe $ map fst $ HashMap.toList expectedOutputs) modName
src/CLaSH/Driver/TestbenchGen.hs view
@@ -11,6 +11,7 @@ import Control.Lens ((.=)) import Data.HashMap.Lazy (HashMap) import qualified Data.HashMap.Lazy as HashMap+import Data.IntMap.Strict (IntMap) import Data.List (find,nub) import Data.Maybe (catMaybes,mapMaybe) import Data.Text.Lazy (append,pack,splitOn)@@ -40,6 +41,7 @@ -> PrimMap -- ^ Primitives -> (HashMap TyConName TyCon -> Type -> Maybe (Either String HWType)) -> HashMap TyConName TyCon+ -> IntMap TyConName -> (HashMap TyConName TyCon -> Bool -> Term -> Term) -> Int -> HashMap TmName (Type,Term) -- ^ Global binders@@ -49,7 +51,7 @@ -> [(String,FilePath)] -- ^ Set of collected data-files -> Component -- ^ Component to generate TB for -> IO ([Component],[(String,FilePath)])-genTestBench opts supply primMap typeTrans tcm eval cmpCnt globals stimuliNmM expectedNmM modName dfiles+genTestBench opts supply primMap typeTrans tcm tupTcm eval cmpCnt globals stimuliNmM expectedNmM modName dfiles (Component cName hidden [inp] [outp] _) = do let ioDecl = [ uncurry NetDecl inp , uncurry NetDecl outp@@ -99,9 +101,9 @@ -> TmName -> HashMap TmName (Type,Term) normalizeSignal glbls bndr =- runNormalization opts supply glbls typeTrans tcm eval (normalize [bndr] >>= cleanupGraph bndr)+ runNormalization opts supply glbls typeTrans tcm tupTcm eval (normalize [bndr] >>= cleanupGraph bndr) -genTestBench opts _ _ _ _ _ _ _ _ _ _ dfiles c = traceIf (opt_dbgLevel opts > DebugNone) ("Can't make testbench for: " ++ show c) $ return ([],dfiles)+genTestBench opts _ _ _ _ _ _ _ _ _ _ _ dfiles c = traceIf (opt_dbgLevel opts > DebugNone) ("Can't make testbench for: " ++ show c) $ return ([],dfiles) genClock :: PrimMap -> (Identifier,HWType)
src/CLaSH/Netlist.hs view
@@ -199,7 +199,7 @@ -- When element and subject have the same HW-type, -- then the projections is just the identity | otherwise -> Just (DC (Void,0))- _ -> error $ $(curLoc) ++ "Not in normal form: Unexpected pattern in case-projection: " ++ showDoc e+ _ -> Nothing extractExpr = Identifier (maybe altVarId (const selId) modifier) modifier return (decls ++ [Assignment dstId extractExpr]) @@ -213,15 +213,15 @@ (exprs,altsDecls) <- (second concat . unzip) <$> mapM (mkCondExpr scrutHTy) alts' let dstId = mkBasicId . Text.pack . name2String $ varName bndr- return $! scrutDecls ++ altsDecls ++ [CondAssignment dstId altHTy scrutExpr (reverse exprs)]+ return $! scrutDecls ++ altsDecls ++ [CondAssignment dstId altHTy scrutExpr scrutHTy (reverse exprs)] where- mkCondExpr :: HWType -> (Pat,Term) -> NetlistMonad ((Maybe Expr,Expr),[Declaration])+ mkCondExpr :: HWType -> (Pat,Term) -> NetlistMonad ((Maybe HW.Literal,Expr),[Declaration]) mkCondExpr scrutHTy (pat,alt) = do (altExpr,altDecls) <- mkExpr False altTy alt (,altDecls) <$> case pat of DefaultPat -> return (Nothing,altExpr) DataPat (Embed dc) _ -> return (Just (dcToLiteral scrutHTy (dcTag dc)),altExpr)- LitPat (Embed (IntegerLiteral i)) -> return (Just (HW.Literal Nothing (NumLit $ fromInteger i)),altExpr)+ LitPat (Embed (IntegerLiteral i)) -> return (Just (NumLit $ fromInteger i),altExpr) _ -> error $ $(curLoc) ++ "Not an integer literal in LitPat" mkScrutExpr :: HWType -> Pat -> Expr -> Expr
src/CLaSH/Netlist/Types.hs view
@@ -77,6 +77,7 @@ -- | Representable hardware types data HWType = Void -- ^ Empty type+ | String -- ^ String type | Bool -- ^ Boolean type | Integer -- ^ Integer type | BitVector !Size -- ^ BitVector of a specified size@@ -102,7 +103,7 @@ -- * Signal to assign -- -- * Assigned expression- | CondAssignment !Identifier !HWType !Expr [(Maybe Expr,Expr)]+ | CondAssignment !Identifier !HWType !Expr !HWType [(Maybe Literal,Expr)] -- ^ Conditional signal assignment: -- -- * Signal to assign@@ -110,6 +111,8 @@ -- * Type of the result/alternatives -- -- * Scrutinized expression+ --+ -- * Type of the scrutinee -- -- * List of: (Maybe expression scrutinized expression is compared with,RHS of alternative) | InstDecl !Identifier !Identifier [(Identifier,Expr)] -- ^ Instantiation of another component
src/CLaSH/Netlist/Util.hs view
@@ -164,6 +164,7 @@ typeSize :: HWType -> Int typeSize Void = 0+typeSize String = 2^(32::Integer) typeSize Bool = 1 typeSize (Clock _ _) = 1 typeSize (Reset _ _) = 1@@ -286,7 +287,7 @@ curCompNm .= vComp return val -dcToLiteral :: HWType -> Int -> Expr-dcToLiteral Bool 1 = HW.Literal Nothing (BoolLit False)-dcToLiteral Bool 2 = HW.Literal Nothing (BoolLit True)-dcToLiteral t i = HW.Literal (Just (t,conSize t)) (NumLit (toInteger i-1))+dcToLiteral :: HWType -> Int -> Literal+dcToLiteral Bool 1 = BoolLit False+dcToLiteral Bool 2 = BoolLit True+dcToLiteral _ i = NumLit (toInteger i-1)
src/CLaSH/Normalize.hs view
@@ -9,6 +9,7 @@ import Data.Either (partitionEithers) import Data.HashMap.Strict (HashMap) import qualified Data.HashMap.Strict as HashMap+import Data.IntMap.Strict (IntMap) import Data.List (mapAccumL,intersect) import qualified Data.Map as Map import qualified Data.Maybe as Maybe@@ -52,18 +53,21 @@ -- ^ Hardcoded Type -> HWType translator -> HashMap TyConName TyCon -- ^ TyCon cache+ -> IntMap TyConName+ -- ^ Tuple TyCon cache -> (HashMap TyConName TyCon -> Bool -> Term -> Term) -- ^ Hardcoded evaluator (delta-reduction) -> NormalizeSession a -- ^ NormalizeSession to run -> a-runNormalization opts supply globals typeTrans tcm eval+runNormalization opts supply globals typeTrans tcm tupTcm eval = runRewriteSession rwEnv rwState where rwEnv = RewriteEnv (opt_dbgLevel opts) typeTrans tcm+ tupTcm eval rwState = RewriteState
+ src/CLaSH/Normalize/DEC.hs view
@@ -0,0 +1,434 @@+{-# LANGUAGE DeriveFoldable #-}+{-# LANGUAGE DeriveFunctor #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TupleSections #-}+{-# LANGUAGE ViewPatterns #-}++-- | Helper functions for the 'disjointExpressionConsolidation' transformation+--+-- The 'disjointExpressionConsolidation' transformation lifts applications of+-- global binders out of alternatives of case-statements.+--+-- e.g. It converts:+--+-- @+-- case x of+-- A -> f 3 y+-- B -> f x x+-- C -> h x+-- @+--+-- into:+--+-- @+-- let f_arg0 = case x of {A -> 3; B -> x}+-- f_arg1 = case x of {A -> y; B -> x}+-- f_out = f f_arg0 f_arg1+-- in case x of+-- A -> f_out+-- B -> f_out+-- C -> h x+-- @+module CLaSH.Normalize.DEC+ (collectGlobals+ ,isDisjoint+ ,mkDisjointGroup+ )+where++-- external+import qualified Control.Lens as Lens+import Data.Bits ((.&.),complement)+import qualified Data.Either as Either+import qualified Data.Foldable as Foldable+import qualified Data.HashMap.Strict as HashMap+import qualified Data.IntMap.Strict as IM+import qualified Data.List as List+import qualified Data.Map.Strict as Map+import qualified Data.Maybe as Maybe+import Data.Set (Set)+import qualified Data.Set as Set+import qualified Data.Set.Lens as Lens++import Unbound.Generics.LocallyNameless (Bind, bind, embed, rec,+ unbind, unembed, unrec)++-- internal+import CLaSH.Core.DataCon (DataCon, dcTag)+import CLaSH.Core.FreeVars (termFreeIds, typeFreeVars)+import CLaSH.Core.Literal (Literal (..))+import CLaSH.Core.Term (LetBinding, Pat (..), Term (..), TmName)+import CLaSH.Core.TyCon (tyConDataCons)+import CLaSH.Core.Type (Type, mkTyConApp, splitFunForallTy)+import CLaSH.Core.Util (collectArgs, mkApps, termType)+import CLaSH.Normalize.Types (NormalizeState)+import CLaSH.Normalize.Util (isConstant)+import CLaSH.Rewrite.Types (RewriteMonad, evaluator, tcCache, tupleTcCache)+import CLaSH.Rewrite.Util (mkInternalVar, mkSelectorCase,+ isUntranslatableType)+import CLaSH.Util++data CaseTree a+ = Leaf a+ | LB [LetBinding] (CaseTree a)+ | Branch Term [(Pat,CaseTree a)]+ deriving (Eq,Show,Functor,Foldable)++-- | Test if a 'CaseTree' collected from an expression indicates that+-- application of a global binder is disjoint: occur in separate branches of a+-- case-expression.+isDisjoint :: CaseTree ([Either Term Type])+ -> Bool+isDisjoint (Leaf _) = False+isDisjoint (LB _ ct) = isDisjoint ct+isDisjoint (Branch _ []) = False+isDisjoint (Branch _ [(_,x)]) = isDisjoint x+isDisjoint b@(Branch _ (_:_:_)) = allEqual (map Either.rights+ (Foldable.toList b))++-- Remove empty branches from a 'CaseTree'+removeEmpty :: Eq a => CaseTree [a] -> CaseTree [a]+removeEmpty l@(Leaf _) = l+removeEmpty (LB lb ct) =+ case removeEmpty ct of+ Leaf [] -> Leaf []+ ct' -> LB lb ct'+removeEmpty (Branch s bs) =+ case filter ((/= (Leaf [])) . snd) (map (second removeEmpty) bs) of+ [] -> Leaf []+ bs' -> Branch s bs'++-- | Test if all elements in a list are equal to each other.+allEqual :: Eq a => [a] -> Bool+allEqual [] = True+allEqual (x:xs) = all (== x) xs++-- | Collect 'CaseTree's for (potentially) disjoint applications of globals out+-- of an expression. Also substitute truly disjoint applications of globals by a+-- reference to a lifted out application.+collectGlobals ::+ Set TmName+ -> [(Term,Term)] -- ^ Substitution of (applications of) a global+ -- binder by a reference to a lifted term.+ -> [Term] -- ^ List of already seen global binders+ -> Term -- ^ The expression+ -> RewriteMonad NormalizeState+ (Term,[(Term,CaseTree [(Either Term Type)])])+collectGlobals inScope substitution seen (Case scrut ty alts) = do+ (scrut',collected) <- collectGlobals inScope substitution seen scrut+ (alts' ,collected') <- collectGlobalsAlts inScope substitution seen scrut'+ alts+ return (Case scrut' ty alts',collected ++ collected')++collectGlobals inScope substitution seen e@(collectArgs -> (fun, args@(_:_)))+ | not (isConstant e) = do+ tcm <- Lens.view tcCache+ eval <- Lens.view evaluator+ eTy <- termType tcm e+ case splitFunForallTy eTy of+ ([],_) -> case interestingToLift inScope (eval tcm False) fun args of+ Just fun' | fun' `notElem` seen -> do+ (args',collected) <- collectGlobalsArgs inScope substitution+ (fun':seen) args+ let e' = Maybe.fromMaybe e (List.lookup fun' substitution)+ return (e',(fun',Leaf args'):collected)+ _ -> do (args',collected) <- collectGlobalsArgs inScope substitution+ seen args+ return (mkApps fun args',collected)+ _ -> return (e,[])++-- FIXME: This duplicates A LOT of let-bindings, where I just pray that after+-- the ANF, CSE, and DeadCodeRemoval pass all duplicates are removed.+--+-- I think we should be able to do better, but perhaps we cannot fix it here.+collectGlobals inScope substitution seen (Letrec b) = do+ (unrec -> lbs,body) <- unbind b+ (body',collected) <- collectGlobals inScope substitution seen body+ (lbs',collected') <- collectGlobalsLbs inScope substitution+ (map fst collected ++ seen)+ lbs+ return (Letrec (bind (rec lbs') body')+ ,map (second (LB lbs')) (collected ++ collected')+ )++collectGlobals _ _ _ e = return (e,[])++-- | Collect 'CaseTree's for (potentially) disjoint applications of globals out+-- of a list of application arguments. Also substitute truly disjoint+-- applications of globals by a reference to a lifted out application.+collectGlobalsArgs ::+ Set TmName+ -> [(Term,Term)] -- ^ Substitution of (applications of) a global+ -- binder by a reference to a lifted term.+ -> [Term] -- ^ List of already seen global binders+ -> [Either Term Type] -- ^ The list of arguments+ -> RewriteMonad NormalizeState+ ([Either Term Type]+ ,[(Term,CaseTree [(Either Term Type)])]+ )+collectGlobalsArgs inScope substitution seen args = do+ (_,(args',collected)) <- second unzip <$> mapAccumLM go seen args+ return (args',concat collected)+ where+ go s (Left tm) = do+ (tm',collected) <- collectGlobals inScope substitution s tm+ return (map fst collected ++ s,(Left tm',collected))+ go s (Right ty) = return (s,(Right ty,[]))++-- | Collect 'CaseTree's for (potentially) disjoint applications of globals out+-- of a list of alternatives. Also substitute truly disjoint applications of+-- globals by a reference to a lifted out application.+collectGlobalsAlts ::+ Set TmName+ -> [(Term,Term)] -- ^ Substitution of (applications of) a global+ -- binder by a reference to a lifted term.+ -> [Term] -- ^ List of already seen global binders+ -> Term -- ^ The subject term+ -> [Bind Pat Term] -- ^ The list of alternatives+ -> RewriteMonad NormalizeState+ ([Bind Pat Term]+ ,[(Term,CaseTree [(Either Term Type)])]+ )+collectGlobalsAlts inScope substitution seen scrut alts = do+ (alts',collected) <- unzip <$> mapM go alts+ let collectedM = map (Map.fromList . map (second (:[]))) collected+ collectedUN = Map.unionsWith (++) collectedM+ collected' = map (second (Branch scrut)) (Map.toList collectedUN)+ return (alts',collected')+ where+ go pe = do (p,e) <- unbind pe+ (e',collected) <- collectGlobals inScope substitution seen e+ return (bind p e',map (second (p,)) collected)++-- | Collect 'CaseTree's for (potentially) disjoint applications of globals out+-- of a list of let-bindings. Also substitute truly disjoint applications of+-- globals by a reference to a lifted out application.+collectGlobalsLbs ::+ Set TmName+ -> [(Term,Term)] -- ^ Substitution of (applications of) a global+ -- binder by a reference to a lifted term.+ -> [Term] -- ^ List of already seen global binders+ -> [LetBinding] -- ^ The list let-bindings+ -> RewriteMonad NormalizeState+ ([LetBinding]+ ,[(Term,CaseTree [(Either Term Type)])]+ )+collectGlobalsLbs inScope substitution seen lbs = do+ (_,(lbs',collected)) <- second unzip <$> mapAccumLM go seen lbs+ return (lbs',concat collected)+ where+ go :: [Term] -> LetBinding+ -> RewriteMonad NormalizeState+ ([Term]+ ,(LetBinding+ ,[(Term,CaseTree [(Either Term Type)])]+ )+ )+ go s (id_,unembed -> e) = do+ (e',collected) <- collectGlobals inScope substitution s e+ return (map fst collected ++ s,((id_,embed e'),collected))++-- | Given a case-tree corresponding to a disjoint interesting \"term-in-a-+-- function-position\", return a let-expression: where the let-binding holds+-- a case-expression selecting between the uncommon arguments of the case-tree,+-- and the body is an application of the term applied to the common arguments of+-- the case tree, and projections of let-binding corresponding to the uncommon+-- argument positions.+mkDisjointGroup :: Set TmName -- ^ Current free variables.+ -> (Term,CaseTree [(Either Term Type)])+ -- ^ Case-tree of arguments belonging to the applied term.+ -> RewriteMonad NormalizeState Term+mkDisjointGroup fvs (fun,cs) = do+ let argss = Foldable.toList cs+ argssT = zip [0..] (List.transpose argss)+ (commonT,uncommonT) = List.partition (isCommon fvs . snd) argssT+ common = map (second head) commonT+ uncommon = map (Either.lefts) (List.transpose (map snd uncommonT))+ cs' = fmap (zip [0..]) cs+ cs'' = removeEmpty+ $ fmap (Either.lefts . map snd)+ (if null common+ then cs'+ else fmap (filter (`notElem` common)) cs')+ tcm <- Lens.view tcCache+ (uncommonCaseM,uncommonProjections) <- case uncommon of+ -- only common arguments: do nothing.+ [] -> return (Nothing,[])+ -- Create selectors and projections+ (uc:_) -> do+ argTys <- mapM (termType tcm) uc+ disJointSelProj argTys cs''+ let newArgs = mkDJArgs 0 common uncommonProjections+ case uncommonCaseM of+ Just lb -> return (Letrec (bind (rec [lb]) (mkApps fun newArgs)))+ Nothing -> return (mkApps fun newArgs)++-- | Create a single selector for all the representable uncommon arguments by+-- selecting between tuples. This selector is only ('Just') created when the+-- number of representable uncommmon arguments is larger than one, otherwise it+-- is not ('Nothing').+--+-- It also returns:+--+-- * For all the non-representable uncommon arguments: a selector+-- * For all the representable uncommon arguments: a projection out of the tuple+-- created by the larger selector. If this larger selector does not exist, a+-- single selector is created for the single representable uncommon argument.+disJointSelProj :: [Type] -- ^ Types of the arguments+ -> CaseTree [Term] -- The case-tree of arguments+ -> RewriteMonad NormalizeState (Maybe LetBinding,[Term])+disJointSelProj _ (Leaf []) = return (Nothing,[])+disJointSelProj argTys cs = do+ let maxIndex = length argTys - 1+ css = map (\i -> fmap ((:[]) . (!!i)) cs) [0..maxIndex]+ (untran,tran) <- partitionM (isUntranslatableType . snd) (zip [0..] argTys)+ let untranCs = map (css!!) (map fst untran)+ untranSels = zipWith (\(_,ty) cs' -> genCase ty Nothing [] cs')+ untran untranCs+ (lbM,projs) <- case tran of+ [] -> return (Nothing,[])+ [(i,ty)] -> return (Nothing,[genCase ty Nothing [] (css!!i)])+ tys -> do+ tcm <- Lens.view tcCache+ tupTcm <- Lens.view tupleTcCache+ let m = length tys+ Just tupTcNm = IM.lookup m tupTcm+ Just tupTc = HashMap.lookup tupTcNm tcm+ [tupDc] = tyConDataCons tupTc+ (tyIxs,tys') = unzip tys+ tupTy = mkTyConApp tupTcNm tys'+ cs' = fmap (\es -> map (es !!) tyIxs) cs+ djCase = genCase tupTy (Just tupDc) tys' cs'+ (scrutId,scrutVar) <- mkInternalVar "tupIn" tupTy+ projections <- mapM (mkSelectorCase ($(curLoc) ++ "disJointSelProj")+ tcm scrutVar (dcTag tupDc)) [0..m-1]+ return (Just (scrutId,embed djCase),projections)+ let selProjs = tranOrUnTran 0 (zip (map fst untran) untranSels) projs++ return (lbM,selProjs)+ where+ tranOrUnTran _ [] projs = projs+ tranOrUnTran _ sels [] = map snd sels+ tranOrUnTran n ((ut,s):uts) (p:projs)+ | n == ut = s : tranOrUnTran (n+1) uts (p:projs)+ | otherwise = p : tranOrUnTran (n+1) ((ut,s):uts) projs+++isCommon :: Set TmName -> [Either Term Type] -> Bool+isCommon _ [] = True+isCommon _ (Right ty:tys) = Set.null (Lens.setOf typeFreeVars ty) &&+ allEqual (Right ty:tys)+isCommon fvs (Left tm:tms) = Set.null (Lens.setOf termFreeIds tm Set.\\ fvs) &&+ allEqual (Left tm:tms)++-- | Create a list of arguments given a map of positions to common arguments,+-- and a list of arguments+mkDJArgs :: Int -- ^ Current position+ -> [(Int,Either Term Type)] -- ^ map from position to common argument+ -> [Term] -- ^ (projections for) uncommon arguments+ -> [Either Term Type]+mkDJArgs _ cms [] = map snd cms+mkDJArgs _ [] uncms = map Left uncms+mkDJArgs n ((m,x):cms) (y:uncms)+ | n == m = x : mkDJArgs (n+1) cms (y:uncms)+ | otherwise = Left y : mkDJArgs (n+1) ((m,x):cms) uncms++-- | Create a case-expression that selects between the uncommon arguments given+-- a case-tree+genCase :: Type -- ^ Type of the alternatives+ -> Maybe DataCon -- ^ DataCon to pack multiple arguments+ -> [Type] -- ^ Types of the arguments+ -> CaseTree [Term] -- ^ CaseTree of arguments+ -> Term+genCase ty dcM argTys = go+ where+ go (Leaf tms) =+ case dcM of+ Just dc -> mkApps (Data dc) (map Right argTys ++ map Left tms)+ _ -> head tms++ go (LB lb ct) =+ Letrec (bind (rec lb) (go ct))++ go (Branch scrut pats) =+ Case scrut ty (map (\(p,ct) -> bind p (go ct)) pats)++-- | Determine if a term in a function position is interesting to lift out of+-- of a case-expression.+--+-- This holds for all global functions, and certain primitives. Currently those+-- primitives are:+--+-- * All non-power-of-two multiplications+-- * All division-like operations with a non-power-of-two divisor+interestingToLift :: Set TmName -- ^ in scope+ -> (Term -> Term) -- ^ Evaluator+ -> Term -- ^ Term in function position+ -> [Either Term Type] -- ^ Arguments+ -> Maybe Term+interestingToLift inScope _ e@(Var _ nm) _ =+ if nm `Set.member` inScope+ then Just e+ else Nothing+interestingToLift _ eval e@(Prim nm _) args =+ case List.lookup nm interestingPrims of+ Just t | t || not (all isConstant lArgs) -> Just e+ _ -> Nothing+ where+ interestingPrims =+ [("CLaSH.Sized.Internal.BitVector.*#",tailNonPow2)+ ,("CLaSH.Sized.Internal.BitVector.times#",tailNonPow2)+ ,("CLaSH.Sized.Internal.BitVector.quot#",lastNotPow2)+ ,("CLaSH.Sized.Internal.BitVector.rem#",lastNotPow2)+ ,("CLaSH.Sized.Internal.Index.*#",tailNonPow2)+ ,("CLaSH.Sized.Internal.Index.quot#",lastNotPow2)+ ,("CLaSH.Sized.Internal.Index.rem#",lastNotPow2)+ ,("CLaSH.Sized.Internal.Signed.*#",tailNonPow2)+ ,("CLaSH.Sized.Internal.Signed.times#",tailNonPow2)+ ,("CLaSH.Sized.Internal.Signed.rem#",lastNotPow2)+ ,("CLaSH.Sized.Internal.Signed.quot#",lastNotPow2)+ ,("CLaSH.Sized.Internal.Signed.div#",lastNotPow2)+ ,("CLaSH.Sized.Internal.Signed.mod#",lastNotPow2)+ ,("CLaSH.Sized.Internal.Unsigned.*#",tailNonPow2)+ ,("CLaSH.Sized.Internal.Unsigned.times#",tailNonPow2)+ ,("CLaSH.Sized.Internal.Unsigned.quot#",lastNotPow2)+ ,("CLaSH.Sized.Internal.Unsigned.rem#",lastNotPow2)+ ,("GHC.Base.quotInt",lastNotPow2)+ ,("GHC.Base.remInt",lastNotPow2)+ ,("GHC.Base.divInt",lastNotPow2)+ ,("GHC.Base.modInt",lastNotPow2)+ ,("GHC.Classes.divInt#",lastNotPow2)+ ,("GHC.Classes.modInt#",lastNotPow2)+ ,("GHC.Integer.Type.timesInteger",allNonPow2)+ ,("GHC.Integer.Type.divInteger",lastNotPow2)+ ,("GHC.Integer.Type.modInteger",lastNotPow2)+ ,("GHC.Integer.Type.quotInteger",lastNotPow2)+ ,("GHC.Integer.Type.remInteger",lastNotPow2)+ ,("GHC.Prim.*#",allNonPow2)+ ,("GHC.Prim.quotInt#",lastNotPow2)+ ,("GHC.Prim.remInt#",lastNotPow2)+ ]++ lArgs = Either.lefts args++ allNonPow2 = all (not . termIsPow2) lArgs+ tailNonPow2 = all (not . termIsPow2) (tail lArgs)+ lastNotPow2 = not (termIsPow2 (last lArgs))++ termIsPow2 e' = case eval e' of+ Literal (IntegerLiteral n) -> isPow2 n+ a -> case collectArgs a of+ (Prim nm' _,[Right _,Left _,Left (Literal (IntegerLiteral n))])+ | isFromInteger nm' -> isPow2 n+ _ -> False++ isPow2 x = x /= 0 && (x .&. (complement x + 1)) == x++ isFromInteger x = x `elem` ["CLaSH.Sized.Internal.BitVector.fromInteger#"+ ,"CLaSH.Sized.Integer.Index.fromInteger"+ ,"CLaSH.Sized.Internal.Signed.fromInteger#"+ ,"CLaSH.Sized.Internal.Unsigned.fromInteger#"+ ]++interestingToLift _ _ _ _ = Nothing
src/CLaSH/Normalize/PrimitiveReductions.hs view
@@ -25,10 +25,13 @@ import qualified Control.Lens as Lens import qualified Data.HashMap.Lazy as HashMap import qualified Data.Maybe as Maybe+import Data.Text (pack) import Unbound.Generics.LocallyNameless (bind, embed, rec, rebind,- string2Name)+ string2Name, name2String) -import CLaSH.Core.DataCon (DataCon, dataConInstArgTys)+import CLaSH.Core.DataCon (DataCon, dataConInstArgTys,+ dcName, dcType)+import CLaSH.Core.Literal (Literal (..)) import CLaSH.Core.Term (Term (..), Pat (..)) import CLaSH.Core.Type (LitTy (..), Type (..), TypeView (..), mkFunTy,@@ -46,8 +49,6 @@ import CLaSH.Rewrite.Util import CLaSH.Util --- import CLaSH.Core.Pretty- -- | Replace an application of the @CLaSH.Sized.Vector.zipWith@ primitive on -- vectors of a known length @n@, by the fully unrolled recursive "definition" -- of @CLaSH.Sized.Vector.zipWith@@@ -275,21 +276,34 @@ [_,consCon] = tyConDataCons vecTc (vars,elems) = second concat . unzip $ extractElems consCon aTy 'D' n arg- ([_ltv,Right dsTy,_etaTy,_eta1Ty],_) <- splitFunForallTy <$> termType tcm fun- let (TyConApp proxyTcNm _) = tyView dsTy- (Just proxyTc) = HashMap.lookup proxyTcNm tcm- [proxyDc] = tyConDataCons proxyTc- lbody = doFold (Data proxyDc) (n-1) vars- lb = Letrec (bind (rec (init elems)) lbody)+ ([_ltv,Right snTy,_etaTy,_eta1Ty],_) <- splitFunForallTy <$> termType tcm fun+ let (TyConApp snatTcNm _) = tyView snTy+ (Just snatTc) = HashMap.lookup snatTcNm tcm+ [snatDc] = tyConDataCons snatTc++ ([_nTv,_kn,Right pTy],_) = splitFunForallTy (dcType snatDc)+ (TyConApp proxyTcNm _) = tyView pTy+ (Just proxyTc) = HashMap.lookup proxyTcNm tcm+ [proxyDc] = tyConDataCons proxyTc++ buildSNat i = mkApps (Prim (pack (name2String (dcName snatDc)))+ (dcType snatDc))+ [Right (LitTy (NumTy i))+ ,Left (Literal (IntegerLiteral (toInteger i)))+ ,Left (mkApps (Data proxyDc)+ [Right typeNatKind+ ,Right (LitTy (NumTy i))])+ ]+ lbody = doFold buildSNat (n-1) vars+ lb = Letrec (bind (rec (init elems)) lbody) changed lb where- doFold _ _ [] = start- doFold pDc k (x:xs) = mkApps fun+ doFold _ _ [] = start+ doFold snDc k (x:xs) = mkApps fun [Right (LitTy (NumTy k))- ,Left (mkApps pDc [Right typeNatKind- ,Right (LitTy (NumTy k))])+ ,Left (snDc k) ,Left x- ,Left (doFold pDc (k-1) xs)+ ,Left (doFold snDc (k-1) xs) ] -- | Replace an application of the @CLaSH.Sized.Vector.head@ primitive on
src/CLaSH/Normalize/Strategy.hs view
@@ -21,13 +21,19 @@ evalConst = topdownR (apply "evalConst" reduceConst) cse = topdownR (apply "CSE" simpleCSE) + constantPropgation :: NormRewrite-constantPropgation = propagate >-> repeatR inlineAndPropagate >-> lifting >-> spec+constantPropgation = propagate >-> repeatR inlineAndPropagate >->+ caseFlattening >-> dec >-> lifting >-> spec >-> dec >->+ conSpec where propagate = innerMost (applyMany transInner) inlineAndPropagate = bottomupR (applyMany transBUP) !-> propagate lifting = bottomupR (apply "liftNonRep" liftNonRep) -- See: [Note] bottom-up traversal for liftNonRep spec = bottomupR (applyMany specRws)+ caseFlattening = repeatR (topdownR (apply "caseFlat" caseFlat))+ dec = repeatR (topdownR (apply "DEC" disjointExpressionConsolidation))+ conSpec = bottomupR (apply "constantSpec" constantSpec) transInner :: [(String,NormRewrite)] transInner = [ ("applicationPropagation", appProp )@@ -47,7 +53,6 @@ specRws :: [(String,NormRewrite)] specRws = [ ("typeSpec" , typeSpec)- , ("constantSpec", constantSpec) , ("nonRepSpec" , nonRepSpec) ]
src/CLaSH/Normalize/Transformations.hs view
@@ -27,6 +27,8 @@ , simpleCSE , reduceConst , reduceNonRepPrim+ , caseFlat+ , disjointExpressionConsolidation ) where @@ -38,6 +40,8 @@ import qualified Data.HashMap.Lazy as HashMap import qualified Data.List as List import qualified Data.Maybe as Maybe+import qualified Data.Set.Lens as Lens+import Data.Text (Text, unpack) import Unbound.Generics.LocallyNameless (Bind, Embed (..), bind, embed, rec, unbind, unembed, unrebind, unrec, name2String)@@ -64,6 +68,7 @@ import CLaSH.Core.Var (Id, Var (..)) import CLaSH.Netlist.Util (representableType, splitNormalized)+import CLaSH.Normalize.DEC import CLaSH.Normalize.PrimitiveReductions import CLaSH.Normalize.Types import CLaSH.Normalize.Util@@ -469,6 +474,105 @@ appProp _ e = return e +-- | Flatten ridiculous case-statements generated by GHC+--+-- For case-statements in haskell of the form:+--+-- @+-- f :: Unsigned 4 -> Unsigned 4+-- f x = case x of+-- 0 -> 3+-- 1 -> 2+-- 2 -> 1+-- 3 -> 0+-- @+--+-- GHC generates Core that looks like:+--+-- @+-- f = \(x :: Unsigned 4) -> case x == fromInteger 3 of+-- False -> case x == fromInteger 2 of+-- False -> case x == fromInteger 1 of+-- False -> case x == fromInteger 0 of+-- False -> error "incomplete case"+-- True -> fromInteger 3+-- True -> fromInteger 2+-- True -> fromInteger 1+-- True -> fromInteger 0+-- @+--+-- Which would result in a priority decoder circuit where a normal decoder+-- circuit was desired.+--+-- This transformation transforms the above Core to the saner:+--+-- @+-- f = \(x :: Unsigned 4) -> case x of+-- _ -> error "incomplete case"+-- 0 -> fromInteger 3+-- 1 -> fromInteger 2+-- 2 -> fromInteger 1+-- 3 -> fromInteger 0+-- @+caseFlat :: NormRewrite+caseFlat _ e@(Case (collectArgs -> (Prim nm _,args)) ty _)+ | isEq nm+ = do let (Left scrut') = args !! 1+ case collectFlat scrut' e of+ Just alts' -> changed (Case scrut' ty (last alts' : init alts'))+ Nothing -> return e++caseFlat _ e = return e++collectFlat :: Term -> Term -> Maybe [Bind Pat Term]+collectFlat scrut (Case (collectArgs -> (Prim nm _,args)) _ty [lAlt,rAlt])+ | isEq nm+ , scrut' == scrut+ = case collectArgs val of+ (Prim nm' _,args') | isFromInt nm'+ -> case last args' of+ Left (Literal i) -> case (unsafeUnbind lAlt,unsafeUnbind rAlt) of+ ((pl,el),(pr,er))+ | isFalseDcPat pl || isTrueDcPat pr ->+ case collectFlat scrut el of+ Just alts' -> Just (bind (LitPat (embed i)) er : alts')+ Nothing -> Just [bind (LitPat (embed i)) er+ ,bind DefaultPat el+ ]+ | otherwise ->+ case collectFlat scrut er of+ Just alts' -> Just (bind (LitPat (embed i)) el : alts')+ Nothing -> Just [bind (LitPat (embed i)) el+ ,bind DefaultPat er+ ]+ _ -> Nothing+ _ -> Nothing+ where+ (Left scrut') = args !! 1+ (Left val) = args !! 2++ isFalseDcPat (DataPat p _)+ = ((== "GHC.Types.False") . name2String . dcName . unembed) p+ isFalseDcPat _ = False++ isTrueDcPat (DataPat p _)+ = ((== "GHC.Types.True") . name2String . dcName . unembed) p+ isTrueDcPat _ = False++collectFlat _ _ = Nothing++isEq :: Text -> Bool+isEq nm = nm == "CLaSH.Sized.Internal.BitVector.eq#" ||+ nm == "CLaSH.Sized.Internal.Index.eq#" ||+ nm == "CLaSH.Sized.Internal.Signed.eq#" ||+ nm == "CLaSH.Sized.Internal.Unsigned.eq#"++isFromInt :: Text -> Bool+isFromInt nm = nm == "CLaSH.Sized.Internal.BitVector.fromInteger#" ||+ nm == "CLaSH.Sized.Internal.Index.fromInteger#" ||+ nm == "CLaSH.Sized.Internal.Signed.fromInteger#" ||+ nm == "CLaSH.Sized.Internal.Unsigned.fromInteger#"+ type NormRewriteW = Transform (WriterT [LetBinding] (RewriteMonad NormalizeState)) -- NOTE [unsafeUnbind]: Use unsafeUnbind (which doesn't freshen pattern@@ -543,7 +647,7 @@ collectANF _ e@(Case _ _ [unsafeUnbind -> (DataPat dc _,_)]) | name2String (dcName $ unembed dc) == "CLaSH.Signal.Internal.:-" = return e -collectANF ctx (Case subj ty alts) = do+collectANF _ (Case subj ty alts) = do localVar <- lift (isLocalVar subj) (bndr,subj') <- if localVar || isConstant subj then return ([],subj)@@ -583,7 +687,7 @@ doPatBndr :: Term -> DataCon -> Id -> Int -> RewriteMonad NormalizeState LetBinding doPatBndr subj' dc pId i = do tcm <- Lens.view tcCache- patExpr <- mkSelectorCase ($(curLoc) ++ "doPatBndr") tcm ctx subj' (dcTag dc) i+ patExpr <- mkSelectorCase ($(curLoc) ++ "doPatBndr") tcm subj' (dcTag dc) i return (pId,embed patExpr) collectANF _ e = return e@@ -802,12 +906,10 @@ in reduceFoldr n aTy bTy fun start arg else return e _ -> return e- "CLaSH.Sized.Vector.dfold" | length args == 7 ->- let [_mTy,nTy,aTy] = Either.rights args+ "CLaSH.Sized.Vector.dfold" | length args == 8 ->+ let ([_kn,_motive,fun,start,arg],[_mTy,nTy,aTy]) = Either.partitionEithers args in case nTy of- (LitTy (NumTy n)) ->- let [_motive,fun,start,arg] = Either.lefts args- in reduceDFold n aTy fun start arg+ (LitTy (NumTy n)) -> reduceDFold n aTy fun start arg _ -> return e "CLaSH.Sized.Vector.++" | length args == 5 -> let [nTy,aTy,mTy] = Either.rights args@@ -855,3 +957,63 @@ _ -> return e reduceNonRepPrim _ e = return e++-- | This transformation lifts applications of global binders out of+-- alternatives of case-statements.+--+-- e.g. It converts:+--+-- @+-- case x of+-- A -> f 3 y+-- B -> f x x+-- C -> h x+-- @+--+-- into:+--+-- @+-- let f_arg0 = case x of {A -> 3; B -> x}+-- f_arg1 = case x of {A -> y; B -> x}+-- f_out = f f_arg0 f_arg1+-- in case x of+-- A -> f_out+-- B -> f_out+-- C -> h x+-- @+disjointExpressionConsolidation :: NormRewrite+disjointExpressionConsolidation ctx e@(Case _scrut _ty _alts) = do+ let eFreeIds = Lens.setOf termFreeIds e+ (_,collected) <- collectGlobals eFreeIds [] [] e+ let disJoint = filter (isDisjoint . snd) collected+ if null disJoint+ then return e+ else do+ exprs <- mapM (mkDisjointGroup eFreeIds) disJoint+ tcm <- Lens.view tcCache+ (lids,lvs) <- unzip <$> Monad.zipWithM (mkFunOut tcm) disJoint exprs+ let substitution = zip (map fst disJoint) lvs+ subsMatrix = l2m substitution+ (exprs',_) <- unzip <$> Monad.zipWithM (\s e' -> collectGlobals eFreeIds s [] e')+ subsMatrix+ exprs+ (e',_) <- collectGlobals eFreeIds substitution [] e+ let lb = Letrec (bind (rec (zip lids (map embed exprs'))) e')+ lb' <- bottomupR deadCode ctx lb+ changed lb'+ where+ mkFunOut tcm (fun,_) e' = do+ ty <- termType tcm e'+ let nm = case collectArgs fun of+ (Var _ nm',_) -> name2String nm'+ (Prim nm' _,_) -> unpack nm'+ _ -> "complex_expression_"+ nm'' = (reverse . List.takeWhile (/='.') . reverse) nm ++ "Out"+ mkInternalVar nm'' ty++ l2m = go []+ where+ go _ [] = []+ go xs (y:ys) = (xs ++ ys) : go (xs ++ [y]) ys++disjointExpressionConsolidation _ e = return e
src/CLaSH/Rewrite/Types.hs view
@@ -13,6 +13,7 @@ import Control.Monad.State (MonadState (..)) import Control.Monad.Writer (MonadWriter (..)) import Data.HashMap.Strict (HashMap)+import Data.IntMap.Strict (IntMap) import Data.Monoid (Any) import Unbound.Generics.LocallyNameless (Fresh (..)) import Unbound.Generics.LocallyNameless.Name (Name (..))@@ -77,6 +78,8 @@ -- ^ Hardcode Type -> HWType translator , _tcCache :: HashMap TyConName TyCon -- ^ TyCon cache+ , _tupleTcCache :: IntMap TyConName+ -- ^ Tuple TyCon cache , _evaluator :: HashMap TyConName TyCon -> Bool -> Term -> Term -- ^ Hardcoded evaluator (delta-reduction)} }
src/CLaSH/Rewrite/Util.hs view
@@ -340,8 +340,7 @@ -> LetBinding -> RewriteMonad extra LetBinding liftBinding gamma delta (Id idName tyE,eE) = do- let ty = unembed tyE- e = unembed eE+ let e = unembed eE -- Get all local FVs, excluding the 'idName' from the let-binding let localFTVs = List.nub $ Lens.toListOf termFreeTyVars e localFVs <- List.nub <$> (Lens.toListOf <$> localFreeIds <*> pure e)@@ -366,11 +365,23 @@ e' = substTm idName newExpr e -- Create a new body that abstracts over the free variables newBody = mkTyLams (mkLams e' boundFVs) boundFTVs- -- Add the created function to the list of global bindings- bindings %= HMS.insert newBodyId (newBodyTy,newBody)- -- Return the new binder- return (Id idName (embed ty), embed newExpr) + -- Check if an alpha-equivalent global binder already exists+ aeqExisting <- (HMS.toList . HMS.filter ((== newBody) . snd)) <$> Lens.use bindings+ case aeqExisting of+ -- If it doesn't, create a new binder+ [] -> do -- Add the created function to the list of global bindings+ bindings %= HMS.insert newBodyId (newBodyTy,newBody)+ -- Return the new binder+ return (Id idName tyE, embed newExpr)+ -- If it does, use the existing binder+ ((k,(aeqTy,_)):_) ->+ let newExpr' = mkTmApps+ (mkTyApps (Var aeqTy k)+ (zipWith VarTy localFTVkinds localFTVs))+ (zipWith Var localFVtys' localFVs')+ in return (Id idName tyE, embed newExpr')+ liftBinding _ _ _ = error $ $(curLoc) ++ "liftBinding: invalid core, expr bound to tyvar" -- | Make a global function for a name-term tuple@@ -440,12 +451,11 @@ mkSelectorCase :: (Functor m, Monad m, MonadUnique m, Fresh m) => String -- ^ Name of the caller of this function -> HashMap TyConName TyCon -- ^ TyCon cache- -> [CoreContext] -- ^ Transformation Context in which this function is called -> Term -- ^ Subject of the case-composition -> Int -- n'th DataCon -> Int -- n'th field -> m Term-mkSelectorCase caller tcm _ scrut dcI fieldI = do+mkSelectorCase caller tcm scrut dcI fieldI = do scrutTy <- termType tcm scrut let cantCreate loc info = error $ loc ++ "Can't create selector " ++ show (caller,dcI,fieldI) ++ " for: (" ++ showDoc scrut ++ " :: " ++ showDoc scrutTy ++ ")\nAdditional info: " ++ info case coreView tcm scrutTy of