X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=VHDL.hs;h=67ef0c79dd08327a8938109285e99997f4003d56;hb=eb685a2f6743bfea37ef304cad0129e16c2809ee;hp=836f06b38c69def7f7263be62f9db2156722535b;hpb=4d203d3d6a58848bfb2e5be4309e8874bc3a5323;p=matthijs%2Fmaster-project%2Fc%CE%BBash.git diff --git a/VHDL.hs b/VHDL.hs index 836f06b..67ef0c7 100644 --- a/VHDL.hs +++ b/VHDL.hs @@ -33,7 +33,7 @@ import FlattenTypes import TranslatorTypes import HsValueMap import Pretty -import HsTools +import CoreTools createDesignFiles :: FlatFuncMap @@ -50,7 +50,8 @@ createDesignFiles flatfuncmap = ty_decls = Map.elems (final_session ^. vsTypes) ieee_context = [ AST.Library $ mkVHDLBasicId "IEEE", - mkUseAll ["IEEE", "std_logic_1164"] + mkUseAll ["IEEE", "std_logic_1164"], + mkUseAll ["IEEE", "numeric_std"] ] full_context = mkUseAll ["work", "types"] @@ -369,26 +370,25 @@ vhdl_ty ty = do (tycon, args) <- Type.splitTyConApp_maybe ty let name = Name.getOccString (TyCon.tyConName tycon) case name of - "FSVec" -> Just $ mk_fsvec_ty ty args + "FSVec" -> Just $ mk_vector_ty (fsvec_len ty) ty + "SizedWord" -> Just $ mk_vector_ty (sized_word_len ty) ty otherwise -> Nothing -- Return new_ty when a new type was successfully created Maybe.fromMaybe (error $ "Unsupported Haskell type: " ++ (showSDoc $ ppr ty)) new_ty --- | Create a VHDL type belonging to a FSVec Haskell type -mk_fsvec_ty :: - Type.Type -- ^ The Haskell type to create a VHDL type for - -> [Type.Type] -- ^ Type arguments to the FSVec type constructor +-- | Create a VHDL vector type +mk_vector_ty :: + Int -- ^ The length of the vector + -> Type.Type -- ^ The Haskell type to create a VHDL type for -> TypeState AST.TypeMark -- The typemark created. -mk_fsvec_ty ty args = do - -- Assume there are two type arguments - let [len, el_ty] = args - let len_int = eval_type_level_int len - let ty_id = mkVHDLExtId $ "vector_" ++ (show len_int) +mk_vector_ty len ty = do + -- Assume there is a single type argument + let ty_id = mkVHDLExtId $ "vector_" ++ (show len) -- TODO: Use el_ty - let range = AST.IndexConstraint [AST.ToRange (AST.PrimLit "0") (AST.PrimLit $ show (len_int - 1))] + let range = AST.IndexConstraint [AST.ToRange (AST.PrimLit "0") (AST.PrimLit $ show (len - 1))] let ty_def = AST.TDA $ AST.ConsArrayDef range std_logic_ty let ty_dec = AST.TypeDec ty_id ty_def -- TODO: Check name uniqueness