kansas-lava-0.2.4: Language/KansasLava/Netlist/Decl.hs
-- | This module generates Netlist 'Decl's for a circuit graph.
module Language.KansasLava.Netlist.Decl where
import Language.KansasLava.Types
import Language.Netlist.AST
import Data.Reify.Graph (Unique)
import Language.KansasLava.Netlist.Utils
-- Entities that need a _next special *extra* signal.
--toAddNextSignal :: [Id]
--toAddNextSignal = [Prim "register"]
-- We have a few exceptions, where we generate some extra signals,
-- but in general, we generate a single signal decl for each
-- entity.
-- | Generate declarations.
genDecl :: (Unique, Entity Unique) -> [Decl]
-- Special cases
{-
genDecl (i,Entity nm outputs _)
| nm `elem` toAddNextSignal
= concat
[ [ NetDecl (next $ sigName n i) (sizedRange nTy) Nothing
, MemDecl (sigName n i) Nothing (sizedRange nTy)
]
| (n,nTy) <- outputs ]
genDecl (i,e@(Entity nm outputs@[_] inputs)) | nm == Prim "BRAM"
= concat
[ [ MemDecl (sigName n i) (memRange aTy) (sizedRange nTy)
, NetDecl (sigName n i) (sizedRange nTy) Nothing
]
| (n,nTy) <- outputs ]
where
aTy = lookupInputType "wAddr" e
genDecl (i,Entity nm outputs _)
| nm `elem` isVirtualEntity
= []
-}
-- General case
genDecl (i,e@(Entity _ outputs _))
= [ case toStdLogicTy nTy of
MatrixTy x (V y)
-> let x' = head [ po2 | po2 <- iterate (*2) 1
, po2 >= x
]
in MemDecl
(sigName n i)
(sizedRange (V x'))
(sizedRange (V y))
(case e of
Entity (Prim "rom")
[("o0",_)]
[("defs",RomTy _,Lits lits)]
-- This is reversed because we defined from (n-1) downto 0
-> Just $ reverse $ map (toTypedExpr (V y))
$ take x'
(lits ++ repeat (RepValue $ replicate y $ Just False))
_ -> Nothing
)
_ -> NetDecl
(sigName n i)
(sizedRange nTy)
(case e of
Entity (Prim "register")
[("o0",ty)]
[ _, ("def",GenericTy,gn), _, _, _] ->
Just (toTypedExpr ty gn)
_ -> Nothing)
| (n,nTy) <- outputs
, toStdLogicTy nTy /= V 0
]