/* * Escribir bloque de caché a memoria */ public void BloqueAMem(BloqueCacheInstrucciones bloqueCache, int nBloque) { for (int i = 0; i < 4; i++) { memoriaPrincipal.SetPalabraInstruccion(nBloque, i, bloqueCache.GetPalabra(i)); } }
/* * Carga las instrucciones en la memoria y crea los contextos para cada hilillo * Si no hay espacio suficiente, muestra un error y termina la ejecución de la simulación */ public void CargarInstrucciones() { int indiceInstruccion = DIRECCION_INICIO_INSTRUCCION; int indicePalabra = 0; int idContexto = 0; foreach (List <string> lineasHilillos in hilillos) { //Crear el contexto y encolarlo en la cola de contextos Contexto contexto = new Contexto(indiceInstruccion, idContexto, reloj); //Un contexto por hilillo colaContextos.Enqueue(contexto); idContexto++; //Parsear lineas para guardarlas en memoria foreach (string linea in lineasHilillos) { if (indicePalabra >= 4) { indicePalabra = 0; } //Generar palabra para guardar en el bloque string[] partesLinea = linea.Split(' '); int codigoOperacion = Int32.Parse(partesLinea[0]); int rX = Int32.Parse(partesLinea[2]); int rY = Int32.Parse(partesLinea[1]); int rZ = Int32.Parse(partesLinea[3]); int[] palabra = { codigoOperacion, rX, rY, rZ }; //Guardar palabra int bloqueDestino = GetNumeroBloque(indiceInstruccion); if (!memoria.SetPalabraInstruccion(bloqueDestino, indicePalabra, palabra)) { MessageBox.Show("No hay memoria suficiente para cargar el programa. Intente de nuevo con un programa más pequeño", "Error cargando los hilillos", MessageBoxButtons.OK, MessageBoxIcon.Stop); Application.Exit(); } //Aumentar índices indiceInstruccion += 4; indicePalabra++; } } }