X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=VHDL.hs;h=8ae351611a6201dfd8a6c7dc7119d916e3961616;hb=8f26d216ad75c8e6cb017ae8b0f5e6f1cd62f505;hp=263bae867f85138f3d77fc72e1bbd31972903c3b;hpb=95cb86c5668260154a766c5aac6b04ebe2992f46;p=matthijs%2Fmaster-project%2Fc%CE%BBash.git diff --git a/VHDL.hs b/VHDL.hs index 263bae8..8ae3516 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"] @@ -370,6 +371,7 @@ vhdl_ty ty = do let name = Name.getOccString (TyCon.tyConName tycon) case name of "FSVec" -> Just $ mk_fsvec_ty ty args + "SizedWord" -> Just $ mk_vector_ty (sized_word_len ty) ty otherwise -> Nothing -- Return new_ty when a new type was successfully created Maybe.fromMaybe @@ -395,6 +397,23 @@ mk_fsvec_ty ty args = do State.modify (Map.insert (OrdType ty) (ty_id, ty_dec)) return ty_id +-- | 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_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 - 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 + State.modify (Map.insert (OrdType ty) (ty_id, ty_dec)) + return ty_id + builtin_types = Map.fromList [ @@ -444,7 +463,7 @@ data BuiltIn = BuiltIn String [PortMap] PortMap mkBuiltins :: [BuiltIn] -> SignatureMap mkBuiltins = Map.fromList . map (\(BuiltIn name args res) -> (HsFunction name (map useAsPort args) (useAsPort res), - Entity (VHDL.mkVHDLExtId name) (map toVHDLSignalMap args) (toVHDLSignalMap res)) + Entity (VHDL.mkVHDLBasicId name) (map toVHDLSignalMap args) (toVHDLSignalMap res)) ) builtin_hsfuncs = Map.keys builtin_funcs @@ -459,4 +478,4 @@ builtin_funcs = mkBuiltins -- | Map a port specification of a builtin function to a VHDL Signal to put in -- a VHDLSignalMap toVHDLSignalMap :: HsValueMap (String, AST.TypeMark) -> VHDLSignalMap -toVHDLSignalMap = fmap (\(name, ty) -> Just (mkVHDLExtId name, ty)) +toVHDLSignalMap = fmap (\(name, ty) -> Just (mkVHDLBasicId name, ty))