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 03:40:59 +02:00
|
|
|
- The literals are given a binary base and are made signed to enable sign
|
|
|
|
|
- extension. In self-determined contexts, the literals are additionally given
|
|
|
|
|
- an explicit size of 1. This enables the desired implicit casting in
|
2019-09-19 05:35:15 +02:00
|
|
|
- Verilog-2005.
|
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 03:40:59 +02:00
|
|
|
literalFor :: String -> Char -> Expr
|
|
|
|
|
literalFor prefix ch =
|
2019-03-19 18:40:25 +01:00
|
|
|
if elem ch digits
|
2020-06-06 03:40:59 +02:00
|
|
|
then Number (prefix ++ [ch])
|
2019-03-19 18:40:25 +01:00
|
|
|
else error $ "unexpected unbased-unsized digit: " ++ [ch]
|
2020-06-06 03:40:59 +02:00
|
|
|
|
|
|
|
|
sizedLiteralFor :: Char -> Expr
|
|
|
|
|
sizedLiteralFor = literalFor "1'sb"
|
|
|
|
|
|
|
|
|
|
unsizedLiteralFor :: Char -> Expr
|
|
|
|
|
unsizedLiteralFor = literalFor "'sb"
|
|
|
|
|
|
|
|
|
|
convertExpr :: Expr -> Expr
|
|
|
|
|
convertExpr (Mux cond left right) =
|
|
|
|
|
Mux cond (convertExprUnsized left) (convertExprUnsized right)
|
|
|
|
|
convertExpr (Number ['\'', ch]) =
|
|
|
|
|
sizedLiteralFor ch
|
2019-03-19 18:40:25 +01:00
|
|
|
convertExpr other = other
|
2020-06-06 03:40:59 +02:00
|
|
|
|
|
|
|
|
convertExprUnsized :: Expr -> Expr
|
|
|
|
|
convertExprUnsized (Number ['\'', ch]) =
|
|
|
|
|
unsizedLiteralFor ch
|
|
|
|
|
convertExprUnsized other = other
|