2019-03-19 18:40:25 +01:00
|
|
|
{- sv2v
|
|
|
|
|
- Author: Zachary Snow <zach@zachjs.com>
|
|
|
|
|
-
|
|
|
|
|
- Conversion for unbased, unsized literals ('0, '1, 'z, 'x)
|
|
|
|
|
-
|
2020-06-06 23:01:27 +02:00
|
|
|
- The literals are given a binary base, a size of 1, and are made signed to
|
|
|
|
|
- allow sign extension. This enables the desired implicit casting in
|
2019-09-19 05:35:15 +02:00
|
|
|
- Verilog-2005.
|
2020-06-06 23:01:27 +02:00
|
|
|
-
|
|
|
|
|
- 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.
|
2019-03-19 18:40:25 +01:00
|
|
|
-}
|
|
|
|
|
|
|
|
|
|
module Convert.UnbasedUnsized (convert) where
|
|
|
|
|
|
|
|
|
|
import Convert.Traverse
|
|
|
|
|
import Language.SystemVerilog.AST
|
|
|
|
|
|
2019-04-24 00:44:45 +02:00
|
|
|
convert :: [AST] -> [AST]
|
2019-03-19 18:40:25 +01:00
|
|
|
convert =
|
2019-04-24 00:44:45 +02:00
|
|
|
map $
|
2019-03-19 18:40:25 +01:00
|
|
|
traverseDescriptions $ traverseModuleItems $
|
|
|
|
|
traverseExprs $ traverseNestedExprs convertExpr
|
|
|
|
|
|
|
|
|
|
digits :: [Char]
|
|
|
|
|
digits = ['0', '1', 'x', 'z', 'X', 'Z']
|
|
|
|
|
|
2020-06-06 23:01:27 +02:00
|
|
|
literalFor :: Char -> Expr
|
|
|
|
|
literalFor ch =
|
2019-03-19 18:40:25 +01:00
|
|
|
if elem ch digits
|
2020-06-06 23:01:27 +02:00
|
|
|
then Number ("1'sb" ++ [ch])
|
2019-03-19 18:40:25 +01:00
|
|
|
else error $ "unexpected unbased-unsized digit: " ++ [ch]
|
2020-06-06 03:40:59 +02:00
|
|
|
|
|
|
|
|
convertExpr :: Expr -> Expr
|
|
|
|
|
convertExpr (Mux cond left right) =
|
2020-06-06 23:01:27 +02:00
|
|
|
Mux cond (convertExprCast left right) (convertExprCast right left)
|
2020-06-06 03:40:59 +02:00
|
|
|
convertExpr (Number ['\'', ch]) =
|
2020-06-06 23:01:27 +02:00
|
|
|
literalFor ch
|
2019-03-19 18:40:25 +01:00
|
|
|
convertExpr other = other
|
2020-06-06 03:40:59 +02:00
|
|
|
|
2020-06-06 23:01:27 +02:00
|
|
|
convertExprCast :: Expr -> Expr -> Expr
|
|
|
|
|
convertExprCast (Number ['\'', ch]) other =
|
|
|
|
|
Cast (Right size) (literalFor ch)
|
|
|
|
|
where
|
|
|
|
|
size = case other of
|
|
|
|
|
Number ['\'', _] -> Number "32"
|
|
|
|
|
_ -> DimsFn FnBits $ Right other
|
|
|
|
|
convertExprCast other _ = other
|