/************************************************************************ ** ** FILE : simkon.c ** ** ZWECK : ** ** AUTOR : Michael C. Ancutici ** Universitaet Stuttgart, Fakultaet Informatik ** ** DATUM : 14.03.93 ** *************************************************************************/ #include "simkon.h" #include "ka.h" #include "netsize.h" #include "sim.h" #include "tra.h" /************************************************************************* ** FUNKTION: LookForKon ** ZWECK: Prueft, ob diese Transition an einem Verzweigungskonflikt ** beteiligt ist. ** EINGABE: Zeiger in TransCond und Nummer der entsprechenden Transition ** GLOBAL: nKonflikt, TransCond, sumPrio ** ANMERK: Ein Verzweigungskonflikt besteht dann, wenn von einer Stelle ** mehrere (ST-)Kanten zu Transitionen fuehren und sie derart ** markiert ist, dass dadurch mehrere Transitionen aktiv, d.h. ** schaltbereit sind. In einem solche Fall muss eine Transition ** durch eine Entscheidug von aussen ausgewaehlt werden. ** ** Konkret fuer eine spezielle Transition T: ** ** fuer alle Kanten von S nach T tue: ** fuer alle Kanten von S nach T' mit Nr(T') < Nr(T) tue: ** if Cond(T') = AKTIV ** Vorgaenger T' ist ebenfalls aktiv, aber noch nicht in ** der Konfliktmenge aufgenommen, und unterhaelt zur ** gleichen Stelle wie T eine ST-Kante: ** setze Cond(T') = KONFLIKT und ** setze Cond(T) = KONFLIKT und ** erhoehe nKonflikt um 2 ** else ** if Cond(T') = KONFLIKT ** Vorgaenger T' ist ebenfalls aktiv und bereits in der ** konfliktmenge aufgenommen. T' unterhaelt zur gleichen ** Stelle wie T eine ST-Kante. ** setze Cond(T) = KONFLIKT und ** erhoehe nKonflikt um 1 ** ** Natuerlich sind hier mit ST-Kanten nur solche gemeint, die ** keine Negativ-Kanten sind. Deshalb nachfolgend mit STpos ** bezeichnet, was aber nichts mit dem Vorzeichen ihres Gewichtes ** zu tun hat. *************************************************************************/ static void LookForKon( ca, TNr) char *ca; int TNr; { register int n; register char *c; register int i; register KANTE **ks, **kt; ks = &(KaKante[ 0][ TNr].NachTrans); for (i=0; iNegativKante) ) for (n=TNr, kt=ks-2, c=ca-1; n>0; n--, c--, kt-=2) if ( (*kt) && !((*kt)->NegativKante) ) if (*c == AKTIV) { nKonflikt+=2; *c = *ca = KONFLIKT; sumPrio += TraTrans[ TNr]->Prio + TraTrans[ n]->Prio; return; } else if (*c == KONFLIKT) { nKonflikt++; *ca = KONFLIKT; sumPrio += TraTrans[ TNr]->Prio; return; } } /************************************************************************* ** FUNKTION: SimKonflikt ** ZWECK: Markiert in TransCond alle AKTIVen Transitionen, die an einem ** Verzweigungskonflikt beteiligt sind. ** GLOBAL: TransCond wird veraendert und der Zaehler nKonflikt gesetzt. ** sumPrio ueber KONFLIKTbehaftete Transitionen *************************************************************************/ void SimKonflikt() { register int i; register char *c; sumPrio = nKonflikt = 0; if (nAktiv < 2) return; for (i=1, c=TransCond+1; iNegativKante) ) for (c=TransCond, kt=ks-(TNr<<1); c < cEnde; c++, kt+=2) if ( (*kt) && !((*kt)->NegativKante) && (*c==KONFLIKT) ) *c=TOT; }