ArrowVHDL-1.0: src/System/ArrowVHDL/Circuit/Tests.hs
-- 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