mirror of https://github.com/zachjs/sv2v.git
simplify value range representation
This commit is contained in:
parent
4bfcfe4b28
commit
ec766657a8
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue