Commit d6d3938d by Zachary Snow

fix codegen for assertion property and sequence expressions

- updated representation and added codegen for sequence match items
- fix incorrect codegen for `iff` property expression
parent 54ea7d55
...@@ -309,14 +309,14 @@ traverseAssertionExprsM mapper = assertionMapper ...@@ -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 ...@@ -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) ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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 ...@@ -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] } ...@@ -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 }
......
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
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