================================================================================

                                   PRAM simulator
                              author: Gyorgy Tomcsanyi
			  email: tomcsanyi2@uniba.sk
		  www: http://www.st.fmph.uniba.sk/~tomcsanyi2/pram/

================================================================================

Pred prácou s programom sa prosím uistite, že použivate aktuálnu verziu zo stránky uvedenej vyššie.
Nová verzia môže obsahovať novú funkčnosť a hlavne opravy bugov.

Kompilácia:
	Projekt sa skompiluje príkazom make. Zdrojové súbory sú v adresári src.

	Prerekvizity:
		- gcc
		- bison
		- flex
		- make
	Tieto nástroje sú štandardne dostupné na unixových systémoch. Na Windows sa odporúča buď
	nainštalovať si cygwin, alebo skompilovať pomocou napr. Microsoft Visual C++. Pri druhej
	možnosti treba mať vygenerované súbory nástrojmi flex a bison.

	Po skompilovaní vznikne jeden spustiteľný program, ktorý sa ďalej používa.

Krátky návod:
	simulátor sa púšťa z konzoly. Jediný povinný parameter je meno súboru obsahujúci program.
	Ďalšie nastavenia:
	-t 	typ PRAMu - ako sa riešia pamäťové konflikty. Akceptované hodnoty
			- erew  - exclusive read exclusive write
			- crew  - concurent read exclusive write
			- ccrcw - (common) concurent read concurent write
			- acrcw - (arbitrary) concurent read concurent write
		Ak sa neuvedie default je erew.
	-f 	súbor z ktorého sa má čítať vstup pre program. Ak sa neuvedie použije sa štandardný vstup
	-h 	pomoc, zobrazí tieto nastavenia
	-d 	dump funkcie ktorej meno dostane ako parameter. Automaticky generované funkcie pre pardo
	majú tvar $pardoX, kde X je počítadlo začínajúce na 0. Slúži to hlavne na debugovanie simulátora.

Výsledky:
	po dobehnutí programu sa zobrazia štatistiky:
		- čas behu
		- čas behu vo WT prezentácii. Toto je čas, ktorý by sa nameral, ak máme k dispozícii
		  ľubovoľný počet procesorov
		- celková práca
	Tieto hodnoty sa merajú na úrovni inštrukcií.

Programovanie:
	Odporúčam začať príkladmi v examples a popisom v diplomovej práci (hlavne kapitola 2). Tu sú
	uvedené časti, ktoré nie sú pokryté v diplomovej práci.

	Hlavný program sa píše do funkcie main. Ďalšie dve špeciálne funkcie sú init a final. Prvá
	slúži na inicializáciu druhá na finalizáciu. V metóde init je možné nastaviť počet procesorov
	PRAMu pomocou príkazu setP(n). Tieto dve metódy sa nezarátajú do výslednej zložitosti, preto je
	vhodné tu načítavať dáta, aby sa dali namerať časy kratšie ako lineárne.

    * Premenné *

	V súčasnosti sú podporované dva typy premenných int a array. Int je celočíselný typ so
	znamienkom, jeho veľkosť závisí od architektúry (typ int v C++). Array sa používa na vytváranie
	polí. Premenné sa definujú podobne ako v jazyku C:
	int x;
	array A;
	Zatiaľ nie je možné definovať viac premenných spolu, ani ich inicializovať počas definície.
	Polia sa používajú nasledovne:
    array A;
    A := new(10, int);
	A[4] := 42;
	write sizeof(A); // dĺžka pola
	delete A;
	Je možné vytvárať viacrozmerné polia ako pole polí. Polia sa indexujú od 0.

	Existujú dva typy premenných:
	    - lokálne
            Viažu sa na funkciu, v ktorej sú definované. Definujú sa slovíčkom local pred
			definíciou, ktoré nie je nutné uviesť (local je default). 

		- zdieľané
		    Sú globálne dostupné *po* definícií. Je dobré definovať si ich v metóde init na začiatku
			programu. Definícia:
			shared int x;

	* Vstup a výstup *

	Načítavať a vypisovať sa dajú premenné typu int. Vstup sa berie zo štandardného vstupu, alebo zo
	súboru (prepínač -f). Načítanie:
	int x;
	read x;
	Ak je na vstupe niečo iné ako číslo program skončí s chybovou hláškou. Výpis:
	write x;
	write 21*2;
	
    * Volanie funkcií *

    Parametre sa predávajú hodnotou, čo pri poliach znamená, že sa prvky nekopírujú. Lokálne a
	zdieľané premenné nie je možné miešať. 

	* Paralelizmus *

        Dve konštrukcie.
		  - pardo cyklus:
      		      for i:=1 to 10 pardo
		        blok príkazov
		  - paralelná metóda
		      parallel int GetAnswerToLifeTheUniverseAndEverything()
 		      begin
			    return 42;
		      end

		Tieto sú podrobne popísané v diplomovke. Dôležité z hľadiska premenných, je že pardo cyklus
		sa prekladá ako volanie špeciálnej metódy. To znamená, že nemá prístup k lokálnym premenným,
		ktoré sú definované pred cyklom. Ďalšia poznámka ku konfliktom: pri modely EREW sme
		implementovali výnimku pre polia, ktoré umožní paralelne indexovať jedno pole a tiež zistiť
		jej dĺžku. K tomu je potrebné pristúpiť paralelne k pointru pre pole, ale keby sme to
		zarátali ako konflikt, nedalo by sa pracovať s polami na modely EREW.

    * Komentáre *
	    
		Používajú sa štandardné komentáre z jazyka C
		// jednoriadkové
        /* viac
		   riadkové */

    * Gramatika jazyka *
	  
	  Gramatiku nájdete v priloženom súbore GRAMATIKA.
