Caching converted tfp integers to speedup translation
authorChristiaan Baaij <christiaan.baaij@gmail.com>
Mon, 6 Jul 2009 14:57:41 +0000 (16:57 +0200)
committerChristiaan Baaij <christiaan.baaij@gmail.com>
Mon, 6 Jul 2009 14:57:41 +0000 (16:57 +0200)
Adders.hs
CoreTools.hs
VHDLTools.hs
VHDLTypes.hs

index 67d7d95e9fa3a7e3c5d693c2bf1980bb24900155..94184b077a66602c8c4b9ded53b6107ebeabc0bd 100644 (file)
--- a/Adders.hs
+++ b/Adders.hs
@@ -176,8 +176,8 @@ highordtest = \x ->
 
 xand a b = hwand a b
 
-functiontest :: TFVec D4 Bit -> TFVec D8 Bit
-functiontest = \v -> let r = v ++ $(vectorTH ([High,Low,High,Low] :: [Bit])) in r
+functiontest :: TFVec D4 (TFVec D3 Bit) -> (TFVec D12 Bit, TFVec D3 Bit)
+functiontest = \v -> let r = (concat v, head v) in r
 
 xhwnot x = hwnot x
 
index 0297f90435c02000cb7b75d0ae0b4ff9833a7484..3569d53b06e98b1c155cee605cd96e626067d69f 100644 (file)
@@ -93,12 +93,14 @@ ranged_word_bound ty =
 
 -- | Get the length of a FSVec type
 tfvec_len :: Type.Type -> Int
-tfvec_len ty =
-  eval_tfp_int len
+tfvec_len ty = eval_tfp_int (tfvec_len_ty ty)
+
+tfvec_len_ty :: Type.Type -> Type.Type
+tfvec_len_ty ty = len
   where  
     args = case Type.splitTyConApp_maybe ty of
       Just (tycon, args) -> args
-      Nothing -> error $ "\nCoreTools.tfvec_len: Not a vector type: " ++ (pprString ty)
+      Nothing -> error $ "\nCoreTools.tfvec_len_ty: Not a vector type: " ++ (pprString ty)
     [len, el_ty] = args
     
 -- | Get the element type of a TFVec type
index 8bc45f79a43490cb3f45c6e0ac3389d58337e085..e4aad6f497a685c1b6d6dbd0e732bb98ac0f456c 100644 (file)
@@ -447,8 +447,9 @@ mkHType ty = do
               elem_htype_either <- mkHType el_ty
               case elem_htype_either of
                 -- Could create element type
-                Right elem_htype ->
-                  return $ Right $ VecType (tfvec_len ty) elem_htype
+                Right elem_htype -> do
+                  len <- vec_len ty
+                  return $ Right $ VecType len elem_htype
                 -- Could not create element type
                 Left err -> return $ Left $ 
                   "VHDLTools.mkHType: Can not construct vectortype for elementtype: " ++ pprString el_ty  ++ "\n"
@@ -487,3 +488,15 @@ isReprType ty = do
   return $ case ty_either of
     Left _ -> False
     Right _ -> True
+
+vec_len :: Type.Type -> TypeSession Int
+vec_len ty = do
+  veclens <- getA vsTfpInts
+  let len_ty = tfvec_len_ty ty
+  let existing_len = Map.lookup (OrdType len_ty) veclens
+  case existing_len of
+    Just len -> return len
+    Nothing -> do
+      let new_len = tfvec_len ty
+      modA vsTfpInts (Map.insert (OrdType len_ty) (new_len))
+      return new_len
\ No newline at end of file
index ff159fa895a6f4c51318eaaf636c2d390e36e2f6..0bc1a5e339ef9cf32aa92554e1c30d12db972ff3 100644 (file)
@@ -54,18 +54,21 @@ type TypeFunMap = Map.Map (OrdType, String) (AST.VHDLId, AST.SubProgBody)
 -- A map of a Haskell function to a hardware signature
 type SignatureMap = Map.Map CoreSyn.CoreBndr Entity
 
+type TfpIntMap = Map.Map OrdType Int
+
 data TypeState = TypeState {
   -- | A map of Core type -> VHDL Type
   vsTypes_      :: TypeMap,
   -- | A list of type declarations
   vsTypeDecls_  :: [AST.PackageDecItem],
   -- | A map of vector Core type -> VHDL type function
-  vsTypeFuns_   :: TypeFunMap
+  vsTypeFuns_   :: TypeFunMap,
+  vsTfpInts_    :: TfpIntMap
 }
 -- Derive accessors
 $( Data.Accessor.Template.deriveAccessors ''TypeState )
 -- Define an empty TypeState
-emptyTypeState = TypeState Map.empty [] Map.empty
+emptyTypeState = TypeState Map.empty [] Map.empty Map.empty
 -- Define a session
 type TypeSession = State.State TypeState