/************************************************************************ ** ** FILE : simstep.h ** ** ZWECK : ** ** AUTOR : Michael C. Ancutici ** Universitaet Stuttgart, Fakultaet Informatik ** ** DATUM : 14.03.93 ** *************************************************************************/ #ifndef SIMSTEP_H #define SIMSTEP_H #include "celltype.h" /************************************************************************* ** FUNKTION: SimStepS ** ZWECK: Fuehrt eine Schaltung (seriell) aus. ** EINGABE: TNr der schaltenden Transition. ** GLOBAL: Markierung in Mark geaendert. ** BreakList evtl. vergroessert. ** RETURN: NULL falls BreakList leer, sonst Zeiger auf erstes ** Element. ** ANMERK: ACHTUNG: ** In Mark m wird die negative Markierung der realen ** Markierung M gehalten, d.h. m = -M. ** neue Markierung N = f( M, S, T) ** N = M + ( d(ST) + d(TS) ) ** -N = -M - ( d(ST) + d(TS) ) ** n = m - ( d(ST) + d(TS) ) mit n = -N ** Dabei ist d(ST) = Gewicht der ST-Kante und ** d(TS) = Gewicht der TS-Kante mit negativem Vorzeichen, ** d.h. d(TS) = -| d(TS) | *************************************************************************/ extern OBJECT *SimStepS( int); /************************************************************************* ** FUNKTION: SimStepP ** ZWECK: Fuehrt einen ParallelSCHRITT durch. Dieser besteht aus der ** sequentiellen Ausfuehrung von EinzelSCHALTUNGEN. Es schalten ** nur diejenigen Transitionen, die sich im Zustand AKTIV ** befinden. ** GLOBAL: Markierung in Mark aktualisiert und evtl BreakList erweitert. ** RETURN: Zeiger auf erstes Breakelement in BreakList. ** ANMERK: Jetzt schalten alle aktiven Transitionen in der Reihenfolge ** ihrer Nummerierung. In SimStepS wird nach jeder Schaltung auf ** eine positive Breakbedingung getestet und die BreakList ** entsprechend ERWEITERT, d.h. nur hinzugefuegt. Wenn jetzt ** aber der Fall eintritt, dass nach einer darauffolgenden ** Schaltung die neue Markierung eine negative Breakbedingung ** liefert, dann wird die zuvor in die BreakList eingetragene ** Stelle NICHT entfernt. SimStepP testet seinerseits nicht auf ** Breaks nach jeder Schaltung, sondern laesst stur jede weitere ** aktive Transition schalten. Somit kann nach einem folgendes ** passieren: ** ** Vor SimStepP: ** 1. Break > 10 auf S2 ** 2. (S1, 1) -> (T1) -10-> (S2, 1) -> (T2) -> (S3, 0) ** ** Nach SimStepP zwei moegliche Zustaende: ** 1. T2 schaltet: ** (S1, 1) -> (T1) -10-> (S2, 0) -> (T2) -> (S3, 1) ** T1 schaltet: ** (S1, 0) -> (T1) -10-> (S2, 10) -> (T2) -> (S3, 1) ** ** 2. T1 schaltet ** (S1, 0) -> (T1) -10-> (S2, 11) -> (T2) -> (S3, 0) ** Breakbedingung >10 in S2 erfuellt. ** T2 schaltet: ** (S1, 0) -> (T1) -10-> (S2, 10) -> (T2) -> (S3, 1) ** ** FAZIT: ** Wenn nach einem Parallelschritt Breaks vorliegen, heisst das, ** dass die entsprechenden Stellen (und nur Stellen) WAEHREND der ** Ausfuehrung des Schrittes irgendeinmal der Breakbedingung ** entsprochen haben. ** ** ALTERNATIVEN: ** 1. Sofortiger Abbruch des Schrittes, falls eine Schaltung ** ein Break ausloest. Dann haben aber nicht alle Transitionen ** schalten lassen, die aktiv sind. ** 2. Breakelement aus BreakList wieder entfernen. Teuer. ** *************************************************************************/ OBJECT *SimStepP(); #endif