Commit 8a67a911 by Zachary Snow

added language support for (untagged) unions

parent ae239f16
...@@ -785,6 +785,10 @@ traverseTypesM mapper item = ...@@ -785,6 +785,10 @@ traverseTypesM mapper item =
types <- mapM fullMapper $ map fst fields types <- mapM fullMapper $ map fst fields
let idents = map snd fields let idents = map snd fields
return $ Struct p (zip types idents) r return $ Struct p (zip types idents) r
tm (Union p fields r) = do
types <- mapM fullMapper $ map fst fields
let idents = map snd fields
return $ Union p (zip types idents) r
exprMapper (Cast (Left t) e) = exprMapper (Cast (Left t) e) =
fullMapper t >>= \t' -> return $ Cast (Left t') e fullMapper t >>= \t' -> return $ Cast (Left t') e
exprMapper (Bits (Left t)) = exprMapper (Bits (Left t)) =
......
...@@ -54,6 +54,9 @@ convertDescription globalTypes description = ...@@ -54,6 +54,9 @@ convertDescription globalTypes description =
else Bits $ Right $ Ident x else Bits $ Right $ Ident x
convertExpr other = other convertExpr other = other
resolveItem :: Types -> (Type, Identifier) -> (Type, Identifier)
resolveItem types (t, x) = (resolveType types t, x)
resolveType :: Types -> Type -> Type resolveType :: Types -> Type -> Type
resolveType _ (Net kw rs) = Net kw rs resolveType _ (Net kw rs) = Net kw rs
resolveType _ (Implicit sg rs) = Implicit sg rs resolveType _ (Implicit sg rs) = Implicit sg rs
...@@ -64,10 +67,8 @@ resolveType _ (InterfaceT x my rs) = InterfaceT x my rs ...@@ -64,10 +67,8 @@ resolveType _ (InterfaceT x my rs) = InterfaceT x my rs
resolveType _ (Enum Nothing vals rs) = Enum Nothing vals rs resolveType _ (Enum Nothing vals rs) = Enum Nothing vals rs
resolveType _ (Alias (Just ps) st rs) = Alias (Just ps) st rs resolveType _ (Alias (Just ps) st rs) = Alias (Just ps) st rs
resolveType types (Enum (Just t) vals rs) = Enum (Just $ resolveType types t) vals rs resolveType types (Enum (Just t) vals rs) = Enum (Just $ resolveType types t) vals rs
resolveType types (Struct p items rs) = Struct p items' rs resolveType types (Struct p items rs) = Struct p (map (resolveItem types) items) rs
where resolveType types (Union p items rs) = Union p (map (resolveItem types) items) rs
items' = map resolveItem items
resolveItem (t, x) = (resolveType types t, x)
resolveType types (Alias Nothing st rs1) = resolveType types (Alias Nothing st rs1) =
if Map.notMember st types if Map.notMember st types
then InterfaceT st Nothing rs1 then InterfaceT st Nothing rs1
...@@ -77,6 +78,7 @@ resolveType types (Alias Nothing st rs1) = ...@@ -77,6 +78,7 @@ resolveType types (Alias Nothing st rs1) =
(IntegerVector kw sg rs2) -> IntegerVector kw sg $ rs1 ++ rs2 (IntegerVector kw sg rs2) -> IntegerVector kw sg $ rs1 ++ rs2
(Enum t v rs2) -> Enum t v $ rs1 ++ rs2 (Enum t v rs2) -> Enum t v $ rs1 ++ rs2
(Struct p l rs2) -> Struct p l $ rs1 ++ rs2 (Struct p l rs2) -> Struct p l $ rs1 ++ rs2
(Union p l rs2) -> Union p l $ rs1 ++ rs2
(InterfaceT x my rs2) -> InterfaceT x my $ rs1 ++ rs2 (InterfaceT x my rs2) -> InterfaceT x my $ rs1 ++ rs2
(IntegerAtom kw _ ) -> error $ "resolveType encountered packed `" ++ (show kw) ++ "` on " ++ st (IntegerAtom kw _ ) -> error $ "resolveType encountered packed `" ++ (show kw) ++ "` on " ++ st
(NonInteger kw ) -> error $ "resolveType encountered packed `" ++ (show kw) ++ "` on " ++ st (NonInteger kw ) -> error $ "resolveType encountered packed `" ++ (show kw) ++ "` on " ++ st
......
...@@ -37,6 +37,7 @@ data Type ...@@ -37,6 +37,7 @@ data Type
| Alias (Maybe Identifier) Identifier [Range] | Alias (Maybe Identifier) Identifier [Range]
| Enum (Maybe Type) [Item] [Range] | Enum (Maybe Type) [Item] [Range]
| Struct Packing [Field] [Range] | Struct Packing [Field] [Range]
| Union Packing [Field] [Range]
| InterfaceT Identifier (Maybe Identifier) [Range] | InterfaceT Identifier (Maybe Identifier) [Range]
deriving (Eq, Ord) deriving (Eq, Ord)
...@@ -54,7 +55,11 @@ instance Show Type where ...@@ -54,7 +55,11 @@ instance Show Type where
tStr = maybe "" showPad mt tStr = maybe "" showPad mt
showVal :: (Identifier, Maybe Expr) -> String showVal :: (Identifier, Maybe Expr) -> String
showVal (x, e) = x ++ (showAssignment e) showVal (x, e) = x ++ (showAssignment e)
show (Struct p items r) = printf "struct %s{\n%s\n}%s" (showPad p) itemsStr (showRanges r) show (Struct p items r) = printf "struct %s{\n%s\n}%s" (showPad p) (showFields items) (showRanges r)
show (Union p items r) = printf "union %s{\n%s\n}%s" (showPad p) (showFields items) (showRanges r)
showFields :: [Field] -> String
showFields items = itemsStr
where where
itemsStr = indent $ unlines' $ map showItem items itemsStr = indent $ unlines' $ map showItem items
showItem (t, x) = printf "%s %s;" (show t) x showItem (t, x) = printf "%s %s;" (show t) x
...@@ -82,6 +87,7 @@ typeRanges (IntegerAtom kw sg ) = (\[] -> IntegerAtom kw sg, []) ...@@ -82,6 +87,7 @@ typeRanges (IntegerAtom kw sg ) = (\[] -> IntegerAtom kw sg, [])
typeRanges (NonInteger kw ) = (\[] -> NonInteger kw , []) typeRanges (NonInteger kw ) = (\[] -> NonInteger kw , [])
typeRanges (Enum t v r) = (Enum t v, r) typeRanges (Enum t v r) = (Enum t v, r)
typeRanges (Struct p l r) = (Struct p l, r) typeRanges (Struct p l r) = (Struct p l, r)
typeRanges (Union p l r) = (Union p l, r)
typeRanges (InterfaceT x my r) = (InterfaceT x my, r) typeRanges (InterfaceT x my r) = (InterfaceT x my, r)
data Signing data Signing
......
...@@ -197,6 +197,7 @@ tokens :- ...@@ -197,6 +197,7 @@ tokens :-
"trior" { tok KW_trior } "trior" { tok KW_trior }
"trireg" { tok KW_trireg } "trireg" { tok KW_trireg }
"typedef" { tok KW_typedef } "typedef" { tok KW_typedef }
"union" { tok KW_union }
"unique" { tok KW_unique } "unique" { tok KW_unique }
"unique0" { tok KW_unique0 } "unique0" { tok KW_unique0 }
"unsigned" { tok KW_unsigned } "unsigned" { tok KW_unsigned }
......
...@@ -115,6 +115,7 @@ import Language.SystemVerilog.Parser.Tokens ...@@ -115,6 +115,7 @@ import Language.SystemVerilog.Parser.Tokens
"trior" { Token KW_trior _ _ } "trior" { Token KW_trior _ _ }
"trireg" { Token KW_trireg _ _ } "trireg" { Token KW_trireg _ _ }
"typedef" { Token KW_typedef _ _ } "typedef" { Token KW_typedef _ _ }
"union" { Token KW_union _ _ }
"unique" { Token KW_unique _ _ } "unique" { Token KW_unique _ _ }
"unique0" { Token KW_unique0 _ _ } "unique0" { Token KW_unique0 _ _ }
"unsigned" { Token KW_unsigned _ _ } "unsigned" { Token KW_unsigned _ _ }
...@@ -277,6 +278,7 @@ PartialType :: { Signing -> [Range] -> Type } ...@@ -277,6 +278,7 @@ PartialType :: { Signing -> [Range] -> Type }
| NonIntegerType { \Unspecified -> \[] -> NonInteger $1 } | NonIntegerType { \Unspecified -> \[] -> NonInteger $1 }
| "enum" EnumBaseType "{" EnumItems "}" { \Unspecified -> Enum $2 $4 } | "enum" EnumBaseType "{" EnumItems "}" { \Unspecified -> Enum $2 $4 }
| "struct" Packing "{" StructItems "}" { \Unspecified -> Struct $2 $4 } | "struct" Packing "{" StructItems "}" { \Unspecified -> Struct $2 $4 }
| "union" Packing "{" StructItems "}" { \Unspecified -> Union $2 $4 }
CastingType :: { Type } CastingType :: { Type }
: IntegerVectorType { IntegerVector $1 Unspecified [] } : IntegerVectorType { IntegerVector $1 Unspecified [] }
| IntegerAtomType { IntegerAtom $1 Unspecified } | IntegerAtomType { IntegerAtom $1 Unspecified }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment