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