X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=Translator.hs;h=78c3a6f08be46eec78cde6662c6e0c73c9ed85c9;hb=a8d7c5bd4b745860f321d4315bff0b9efa3cb05c;hp=142a8349dd8364021a8fd5d5c971b6123c91bd98;hpb=fe0898cdc1f53172c3897354ef6d0b16d24736de;p=matthijs%2Fmaster-project%2Fc%CE%BBash.git diff --git a/Translator.hs b/Translator.hs index 142a834..78c3a6f 100644 --- a/Translator.hs +++ b/Translator.hs @@ -33,8 +33,10 @@ import qualified ForSyDe.Backend.Ppr import Text.PrettyPrint.HughesPJ (render) import TranslatorTypes +import HsValueMap import Pretty import Flatten +import FlattenTypes import qualified VHDL main = @@ -63,12 +65,18 @@ main = -- Turns the given bind into VHDL mkVHDL binds = do -- Add the builtin functions - --mapM (uncurry addFunc) builtin_funcs + mapM addBuiltIn builtin_funcs -- Create entities and architectures for them - mapM flattenBind binds + mapM processBind binds + modFuncs nameFlatFunction + modFuncs VHDL.createEntity + -- Extract the library units generated from all the functions in the + -- session. + funcs <- getFuncs + let units = concat $ map VHDL.getLibraryUnits funcs return $ AST.DesignFile [] - [] + units findBind :: [CoreBind] -> String -> Maybe CoreBind findBind binds lookfor = @@ -80,21 +88,30 @@ findBind binds lookfor = NonRec var _ -> lookfor == (occNameString $ nameOccName $ getName var) ) binds --- | Flattens the given bind and adds it to the session. Then (recursively) --- finds any functions it uses and does the same with them. -flattenBind :: - CoreBind -- The binder to flatten +-- | Processes the given bind as a top level bind. +processBind :: + CoreBind -- The bind to process -> VHDLState () -flattenBind (Rec _) = error "Recursive binders not supported" - -flattenBind bind@(NonRec var expr) = do +processBind (Rec _) = error "Recursive binders not supported" +processBind bind@(NonRec var expr) = do -- Create the function signature let ty = CoreUtils.exprType expr let hsfunc = mkHsFunction var ty - --hwfunc <- mkHWFunction bind hsfunc - -- Add it to the session - --addFunc hsfunc hwfunc + flattenBind hsfunc bind + +-- | Flattens the given bind into the given signature and adds it to the +-- session. Then (recursively) finds any functions it uses and does the same +-- with them. +flattenBind :: + HsFunction -- The signature to flatten into + -> CoreBind -- The bind to flatten + -> VHDLState () + +flattenBind _ (Rec _) = error "Recursive binders not supported" + +flattenBind hsfunc bind@(NonRec var expr) = do + -- Flatten the function let flatfunc = flattenFunction hsfunc bind addFunc hsfunc setFlatFunc hsfunc flatfunc @@ -123,7 +140,7 @@ resolvFunc hsfunc = do let bind = findBind (cm_binds core) name case bind of Nothing -> error $ "Couldn't find function " ++ name ++ " in current module." - Just b -> flattenBind b + Just b -> flattenBind hsfunc b where name = hsFuncName hsfunc @@ -155,6 +172,24 @@ mkHsFunction f ty = error $ "Input state type of function " ++ hsname ++ ": " ++ (showSDoc $ ppr state_ty) ++ " does not match output state type: " ++ (showSDoc $ ppr outstate_ty) otherwise -> error $ "Return type of top-level function " ++ hsname ++ " must be a two-tuple containing a state and output ports." +-- | Adds signal names to the given FlatFunction +nameFlatFunction :: + HsFunction + -> FuncData + -> FuncData + +nameFlatFunction hsfunc fdata = + let func = flatFunc fdata in + case func of + -- Skip (builtin) functions without a FlatFunction + Nothing -> fdata + -- Name the signals in all other functions + Just flatfunc -> + let s = sigs flatfunc in + let s' = map (\(id, (SignalInfo Nothing ty)) -> (id, SignalInfo (Just $ "sig_" ++ (show id)) ty)) s in + let flatfunc' = flatfunc { sigs = s' } in + fdata { flatFunc = Just flatfunc' } + -- | Splits a tuple type into a list of element types, or Nothing if the type -- is not a tuple type. splitTupleType :: @@ -172,18 +207,23 @@ splitTupleType ty = -- | A consise representation of a (set of) ports on a builtin function type PortMap = HsValueMap (String, AST.TypeMark) -{- +-- | A consise representation of a builtin function +data BuiltIn = BuiltIn String [PortMap] PortMap + -- | Translate a concise representation of a builtin function to something -- that can be put into FuncMap directly. -make_builtin :: String -> [PortMap] -> PortMap -> (HsFunction, FuncData) -make_builtin name args res = - (hsfunc, (Nothing)) +addBuiltIn :: BuiltIn -> VHDLState () +addBuiltIn (BuiltIn name args res) = do + addFunc hsfunc where hsfunc = HsFunction name (map useAsPort args) (useAsPort res) builtin_funcs = [ - make_builtin "hwxor" [(Single ("a", VHDL.bit_ty)), (Single ("b", VHDL.bit_ty))] (Single ("o", VHDL.bit_ty)) + BuiltIn "hwxor" [(Single ("a", VHDL.bit_ty)), (Single ("b", VHDL.bit_ty))] (Single ("o", VHDL.bit_ty)), + BuiltIn "hwand" [(Single ("a", VHDL.bit_ty)), (Single ("b", VHDL.bit_ty))] (Single ("o", VHDL.bit_ty)), + BuiltIn "hwor" [(Single ("a", VHDL.bit_ty)), (Single ("b", VHDL.bit_ty))] (Single ("o", VHDL.bit_ty)), + BuiltIn "hwnot" [(Single ("a", VHDL.bit_ty))] (Single ("o", VHDL.bit_ty)) ] --} + -- vim: set ts=8 sw=2 sts=2 expandtab: