mirror of https://github.com/zachjs/sv2v.git
support for methods (no conversion) and interface TFs
This commit is contained in:
parent
39f0e9b40d
commit
3597f4a6be
|
|
@ -46,8 +46,8 @@ traverseFunctionsM (MIPackageItem (Function ml t f decls stmts)) = do
|
||||||
traverseFunctionsM other = return other
|
traverseFunctionsM other = return other
|
||||||
|
|
||||||
convertExpr :: Idents -> Expr -> Expr
|
convertExpr :: Idents -> Expr -> Expr
|
||||||
convertExpr functions (Call Nothing func (Args [] [])) =
|
convertExpr functions (Call (Ident func) (Args [] [])) =
|
||||||
Call Nothing func (Args args [])
|
Call (Ident func) (Args args [])
|
||||||
where args = if Set.member func functions
|
where args = if Set.member func functions
|
||||||
then [Just $ Number "0"]
|
then [Just $ Number "0"]
|
||||||
else []
|
else []
|
||||||
|
|
|
||||||
|
|
@ -186,6 +186,7 @@ convertDescription _ _ other = other
|
||||||
-- add a prefix to all standard identifiers in a module item
|
-- add a prefix to all standard identifiers in a module item
|
||||||
prefixModuleItems :: Identifier -> ModuleItem -> ModuleItem
|
prefixModuleItems :: Identifier -> ModuleItem -> ModuleItem
|
||||||
prefixModuleItems prefix =
|
prefixModuleItems prefix =
|
||||||
|
prefixMIPackageItem .
|
||||||
traverseDecls prefixDecl .
|
traverseDecls prefixDecl .
|
||||||
traverseExprs (traverseNestedExprs prefixExpr) .
|
traverseExprs (traverseNestedExprs prefixExpr) .
|
||||||
traverseLHSs (traverseNestedLHSs prefixLHS )
|
traverseLHSs (traverseNestedLHSs prefixLHS )
|
||||||
|
|
@ -200,6 +201,19 @@ prefixModuleItems prefix =
|
||||||
prefixLHS :: LHS -> LHS
|
prefixLHS :: LHS -> LHS
|
||||||
prefixLHS (LHSIdent x) = LHSIdent (prefix ++ x)
|
prefixLHS (LHSIdent x) = LHSIdent (prefix ++ x)
|
||||||
prefixLHS other = other
|
prefixLHS other = other
|
||||||
|
prefixMIPackageItem (MIPackageItem item) =
|
||||||
|
MIPackageItem $ prefixPackageItem prefix item
|
||||||
|
prefixMIPackageItem other = other
|
||||||
|
|
||||||
|
-- add a prefix to all standard identifiers in a package item
|
||||||
|
prefixPackageItem :: Identifier -> PackageItem -> PackageItem
|
||||||
|
prefixPackageItem prefix (Function lifetime t x decls stmts) =
|
||||||
|
Function lifetime t x' decls stmts
|
||||||
|
where x' = prefix ++ x
|
||||||
|
prefixPackageItem prefix (Task lifetime x decls stmts) =
|
||||||
|
Task lifetime x' decls stmts
|
||||||
|
where x' = prefix ++ x
|
||||||
|
prefixPackageItem _ other = other
|
||||||
|
|
||||||
lookupType :: [ModuleItem] -> Expr -> (Type, [Range])
|
lookupType :: [ModuleItem] -> Expr -> (Type, [Range])
|
||||||
lookupType items (Ident ident) =
|
lookupType items (Ident ident) =
|
||||||
|
|
|
||||||
|
|
@ -44,11 +44,11 @@ collectTFDecls name decls =
|
||||||
getInput _ = Nothing
|
getInput _ = Nothing
|
||||||
|
|
||||||
convertExpr :: TFs -> Expr -> Expr
|
convertExpr :: TFs -> Expr -> Expr
|
||||||
convertExpr _ (orig @ (Call Nothing _ (Args _ []))) = orig
|
convertExpr _ (orig @ (Call _ (Args _ []))) = orig
|
||||||
convertExpr tfs (Call Nothing func (Args pnArgs kwArgs)) =
|
convertExpr tfs (Call (Ident func) (Args pnArgs kwArgs)) =
|
||||||
case tfs Map.!? func of
|
case tfs Map.!? func of
|
||||||
Nothing -> Call Nothing func (Args pnArgs kwArgs)
|
Nothing -> Call (Ident func) (Args pnArgs kwArgs)
|
||||||
Just ordered -> Call Nothing func (Args args [])
|
Just ordered -> Call (Ident func) (Args args [])
|
||||||
where
|
where
|
||||||
args = pnArgs ++ (map snd $ sortOn position kwArgs)
|
args = pnArgs ++ (map snd $ sortOn position kwArgs)
|
||||||
position (x, _) = elemIndex x ordered
|
position (x, _) = elemIndex x ordered
|
||||||
|
|
|
||||||
|
|
@ -82,12 +82,12 @@ collectPIsM _ = return ()
|
||||||
|
|
||||||
-- writes down the names of subroutine invocations
|
-- writes down the names of subroutine invocations
|
||||||
collectSubroutinesM :: Stmt -> Writer Idents ()
|
collectSubroutinesM :: Stmt -> Writer Idents ()
|
||||||
collectSubroutinesM (Subroutine Nothing f _) = tell $ Set.singleton f
|
collectSubroutinesM (Subroutine (Ident f) _) = tell $ Set.singleton f
|
||||||
collectSubroutinesM _ = return ()
|
collectSubroutinesM _ = return ()
|
||||||
|
|
||||||
-- writes down the names of function calls and identifiers
|
-- writes down the names of function calls and identifiers
|
||||||
collectIdentsM :: Expr -> Writer Idents ()
|
collectIdentsM :: Expr -> Writer Idents ()
|
||||||
collectIdentsM (Call Nothing x _) = tell $ Set.singleton x
|
collectIdentsM (Call (Ident x) _) = tell $ Set.singleton x
|
||||||
collectIdentsM (Ident x) = tell $ Set.singleton x
|
collectIdentsM (Ident x) = tell $ Set.singleton x
|
||||||
collectIdentsM _ = return ()
|
collectIdentsM _ = return ()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -154,22 +154,14 @@ traverseModuleItem existingItemNames packages (MIPackageItem (Import x y)) =
|
||||||
items = map snd $ filter (filterer . fst) $ packageItems
|
items = map snd $ filter (filterer . fst) $ packageItems
|
||||||
traverseModuleItem _ _ item =
|
traverseModuleItem _ _ item =
|
||||||
(traverseExprs $ traverseNestedExprs traverseExpr) $
|
(traverseExprs $ traverseNestedExprs traverseExpr) $
|
||||||
(traverseStmts traverseStmt) $
|
|
||||||
(traverseTypes $ traverseNestedTypes traverseType) $
|
(traverseTypes $ traverseNestedTypes traverseType) $
|
||||||
item
|
item
|
||||||
where
|
where
|
||||||
|
|
||||||
traverseExpr :: Expr -> Expr
|
traverseExpr :: Expr -> Expr
|
||||||
traverseExpr (PSIdent x y) = Ident $ x ++ "_" ++ y
|
traverseExpr (PSIdent x y) = Ident $ x ++ "_" ++ y
|
||||||
traverseExpr (Call (Just ps) f args) =
|
|
||||||
Call Nothing (ps ++ "_" ++ f) args
|
|
||||||
traverseExpr other = other
|
traverseExpr other = other
|
||||||
|
|
||||||
traverseStmt :: Stmt -> Stmt
|
|
||||||
traverseStmt (Subroutine (Just ps) f args) =
|
|
||||||
Subroutine Nothing (ps ++ "_" ++ f) args
|
|
||||||
traverseStmt other = other
|
|
||||||
|
|
||||||
traverseType :: Type -> Type
|
traverseType :: Type -> Type
|
||||||
traverseType (Alias (Just ps) xx rs) =
|
traverseType (Alias (Just ps) xx rs) =
|
||||||
Alias Nothing (ps ++ "_" ++ xx) rs
|
Alias Nothing (ps ++ "_" ++ xx) rs
|
||||||
|
|
|
||||||
|
|
@ -56,13 +56,13 @@ convertExpr info (DimFn f v e) =
|
||||||
DimFn f v e'
|
DimFn f v e'
|
||||||
where
|
where
|
||||||
e' = simplify $ substitute info e
|
e' = simplify $ substitute info e
|
||||||
convertExpr info (Call Nothing "$clog2" (Args [Just e] [])) =
|
convertExpr info (Call (Ident "$clog2") (Args [Just e] [])) =
|
||||||
if clog2' == clog2
|
if clog2' == clog2
|
||||||
then clog2
|
then clog2
|
||||||
else clog2'
|
else clog2'
|
||||||
where
|
where
|
||||||
e' = simplify $ substitute info e
|
e' = simplify $ substitute info e
|
||||||
clog2 = Call Nothing "$clog2" (Args [Just e'] [])
|
clog2 = Call (Ident "$clog2") (Args [Just e'] [])
|
||||||
clog2' = simplify clog2
|
clog2' = simplify clog2
|
||||||
convertExpr info (Mux cc aa bb) =
|
convertExpr info (Mux cc aa bb) =
|
||||||
if before == after
|
if before == after
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,7 @@ traverseExprM =
|
||||||
lift $ tell $ Set.singleton (s, sg)
|
lift $ tell $ Set.singleton (s, sg)
|
||||||
let f = castFnName s sg
|
let f = castFnName s sg
|
||||||
let args = Args [Just e] []
|
let args = Args [Just e] []
|
||||||
return $ Call Nothing f args
|
return $ Call (Ident f) args
|
||||||
_ -> return $ Cast (Right s) e
|
_ -> return $ Cast (Right s) e
|
||||||
convertExprM other = return other
|
convertExprM other = return other
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -51,10 +51,10 @@ convertDescription (description @ Part{}) =
|
||||||
traverseExprsM traverseExprM >>=
|
traverseExprsM traverseExprM >>=
|
||||||
traverseAsgnsM traverseAsgnM
|
traverseAsgnsM traverseAsgnM
|
||||||
traverseStmtM :: Stmt -> State Types Stmt
|
traverseStmtM :: Stmt -> State Types Stmt
|
||||||
traverseStmtM (Subroutine Nothing f args) = do
|
traverseStmtM (Subroutine expr args) = do
|
||||||
stateTypes <- get
|
stateTypes <- get
|
||||||
return $ uncurry (Subroutine Nothing) $
|
return $ Subroutine expr $
|
||||||
convertCall structs stateTypes f args
|
convertCall structs stateTypes expr args
|
||||||
traverseStmtM stmt =
|
traverseStmtM stmt =
|
||||||
traverseStmtLHSsM traverseLHSM stmt >>=
|
traverseStmtLHSsM traverseLHSM stmt >>=
|
||||||
traverseStmtExprsM traverseExprM >>=
|
traverseStmtExprsM traverseExprM >>=
|
||||||
|
|
@ -152,7 +152,7 @@ convertType structs t1 =
|
||||||
|
|
||||||
-- writes down the names of called functions
|
-- writes down the names of called functions
|
||||||
collectCallsM :: Expr -> Writer Idents ()
|
collectCallsM :: Expr -> Writer Idents ()
|
||||||
collectCallsM (Call Nothing f _) = tell $ Set.singleton f
|
collectCallsM (Call (Ident f) _) = tell $ Set.singleton f
|
||||||
collectCallsM _ = return ()
|
collectCallsM _ = return ()
|
||||||
|
|
||||||
collectTFArgsM :: ModuleItem -> Writer Types ()
|
collectTFArgsM :: ModuleItem -> Writer Types ()
|
||||||
|
|
@ -328,8 +328,8 @@ convertAsgn structs types (lhs, expr) =
|
||||||
show (Set.toList extraNames) ++ " that are not in " ++
|
show (Set.toList extraNames) ++ " that are not in " ++
|
||||||
show structTf
|
show structTf
|
||||||
else if Map.member structTf structs then
|
else if Map.member structTf structs then
|
||||||
Call Nothing
|
Call
|
||||||
(packerFnName structTf)
|
(Ident $ packerFnName structTf)
|
||||||
(Args (map (Just . snd) items) [])
|
(Args (map (Just . snd) items) [])
|
||||||
else
|
else
|
||||||
Pattern items
|
Pattern items
|
||||||
|
|
@ -464,14 +464,15 @@ convertAsgn structs types (lhs, expr) =
|
||||||
(_, []) -> Implicit Unspecified []
|
(_, []) -> Implicit Unspecified []
|
||||||
(tf, rs) -> tf $ tail rs
|
(tf, rs) -> tf $ tail rs
|
||||||
(_, i') = convertSubExpr i
|
(_, i') = convertSubExpr i
|
||||||
convertSubExpr (Call Nothing f args) =
|
convertSubExpr (Call e args) =
|
||||||
(retType, uncurry (Call Nothing) $ convertCall structs types f args)
|
(retType, Call e $ convertCall structs types e' args)
|
||||||
where
|
where
|
||||||
retType = case Map.lookup f types of
|
(_, e') = convertSubExpr e
|
||||||
Nothing -> Implicit Unspecified []
|
retType = case e' of
|
||||||
Just t -> t
|
Ident f -> case Map.lookup f types of
|
||||||
convertSubExpr (Call (Just x) f args) =
|
Nothing -> Implicit Unspecified []
|
||||||
(Implicit Unspecified [], Call (Just x) f args)
|
Just t -> t
|
||||||
|
_ -> Implicit Unspecified []
|
||||||
convertSubExpr (String s) = (Implicit Unspecified [], String s)
|
convertSubExpr (String s) = (Implicit Unspecified [], String s)
|
||||||
convertSubExpr (Number n) = (Implicit Unspecified [], Number n)
|
convertSubExpr (Number n) = (Implicit Unspecified [], Number n)
|
||||||
convertSubExpr (Time n) = (Implicit Unspecified [], Time n)
|
convertSubExpr (Time n) = (Implicit Unspecified [], Time n)
|
||||||
|
|
@ -536,10 +537,13 @@ convertAsgn structs types (lhs, expr) =
|
||||||
where fieldMap = Map.fromList $ map swap fields
|
where fieldMap = Map.fromList $ map swap fields
|
||||||
|
|
||||||
-- attempts to convert based on the assignment-like contexts of TF arguments
|
-- attempts to convert based on the assignment-like contexts of TF arguments
|
||||||
convertCall :: Structs -> Types -> Identifier -> Args -> (Identifier, Args)
|
convertCall :: Structs -> Types -> Expr -> Args -> Args
|
||||||
convertCall structs types f (Args pnArgs kwArgs) =
|
convertCall structs types fn (Args pnArgs kwArgs) =
|
||||||
(f, args)
|
case fn of
|
||||||
|
Ident _ -> args
|
||||||
|
_ -> Args pnArgs kwArgs
|
||||||
where
|
where
|
||||||
|
Ident f = fn
|
||||||
idxs = map show ([0..] :: [Int])
|
idxs = map show ([0..] :: [Int])
|
||||||
args = Args
|
args = Args
|
||||||
(map snd $ map convertArg $ zip idxs pnArgs)
|
(map snd $ map convertArg $ zip idxs pnArgs)
|
||||||
|
|
|
||||||
|
|
@ -257,7 +257,7 @@ traverseSinglyNestedStmtsM fullMapper = cs
|
||||||
return $ If u e s1' s2'
|
return $ If u e s1' s2'
|
||||||
cs (Timing event stmt) = fullMapper stmt >>= return . Timing event
|
cs (Timing event stmt) = fullMapper stmt >>= return . Timing event
|
||||||
cs (Return expr) = return $ Return expr
|
cs (Return expr) = return $ Return expr
|
||||||
cs (Subroutine ps f exprs) = return $ Subroutine ps f exprs
|
cs (Subroutine expr exprs) = return $ Subroutine expr exprs
|
||||||
cs (Trigger blocks x) = return $ Trigger blocks x
|
cs (Trigger blocks x) = return $ Trigger blocks x
|
||||||
cs (Assertion a) =
|
cs (Assertion a) =
|
||||||
traverseAssertionStmtsM fullMapper a >>= return . Assertion
|
traverseAssertionStmtsM fullMapper a >>= return . Assertion
|
||||||
|
|
@ -455,11 +455,12 @@ traverseNestedExprsM mapper = exprMapper
|
||||||
e' <- exprMapper e
|
e' <- exprMapper e
|
||||||
l' <- mapM exprMapper l
|
l' <- mapM exprMapper l
|
||||||
return $ Stream o e' l'
|
return $ Stream o e' l'
|
||||||
em (Call ps f (Args l p)) = do
|
em (Call e (Args l p)) = do
|
||||||
|
e' <- exprMapper e
|
||||||
l' <- mapM maybeExprMapper l
|
l' <- mapM maybeExprMapper l
|
||||||
pes <- mapM maybeExprMapper $ map snd p
|
pes <- mapM maybeExprMapper $ map snd p
|
||||||
let p' = zip (map fst p) pes
|
let p' = zip (map fst p) pes
|
||||||
return $ Call ps f (Args l' p')
|
return $ Call e' (Args l' p')
|
||||||
em (UniOp o e) =
|
em (UniOp o e) =
|
||||||
exprMapper e >>= return . UniOp o
|
exprMapper e >>= return . UniOp o
|
||||||
em (BinOp o e1 e2) = do
|
em (BinOp o e1 e2) = do
|
||||||
|
|
@ -711,11 +712,12 @@ traverseStmtExprsM exprMapper = flatStmtMapper
|
||||||
flatStmtMapper (If u cc s1 s2) =
|
flatStmtMapper (If u cc s1 s2) =
|
||||||
exprMapper cc >>= \cc' -> return $ If u cc' s1 s2
|
exprMapper cc >>= \cc' -> return $ If u cc' s1 s2
|
||||||
flatStmtMapper (Timing event stmt) = return $ Timing event stmt
|
flatStmtMapper (Timing event stmt) = return $ Timing event stmt
|
||||||
flatStmtMapper (Subroutine ps f (Args l p)) = do
|
flatStmtMapper (Subroutine e (Args l p)) = do
|
||||||
|
e' <- exprMapper e
|
||||||
l' <- mapM maybeExprMapper l
|
l' <- mapM maybeExprMapper l
|
||||||
pes <- mapM maybeExprMapper $ map snd p
|
pes <- mapM maybeExprMapper $ map snd p
|
||||||
let p' = zip (map fst p) pes
|
let p' = zip (map fst p) pes
|
||||||
return $ Subroutine ps f (Args l' p')
|
return $ Subroutine e' (Args l' p')
|
||||||
flatStmtMapper (Return expr) =
|
flatStmtMapper (Return expr) =
|
||||||
exprMapper expr >>= return . Return
|
exprMapper expr >>= return . Return
|
||||||
flatStmtMapper (Trigger blocks x) = return $ Trigger blocks x
|
flatStmtMapper (Trigger blocks x) = return $ Trigger blocks x
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@ data Expr
|
||||||
| Repeat Expr [Expr]
|
| Repeat Expr [Expr]
|
||||||
| Concat [Expr]
|
| Concat [Expr]
|
||||||
| Stream StreamOp Expr [Expr]
|
| Stream StreamOp Expr [Expr]
|
||||||
| Call (Maybe Identifier) Identifier Args
|
| Call Expr Args
|
||||||
| UniOp UniOp Expr
|
| UniOp UniOp Expr
|
||||||
| BinOp BinOp Expr Expr
|
| BinOp BinOp Expr Expr
|
||||||
| Mux Expr Expr Expr
|
| Mux Expr Expr Expr
|
||||||
|
|
@ -75,7 +75,7 @@ instance Show Expr where
|
||||||
show (BinOp o a b) = printf "(%s %s %s)" (show a) (show o) (show b)
|
show (BinOp o a b) = printf "(%s %s %s)" (show a) (show o) (show b)
|
||||||
show (Dot e n ) = printf "%s.%s" (show e) n
|
show (Dot e n ) = printf "%s.%s" (show e) n
|
||||||
show (Mux c a b) = printf "(%s ? %s : %s)" (show c) (show a) (show b)
|
show (Mux c a b) = printf "(%s ? %s : %s)" (show c) (show a) (show b)
|
||||||
show (Call ps f l) = printf "%s%s%s" (maybe "" (++ "::") ps) f (show l)
|
show (Call e l ) = printf "%s%s" (show e) (show l)
|
||||||
show (Cast tore e ) = printf "%s'(%s)" (showEither tore) (show e)
|
show (Cast tore e ) = printf "%s'(%s)" (showEither tore) (show e)
|
||||||
show (DimsFn f v ) = printf "%s(%s)" (show f) (showEither v)
|
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 (DimFn f v e) = printf "%s(%s, %s)" (show f) (showEither v) (show e)
|
||||||
|
|
@ -184,7 +184,7 @@ simplify (orig @ (Repeat (Number n) exprs)) =
|
||||||
simplify (Concat [expr]) = expr
|
simplify (Concat [expr]) = expr
|
||||||
simplify (Concat exprs) =
|
simplify (Concat exprs) =
|
||||||
Concat $ filter (/= Concat []) exprs
|
Concat $ filter (/= Concat []) exprs
|
||||||
simplify (orig @ (Call Nothing "$clog2" (Args [Just (Number n)] []))) =
|
simplify (orig @ (Call (Ident "$clog2") (Args [Just (Number n)] []))) =
|
||||||
case readNumber n of
|
case readNumber n of
|
||||||
Nothing -> orig
|
Nothing -> orig
|
||||||
Just x -> Number $ show $ clog2 x
|
Just x -> Number $ show $ clog2 x
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,7 @@ data Stmt
|
||||||
| If (Maybe UniquePriority) Expr Stmt Stmt
|
| If (Maybe UniquePriority) Expr Stmt Stmt
|
||||||
| Timing Timing Stmt
|
| Timing Timing Stmt
|
||||||
| Return Expr
|
| Return Expr
|
||||||
| Subroutine (Maybe Identifier) Identifier Args
|
| Subroutine Expr Args
|
||||||
| Trigger Bool Identifier
|
| Trigger Bool Identifier
|
||||||
| Assertion Assertion
|
| Assertion Assertion
|
||||||
| Continue
|
| Continue
|
||||||
|
|
@ -84,7 +84,7 @@ instance Show Stmt where
|
||||||
where showInit (l, e) = showAssign (l, AsgnOpEq, e)
|
where showInit (l, e) = showAssign (l, AsgnOpEq, e)
|
||||||
showAssign :: (LHS, AsgnOp, Expr) -> String
|
showAssign :: (LHS, AsgnOp, Expr) -> String
|
||||||
showAssign (l, op, e) = printf "%s %s %s" (show l) (show op) (show e)
|
showAssign (l, op, e) = printf "%s %s %s" (show l) (show op) (show e)
|
||||||
show (Subroutine ps x a) = printf "%s%s%s;" (maybe "" (++ "::") ps) x aStr
|
show (Subroutine e a) = printf "%s%s;" (show e) aStr
|
||||||
where aStr = if a == Args [] [] then "" else show a
|
where aStr = if a == Args [] [] then "" else show a
|
||||||
show (AsgnBlk o v e) = printf "%s %s %s;" (show v) (show o) (show e)
|
show (AsgnBlk o v e) = printf "%s %s %s;" (show v) (show o) (show e)
|
||||||
show (Asgn t v e) = printf "%s <= %s%s;" (show v) (maybe "" showPad t) (show e)
|
show (Asgn t v e) = printf "%s <= %s%s;" (show v) (maybe "" showPad t) (show e)
|
||||||
|
|
|
||||||
|
|
@ -592,7 +592,6 @@ DeclTokens(delim) :: { [DeclToken] }
|
||||||
DeclToken :: { DeclToken }
|
DeclToken :: { DeclToken }
|
||||||
: DeclOrStmtToken { $1 }
|
: DeclOrStmtToken { $1 }
|
||||||
| ParameterBindings { DTParams $1 }
|
| ParameterBindings { DTParams $1 }
|
||||||
| PortBindings { DTInstance $1 }
|
|
||||||
|
|
||||||
DeclOrStmtTokens(delim) :: { [DeclToken] }
|
DeclOrStmtTokens(delim) :: { [DeclToken] }
|
||||||
: DeclOrStmtToken delim { [$1] }
|
: DeclOrStmtToken delim { [$1] }
|
||||||
|
|
@ -612,6 +611,7 @@ DeclOrStmtToken :: { DeclToken }
|
||||||
| LHSConcat { DTConcat $1 }
|
| LHSConcat { DTConcat $1 }
|
||||||
| PartialType { DTType $1 }
|
| PartialType { DTType $1 }
|
||||||
| "." Identifier { DTDot $2 }
|
| "." Identifier { DTDot $2 }
|
||||||
|
| PortBindings { DTInstance $1 }
|
||||||
| Signing { DTSigning $1 }
|
| Signing { DTSigning $1 }
|
||||||
| Lifetime { DTLifetime $1 }
|
| Lifetime { DTLifetime $1 }
|
||||||
| Identifier "::" Identifier { DTPSIdent $1 $3 }
|
| Identifier "::" Identifier { DTPSIdent $1 $3 }
|
||||||
|
|
@ -904,8 +904,8 @@ StmtAsgn :: { Stmt }
|
||||||
: LHS AsgnOp Expr ";" { AsgnBlk $2 $1 $3 }
|
: LHS AsgnOp Expr ";" { AsgnBlk $2 $1 $3 }
|
||||||
| LHS IncOrDecOperator ";" { AsgnBlk (AsgnOp $2) $1 (Number "1") }
|
| LHS IncOrDecOperator ";" { AsgnBlk (AsgnOp $2) $1 (Number "1") }
|
||||||
| LHS "<=" opt(DelayOrEventControl) Expr ";" { Asgn $3 $1 $4 }
|
| LHS "<=" opt(DelayOrEventControl) Expr ";" { Asgn $3 $1 $4 }
|
||||||
| Identifier ";" { Subroutine (Nothing) $1 (Args [] []) }
|
| LHS ";" { Subroutine (lhsToExpr $1) (Args [] []) }
|
||||||
| Identifier "::" Identifier ";" { Subroutine (Just $1) $3 (Args [] []) }
|
| LHS CallArgs ";" { Subroutine (lhsToExpr $1) $2 }
|
||||||
StmtNonAsgn :: { Stmt }
|
StmtNonAsgn :: { Stmt }
|
||||||
: StmtBlock(BlockKWSeq, "end" ) { $1 }
|
: StmtBlock(BlockKWSeq, "end" ) { $1 }
|
||||||
| StmtBlock(BlockKWPar, "join") { $1 }
|
| StmtBlock(BlockKWPar, "join") { $1 }
|
||||||
|
|
@ -920,8 +920,6 @@ StmtNonBlock :: { Stmt }
|
||||||
| Unique "if" "(" Expr ")" Stmt %prec NoElse { If $1 $4 $6 Null }
|
| Unique "if" "(" Expr ")" Stmt %prec NoElse { If $1 $4 $6 Null }
|
||||||
| "for" "(" ForInit ForCond ForStep ")" Stmt { For $3 $4 $5 $7 }
|
| "for" "(" ForInit ForCond ForStep ")" Stmt { For $3 $4 $5 $7 }
|
||||||
| Unique CaseKW "(" Expr ")" Cases "endcase" { Case $1 $2 $4 (fst $6) (snd $6) }
|
| Unique CaseKW "(" Expr ")" Cases "endcase" { Case $1 $2 $4 (fst $6) (snd $6) }
|
||||||
| Identifier CallArgs ";" { Subroutine (Nothing) $1 $2 }
|
|
||||||
| Identifier "::" Identifier CallArgs ";" { Subroutine (Just $1) $3 $4 }
|
|
||||||
| TimingControl Stmt { Timing $1 $2 }
|
| TimingControl Stmt { Timing $1 $2 }
|
||||||
| "return" Expr ";" { Return $2 }
|
| "return" Expr ";" { Return $2 }
|
||||||
| "return" ";" { Return Nil }
|
| "return" ";" { Return Nil }
|
||||||
|
|
@ -1102,8 +1100,7 @@ Expr :: { Expr }
|
||||||
| String { String $1 }
|
| String { String $1 }
|
||||||
| Number { Number $1 }
|
| Number { Number $1 }
|
||||||
| Time { Time $1 }
|
| Time { Time $1 }
|
||||||
| Identifier CallArgs { Call (Nothing) $1 $2 }
|
| Expr CallArgs { Call $1 $2 }
|
||||||
| Identifier "::" Identifier CallArgs { Call (Just $1) $3 $4 }
|
|
||||||
| DimsFn "(" TypeOrExpr ")" { DimsFn $1 $3 }
|
| DimsFn "(" TypeOrExpr ")" { DimsFn $1 $3 }
|
||||||
| DimFn "(" TypeOrExpr ")" { DimFn $1 $3 (Number "1") }
|
| DimFn "(" TypeOrExpr ")" { DimFn $1 $3 (Number "1") }
|
||||||
| DimFn "(" TypeOrExpr "," Expr ")" { DimFn $1 $3 $5 }
|
| DimFn "(" TypeOrExpr "," Expr ")" { DimFn $1 $3 $5 }
|
||||||
|
|
|
||||||
|
|
@ -38,8 +38,8 @@ module Language.SystemVerilog.Parser.ParseDecl
|
||||||
, parseDTsAsDeclsOrAsgns
|
, parseDTsAsDeclsOrAsgns
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Data.List (elemIndex, findIndex, findIndices)
|
import Data.List (elemIndex, findIndex, findIndices, partition)
|
||||||
import Data.Maybe (fromJust, mapMaybe)
|
import Data.Maybe (mapMaybe)
|
||||||
|
|
||||||
import Language.SystemVerilog.AST
|
import Language.SystemVerilog.AST
|
||||||
|
|
||||||
|
|
@ -202,22 +202,34 @@ parseDTsAsDecl tokens =
|
||||||
-- [PUBLIC]: parser for single block item declarations or assign or arg-less
|
-- [PUBLIC]: parser for single block item declarations or assign or arg-less
|
||||||
-- subroutine call statetments
|
-- subroutine call statetments
|
||||||
parseDTsAsDeclOrAsgn :: [DeclToken] -> ([Decl], [Stmt])
|
parseDTsAsDeclOrAsgn :: [DeclToken] -> ([Decl], [Stmt])
|
||||||
parseDTsAsDeclOrAsgn [DTIdent f] = ([], [Subroutine (Nothing) f (Args [] [])])
|
parseDTsAsDeclOrAsgn [DTIdent f] = ([], [Subroutine (Ident f) (Args [] [])])
|
||||||
parseDTsAsDeclOrAsgn [DTPSIdent p f] = ([], [Subroutine (Just p) f (Args [] [])])
|
parseDTsAsDeclOrAsgn [DTPSIdent p f] = ([], [Subroutine (PSIdent p f) (Args [] [])])
|
||||||
parseDTsAsDeclOrAsgn tokens =
|
parseDTsAsDeclOrAsgn tokens =
|
||||||
if (isAsgn (last tokens) || tripLookahead tokens) && lhs /= Nothing
|
if (isStmt (last tokens) || tripLookahead tokens) && maybeLhs /= Nothing
|
||||||
then ([], [constructor (fromJust lhs) expr])
|
then ([], [stmt])
|
||||||
else (parseDTsAsDecl tokens, [])
|
else (parseDTsAsDecl tokens, [])
|
||||||
where
|
where
|
||||||
(constructor, expr) = case last tokens of
|
stmt = case last tokens of
|
||||||
DTAsgn op e -> (AsgnBlk op, e)
|
DTAsgn op e -> AsgnBlk op lhs e
|
||||||
DTAsgnNBlk mt e -> (Asgn mt, e)
|
DTAsgnNBlk mt e -> Asgn mt lhs e
|
||||||
|
DTInstance args -> Subroutine (lhsToExpr lhs) (instanceToArgs args)
|
||||||
_ -> error $ "invalid block item decl or stmt: " ++ (show tokens)
|
_ -> error $ "invalid block item decl or stmt: " ++ (show tokens)
|
||||||
lhs = takeLHS $ init tokens
|
maybeLhs = takeLHS $ init tokens
|
||||||
isAsgn :: DeclToken -> Bool
|
Just lhs = maybeLhs
|
||||||
isAsgn (DTAsgnNBlk _ _) = True
|
isStmt :: DeclToken -> Bool
|
||||||
isAsgn (DTAsgn _ _) = True
|
isStmt (DTAsgnNBlk{}) = True
|
||||||
isAsgn _ = False
|
isStmt (DTAsgn{}) = True
|
||||||
|
isStmt (DTInstance{}) = True
|
||||||
|
isStmt _ = False
|
||||||
|
|
||||||
|
-- converts port bindings to call args
|
||||||
|
instanceToArgs :: [PortBinding] -> Args
|
||||||
|
instanceToArgs bindings =
|
||||||
|
Args pnArgs kwArgs
|
||||||
|
where
|
||||||
|
(pnBindings, kwBindings) = partition (null . fst) bindings
|
||||||
|
pnArgs = map snd pnBindings
|
||||||
|
kwArgs = kwBindings
|
||||||
|
|
||||||
-- [PUBLIC]: parser for comma-separated declarations or assignment lists; this
|
-- [PUBLIC]: parser for comma-separated declarations or assignment lists; this
|
||||||
-- is only used for `for` loop initialization lists
|
-- is only used for `for` loop initialization lists
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
interface Foo;
|
||||||
|
function bar;
|
||||||
|
input integer x;
|
||||||
|
return x * x;
|
||||||
|
endfunction
|
||||||
|
endinterface
|
||||||
|
|
||||||
|
module top;
|
||||||
|
Foo foo();
|
||||||
|
initial $display(foo.bar(3));
|
||||||
|
endmodule
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
module top;
|
||||||
|
function bar;
|
||||||
|
input integer x;
|
||||||
|
bar = x * x;
|
||||||
|
endfunction
|
||||||
|
initial $display(bar(3));
|
||||||
|
endmodule
|
||||||
Loading…
Reference in New Issue