module Language.Netlist.Util where
import Language.Netlist.AST
data Direction = Up | Down
unsizedInteger :: Integer -> Expr
unsizedInteger :: Integer -> Expr
unsizedInteger = forall a. Integral a => a -> Expr
unsizedIntegral
unsizedIntegral :: Integral a => a -> Expr
unsizedIntegral :: forall a. Integral a => a -> Expr
unsizedIntegral = Maybe Size -> ExprLit -> Expr
ExprLit forall a. Maybe a
Nothing forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> ExprLit
ExprNum forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Integral a => a -> Integer
toInteger
sizedInteger :: Int -> Integer -> Expr
sizedInteger :: Size -> Integer -> Expr
sizedInteger = forall a. Integral a => Size -> a -> Expr
sizedIntegral
sizedIntegral :: Integral a => Int -> a -> Expr
sizedIntegral :: forall a. Integral a => Size -> a -> Expr
sizedIntegral Size
sz = Maybe Size -> ExprLit -> Expr
ExprLit (forall a. a -> Maybe a
Just Size
sz) forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> ExprLit
ExprNum forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Integral a => a -> Integer
toInteger
makeRange :: Direction -> Size -> Maybe Range
makeRange :: Direction -> Size -> Maybe Range
makeRange Direction
_ Size
1 = forall a. Maybe a
Nothing
makeRange Direction
d Size
sz
| Size
sz forall a. Ord a => a -> a -> Bool
> Size
1
= let upper :: Expr
upper = forall a. Integral a => a -> Expr
unsizedIntegral (Size
sz forall a. Num a => a -> a -> a
- Size
1)
lower :: Expr
lower = Integer -> Expr
unsizedInteger Integer
0
in forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ case Direction
d of
Direction
Up -> Expr -> Expr -> Range
Range Expr
lower Expr
upper
Direction
Down -> Expr -> Expr -> Range
Range Expr
upper Expr
lower
| Bool
otherwise
= forall a. HasCallStack => [Char] -> a
error ([Char]
"makeRange: invalid size: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Size
sz)
exprConcat :: [Expr] -> Expr
exprConcat :: [Expr] -> Expr
exprConcat [Expr
e] = Expr
e
exprConcat [Expr]
es = [Expr] -> Expr
ExprConcat [Expr]
es
statements :: [Stmt] -> Stmt
statements :: [Stmt] -> Stmt
statements [Stmt
x] = Stmt
x
statements [Stmt]
xs = [Stmt] -> Stmt
Seq [Stmt]
xs
generateReg :: Expr -> Expr -> Maybe (Expr, Expr) -> Maybe (Expr, Expr) ->
Maybe Expr -> Expr -> Decl
generateReg :: Expr
-> Expr
-> Maybe (Expr, Expr)
-> Maybe (Expr, Expr)
-> Maybe Expr
-> Expr
-> Decl
generateReg Expr
x Expr
clk Maybe (Expr, Expr)
mb_reset Maybe (Expr, Expr)
mb_restart Maybe Expr
mb_enable Expr
expr
= Event -> Maybe (Event, Stmt) -> Stmt -> Decl
ProcessDecl (Expr -> Edge -> Event
Event Expr
clk Edge
PosEdge) Maybe (Event, Stmt)
mb_reset' Stmt
stmt2
where
mb_reset' :: Maybe (Event, Stmt)
mb_reset' = case Maybe (Expr, Expr)
mb_reset of
Just (Expr
reset, Expr
initial) -> forall a. a -> Maybe a
Just (Expr -> Edge -> Event
Event Expr
reset Edge
PosEdge, Expr -> Expr -> Stmt
Assign Expr
x Expr
initial)
Maybe (Expr, Expr)
Nothing -> forall a. Maybe a
Nothing
stmt2 :: Stmt
stmt2 = case Maybe (Expr, Expr)
mb_restart of
Just (Expr
restart, Expr
initial)
-> Expr -> Stmt -> Maybe Stmt -> Stmt
If Expr
restart (Expr -> Expr -> Stmt
Assign Expr
x Expr
initial) (forall a. a -> Maybe a
Just Stmt
stmt1)
Maybe (Expr, Expr)
Nothing
-> Stmt
stmt1
stmt1 :: Stmt
stmt1 = case Maybe Expr
mb_enable of
Just Expr
enable -> Expr -> Stmt -> Maybe Stmt -> Stmt
If Expr
enable Stmt
stmt0 forall a. Maybe a
Nothing
Maybe Expr
Nothing -> Stmt
stmt0
stmt0 :: Stmt
stmt0 = Expr -> Expr -> Stmt
Assign Expr
x Expr
expr