Added unzip
authorChristiaan Baaij <christiaan.baaij@gmail.com>
Mon, 29 Jun 2009 09:02:31 +0000 (11:02 +0200)
committerChristiaan Baaij <christiaan.baaij@gmail.com>
Mon, 29 Jun 2009 09:02:31 +0000 (11:02 +0200)
Added typenames to typlerecordname to make unique id's

Adders.hs
Constants.hs
Generate.hs
VHDLTools.hs

index b17f744c0fbea1548e70cc341add975c9d99f089..57823bd5009d935bb0c41c9fb2873f75d803f706 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 D4 Bit -> TFVec D4 (Bit, Bit)
-functiontest = \v1 v2 -> let r = zip v1 v2 in r
+functiontest :: TFVec D4 (Bit, Bit) -> (TFVec D4 Bit, TFVec D4 Bit)
+functiontest = \v -> let r = unzip v in r
 
 xhwnot x = hwnot x
 
index 60aba4e9303cf3da356d02e490d1e2fb8d8d272c..c5382933485f574e98e69d7d25fca58976da3956 100644 (file)
@@ -177,6 +177,10 @@ foldrId = "foldr"
 zipId :: String
 zipId = "zip"
 
+-- | unzip function identifier
+unzipId :: String
+unzipId = "unzip"
+
 -- | hwxor function identifier
 hwxorId :: String
 hwxorId = "hwxor"
index 691a27d06e39f9a3080954c9117ab7972e50fe4a..7c274e5752cf15b7851b03e4432301aebe25bda7 100644 (file)
@@ -247,6 +247,34 @@ genZip' (Left res) f args@[arg1, arg2] =
     let resB_assign = mkUncondAssign (Right resnameB) argexpr2
     -- Return the generate functions
     return [AST.CSGSm $ AST.GenerateSm label genScheme [] [resA_assign,resB_assign]]
+    
+-- | Generate a generate statement for the builtin function "unzip"
+genUnzip :: BuiltinBuilder
+genUnzip = genVarArgs genUnzip'
+genUnzip' :: (Either CoreSyn.CoreBndr AST.VHDLName) -> CoreSyn.CoreBndr -> [Var.Var] -> VHDLSession [AST.ConcSm]
+genUnzip' (Left res) f args@[arg] =
+  let
+    -- Setup the generate scheme
+    len             = (tfvec_len . Var.varType) arg
+    -- TODO: Use something better than varToString
+    label           = mkVHDLExtId ("unzipVector" ++ (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'        = varToVHDLName res
+    argexpr'        = mkIndexedName (varToVHDLName arg) n_expr
+  in do
+    reslabels <- getFieldLabels (Var.varType res)
+    arglabels <- getFieldLabels (tfvec_elem (Var.varType arg))
+    let resnameA    = mkIndexedName (mkSelectedName resname' (reslabels!!0)) n_expr
+    let resnameB    = mkIndexedName (mkSelectedName resname' (reslabels!!1)) n_expr
+    let argexprA    = vhdlNameToVHDLExpr $ mkSelectedName argexpr' (arglabels!!0)
+    let argexprB    = vhdlNameToVHDLExpr $ mkSelectedName argexpr' (arglabels!!1)
+    let resA_assign = mkUncondAssign (Right resnameA) argexprA
+    let resB_assign = mkUncondAssign (Right resnameB) argexprB
+    -- Return the generate functions
+    return [AST.CSGSm $ AST.GenerateSm label genScheme [] [resA_assign,resB_assign]]
 
 -----------------------------------------------------------------------------
 -- Function to generate VHDL for applications
@@ -605,6 +633,7 @@ globalNameTable = Map.fromList
   , (foldlId          , (3, genFoldl                ) )
   , (foldrId          , (3, genFoldr                ) )
   , (zipId            , (2, genZip                  ) )
+  , (unzipId          , (1, genUnzip                ) )
   , (emptyId          , (0, genFCall                ) )
   , (singletonId      , (1, genFCall                ) )
   , (copyId           , (2, genFCall                ) )
index 96a8ae50b28afd8e69434f8d6cc2cfe0a72317f2..09796399b8e24576435e0155a6621cacba35f559 100644 (file)
@@ -322,7 +322,8 @@ mk_tycon_ty tycon args =
       -- each argument.
       -- TODO: Add argument type ids to this, to ensure uniqueness
       -- TODO: Special handling for tuples?
-      let ty_id = mkVHDLExtId $ nameToString (TyCon.tyConName tycon)
+      let elem_names = concat $ map prettyShow elem_tys
+      let ty_id = mkVHDLExtId $ nameToString (TyCon.tyConName tycon) ++ elem_names
       let ty_def = AST.TDR $ AST.RecordTypeDef elems
       return $ Just (ty_id, Left ty_def)
     dcs -> error $ "Only single constructor datatypes supported: " ++ pprString tycon