111 lines
2.5 KiB
Tcl
111 lines
2.5 KiB
Tcl
|
|
#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 |