mirror of https://github.com/zachjs/sv2v.git
simplify handles division and unsized decimal constants
This commit is contained in:
parent
2ee837f7b0
commit
e4cd8f4c09
|
|
@ -106,17 +106,25 @@ clog2Help p n = if p >= n then 0 else 1 + clog2Help (p*2) n
|
||||||
clog2 :: Int -> Int
|
clog2 :: Int -> Int
|
||||||
clog2 n = if n < 2 then 0 else clog2Help 1 n
|
clog2 n = if n < 2 then 0 else clog2Help 1 n
|
||||||
|
|
||||||
|
readNumber :: String -> Maybe Int
|
||||||
|
readNumber n =
|
||||||
|
readMaybe n' :: Maybe Int
|
||||||
|
where
|
||||||
|
n' = case n of
|
||||||
|
'\'' : 'd' : rest -> rest
|
||||||
|
_ -> n
|
||||||
|
|
||||||
-- basic expression simplfication utility to help us generate nicer code in the
|
-- basic expression simplfication utility to help us generate nicer code in the
|
||||||
-- common case of ranges like `[FOO-1:0]`
|
-- common case of ranges like `[FOO-1:0]`
|
||||||
simplify :: Expr -> Expr
|
simplify :: Expr -> Expr
|
||||||
simplify (orig @ (Call "$clog2" (Args [Just (Number n)] []))) =
|
simplify (orig @ (Call "$clog2" (Args [Just (Number n)] []))) =
|
||||||
case readMaybe n :: Maybe Int of
|
case readNumber n of
|
||||||
Nothing -> orig
|
Nothing -> orig
|
||||||
Just x -> Number $ show $ clog2 x
|
Just x -> Number $ show $ clog2 x
|
||||||
simplify (Mux (BinOp Ge c1 c2) e1 e2) =
|
simplify (Mux (BinOp Ge c1 c2) e1 e2) =
|
||||||
case (c1', c2') of
|
case (c1', c2') of
|
||||||
(Number a, Number b) ->
|
(Number a, Number b) ->
|
||||||
case (readMaybe a :: Maybe Int, readMaybe b :: Maybe Int) of
|
case (readNumber a, readNumber b) of
|
||||||
(Just x, Just y) ->
|
(Just x, Just y) ->
|
||||||
if x >= y
|
if x >= y
|
||||||
then e1
|
then e1
|
||||||
|
|
@ -141,13 +149,15 @@ simplify (BinOp op e1 e2) =
|
||||||
(Add, BinOp Sub e (Number "1"), Number "1") -> e
|
(Add, BinOp Sub e (Number "1"), Number "1") -> e
|
||||||
(Add, e, BinOp Sub (Number "0") (Number "1")) -> BinOp Sub e (Number "1")
|
(Add, e, BinOp Sub (Number "0") (Number "1")) -> BinOp Sub e (Number "1")
|
||||||
(_ , Number a, Number b) ->
|
(_ , Number a, Number b) ->
|
||||||
case (op, readMaybe a :: Maybe Int, readMaybe b :: Maybe Int) of
|
case (op, readNumber a, readNumber b) of
|
||||||
(Add, Just x, Just y) -> Number $ show (x + y)
|
(Add, Just x, Just y) -> Number $ show (x + y)
|
||||||
(Sub, Just x, Just y) -> Number $ show (x - y)
|
(Sub, Just x, Just y) -> Number $ show (x - y)
|
||||||
(Mul, Just x, Just y) -> Number $ show (x * y)
|
(Mul, Just x, Just y) -> Number $ show (x * y)
|
||||||
|
(Div, Just _, Just 0) -> Number "x"
|
||||||
|
(Div, Just x, Just y) -> Number $ show (x `quot` y)
|
||||||
_ -> BinOp op e1' e2'
|
_ -> BinOp op e1' e2'
|
||||||
(Add, BinOp Add e (Number a), Number b) ->
|
(Add, BinOp Add e (Number a), Number b) ->
|
||||||
case (readMaybe a :: Maybe Int, readMaybe b :: Maybe Int) of
|
case (readNumber a, readNumber b) of
|
||||||
(Just x, Just y) -> BinOp Add e $ Number $ show (x + y)
|
(Just x, Just y) -> BinOp Add e $ Number $ show (x + y)
|
||||||
_ -> BinOp op e1' e2'
|
_ -> BinOp op e1' e2'
|
||||||
_ -> BinOp op e1' e2'
|
_ -> BinOp op e1' e2'
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue