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