Add a Type to a Literal SignalExpr.
authorMatthijs Kooijman <m.kooijman@student.utwente.nl>
Tue, 14 Apr 2009 09:24:34 +0000 (11:24 +0200)
committerMatthijs Kooijman <m.kooijman@student.utwente.nl>
Tue, 14 Apr 2009 09:24:34 +0000 (11:24 +0200)
The Type is still unused, but will be used for making the VHDL backend add
a typecast (since the actual VHDL name for the type is not known
earlier).

Flatten.hs
FlattenTypes.hs
Pretty.hs
VHDL.hs

index e434f2e0862f1d5adffa272298f267d22cb46b5a..30a9bbabe9754911b551c9dad1e5ccc41d1e2401 100644 (file)
@@ -169,7 +169,7 @@ flattenExpr binds var@(Var id) =
           sig_id <- genSignalId SigInternal ty
           -- Add a name hint to the signal
           addNameHint (Name.getOccString id) sig_id
-          addDef (UncondDef (Right $ Literal lit) sig_id)
+          addDef (UncondDef (Right $ Literal lit Nothing) sig_id)
           return ([], Single sig_id)
     IdInfo.VanillaGlobal ->
       -- Treat references to globals as an application with zero elements
@@ -220,7 +220,7 @@ flattenExpr binds app@(App _ _) = do
         let len = sized_word_len ty
         -- TODO: to_stdlogicvector doesn't work here, since SizedWord
         -- translates to a different type...
-        addDef (UncondDef (Right $ Literal $ "to_stdlogicvector(to_unsigned(" ++ (show int) ++ ", " ++ (show len) ++ "))") sig_id)
+        addDef $ UncondDef (Right $ Literal ("to_stdlogicvector(to_unsigned(" ++ (show int) ++ ", " ++ (show len) ++ "))") Nothing) sig_id
         return ([], Single sig_id)
       else
         flattenApplicationExpr binds (CoreUtils.exprType app) f args
index f20fbc30f11f0c9bc8ac0379fa63d3b0d7af3c78..bd6c1d5996cf2a75c6f6b9595444a795684c6e31 100644 (file)
@@ -113,14 +113,18 @@ sigDefUses (FApp _ args _) = concat $ map Foldable.toList args
 -- | An expression on signals
 data SignalExpr = 
   EqLit SignalId String -- ^ Is the given signal equal to the given (VHDL) literal
-  | Literal String -- ^ A literal value
+  | Literal String (Maybe Type.Type)-- ^ A literal value, with an optional type to cast to
   | Eq SignalId SignalId -- ^ A comparison between to signals
   deriving (Show, Eq)
 
+-- Instantiate Eq for Type, so we can derive Eq for SignalExpr.
+instance Eq Type.Type where
+  (==) = Type.coreEqType
+
 -- | Which signals are used by the given SignalExpr?
 sigExprUses :: SignalExpr -> [SignalId]
 sigExprUses (EqLit id _) = [id]
-sigExprUses (Literal _) = []
+sigExprUses (Literal _ _) = []
 sigExprUses (Eq a b) = [a, b]
 
 -- Returns the function used by the given SigDef, if any
index ef92c4dc955aeffe47dfb0877ad1b08f80abbae3..0cc2b59d98ab4f2ab36ae49aa5e812afdc4b3a60 100644 (file)
--- a/Pretty.hs
+++ b/Pretty.hs
@@ -76,8 +76,8 @@ instance Pretty SigDef where
 instance Pretty SignalExpr where
   pPrint (EqLit id lit) =
     parens $ pPrint id <> text " = " <> text lit
-  pPrint (Literal lit) =
-    text lit
+  pPrint (Literal lit ty) =
+    text "(" <> text (show ty) <> text ") " <> text lit
   pPrint (Eq a b) =
     parens $ pPrint a <> text " = " <> pPrint b
 
diff --git a/VHDL.hs b/VHDL.hs
index 67ef0c79dd08327a8938109285e99997f4003d56..08034192bf6ced1d4e813f094c4be9b3cbf3417c 100644 (file)
--- a/VHDL.hs
+++ b/VHDL.hs
@@ -275,7 +275,7 @@ mkConcSm _ sigs (UncondDef src dst) _ =
       case expr of
         (EqLit id lit) ->
           (mkIdExpr sigs id) AST.:=: (AST.PrimLit lit)
-        (Literal lit) ->
+        (Literal lit _) ->
           AST.PrimLit lit
         (Eq a b) ->
           (mkIdExpr sigs a) AST.:=: (mkIdExpr sigs b)