Moved to new GHC API (6.11). Also use vhdl package for the VHDL AST
authorChristiaan Baaij <christiaan.baaij@gmail.com>
Wed, 15 Jul 2009 15:41:13 +0000 (17:41 +0200)
committerChristiaan Baaij <christiaan.baaij@gmail.com>
Wed, 15 Jul 2009 15:41:13 +0000 (17:41 +0200)
12 files changed:
Constants.hs
CoreShow.hs
Generate.hs
Normalize.hs
NormalizeTools.hs
Pretty.hs
Translator.hs
TranslatorTypes.hs
VHDL.hs
VHDLTools.hs
VHDLTypes.hs
cλash.cabal

index ad87e0a02979645ea1c80ad6789525932c912b10..e9c4a4a2d6efc87c73f897db8910691606972727 100644 (file)
@@ -1,6 +1,6 @@
 module Constants where
   
-import qualified ForSyDe.Backend.VHDL.AST as AST
+import qualified Language.VHDL.AST as AST
 
 --------------
 -- Identifiers
index 75bacefe3b278f493177007e13dbb6c64209ef05..09abed667003cdcbca4493245ed7f3ba9ae81019 100644 (file)
@@ -24,6 +24,7 @@ deriving instance (Show b) => Show (CoreSyn.Expr b)
 deriving instance (Show b) => Show (CoreSyn.Bind b)
 deriving instance Show TypeRep.Type
 deriving instance (Show n, OutputableBndr n) => Show (HsTypes.HsType n)
+deriving instance (Show n, OutputableBndr n) => Show (HsTypes.ConDeclField n)
 deriving instance (Show x) => Show (SrcLoc.Located x)
 deriving instance (Show x, OutputableBndr x) => Show (HsExpr.StmtLR x x)
 deriving instance (Show x, OutputableBndr x) => Show (HsExpr.HsExpr x)
index f4cab36460d4f1b1b9e39ce5dc8819a582c68102..8dc7a0aaaef50b0dacc7bc0be63df0f0d5a28013 100644 (file)
@@ -14,7 +14,7 @@ import Data.Accessor.MonadState as MonadState
 import Debug.Trace
 
 -- ForSyDe
-import qualified ForSyDe.Backend.VHDL.AST as AST
+import qualified Language.VHDL.AST as AST
 
 -- GHC API
 import CoreSyn
@@ -511,34 +511,8 @@ genApplication ::
   -> [Either CoreSyn.CoreExpr AST.Expr] -- ^ The arguments to apply
   -> VHDLSession [AST.ConcSm] -- ^ The resulting concurrent statements
 genApplication dst f args = do
-  case Var.globalIdVarDetails f of
-    IdInfo.DataConWorkId dc -> case dst of
-      -- It's a datacon. Create a record from its arguments.
-      Left bndr -> do
-        -- We have the bndr, so we can get at the type
-        labels <- MonadState.lift vsType $ getFieldLabels (Var.varType bndr)
-        args' <- eitherCoreOrExprArgs args
-        return $ zipWith mkassign labels $ args'
-        where
-          mkassign :: AST.VHDLId -> AST.Expr -> AST.ConcSm
-          mkassign label arg =
-            let sel_name = mkSelectedName ((either varToVHDLName id) dst) label in
-            mkUncondAssign (Right sel_name) arg
-      Right _ -> error $ "\nGenerate.genApplication: Can't generate dataconstructor application without an original binder"
-    IdInfo.VanillaGlobal -> do
-      -- It's a global value imported from elsewhere. These can be builtin
-      -- functions. Look up the function name in the name table and execute
-      -- the associated builder if there is any and the argument count matches
-      -- (this should always be the case if it typechecks, but just to be
-      -- sure...).
-      case (Map.lookup (varToString f) globalNameTable) of
-        Just (arg_count, builder) ->
-          if length args == arg_count then
-            builder dst f args
-          else
-            error $ "\nGenerate.genApplication(VanillaGlobal): Incorrect number of arguments to builtin function: " ++ pprString f ++ " Args: " ++ show args
-        Nothing -> error $ "\nGenerate.genApplication(VanillaGlobal): Using function from another module that is not a known builtin: " ++ pprString f
-    IdInfo.NotGlobalId -> do
+  case Var.isGlobalId f of
+    False -> do
       signatures <- getA vsSignatures
       -- This is a local id, so it should be a function whose definition we
       -- have and which can be turned into a component instantiation.
@@ -560,18 +534,45 @@ genApplication dst f args = do
           -- unconditional assignment here.
           f' <- MonadState.lift vsType $ varToVHDLExpr f
           return $ [mkUncondAssign dst f']
-            
-    IdInfo.ClassOpId cls -> do
-      -- FIXME: Not looking for what instance this class op is called for
-      -- Is quite stupid of course.
-      case (Map.lookup (varToString f) globalNameTable) of
-        Just (arg_count, builder) ->
-          if length args == arg_count then
-            builder dst f args
-          else
-            error $ "\nGenerate.genApplication(ClassOpId): Incorrect number of arguments to builtin function: " ++ pprString f ++ " Args: " ++ show args
-        Nothing -> error $ "\nGenerate.genApplication(ClassOpId): Using function from another module that is not a known builtin: " ++ pprString f
-    details -> error $ "\nGenerate.genApplication: Calling unsupported function " ++ pprString f ++ " with GlobalIdDetails " ++ pprString details
+    True ->
+      case Var.idDetails f of
+        IdInfo.DataConWorkId dc -> case dst of
+          -- It's a datacon. Create a record from its arguments.
+          Left bndr -> do
+            -- We have the bndr, so we can get at the type
+            labels <- MonadState.lift vsType $ getFieldLabels (Var.varType bndr)
+            args' <- eitherCoreOrExprArgs args
+            return $ zipWith mkassign labels $ args'
+            where
+              mkassign :: AST.VHDLId -> AST.Expr -> AST.ConcSm
+              mkassign label arg =
+                let sel_name = mkSelectedName ((either varToVHDLName id) dst) label in
+                mkUncondAssign (Right sel_name) arg
+          Right _ -> error $ "\nGenerate.genApplication: Can't generate dataconstructor application without an original binder"
+        IdInfo.VanillaId -> do
+          -- It's a global value imported from elsewhere. These can be builtin
+          -- functions. Look up the function name in the name table and execute
+          -- the associated builder if there is any and the argument count matches
+          -- (this should always be the case if it typechecks, but just to be
+          -- sure...).
+          case (Map.lookup (varToString f) globalNameTable) of
+            Just (arg_count, builder) ->
+              if length args == arg_count then
+                builder dst f args
+              else
+                error $ "\nGenerate.genApplication(VanillaGlobal): Incorrect number of arguments to builtin function: " ++ pprString f ++ " Args: " ++ show args
+            Nothing -> error $ "\nGenerate.genApplication(VanillaGlobal): Using function from another module that is not a known builtin: " ++ pprString f
+        IdInfo.ClassOpId cls -> do
+          -- FIXME: Not looking for what instance this class op is called for
+          -- Is quite stupid of course.
+          case (Map.lookup (varToString f) globalNameTable) of
+            Just (arg_count, builder) ->
+              if length args == arg_count then
+                builder dst f args
+              else
+                error $ "\nGenerate.genApplication(ClassOpId): Incorrect number of arguments to builtin function: " ++ pprString f ++ " Args: " ++ show args
+            Nothing -> error $ "\nGenerate.genApplication(ClassOpId): Using function from another module that is not a known builtin: " ++ pprString f
+        details -> error $ "\nGenerate.genApplication: Calling unsupported function " ++ pprString f ++ " with GlobalIdDetails " ++ pprString details
 
 -----------------------------------------------------------------------------
 -- Functions to generate functions dealing with vectors.
index 3f9389a8658470776c04f123f679040c1068157f..12356e23c7b9af33a6a0c8989fa31efc27172ab6 100644 (file)
@@ -205,7 +205,7 @@ casewild expr@(Case scrut b ty alts) = do
   if null bindings || length alts == 1 && length bindings == 1 then return expr else change newlet 
   where
   -- Generate a single wild binder, since they are all the same
-  wild = Id.mkWildId
+  wild = MkCore.mkWildBinder
   -- Wilden the binders of one alt, producing a list of bindings as a
   -- sideeffect.
   doalt :: CoreAlt -> TransformMonad ([(CoreBndr, CoreExpr)], CoreAlt)
@@ -219,7 +219,7 @@ casewild expr@(Case scrut b ty alts) = do
     return (bindings, newalt)
     where
       -- Make all binders wild
-      wildbndrs = map (\bndr -> Id.mkWildId (Id.idType bndr)) bndrs
+      wildbndrs = map (\bndr -> MkCore.mkWildBinder (Id.idType bndr)) bndrs
       -- A set of all the binders that are used by the expression
       free_vars = CoreFVs.exprSomeFreeVars (`elem` bndrs) expr
       -- Creates a case statement to retrieve the ith element from the scrutinee
@@ -488,7 +488,7 @@ normalizeBind :: CoreBndr -> TransformSession ()
 normalizeBind bndr =
   -- Don't normalize global variables, these should be either builtin
   -- functions or data constructors.
-  Monad.when (Var.isLocalIdVar bndr) $ do
+  Monad.when (Var.isLocalId bndr) $ do
     -- Skip binders that have a polymorphic type, since it's impossible to
     -- create polymorphic hardware.
     if is_poly (Var bndr)
index 1290fd85bd8b19d7aa93a90f59b81c779061c796..920d28bdcefa171f8bfa3437f727fa3df25f5dbf 100644 (file)
@@ -48,7 +48,7 @@ mkInternalVar str ty = do
   uniq <- mkUnique
   let occname = OccName.mkVarOcc (str ++ show uniq)
   let name = Name.mkInternalName uniq occname SrcLoc.noSrcSpan
-  return $ Var.mkLocalIdVar name ty IdInfo.vanillaIdInfo
+  return $ Var.mkLocalVar IdInfo.VanillaId name ty IdInfo.vanillaIdInfo
 
 -- Create a new type variable with the given name and kind. A Unique is
 -- appended to the given name, to ensure uniqueness (not strictly neccesary,
@@ -79,7 +79,7 @@ cloneVar v = do
   uniq <- mkUnique
   -- Swap out the unique, and reset the IdInfo (I'm not 100% sure what it
   -- contains, but vannillaIdInfo is always correct, since it means "no info").
-  return $ Var.lazySetVarIdInfo (Var.setVarUnique v uniq) IdInfo.vanillaIdInfo
+  return $ Var.lazySetIdInfo (Var.setVarUnique v uniq) IdInfo.vanillaIdInfo
 
 -- Creates a new function with the same name as the given binder (but with a
 -- new unique) and with the given function body. Returns the new binder for
index 927749493ae7231d4a9bc6e8017ecae9d1a11190..d88846a1f2600e30cc8f9fa6efdf6cb31446f382 100644 (file)
--- a/Pretty.hs
+++ b/Pretty.hs
@@ -11,9 +11,9 @@ import qualified HscTypes
 import Text.PrettyPrint.HughesPJClass
 import Outputable ( showSDoc, showSDocDebug, ppr, Outputable, OutputableBndr)
 
-import qualified ForSyDe.Backend.Ppr
-import qualified ForSyDe.Backend.VHDL.Ppr
-import qualified ForSyDe.Backend.VHDL.AST as AST
+import qualified Language.VHDL.Ppr as Ppr
+import qualified Language.VHDL.AST as AST
+import qualified Language.VHDL.AST.Ppr
 
 import HsValueMap
 import FlattenTypes
@@ -136,10 +136,10 @@ instance (OutputableBndr b, Show b) => Pretty (CoreSyn.Expr b) where
   pPrint = text . show
 
 instance Pretty AST.VHDLId where
-  pPrint id = ForSyDe.Backend.Ppr.ppr id
+  pPrint id = Ppr.ppr id
   
 instance Pretty AST.VHDLName where
-  pPrint name = ForSyDe.Backend.Ppr.ppr name
+  pPrint name = Ppr.ppr name
 
 prettyBind :: (Show b, Show e) => (b, e) -> Doc
 prettyBind (b, expr) =
index feb712ba7dbf3bd96c9a652e0ec6f976f54fb20f..260b1cdf5061a5e57b0553ed1ffebd0e1c7e9217 100644 (file)
@@ -37,10 +37,9 @@ import qualified Monad
 -- The following modules come from the ForSyDe project. They are really
 -- internal modules, so ForSyDe.cabal has to be modified prior to installing
 -- ForSyDe to get access to these modules.
-import qualified ForSyDe.Backend.VHDL.AST as AST
-import qualified ForSyDe.Backend.VHDL.Ppr
-import qualified ForSyDe.Backend.VHDL.FileIO
-import qualified ForSyDe.Backend.Ppr
+import qualified Language.VHDL.AST as AST
+import qualified Language.VHDL.FileIO
+import qualified Language.VHDL.Ppr as Ppr
 -- This is needed for rendering the pretty printed VHDL
 import Text.PrettyPrint.HughesPJ (render)
 
@@ -113,7 +112,7 @@ moduleToVHDL env core list = do
   let all_bindings = (CoreSyn.flattenBinds $ cm_binds core)
   let (normalized_bindings, typestate) = normalizeModule env uniqSupply all_bindings binds statefuls
   let vhdl = VHDL.createDesignFiles typestate normalized_bindings
-  mapM (putStr . render . ForSyDe.Backend.Ppr.ppr . snd) vhdl
+  mapM (putStr . render . Ppr.ppr . snd) vhdl
   --putStr $ "\n\nFinal session:\n" ++ prettyShow sess ++ "\n\n"
   return vhdl
   where
@@ -140,7 +139,7 @@ writeVHDL dir (name, vhdl) = do
   -- Find the filename
   let fname = dir ++ (AST.fromVHDLId name) ++ ".vhdl"
   -- Write the file
-  ForSyDe.Backend.VHDL.FileIO.writeDesignFile vhdl fname
+  Language.VHDL.FileIO.writeDesignFile vhdl fname
 
 -- | Loads the given file and turns it into a core module.
 loadModule :: String -> IO (HscTypes.CoreModule, HscTypes.HscEnv)
index 37e86190a63f36b1b38acf1c75b193cda7fbdb44..1286a41bd55d6846c23074362b8633ecd0cba53c 100644 (file)
@@ -12,7 +12,7 @@ import Data.Accessor
 
 import qualified HscTypes
 
-import qualified ForSyDe.Backend.VHDL.AST as AST
+import qualified Language.VHDL.AST as AST
 
 import FlattenTypes
 import VHDLTypes
diff --git a/VHDL.hs b/VHDL.hs
index 03859095b8f8fb4158f4d8965b536b354ad46a22..1a8f39420e08267fde679ff6bff257d9a545e810 100644 (file)
--- a/VHDL.hs
+++ b/VHDL.hs
@@ -16,7 +16,7 @@ import Data.Accessor.MonadState as MonadState
 import Debug.Trace
 
 -- ForSyDe
-import qualified ForSyDe.Backend.VHDL.AST as AST
+import qualified Language.VHDL.AST as AST
 
 -- GHC API
 import CoreSyn
index 2d36049d1f3572d9eca43e3e05d45dfe41e7547c..6e6a0c42acefa29ba26750443580f98aefdae18a 100644 (file)
@@ -13,7 +13,7 @@ import Data.Accessor
 import Debug.Trace
 
 -- ForSyDe
-import qualified ForSyDe.Backend.VHDL.AST as AST
+import qualified Language.VHDL.AST as AST
 
 -- GHC API
 import CoreSyn
index 5562c6a7a0db0fc6cf9eb10654ce88f36fc7a343..87120436510620829be57115f5f52ff15933114c 100644 (file)
@@ -16,7 +16,7 @@ import qualified CoreSyn
 import qualified HscTypes
 
 -- ForSyDe imports
-import qualified ForSyDe.Backend.VHDL.AST as AST
+import qualified Language.VHDL.AST as AST
 
 -- Local imports
 
index 479695692000b85f167f0d24e91e2fa57ad3d95c..3eb5dca8a97ff23e4abd91446e76196e23f807a9 100644 (file)
@@ -2,7 +2,11 @@ name:                clash
 version:             0.1
 build-type:          Simple
 synopsis:            CAES Languege for Hardware Descriptions (CλasH)
-description:         CλasH is a toolchain/language to translate subsets of Haskell to synthesizable VHDL. It does this by translating the intermediate System Fc (GHC Core) representation to a VHDL AST, which is then written to file.
+description:         CλasH is a toolchain/language to translate subsets of 
+                     Haskell to synthesizable VHDL. It does this by 
+                     translating the intermediate System Fc (GHC Core) 
+                     representation to a VHDL AST, which is then written to 
+                     file.
 category:            Development
 license:             BSD3
 license-file:        LICENSE
@@ -11,11 +15,10 @@ copyright:           Copyright (c) 2009 Christiaan Baaij & Matthijs Kooijman
 author:              Christiaan Baaij & Matthijs Kooijman
 stability:           alpha
 maintainer:          christiaan.baaij@gmail.com & matthijs@stdin.nl
-build-depends:       base > 4, syb, ghc, ghc-paths, transformers, haskell98,
-                     ForSyDe > 3.0, regex-posix ,data-accessor-template, pretty,
-                     data-accessor, containers, prettyclass, tfp > 0.3.2, 
-                     tfvec > 0.1.2, QuickCheck, template-haskell, filepath
+build-depends:       ghc >= 6.11, vhdl, data-accessor-template, data-accessor, 
+                     containers, transformers, base >= 4, haskell98,
+                     prettyclass, ghc-paths, pretty, syb, filepath,
+                     th-lift-ng, tfp > 0.3.2, tfvec > 0.1.2
 
 executable:          clash
-main-is:             Main.hs     
-ghc-options:         
+main-is:             Main.hs