{-# LANGUAGE ParallelListComp #-}
module Language.Netlist.Examples where
import Language.Netlist.AST
import Language.Netlist.Util
t :: Module
t :: Module
t = Ident
-> [(Ident, Maybe Range)]
-> [(Ident, Maybe Range)]
-> [(Ident, ConstExpr)]
-> [Decl]
-> Module
Module "foo" ([(Ident, Size)] -> [(Ident, Maybe Range)]
forall a. [(a, Size)] -> [(a, Maybe Range)]
f [(Ident, Size)]
ins) ([(Ident, Size)] -> [(Ident, Maybe Range)]
forall a. [(a, Size)] -> [(a, Maybe Range)]
f [(Ident, Size)]
outs) [] [Decl]
ds
where
f :: [(a, Size)] -> [(a, Maybe Range)]
f xs :: [(a, Size)]
xs = [ (a
x, Direction -> Size -> Maybe Range
makeRange Direction
Down Size
sz) | (x :: a
x, sz :: Size
sz) <- [(a, Size)]
xs ]
ins :: [(Ident, Size)]
ins = [("clk", 1), ("reset", 1), ("enable", 1), ("x", 16)]
outs :: [(Ident, Size)]
outs = [("z", 16)]
ds :: [Decl]
ds :: [Decl]
ds = [ Ident -> Maybe Range -> Maybe ConstExpr -> Decl
NetDecl "a" (Direction -> Size -> Maybe Range
makeRange Direction
Down 16) (ConstExpr -> Maybe ConstExpr
forall a. a -> Maybe a
Just (Ident -> ConstExpr
ExprVar "x"))
, Ident -> Maybe Range -> Maybe ConstExpr -> Decl
NetDecl "b" (Direction -> Size -> Maybe Range
makeRange Direction
Down 16) (ConstExpr -> Maybe ConstExpr
forall a. a -> Maybe a
Just (Size -> Integer -> ConstExpr
sizedInteger 16 10))
, Ident -> Maybe Range -> Maybe Range -> Maybe [ConstExpr] -> Decl
MemDecl "c" Maybe Range
forall a. Maybe a
Nothing (Direction -> Size -> Maybe Range
makeRange Direction
Down 16) Maybe [ConstExpr]
forall a. Maybe a
Nothing
, Event -> Maybe (Event, Stmt) -> Stmt -> Decl
ProcessDecl (ConstExpr -> Edge -> Event
Event (Ident -> ConstExpr
ExprVar "clk") Edge
PosEdge)
((Event, Stmt) -> Maybe (Event, Stmt)
forall a. a -> Maybe a
Just (ConstExpr -> Edge -> Event
Event (Ident -> ConstExpr
ExprVar "reset") Edge
PosEdge, (ConstExpr -> ConstExpr -> Stmt
Assign (Ident -> ConstExpr
ExprVar "c") (Size -> Integer -> ConstExpr
sizedInteger 16 0))))
(ConstExpr -> Stmt -> Maybe Stmt -> Stmt
If (Ident -> ConstExpr
ExprVar "enable")
(ConstExpr -> ConstExpr -> Stmt
Assign (Ident -> ConstExpr
ExprVar "c") (Ident -> ConstExpr
ExprVar "x"))
Maybe Stmt
forall a. Maybe a
Nothing)
]
var_exprs :: [Expr]
var_exprs :: [ConstExpr]
var_exprs = [ Ident -> ConstExpr
ExprVar [Char
x] | Char
x <- "abcdefghijklmnopqrstuvwxyz" ]
stmts :: [Stmt]
stmts :: [Stmt]
stmts = [ ConstExpr -> ConstExpr -> Stmt
Assign ConstExpr
x (Integer -> ConstExpr
unsizedInteger Integer
i) | ConstExpr
x <- [ConstExpr]
var_exprs | Integer
i <- [0..] ]
if0 :: Stmt
if0 :: Stmt
if0 = ConstExpr -> Stmt -> Maybe Stmt -> Stmt
If ConstExpr
e0 Stmt
s0 (Maybe Stmt -> Stmt) -> Maybe Stmt -> Stmt
forall a b. (a -> b) -> a -> b
$ Stmt -> Maybe Stmt
forall a. a -> Maybe a
Just (Stmt -> Maybe Stmt) -> Stmt -> Maybe Stmt
forall a b. (a -> b) -> a -> b
$
ConstExpr -> Stmt -> Maybe Stmt -> Stmt
If ConstExpr
e1 Stmt
s1' (Maybe Stmt -> Stmt) -> Maybe Stmt -> Stmt
forall a b. (a -> b) -> a -> b
$ Stmt -> Maybe Stmt
forall a. a -> Maybe a
Just (Stmt -> Maybe Stmt) -> Stmt -> Maybe Stmt
forall a b. (a -> b) -> a -> b
$
ConstExpr -> Stmt -> Maybe Stmt -> Stmt
If ConstExpr
e2 Stmt
s2' (Maybe Stmt -> Stmt) -> Maybe Stmt -> Stmt
forall a b. (a -> b) -> a -> b
$ Stmt -> Maybe Stmt
forall a. a -> Maybe a
Just Stmt
s3'
where
s1' :: Stmt
s1' = [Stmt] -> Stmt
Seq [Stmt
s1, Stmt
s2, Stmt
s3]
s2' :: Stmt
s2' = [Stmt] -> Stmt
Seq [Stmt
s4, Stmt
s5, Stmt
s6]
s3' :: Stmt
s3' = Stmt
s7
(e0 :: ConstExpr
e0:e1 :: ConstExpr
e1:e2 :: ConstExpr
e2:_) = [ConstExpr]
var_exprs
(s0 :: Stmt
s0:s1 :: Stmt
s1:s2 :: Stmt
s2:s3 :: Stmt
s3:s4 :: Stmt
s4:s5 :: Stmt
s5:s6 :: Stmt
s6:s7 :: Stmt
s7:_) = [Stmt]
stmts
if1 :: Stmt
if1 :: Stmt
if1 = ConstExpr -> Stmt -> Maybe Stmt -> Stmt
If ConstExpr
e0 (ConstExpr -> Stmt -> Maybe Stmt -> Stmt
If ConstExpr
e1 Stmt
s1 Maybe Stmt
forall a. Maybe a
Nothing) (Stmt -> Maybe Stmt
forall a. a -> Maybe a
Just (ConstExpr -> Stmt -> Maybe Stmt -> Stmt
If ConstExpr
e2 Stmt
s2 Maybe Stmt
forall a. Maybe a
Nothing))
where
(e0 :: ConstExpr
e0:e1 :: ConstExpr
e1:e2 :: ConstExpr
e2:_) = [ConstExpr]
var_exprs
(_:s1 :: Stmt
s1:s2 :: Stmt
s2:_) = [Stmt]
stmts