--------------------------------------------------------------------------------
-- |
-- 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 "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

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