mirror of https://github.com/zachjs/sv2v.git
fix codegen for assertion property and sequence expressions
- updated representation and added codegen for sequence match items - fix incorrect codegen for `iff` property expression
This commit is contained in:
parent
54ea7d55d5
commit
d6d3938d20
|
|
@ -309,14 +309,14 @@ traverseAssertionExprsM mapper = assertionMapper
|
||||||
s' <- seqExprMapper s
|
s' <- seqExprMapper s
|
||||||
items' <- mapM seqMatchItemMapper items
|
items' <- mapM seqMatchItemMapper items
|
||||||
return $ SeqExprFirstMatch s' items'
|
return $ SeqExprFirstMatch s' items'
|
||||||
seqMatchItemMapper (Left (a, b, c)) = do
|
seqMatchItemMapper (SeqMatchAsgn (a, b, c)) = do
|
||||||
c' <- mapper c
|
c' <- mapper c
|
||||||
return $ Left (a, b, c')
|
return $ SeqMatchAsgn (a, b, c')
|
||||||
seqMatchItemMapper (Right (x, (Args l p))) = do
|
seqMatchItemMapper (SeqMatchCall x (Args l p)) = do
|
||||||
l' <- mapM mapper l
|
l' <- mapM mapper l
|
||||||
pes <- mapM mapper $ map snd p
|
pes <- mapM mapper $ map snd p
|
||||||
let p' = zip (map fst p) pes
|
let p' = zip (map fst p) pes
|
||||||
return $ Right (x, Args l' p')
|
return $ SeqMatchCall x (Args l' p')
|
||||||
ppMapper constructor p1 p2 = do
|
ppMapper constructor p1 p2 = do
|
||||||
p1' <- propExprMapper p1
|
p1' <- propExprMapper p1
|
||||||
p2' <- propExprMapper p2
|
p2' <- propExprMapper p2
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ module Language.SystemVerilog.AST.Stmt
|
||||||
, Case
|
, Case
|
||||||
, ActionBlock (..)
|
, ActionBlock (..)
|
||||||
, PropExpr (..)
|
, PropExpr (..)
|
||||||
, SeqMatchItem
|
, SeqMatchItem (..)
|
||||||
, SeqExpr (..)
|
, SeqExpr (..)
|
||||||
, AssertionItem
|
, AssertionItem
|
||||||
, AssertionExpr
|
, AssertionExpr
|
||||||
|
|
@ -28,7 +28,7 @@ import Text.Printf (printf)
|
||||||
import Language.SystemVerilog.AST.ShowHelp (commas, indent, unlines', showPad, showBlock)
|
import Language.SystemVerilog.AST.ShowHelp (commas, indent, unlines', showPad, showBlock)
|
||||||
import Language.SystemVerilog.AST.Attr (Attr)
|
import Language.SystemVerilog.AST.Attr (Attr)
|
||||||
import Language.SystemVerilog.AST.Decl (Decl)
|
import Language.SystemVerilog.AST.Decl (Decl)
|
||||||
import Language.SystemVerilog.AST.Expr (Expr(Nil), Args(..))
|
import Language.SystemVerilog.AST.Expr (Expr(Call, Ident, Nil), Args(..))
|
||||||
import Language.SystemVerilog.AST.LHS (LHS)
|
import Language.SystemVerilog.AST.LHS (LHS)
|
||||||
import Language.SystemVerilog.AST.Op (AsgnOp(AsgnOpEq))
|
import Language.SystemVerilog.AST.Op (AsgnOp(AsgnOpEq))
|
||||||
import Language.SystemVerilog.AST.Type (Identifier)
|
import Language.SystemVerilog.AST.Type (Identifier)
|
||||||
|
|
@ -80,8 +80,6 @@ instance Show Stmt where
|
||||||
showInits :: [(LHS, Expr)] -> String
|
showInits :: [(LHS, Expr)] -> String
|
||||||
showInits = commas . map showInit
|
showInits = commas . map showInit
|
||||||
where showInit (l, e) = showAssign (l, AsgnOpEq, e)
|
where showInit (l, e) = showAssign (l, AsgnOpEq, e)
|
||||||
showAssign :: (LHS, AsgnOp, Expr) -> String
|
|
||||||
showAssign (l, op, e) = (showPad l) ++ (showPad op) ++ (show e)
|
|
||||||
show (Subroutine e a) = printf "%s%s;" (show e) 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 (Asgn o t v e) = printf "%s %s %s%s;" (show v) (show o) tStr (show e)
|
show (Asgn o t v e) = printf "%s %s %s%s;" (show v) (show o) tStr (show e)
|
||||||
|
|
@ -105,6 +103,9 @@ instance Show Stmt where
|
||||||
then "// " ++ show c
|
then "// " ++ show c
|
||||||
else "// " ++ c
|
else "// " ++ c
|
||||||
|
|
||||||
|
showAssign :: (LHS, AsgnOp, Expr) -> String
|
||||||
|
showAssign (l, op, e) = (showPad l) ++ (showPad op) ++ (show e)
|
||||||
|
|
||||||
showBranch :: Stmt -> String
|
showBranch :: Stmt -> String
|
||||||
showBranch (Block Seq "" [] (stmts @ [CommentStmt{}, _])) =
|
showBranch (Block Seq "" [] (stmts @ [CommentStmt{}, _])) =
|
||||||
'\n' : (indent $ show stmts)
|
'\n' : (indent $ show stmts)
|
||||||
|
|
@ -208,8 +209,14 @@ instance Show PropExpr where
|
||||||
show (PropExprImpliesNO a b) = printf "(%s |=> %s)" (show a) (show b)
|
show (PropExprImpliesNO a b) = printf "(%s |=> %s)" (show a) (show b)
|
||||||
show (PropExprFollowsO a b) = printf "(%s #-# %s)" (show a) (show b)
|
show (PropExprFollowsO a b) = printf "(%s #-# %s)" (show a) (show b)
|
||||||
show (PropExprFollowsNO a b) = printf "(%s #=# %s)" (show a) (show b)
|
show (PropExprFollowsNO a b) = printf "(%s #=# %s)" (show a) (show b)
|
||||||
show (PropExprIff a b) = printf "(%s and %s)" (show a) (show b)
|
show (PropExprIff a b) = printf "(%s iff %s)" (show a) (show b)
|
||||||
type SeqMatchItem = Either (LHS, AsgnOp, Expr) (Identifier, Args)
|
data SeqMatchItem
|
||||||
|
= SeqMatchAsgn (LHS, AsgnOp, Expr)
|
||||||
|
| SeqMatchCall Identifier Args
|
||||||
|
deriving Eq
|
||||||
|
instance Show SeqMatchItem where
|
||||||
|
show (SeqMatchAsgn asgn) = showAssign asgn
|
||||||
|
show (SeqMatchCall ident args) = show $ Call (Ident ident) args
|
||||||
data SeqExpr
|
data SeqExpr
|
||||||
= SeqExpr Expr
|
= SeqExpr Expr
|
||||||
| SeqExprAnd SeqExpr SeqExpr
|
| SeqExprAnd SeqExpr SeqExpr
|
||||||
|
|
@ -228,7 +235,7 @@ instance Show SeqExpr where
|
||||||
show (SeqExprThroughout a b) = printf "(%s %s %s)" (show a) "throughout" (show b)
|
show (SeqExprThroughout a b) = printf "(%s %s %s)" (show a) "throughout" (show b)
|
||||||
show (SeqExprWithin a b) = printf "(%s %s %s)" (show a) "within" (show b)
|
show (SeqExprWithin a b) = printf "(%s %s %s)" (show a) "within" (show b)
|
||||||
show (SeqExprDelay me e s) = printf "%s##%s %s" (maybe "" showPad me) (show e) (show s)
|
show (SeqExprDelay me e s) = printf "%s##%s %s" (maybe "" showPad me) (show e) (show s)
|
||||||
show (SeqExprFirstMatch e a) = printf "first_match(%s, %s)" (show e) (show a)
|
show (SeqExprFirstMatch e a) = printf "first_match(%s, %s)" (show e) (commas $ map show a)
|
||||||
|
|
||||||
type AssertionItem = (Identifier, Assertion)
|
type AssertionItem = (Identifier, Assertion)
|
||||||
type AssertionExpr = Either PropertySpec Expr
|
type AssertionExpr = Either PropertySpec Expr
|
||||||
|
|
|
||||||
|
|
@ -774,8 +774,8 @@ SeqMatchItems :: { [SeqMatchItem] }
|
||||||
: "," SeqMatchItem { [$2] }
|
: "," SeqMatchItem { [$2] }
|
||||||
| SeqMatchItems "," SeqMatchItem { $1 ++ [$3] }
|
| SeqMatchItems "," SeqMatchItem { $1 ++ [$3] }
|
||||||
SeqMatchItem :: { SeqMatchItem }
|
SeqMatchItem :: { SeqMatchItem }
|
||||||
: ForStepAssignment { Left $1 }
|
: ForStepAssignment { SeqMatchAsgn $1 }
|
||||||
| Identifier CallArgs { Right ($1, $2) }
|
| Identifier CallArgs { SeqMatchCall $1 $2 }
|
||||||
|
|
||||||
ActionBlock :: { ActionBlock }
|
ActionBlock :: { ActionBlock }
|
||||||
: Stmt %prec NoElse { ActionBlock $1 Null }
|
: Stmt %prec NoElse { ActionBlock $1 Null }
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
module top;
|
||||||
|
reg clk;
|
||||||
|
initial begin
|
||||||
|
clk = 0;
|
||||||
|
repeat (100) #1 clk = ~clk;
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
assert property (@(posedge clk) 1);
|
||||||
|
assume property (@(posedge clk) 1);
|
||||||
|
cover property (@(posedge clk) 1);
|
||||||
|
initial begin
|
||||||
|
assert (1);
|
||||||
|
assume (1);
|
||||||
|
cover (1);
|
||||||
|
assume (1);
|
||||||
|
end
|
||||||
|
assert property (@(posedge clk) 1)
|
||||||
|
else $display("FOO");
|
||||||
|
assume property (@(posedge clk) 1)
|
||||||
|
$display("FOO");
|
||||||
|
else
|
||||||
|
$display("BAR");
|
||||||
|
assert property (@(posedge clk)
|
||||||
|
(1 |-> (1 |=> (1 #-# (1 #=# (1 iff 1))))));
|
||||||
|
assert property (@(posedge clk)
|
||||||
|
1 and 1 or 1 intersect 1 throughout 1 within 1);
|
||||||
|
assert property (@(posedge clk) 1 ##1 1);
|
||||||
|
assert property (@(posedge clk) ##1 1);
|
||||||
|
integer x;
|
||||||
|
assert property (@(posedge clk) first_match(1, x++, $display("a", clk), $display("b", clk)));
|
||||||
|
endmodule
|
||||||
Loading…
Reference in New Issue