Added "zip" function
authorChristiaan Baaij <christiaan.baaij@gmail.com>
Mon, 29 Jun 2009 08:11:48 +0000 (10:11 +0200)
committerChristiaan Baaij <christiaan.baaij@gmail.com>
Mon, 29 Jun 2009 08:11:48 +0000 (10:11 +0200)
Adders.hs
Constants.hs
Generate.hs

index 408e6b89c43e93cf291f460f0bafd154942eed45..b17f744c0fbea1548e70cc341add975c9d99f089 100644 (file)
--- a/Adders.hs
+++ b/Adders.hs
@@ -174,8 +174,8 @@ highordtest = \x ->
 
 xand a b = hwand a b
 
-functiontest :: TFVec D4 Bit -> TFVec D2 Bit
-functiontest = \v -> let r = select d0 d1 d2 v in r
+functiontest :: TFVec D4 Bit -> TFVec D4 Bit -> TFVec D4 (Bit, Bit)
+functiontest = \v1 v2 -> let r = zip v1 v2 in r
 
 xhwnot x = hwnot x
 
index 380a7451449b919a1db3cd0bd1473f4a6366782c..60aba4e9303cf3da356d02e490d1e2fb8d8d272c 100644 (file)
@@ -165,12 +165,18 @@ mapId = "map"
 zipWithId :: String
 zipWithId = "zipWith"
 
+-- | foldl function identifier
 foldlId :: String
 foldlId = "foldl"
 
+-- | foldr function identifier
 foldrId :: String
 foldrId = "foldr"
 
+-- | zip function identifier
+zipId :: String
+zipId = "zip"
+
 -- | hwxor function identifier
 hwxorId :: String
 hwxorId = "hwxor"
index 75ee1d3d22a45e2c59d89c6530c841e63724f060..691a27d06e39f9a3080954c9117ab7972e50fe4a 100644 (file)
@@ -222,6 +222,32 @@ genFold' left (Left res) f [folded_f, start, vec] = do
       -- Return the conditional generate part
       return $ AST.GenerateSm cond_label cond_scheme [] app_concsms
 
+-- | Generate a generate statement for the builtin function "zip"
+genZip :: BuiltinBuilder
+genZip = genVarArgs genZip'
+genZip' :: (Either CoreSyn.CoreBndr AST.VHDLName) -> CoreSyn.CoreBndr -> [Var.Var] -> VHDLSession [AST.ConcSm]
+genZip' (Left res) f args@[arg1, arg2] =
+  let
+    -- Setup the generate scheme
+    len             = (tfvec_len . Var.varType) res
+    -- TODO: Use something better than varToString
+    label           = mkVHDLExtId ("zipVector" ++ (varToString res))
+    n_id            = mkVHDLBasicId "n"
+    n_expr          = idToVHDLExpr n_id
+    range           = AST.ToRange (AST.PrimLit "0") (AST.PrimLit $ show (len-1))
+    genScheme       = AST.ForGn n_id range
+    resname'        = mkIndexedName (varToVHDLName res) n_expr
+    argexpr1        = vhdlNameToVHDLExpr $ mkIndexedName (varToVHDLName arg1) n_expr
+    argexpr2        = vhdlNameToVHDLExpr $ mkIndexedName (varToVHDLName arg2) n_expr
+  in do
+    labels <- getFieldLabels (tfvec_elem (Var.varType res))
+    let resnameA    = mkSelectedName resname' (labels!!0)
+    let resnameB    = mkSelectedName resname' (labels!!1)
+    let resA_assign = mkUncondAssign (Right resnameA) argexpr1
+    let resB_assign = mkUncondAssign (Right resnameB) argexpr2
+    -- Return the generate functions
+    return [AST.CSGSm $ AST.GenerateSm label genScheme [] [resA_assign,resB_assign]]
+
 -----------------------------------------------------------------------------
 -- Function to generate VHDL for applications
 -----------------------------------------------------------------------------
@@ -578,6 +604,7 @@ globalNameTable = Map.fromList
   , (zipWithId        , (3, genZipWith              ) )
   , (foldlId          , (3, genFoldl                ) )
   , (foldrId          , (3, genFoldr                ) )
+  , (zipId            , (2, genZip                  ) )
   , (emptyId          , (0, genFCall                ) )
   , (singletonId      , (1, genFCall                ) )
   , (copyId           , (2, genFCall                ) )