Scenariusz na lab 7: ObwĂłd logiczny to obiekt matematyczny skĹadajÄ cy siÄ z bramek poĹÄ czonych drutami. KaĹźda bramka wartoĹciuje siÄ do wartoĹci prawda lub faĹsz, dochodzi do niej pewna liczba drutĂłw wejĹciowych i wychodzi zeĹ pewna liczba drutĂłw wyjĹciowych. ObwĂłd skĹada siÄ z nastÄpujÄ cych typĂłw bramek: (1) Bramki wejĹciowe: bramki bez drutĂłw wejĹciowych, ustawiane na poczÄ tku na pewnÄ konkretnÄ wartoĹÄ boolowskÄ . (2) Bramki AND: bramki z nieujemnÄ (lecz dowolnie duĹźÄ ) liczbÄ drutĂłw wejĹciowych. WartoĹÄ bramki ustawia siÄ na koniunkcjÄ (logiczne AND) wartoĹci bramek podĹÄ czonych drutami wejĹciowymi. (3) Bramki OR: tak samo jak AND, tylko dysjunkcja (logiczny OR) zamiast AND. (4) Bramki NOT: bramki z jednym drutem wejĹciowym, ustawiajÄ ce siÄ na negacjÄ bramki podĹÄ czonej tym drutem. MoĹźna sobie wyobraĹźaÄ teĹź inne bramki, na przykĹad: (5) Bramki PARITY: ustawiajÄ siÄ na true wtedy i tylko wtedy gdy nieparzyĹcie wiele wejĹciowych bramek ustawia siÄ na true. (6) Bramki MAJORITY: ustawiajÄ siÄ na true wtedy i tylko wtedy gdy ĹcisĹa wiÄkszoĹÄ bramek wejĹciowych ustawi siÄ na true. ObwĂłd logiczny ma jednÄ wyszczegĂłlnionÄ bramkÄ wyjĹciowÄ , ktĂłrej wartoĹÄ dla danego wejĹcia rozumiemy jako wartoĹÄ wynikowÄ caĹego obwodu. W ten sposĂłb obwĂłd definiuje nam funkcjÄ z ciÄ gĂłw wartoĹci boolowskich jakie wkĹadamy na bramkach wejĹciowych w pojedyĹczÄ wartoĹÄ boolowskÄ na bramce wyjĹciowej. MoĹźesz zaĹoĹźyÄ, Ĺźe w budowanych obwodach nie bÄdzie cykli (tzn. nie trzeba tego sprawdzaÄ w czasie budowy). WiÄcej informacji o obwodach moĹźna znaleĹşÄ na http://en.wikipedia.org/wiki/Logic_gate oraz http://en.wikipedia.org/wiki/Circuit_complexity . ProszÄ zaplanowaÄ i zaimplementowaÄ hierarchiÄ klas pozwalajÄ cÄ na konstrukcjÄ takich obwodĂłw logicznych. Docelowo, powinna byÄ klasa Circuit, ktĂłra oferuje nastÄpujÄ ce metody: (1) inputLength() : iloĹÄ bramek wejĹciowych. (2) depth() : gĹÄbokoĹÄ obwodu, rozumiana jako dĹugoĹÄ najdĹuĹźszej ĹcieĹźki od bramki wyjĹciowej do jakiejkolwiek bramki wejĹciowej. (3) size() : iloĹÄ bramek w obwodzie (moĹźna zaĹoĹźyÄ, Ĺźe kaĹźda bramka znajduje siÄ pod bramkÄ wyjĹciowÄ ). (4) evaluate(boolean[] input) : wartoĹÄ wynikowa obwodu dla wartoĹci zapisanych w tablicy input wstawionych do bramek wejĹciowych. UWAGA: metody te powinny siÄ liczyÄ w czasie co najwyĹźej *liniowym* od wielkoĹci obwodu (liczby drutĂłw). ProszÄ uwaĹźaÄ, Ĺźeby zĹoĹźonoĹÄ nie staĹa siÄ wykĹadnicza przez niespamiÄtywanie wynikĂłw. ProszÄ napisaÄ kilka prostych przykĹadĂłw pokazujÄ cych, Ĺźe rozwiÄ zanie dziaĹa.