--------------------------------------------------------------------------------
-- |
-- Module       :  Language.Netlist.Examples
-- Copyright    :  (c) Signali Corp. 2010
-- License      :  All rights reserved
--
-- Maintainer   : pweaver@signalicorp.com
-- Stability    : experimental
-- Portability  : non-portable
--
-- Examples of Netlist AST.
--------------------------------------------------------------------------------

{-# 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" ([(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 [(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) (ConstExpr -> Maybe ConstExpr
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) (ConstExpr -> Maybe ConstExpr
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" Maybe Range
forall a. Maybe a
Nothing (Direction -> Size -> Maybe Range
makeRange Direction
Down Size
16) Maybe [ConstExpr]
forall a. Maybe a
Nothing
     , Event -> Maybe (Event, Stmt) -> Stmt -> Decl
ProcessDecl (ConstExpr -> Edge -> Event
Event (Ident -> ConstExpr
ExprVar Ident
"clk") Edge
PosEdge)
                   ((Event, Stmt) -> Maybe (Event, Stmt)
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"))
                         Maybe Stmt
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 (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
    (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 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
    (ConstExpr
e0:ConstExpr
e1:ConstExpr
e2:[ConstExpr]
_) = [ConstExpr]
var_exprs
    (Stmt
_:Stmt
s1:Stmt
s2:[Stmt]
_) = [Stmt]
stmts

-- -----------------------------------------------------------------------------