From ec766657a8d042f06a85ca13b1d2e7dc52790efe Mon Sep 17 00:00:00 2001 From: Zachary Snow Date: Wed, 17 Feb 2021 16:57:15 -0500 Subject: [PATCH] simplify value range representation --- src/Convert/Inside.hs | 15 +++++---------- src/Convert/Traverse.hs | 8 +------- src/Language/SystemVerilog/AST/Expr.hs | 13 ++----------- src/Language/SystemVerilog/Parser/Parse.y | 14 +++++--------- 4 files changed, 13 insertions(+), 37 deletions(-) diff --git a/src/Convert/Inside.hs b/src/Convert/Inside.hs index 9a52367..2d1221a 100644 --- a/src/Convert/Inside.hs +++ b/src/Convert/Inside.hs @@ -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 diff --git a/src/Convert/Traverse.hs b/src/Convert/Traverse.hs index 41b2e27..9106ed8 100644 --- a/src/Convert/Traverse.hs +++ b/src/Convert/Traverse.hs @@ -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 diff --git a/src/Language/SystemVerilog/AST/Expr.hs b/src/Language/SystemVerilog/AST/Expr.hs index b811532..5ae724c 100644 --- a/src/Language/SystemVerilog/AST/Expr.hs +++ b/src/Language/SystemVerilog/AST/Expr.hs @@ -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 diff --git a/src/Language/SystemVerilog/Parser/Parse.y b/src/Language/SystemVerilog/Parser/Parse.y index db4814d..7590185 100644 --- a/src/Language/SystemVerilog/Parser/Parse.y +++ b/src/Language/SystemVerilog/Parser/Parse.y @@ -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