Merge branch 'master' of https://github.com/vtselfa/Multi2Sim
Arreglat BUG important

No podem esperar en un slot de prefetch si davant nostre hi ha una
store, ja que esta modificarà el bloc. Ara find_pref_block ho té en
compte.

També arreglat un posible bug en find and lock que accedia als blocks
prebuscats a pesar d'haver fet hit a la cache quan la direcció era down
up.
Molts canvis:

BUGFIX: copiavem un bloc a pref_blk i es modificava sols la copia.
Implementades moltes estructures per al soport d'streams.
Corregit BUG

He detectat que en algunes execucions (tot i que el programa acaba correctament) es creen més stacks de les que es destrueixen (aka fugues de memoria).
I seguint la pista he descobert una cosa que no se si es culpa meua o que, però que dona problemes.

Tenim unes quantes stores que volen escriure totes al mateix bloc amb les id {7268, 7275, 7276, 7278, 7279, 7280, 7282, 7283, 7284}

La primera en arribar a L1 es 7268, però el bloc no està, aixi que se li assigna el set 32 i la via 3, que estava invalida, i la bloqueja.
La resta, veuen que 7268 està portant el bloc i s'esperen en la cua del bloc.

7268 fa un write request (que es no bloquejant), fa hit però no pot bloquejar el bloc en L2 i retorna amb fallada. 7268 desbloqueja el bloc en L1, desencua a 7275 i es prepara per a reintentar bloquejar en 1 cicle.

Ara meteixa tenim, per tant, el set 32 via 3 amb una cua pendent, una transient tag pero DESBLOQUEJAT. Ara ve una nova store amb id 7287 que vol escriure al mateix bloc PERO com el bloc no està bloquejat, no fa hit amb ell (a pesar de estar la transcient tag) i ¡¡¡se li assigna una nova via!!!
En aquest cas a 7287 se li assigna la via 1.

Tant 7275 com 7268 quan fan find and lock fan hit a la via 1 deixant penjades les stacks que hi ha pendents a la via 3.
Concretament es queden penjades durant 60.000 cicles, fins que de casualitat algu (id 10677) bloqueja la mateixa via i al desbloquejar, les llança.

Jo detecte el problema xq no sempre se li assigna a algú el bloc amb problemes i fa neteja. Concretament, en el exemple que estic exposant, les stacks 7283 i 7284 no es desencuaven mai.
Preparant la transició a pref_aggressivity

Adaptades les funcions del directori i les que quedaven de cache.
Adaptat stream_buffer_t i stream_block_t

Ja estan preparats per a usar agressivitat.
Millorada legibilitat del codi

Afegides dues funcions auxiliars en nmoesi
L'atribut count dels buffers pareix que funciona

Ha constat, el desgraciat
Arreglat LRU

Els cicles han baixat moltissim.
Encuar prefetch L2 canviat de lloc

Canviant el moment en que s'encua el prefetch d'L2 de find and lock a
read request action els cicles disminueixen sensiblement.

Millorada la funció must_enqueue_prefetch que indica si per a una stack
i un nivell de cache concrets cal encuar prefetch en cas de fallada.
Unificades funcions per a encuar prebusques

Les funcions per a saber si s'ha d'encuar una prebusca i per a encuar-la
poden ara ser usades tant per a L1 com per a L2.
Separada la part de prefetch en find and lock

Afegida una nova funció
Eliminat codi mort en find_and_lock
Afegida l'estructura pref_group

Tot i que encara no s'usa, ja està completament implementada i es crea i
destrueix correctament.
Millorada la creació i destrucció de pref_group

Afegit un contador de referencies a pref_group.
Inicialment cada pref_group te tantes referències com instruccions de
prefetch conté. Posteriorment se li suma 1 per cada stack que el
referència.

S'ha afegit una funció per a destruir-lo, que es crida quan una stack
(mod_stack_return) o una uop (x86_uop_free_if_not_queued o algo així)
s'alliveren

Per cert, poden quedar uops de prefetch en les cues que no arriben a
llançar-se per acabar el programa. Per tant quan es destrueixen les cues
s'han d'alliverar. Es fa correctament, i com s'usa la funció eixa
d'alliberar uops, també està controlat el tema dels grups. Pareix que
tot xuta.
Intentant que funcione l'agressivitat
Les peticions down up ja fan una busca direrent
Afegit invalidate slot

Falta probar.
Primer èxit!!!

math funciona amb 1 stream aggr 2
Loads que fan un hit a mitant stream

Invaliden el stream per baix del hit i NO porten un bloc nou.