mirror of https://github.com/zachjs/sv2v.git
actually fix unbased unsized literals in ternary exprs
This commit is contained in:
parent
71d174877d
commit
a8346f2f88
|
|
@ -3,10 +3,13 @@
|
||||||
-
|
-
|
||||||
- Conversion for unbased, unsized literals ('0, '1, 'z, 'x)
|
- Conversion for unbased, unsized literals ('0, '1, 'z, 'x)
|
||||||
-
|
-
|
||||||
- The literals are given a binary base and are made signed to enable sign
|
- The literals are given a binary base, a size of 1, and are made signed to
|
||||||
- extension. In self-determined contexts, the literals are additionally given
|
- allow sign extension. This enables the desired implicit casting in
|
||||||
- an explicit size of 1. This enables the desired implicit casting in
|
|
||||||
- Verilog-2005.
|
- Verilog-2005.
|
||||||
|
-
|
||||||
|
- However, in a ternary expressions, these literals should take on the sign and
|
||||||
|
- size of their counterpart. To work around this, we explicitly size cast these
|
||||||
|
- literlas when they appear within a ternary expression.
|
||||||
-}
|
-}
|
||||||
|
|
||||||
module Convert.UnbasedUnsized (convert) where
|
module Convert.UnbasedUnsized (convert) where
|
||||||
|
|
@ -23,26 +26,24 @@ convert =
|
||||||
digits :: [Char]
|
digits :: [Char]
|
||||||
digits = ['0', '1', 'x', 'z', 'X', 'Z']
|
digits = ['0', '1', 'x', 'z', 'X', 'Z']
|
||||||
|
|
||||||
literalFor :: String -> Char -> Expr
|
literalFor :: Char -> Expr
|
||||||
literalFor prefix ch =
|
literalFor ch =
|
||||||
if elem ch digits
|
if elem ch digits
|
||||||
then Number (prefix ++ [ch])
|
then Number ("1'sb" ++ [ch])
|
||||||
else error $ "unexpected unbased-unsized digit: " ++ [ch]
|
else error $ "unexpected unbased-unsized digit: " ++ [ch]
|
||||||
|
|
||||||
sizedLiteralFor :: Char -> Expr
|
|
||||||
sizedLiteralFor = literalFor "1'sb"
|
|
||||||
|
|
||||||
unsizedLiteralFor :: Char -> Expr
|
|
||||||
unsizedLiteralFor = literalFor "'sb"
|
|
||||||
|
|
||||||
convertExpr :: Expr -> Expr
|
convertExpr :: Expr -> Expr
|
||||||
convertExpr (Mux cond left right) =
|
convertExpr (Mux cond left right) =
|
||||||
Mux cond (convertExprUnsized left) (convertExprUnsized right)
|
Mux cond (convertExprCast left right) (convertExprCast right left)
|
||||||
convertExpr (Number ['\'', ch]) =
|
convertExpr (Number ['\'', ch]) =
|
||||||
sizedLiteralFor ch
|
literalFor ch
|
||||||
convertExpr other = other
|
convertExpr other = other
|
||||||
|
|
||||||
convertExprUnsized :: Expr -> Expr
|
convertExprCast :: Expr -> Expr -> Expr
|
||||||
convertExprUnsized (Number ['\'', ch]) =
|
convertExprCast (Number ['\'', ch]) other =
|
||||||
unsizedLiteralFor ch
|
Cast (Right size) (literalFor ch)
|
||||||
convertExprUnsized other = other
|
where
|
||||||
|
size = case other of
|
||||||
|
Number ['\'', _] -> Number "32"
|
||||||
|
_ -> DimsFn FnBits $ Right other
|
||||||
|
convertExprCast other _ = other
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ module top;
|
||||||
i = 42;
|
i = 42;
|
||||||
flag = 1;
|
flag = 1;
|
||||||
a = (flag ? '1 : i);
|
a = (flag ? '1 : i);
|
||||||
b = (flag ? 1'sb1 : i);
|
b = (flag ? 'x : i);
|
||||||
c = (flag ? '1 : '0);
|
c = (flag ? '1 : '0);
|
||||||
$display("%b", a);
|
$display("%b", a);
|
||||||
$display("%b", b);
|
$display("%b", b);
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ module top;
|
||||||
i = 42;
|
i = 42;
|
||||||
flag = 1;
|
flag = 1;
|
||||||
a = (flag ? 32'hFFFFFFFF : i);
|
a = (flag ? 32'hFFFFFFFF : i);
|
||||||
b = (flag ? 1'sb1 : i);
|
b = (flag ? 32'hXXXXXXXX : i);
|
||||||
c = (flag ? 32'hFFFFFFFF: i);
|
c = (flag ? 32'hFFFFFFFF: i);
|
||||||
$display("%b", a);
|
$display("%b", a);
|
||||||
$display("%b", b);
|
$display("%b", b);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue