import TranslatorTypes
import Pretty
-getDesignFile :: VHDLState AST.DesignFile
-getDesignFile = do
+getDesignFiles :: VHDLState [AST.DesignFile]
+getDesignFiles = do
-- Extract the library units generated from all the functions in the
-- session.
funcs <- getFuncs
- let units = concat $ map getLibraryUnits funcs
+ let units = Maybe.mapMaybe getLibraryUnits funcs
let context = [
AST.Library $ mkVHDLId "IEEE",
AST.Use $ (AST.NSimple $ mkVHDLId "IEEE.std_logic_1164") AST.:.: AST.All]
- return $ AST.DesignFile
- context
- units
+ return $ map (\(ent, arch) -> AST.DesignFile context [ent, arch]) units
-- | Create an entity for a given function
createEntity ::
case expr of
(EqLit id lit) ->
(mkIdExpr sigs id) AST.:=: (AST.PrimLit lit)
+ (Literal lit) ->
+ AST.PrimLit lit
+ (Eq a b) ->
+ (mkIdExpr sigs a) AST.:=: (mkIdExpr sigs b)
mkConcSm sigs (CondDef cond true false dst) = do
let cond_expr = mkIdExpr sigs cond
getLibraryUnits ::
(HsFunction, FuncData) -- | A function from the session
- -> [AST.LibraryUnit] -- | The library units it generates
+ -> Maybe (AST.LibraryUnit, AST.LibraryUnit) -- | The entity and architecture for the function
getLibraryUnits (hsfunc, fdata) =
case funcEntity fdata of
- Nothing -> []
- Just ent -> case ent_decl ent of
- Nothing -> []
- Just decl -> [AST.LUEntity decl]
- ++
- case funcArch fdata of
- Nothing -> []
- Just arch -> [AST.LUArch arch]
+ Nothing -> Nothing
+ Just ent ->
+ case ent_decl ent of
+ Nothing -> Nothing
+ Just decl ->
+ case funcArch fdata of
+ Nothing -> Nothing
+ Just arch ->
+ Just (AST.LUEntity decl, AST.LUArch arch)
-- | The VHDL Bit type
bit_ty :: AST.TypeMark
let name = TyCon.tyConName tycon in
-- TODO: Do something more robust than string matching
case Name.getOccString name of
- "Bit" -> Just bit_ty
+ "Bit" -> Just std_logic_ty
otherwise -> Nothing
otherwise -> Nothing
-- Shortcut
mkVHDLId :: String -> AST.VHDLId
-mkVHDLId = AST.unsafeVHDLBasicId
+mkVHDLId s =
+ AST.unsafeVHDLBasicId s'
+ where
+ -- Strip invalid characters.
+ s' = filter (`elem` ['A'..'Z'] ++ ['a'..'z'] ++ ['0'..'9'] ++ "_.") s