-- Dieses Modul beschreibt eine Reihe von Funktionen zum prüfen von Eigenschaften. Diese Funktionen haben eine Gemeinsamkeit, nämlich dass sie
-- letztlich immer einen \hsSource{Bool}-Wert erzeugen. 


module System.ArrowVHDL.Circuit.Tests 
where

-- Lediglich das Modul \hsSource{Circuit.Descriptor} wird benötigt


import System.ArrowVHDL.Circuit.Descriptor


-- Die Funktion \hsSource{isFromOrToComp} ermittelt ob eine übergebene Kante eine Verbindung zu einer Komponente, die über ihre Komponenten ID
-- identifiziert wird, darstellt.

isFromOrToComp :: CompID -> Edge -> Bool
isFromOrToComp cid (MkEdge (Nothing, pi) (Just co, po)) = cid == co
isFromOrToComp cid (MkEdge (Just ci, pi) (Nothing, po)) = cid == ci
isFromOrToComp cid (MkEdge (Just ci, pi) (Just co, po)) = cid == co 


-- Jeder Schaltkreis besitzt eine innere Verschaltung und daneben eine Verbindung zur Außenwelt. Eine Kante kann von ``Außen'' her kommen, oder
-- nach ``Außen'' gehen. Genau diese Kanten sind die Pins eines tatsächlichen Chips. 


-- Mit \hsSource{isToOuter} wird getestet, ob es sich um eine abgehende Kante, also einen ``outgoing''-Pin handelt.

isToOuter :: Edge -> Bool
isToOuter (MkEdge (_, _) (Nothing, _)) = True
isToOuter _                            = False


-- \par Das Pendant zu abgehenden Kanten sind eingehende Kanten. Diese werden auch als Inputs bezeichnet. \hsSource{isFromOuter} testet, ob
-- eine Kante eingehend ist.

isFromOuter :: Edge -> Bool
isFromOuter (MkEdge (Nothing, _) (_, _)) = True
isFromOuter _                            = False




-- Mit der Funktion \hsSource{hasLabel} wird überprüft, ob ein Schaltkreis den übergebenen Namen trägt.

hasLabel :: String -> CircuitDescriptor -> Bool
hasLabel s
    = ((== s).label.nodeDesc)


-- \hsSource{isAtomic} überprüft, ob ein Baustein atomar ist, also ob er aus weiteren Bausteinen zusammengesetzt ist, oder nicht.

isAtomic :: CircuitDescriptor -> Bool
isAtomic g
    = if (length (nodes g) == 0) then True else False


-- Die Funktion \hsSource{isSuperNodeOf} testet, ob eine Komponente eine bestimmte andere Komponente, identifiziert durch ihre Komponenten ID,
-- enthält.

isSuperNodeOf :: CircuitDescriptor -> CompID -> Bool
isSuperNodeOf g cid 
    = if length (filter (== cid) subNodes) > 0
        then True
        else False
    where subNodes = map (nodeId.nodeDesc) $ nodes g


-- Mit der Funktion \hsSource{isGenerated} lässt sich herausfinden, ob einen Komponente eine vom Entwickler entwickelte Komponente ist, oder ob
-- diese Komponente automatisch vom System erzeugt wurde.

isGenerated :: CircuitDescriptor -> Bool
isGenerated s = ((== '|').head.label.nodeDesc) s && ((== '|').head.reverse.label.nodeDesc) s



-- %%% TODO : isID ist nur eine debugging funktion und muss rausgenommen werden

isID :: CircuitDescriptor -> Bool
isID = hasLabel "-ID-"

-- In einem weiteren Test wird die Art der Schaltung überprüft. Handelt es sich bei dem vorliegenden \hsSource{CircuitDescriptor} um einen
-- Kombinatorischen Schaltkreis, um ein Register oder um eine Schleife?

isCombinatorial :: CircuitDescriptor -> Bool
isCombinatorial (MkCombinatorial _ _ _ _ _) = True
isCombinatorial otherwise           = False

isRegister :: CircuitDescriptor -> Bool
isRegister (MkRegister _ _) = True
isRegister otherwise      = False

isLoop :: CircuitDescriptor -> Bool
isLoop (MkLoop _ _ _ _) = True
isLoop otherwise        = False
