X-Git-Url: https://git.stderr.nl/gitweb?a=blobdiff_plain;f=Translator.hs;h=142a8349dd8364021a8fd5d5c971b6123c91bd98;hb=fe0898cdc1f53172c3897354ef6d0b16d24736de;hp=8d69ea2626396094202437afc6c7ca570c123c42;hpb=2f1cf3a17e4d206c01031b3117779e99d21a4dce;p=matthijs%2Fmaster-project%2Fc%CE%BBash.git diff --git a/Translator.hs b/Translator.hs index 8d69ea2..142a834 100644 --- a/Translator.hs +++ b/Translator.hs @@ -10,6 +10,7 @@ import qualified Maybe import qualified Module import qualified Control.Monad.State as State import Name +import qualified Data.Map as Map import Data.Generics import NameEnv ( lookupNameEnv ) import HscTypes ( cm_binds, cm_types ) @@ -53,7 +54,7 @@ main = let binds = Maybe.mapMaybe (findBind (cm_binds core)) ["sfull_adder"] liftIO $ putStr $ prettyShow binds -- Turn bind into VHDL - let (vhdl, sess) = State.runState (mkVHDL binds) (VHDLSession 0 []) + let (vhdl, sess) = State.runState (mkVHDL binds) (VHDLSession core 0 Map.empty) liftIO $ putStr $ render $ ForSyDe.Backend.Ppr.ppr vhdl liftIO $ ForSyDe.Backend.VHDL.FileIO.writeDesignFile vhdl "../vhdl/vhdl/output.vhdl" liftIO $ putStr $ "\n\nFinal session:\n" ++ prettyShow sess ++ "\n\n" @@ -95,7 +96,8 @@ flattenBind bind@(NonRec var expr) = do -- Add it to the session --addFunc hsfunc hwfunc let flatfunc = flattenFunction hsfunc bind - addFunc hsfunc flatfunc + addFunc hsfunc + setFlatFunc hsfunc flatfunc let used_hsfuncs = map appFunc (apps flatfunc) State.mapM resolvFunc used_hsfuncs return () @@ -106,8 +108,24 @@ resolvFunc :: HsFunction -- | The function to look for -> VHDLState () -resolvFunc hsfunc = - return () +resolvFunc hsfunc = do + -- See if the function is already known + func <- getFunc hsfunc + case func of + -- Already known, do nothing + Just _ -> do + return () + -- New function, resolve it + Nothing -> do + -- Get the current module + core <- getModule + -- Find the named function + let bind = findBind (cm_binds core) name + case bind of + Nothing -> error $ "Couldn't find function " ++ name ++ " in current module." + Just b -> flattenBind b + where + name = hsFuncName hsfunc -- | Translate a top level function declaration to a HsFunction. i.e., which -- interface will be provided by this function. This function essentially @@ -152,4 +170,20 @@ splitTupleType ty = Nothing Nothing -> Nothing +-- | A consise representation of a (set of) ports on a builtin function +type PortMap = HsValueMap (String, AST.TypeMark) +{- +-- | 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)) + 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)) + ] +-} -- vim: set ts=8 sw=2 sts=2 expandtab: