--- | A flattened function application
-data FApp sigid = FApp {
- appFunc :: HsFunction,
- appArgs :: [SignalMap sigid],
- appRes :: SignalMap sigid
-} deriving (Show, Eq)
-
--- | A conditional signal definition
-data CondDef sigid = CondDef {
- cond :: sigid,
- high :: sigid,
- low :: sigid,
- condRes :: sigid
-} deriving (Show, Eq)
+hasState :: HsFunction -> Bool
+hasState hsfunc =
+ any (Foldable.any isStateUse) (hsFuncArgs hsfunc)
+ || Foldable.any isStateUse (hsFuncRes hsfunc)
+
+-- | Something that defines a signal
+data SigDef =
+ -- | A flattened function application
+ FApp {
+ appFunc :: HsFunction,
+ appArgs :: [SignalMap],
+ appRes :: SignalMap
+ }
+ -- | A conditional signal definition
+ | CondDef {
+ cond :: SignalId,
+ high :: SignalId,
+ low :: SignalId,
+ condRes :: SignalId
+ }
+ -- | Unconditional signal definition
+ | UncondDef {
+ defSrc :: Either SignalId SignalExpr,
+ defDst :: SignalId
+ } deriving (Show, Eq)
+
+-- | An expression on signals
+data SignalExpr =
+ EqLit SignalId String -- ^ Is the given signal equal to the given (VHDL) literal
+ | Literal String -- ^ A literal value
+ | Eq SignalId SignalId -- ^ A comparison between to signals
+ deriving (Show, Eq)
+
+-- Returns the function used by the given SigDef, if any
+usedHsFunc :: SigDef -> Maybe HsFunction
+usedHsFunc (FApp hsfunc _ _) = Just hsfunc
+usedHsFunc _ = Nothing
+
+-- | How is a given signal used in the resulting VHDL?
+data SigUse =
+ SigPortIn -- | Use as an input port
+ | SigPortOut -- | Use as an input port
+ | SigInternal -- | Use as an internal signal
+ | SigStateOld StateId -- | Use as the current internal state
+ | SigStateNew StateId -- | Use as the new internal state
+ | SigSubState -- | Do not use, state variable is used in a subcircuit
+
+-- | Is this a port signal use?
+isPortSigUse :: SigUse -> Bool
+isPortSigUse SigPortIn = True
+isPortSigUse SigPortOut = True
+isPortSigUse _ = False
+
+-- | Is this a state signal use? Returns false for substate.
+isStateSigUse :: SigUse -> Bool
+isStateSigUse (SigStateOld _) = True
+isStateSigUse (SigStateNew _) = True
+isStateSigUse _ = False
+
+-- | Is this an internal signal use?
+isInternalSigUse :: SigUse -> Bool
+isInternalSigUse SigInternal = True
+isInternalSigUse _ = False