-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patheventos.c
133 lines (112 loc) · 3.82 KB
/
eventos.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/*
Progres - Simulador de circuitos combinacionais em Verilog
(C) 2014, 2015 Tiago Matos Santos
Under the terms of the MIT license.
*/
#include <stdlib.h>
#include "eventos.h"
#include "progres.h"
#include "estruturas.h"
#include "sinais.h"
#include "mem.h"
void insereEvento(Evento **fila, Tempo t, Componente comp, ValorLogico novoValor)
{
Evento *evt;
if(!comp)
return;
if( !(*fila) )
{
evt = (Evento*) xmalloc(sizeof(Evento));
evt->quando = t;
evt->listaTransicao = (Transicao*) xmalloc(sizeof(Transicao));
evt->listaTransicao->fio = comp;
evt->listaTransicao->novoValor = novoValor;
evt->listaTransicao->proximo = NULL;
evt->ultimaTransicao = evt->listaTransicao;
evt->proximo = NULL;
*fila = evt;
}
else
{
Evento *ant = NULL; // evento anterior
Evento *it = *fila; // iterador de evento
while( it && (it->quando < t) ) {
ant = it;
it = it->proximo;
}
if(!it) // inserir evento na ultima posicao da fila
{
evt = (Evento*) xmalloc(sizeof(Evento));
evt->quando = t;
evt->listaTransicao = (Transicao*) xmalloc(sizeof(Transicao));
evt->listaTransicao->fio = comp;
evt->listaTransicao->novoValor = novoValor;
evt->listaTransicao->proximo = NULL;
evt->ultimaTransicao = evt->listaTransicao;
evt->proximo = it;
ant->proximo = evt;
}
else if(t == it->quando) // um evento no instante existe, adicionar à lista de transições
{
it->ultimaTransicao->proximo = (Transicao*) xmalloc(sizeof(Transicao));
it->ultimaTransicao = it->ultimaTransicao->proximo;
it->ultimaTransicao->proximo = NULL;
it->ultimaTransicao->fio = comp;
it->ultimaTransicao->novoValor = novoValor;
}
else if(t < it->quando)
{
if(ant == NULL) // inserir evento no início da fila
{
evt = (Evento*) xmalloc(sizeof(Evento));
evt->quando = t;
evt->listaTransicao = (Transicao*) xmalloc(sizeof(Transicao));
evt->listaTransicao->fio = comp;
evt->listaTransicao->novoValor = novoValor;
evt->listaTransicao->proximo = NULL;
evt->ultimaTransicao = evt->listaTransicao;
evt->proximo = it;
*fila = evt; // ele vira o primeiro da fila
}
else // inserir entre dois eventos, o anterior e o seguinte
{
evt = (Evento*) xmalloc(sizeof(Evento));
evt->quando = t;
evt->listaTransicao = (Transicao*) xmalloc(sizeof(Transicao));
evt->listaTransicao->fio = comp;
evt->listaTransicao->novoValor = novoValor;
evt->listaTransicao->proximo = NULL;
evt->ultimaTransicao = evt->listaTransicao;
evt->proximo = it;
ant->proximo = evt;
}
}
}
}
Transicao* getTransicoesEm(Evento* fila, Tempo t)
{
Evento *it = fila; // iterador de evento
while( (it->quando < t) && it ) {
it = it->proximo;
}
if( it && (t == it->quando) )
return it->listaTransicao;
else
return NULL;
}
Transicao* popEvento(Evento **fila)
{
Transicao *ret = NULL;
Evento *dead = NULL;
if(!fila)
return NULL;
if( !(*fila) )
return NULL;
if( ! (*fila)->listaTransicao )
return NULL;
ret = (*fila)->listaTransicao;
dead = (*fila);
(*fila) = (*fila)->proximo;
free(dead);
return ret;
}