#inicjalizacja load ./q3.so; source symul_lib.tcl; # ring set liczbaWierz 5 set sasiedzi(0) {4 1} set sasiedzi(1) {0 2} set sasiedzi(2) {1 3} set sasiedzi(3) {2 4} set sasiedzi(4) {3 0} fiber create $liczbaWierz { #zmienne set wielkosc 50 set por 0 set new 0 set kolor_pierwszy [wyrownaj $wielkosc [bity $id_los]] set kolor_drugi 0 set b 0 set c 0 for {set i 1} {$i < $stopien} {incr i} {wyslij $i $kolor_pierwszy} fiber yield; #główna pętla while {$run} { if {$kom(0)!=""} { set kolor_drugi $kom(0) } else { set kolor_drugi [wyrownaj $wielkosc [bity 0]] } set por [porownanieC $kolor_pierwszy $kolor_drugi] set c [lindex $por 1] set b [lindex $por 0] set new [wyrownaj $wielkosc "[bity $b]$c"] set wielkosc [expr {int(ceil(log($wielkosc)/log(2)) + 1)}] set kolor_pierwszy $new for {set i 1} {$i < $stopien} {incr i} {wyslij $i $kolor_pierwszy} fiber yield; } } #obsługa bitów set obslugaBitow { proc bity x { # postac binarna liczby usun0 [binary scan [binary format I $x] B* x; set x] } proc usun0 x { # usuwa zera poczatkowe z repr bin liczby set x [string trimleft $x 0] if {$x==""} {set x 0} set x } proc porownanieC {cv cu} { # porownuje 2 kolory, zwraca indeks oraz 2 bity... set dlcu [string len $cu] set dlcv [string len $cv] if {$dlcu<$dlcv} { set cu "[string repeat 0 [expr {$dlcv-$dlcu}]]$cu" } if {$dlcu>$dlcv} { set cv "[string repeat 0 [expr {$dlcu-$dlcv}]]$cv" } set dl [string len $cu] iterate i $dl { set i1 [expr {$dl-$i-1}] # KONIECZNIE trzeba numerowac bity od prawej gdyz # dopisuje sie 0 z lewej i wtedy indeksy by sie zmienialy! set bu [string index $cu $i1] set bv [string index $cv $i1] if {$bu != $bv} {return "$i $bv $bu"} } return {-1 ? ?} } proc wyrownaj {L x} { # dodaje 0 z lewej do L-bitow set dl [string len $x] if {$dl>$L} {error "wyrownaj"} return "[string repeat "0" [expr {$L-$dl}]]$x" } proc bin2dec x { # do 32-bitow binary scan [binary form B* [wyrownaj 32 $x]] I y set y } proc iterate {zm liIter kod} { # wygodna petla upvar $zm i for {set i 0} {$i<$liIter} {incr i} { set e [catch {uplevel $kod} x] if {$e!=0} {return -code $e $x} } } } fiber_iterate $obslugaBitow Inicjalizacja; #wizualizaca proc wizualizacja {} { fiber_iterate {_puts "$id : $kolor_pierwszy"} } #wykonanie fiber yield; runda; wizualizacja