Commit ec766657 by Zachary Snow

simplify value range representation

parent 4bfcfe4b
......@@ -38,13 +38,13 @@ convertExpr (Inside expr valueRanges) =
else UniOp RedOr $ Concat checks
where
checks = map toCheck valueRanges
toCheck :: ExprOrRange -> Expr
toCheck (Left pattern) =
BinOp WEq expr pattern
toCheck (Right (lo, hi)) =
toCheck :: Expr -> Expr
toCheck (Range Nil NonIndexed (lo, hi)) =
BinOp LogAnd
(BinOp Le lo expr)
(BinOp Ge hi expr)
toCheck pattern =
BinOp WEq expr pattern
convertExpr other = other
convertStmt :: Stmt -> Stmt
......@@ -62,12 +62,7 @@ convertStmt (Case u CaseInside expr items) =
stmt = convertStmt (Case u CaseInside (Ident tmp) items)
-- underlying inside case elaboration
itemsNonDefault = filter (not . null . fst) items
makeComp :: [Expr] -> Expr
makeComp = Inside expr . map unwrap
unwrap :: Expr -> ExprOrRange
unwrap (Range Nil NonIndexed r) = Right r
unwrap e = Left e
comps = map (makeComp . fst) itemsNonDefault
comps = map (Inside expr . fst) itemsNonDefault
stmts = map snd itemsNonDefault
defaultStmt = fromMaybe Null (lookup [] items)
convertStmt other = other
......
......@@ -405,12 +405,6 @@ traverseSinglyNestedExprsM exprMapper = em
typeOrExprMapper (Left t) = return $ Left t
typeOrExprMapper (Right e) =
exprMapper e >>= return . Right
exprOrRangeMapper (Left e) =
exprMapper e >>= return . Left
exprOrRangeMapper (Right (e1, e2)) = do
e1' <- exprMapper e1
e2' <- exprMapper e2
return $ Right (e1', e2')
em (String s) = return $ String s
em (Real s) = return $ Real s
em (Number n) = return $ Number n
......@@ -475,7 +469,7 @@ traverseSinglyNestedExprsM exprMapper = em
return $ Pattern $ zip names exprs
em (Inside e l) = do
e' <- exprMapper e
l' <- mapM exprOrRangeMapper l
l' <- mapM exprMapper l
return $ Inside e' l'
em (MinTypMax e1 e2 e3) = do
e1' <- exprMapper e1
......
......@@ -10,14 +10,12 @@ module Language.SystemVerilog.AST.Expr
( Expr (..)
, Range
, TypeOrExpr
, ExprOrRange
, Args (..)
, PartSelectMode (..)
, DimsFn (..)
, DimFn (..)
, showAssignment
, showRanges
, showExprOrRange
, ParamBinding
, showParams
, pattern RawNum
......@@ -34,7 +32,6 @@ import {-# SOURCE #-} Language.SystemVerilog.AST.Type
type Range = (Expr, Expr)
type TypeOrExpr = Either Type Expr
type ExprOrRange = Either Expr Range
pattern RawNum :: Integer -> Expr
pattern RawNum n = Number (Decimal (-32) True n)
......@@ -61,7 +58,7 @@ data Expr
| DimFn DimFn TypeOrExpr Expr
| Dot Expr Identifier
| Pattern [(Identifier, Expr)]
| Inside Expr [ExprOrRange]
| Inside Expr [Expr]
| MinTypMax Expr Expr Expr
| Nil
deriving (Eq, Ord)
......@@ -83,9 +80,7 @@ instance Show Expr where
show (Cast tore e ) = printf "%s'(%s)" (showEither tore) (show e)
show (DimsFn f v ) = printf "%s(%s)" (show f) (showEither v)
show (DimFn f v e) = printf "%s(%s, %s)" (show f) (showEither v) (show e)
show (Inside e l ) = printf "(%s inside { %s })" (show e) (intercalate ", " strs)
where
strs = map showExprOrRange l
show (Inside e l ) = printf "(%s inside { %s })" (show e) (intercalate ", " $ map show l)
show (Pattern l ) =
printf "'{\n%s\n}" (indent $ intercalate ",\n" $ map showPatternItem l)
where
......@@ -187,10 +182,6 @@ showRanges l = " " ++ (concatMap showRange l)
showRange :: Range -> String
showRange (h, l) = printf "[%s:%s]" (show h) (show l)
showExprOrRange :: ExprOrRange -> String
showExprOrRange (Left x) = show x
showExprOrRange (Right x) = show x
showUniOpPrec :: Expr -> ShowS
showUniOpPrec (e @ UniOp{}) = (showParen True . shows) e
showUniOpPrec (e @ BinOp{}) = (showParen True . shows) e
......
......@@ -1140,7 +1140,7 @@ InsideCases :: { [Case] }
: InsideCase { [$1] }
| InsideCase InsideCases { $1 : $2 }
InsideCase :: { Case }
: OpenRangeList ":" Stmt { (map rangeAsExpr $1, $3) }
: OpenRangeList ":" Stmt { ($1, $3) }
| "default" opt(":") Stmt { ([], $3) }
Real :: { String }
......@@ -1183,12 +1183,12 @@ TypeOrExpr :: { TypeOrExpr }
: TypeNonIdent { Left $1 }
| Expr { Right $1 }
OpenRangeList :: { [ExprOrRange] }
OpenRangeList :: { [Expr] }
: ValueRange { [$1] }
| OpenRangeList "," ValueRange { $1 ++ [$3] }
ValueRange :: { ExprOrRange }
: Expr { Left $1 }
| Range { Right $1 }
ValueRange :: { Expr }
: Expr { $1 }
| Range { Range Nil NonIndexed $1 }
Expr :: { Expr }
: "(" Expr ")" { $2 }
......@@ -1465,10 +1465,6 @@ caseInsideKW tok kw =
error $ show (tokenPosition tok)
++ ": Parse error: cannot use inside with " ++ show kw
rangeAsExpr :: ExprOrRange -> Expr
rangeAsExpr (Left e) = e
rangeAsExpr (Right r) = Range Nil NonIndexed r
addMIAttr :: Attr -> ModuleItem -> ModuleItem
addMIAttr _ (item @ (MIPackageItem (Decl CommentDecl{}))) = item
addMIAttr attr item = MIAttr attr item
......
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