Skip to content

Commit

Permalink
Implementando simulador sem cache. Iniciando implementacao do simulad…
Browse files Browse the repository at this point in the history
…or com cache.
  • Loading branch information
Italo Valcy committed Jun 17, 2008
1 parent bad30dd commit cb46948
Show file tree
Hide file tree
Showing 5 changed files with 130 additions and 110 deletions.
15 changes: 11 additions & 4 deletions lib/barramento.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,20 @@ def initialize
# Entrada:
# type - Tipo de barramento: mem (memoria), io (I/O)
# address - Endereço que deseja-se ler
# qtd - quantidade de endereços que devem ser lidos
# Retorno:
# Valor contido em address
def Barramento.read(type,address)
Simulador.set_value_bus(type,"con","1")
def Barramento.read(type,address, qtd)
# Define o valor do controle
con = qtd.to_s(2).rjust(4,'0') + "0001"
con = con.to_i(2).to_s

Simulador.set_value_bus(type,"con",con)
Simulador.set_value_bus(type,"end",address)
Simulador.get_clock
case type
when 'mem'
value = Cache.get_value(address,1)
value = Memoria.get_value(address,qtd)
when 'io'
value = Simulador.get_value_grid('io',address)
end
Expand All @@ -29,9 +35,10 @@ def Barramento.write(type,address,value)
Simulador.set_value_bus(type,"con","2")
Simulador.set_value_bus(type,"end",address)
Simulador.set_value_bus(type,"data",value)
Simulador.get_clock
case type
when 'mem'
Cache.set_value(address,value)
Memoria.set_value(address,value)
when 'io'
Simulador.set_value_grid('io',address,value)
end
Expand Down
68 changes: 44 additions & 24 deletions lib/cache.rb
Original file line number Diff line number Diff line change
@@ -1,47 +1,67 @@
require 'gui'
require 'barramento'

class Cache

# Retorna o valor contido em alguns endereços do cache
# address - endereço inicial do cache
# qtd - quantidade de registros que deve ser lidos a
# partir de address

# Retorna o valor contido em alguns endereços do cache
# address - endereço inicial do cache
# qtd - quantidade de registros que deve ser lidos a
# partir de address
def Cache.get_value(address, qtd)
if(Simulador.get_type_mapping )
result = ''
if(Simulador.cache_habilitado)
for i in 0..qtd - 1
value = fetch_value(address.to_i + i)
if (value == nil)
# Cache miss
value = update_cache(address.to_i + i)
end
result = str_concat(result,value)
end
else
result = Barramento.read('mem',address,qtd)
end
return Simulador.get_value_memoria(address)
return result
end

# Armazena o valor de value no cache no endereco address
def Cache.set_value(address, value)
end

def get_position(address)
case (Simulador.get_type_mapping)
when 0 #mapeamento direto
return address.to_i.mod Simulador.get_cache_size
return address.to_i.mod(Simulador.get_cache_size)
when 1 #mapeamento fully-set
when 2 #mapeamento 2-set
when 3 #mapeamento 4-set
end
end

def str_concat(str1, str2)
return (str1.to_i)*256 + str2.to_i
end

def fetch_value(address)
pos = get_position(address)
vet = Simulador.get_value_cache('cache',pos)
if(vet[0] == address)
#cache hit
return vet[1]
else
#cache miss
if(Simulador.get_type_update_cache == 0) #write back
#levar o que tem no cache para a memoria
#trazer novos dados da memoria para o cache
else #write through
Memoria.get_value(address,4)
#trazer novos dados da memoria para o cache
end
block = Simulador.get_block_cache(pos)
if (block[0] == address + i)
return block[1]
end
return nil
end

# Armazena o valor de value no cache no endereco address
def Cache.set_value(address, value)
def update_cache(address)
case Simulador.get_type_update_cache
when 0 #write back
pos = get_position(address.to_i)
block1 = Simulador.get_block_cache(pos)
pos = get_position(address.to_i+1)
block2 = Simulador.get_block_cache(pos)
#levar o que tem no cache para a memoria
#trazer novos dados da memoria para o cache
when 1 #write through
Memoria.get_value(address,4)
#trazer novos dados da memoria para o cache
end
end
end
38 changes: 19 additions & 19 deletions lib/gui.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ def initialize()
@tam_cache = 16
@tam_io = 64
@thread_proc = nil
@@count_clock = 0
# t_config define onde serao aplicadas
# as configuracoes que um determinado arquivo
# traz. Seus valores possíveis são: 'mem', 'io'
Expand Down Expand Up @@ -120,7 +121,7 @@ def initializa_configs
@@glade['cache_size'].active = 0
@@glade['cache_mapeamento'].active = 0
@@glade['cache_atualizacao'].active = 1
@@glade['cache_habilitado'].active = true
@@glade['cache_habilitado'].active = false
@@glade['io_size'].value = @tam_io
@@glade['mem_size'].value = @tam_mem
@@glade['sleep_clock'].value = 1
Expand Down Expand Up @@ -160,10 +161,6 @@ def carregar_arq(file_dialog, name_view)
return true
end


def get_value_cache()
end

def set_events
@@glade['simulador_window'].signal_connect("destroy") { Gtk.main_quit }
@@glade['btn_sair'].signal_connect("activate") { Gtk.main_quit }
Expand Down Expand Up @@ -216,6 +213,7 @@ def event_clear
initialize_registers()
initialize_bus()
@@glade['txt_ula'].buffer.text = ""
@@count_clock = 0
@@glade['statusbar'].push(1,"Pulsos de clock: 0")
end

Expand Down Expand Up @@ -246,7 +244,7 @@ def Simulador.get_value_grid(name, address)
end
end

def Simulador.get_value_cache(address)
def Simulador.get_block_cache(address)
result = []
model = @@glade["gridview_cache"].model
iter = model.get_iter("#{address}")
Expand Down Expand Up @@ -281,22 +279,10 @@ def Simulador.get_value_bus(type,bus)
return @@glade["bus_#{bus}_p_#{type}"].text
end

def Simulador.get_sleep_clock
return @@glade['sleep_clock'].text.to_i
end

def Simulador.set_log_ula(value)
@@glade['txt_ula'].buffer.text = value
end

def Simulador.inc_clock(value)
@@glade['statusbar'].push(1,"Pulsos de clock: #{value}")
end

def Simulador.automatic_clock?
return @@glade['clock_type'].active_text == "Automatico"
end


def Simulador.get_type_mapping
return @@glade['cache_mapeamento'].active
end
Expand All @@ -309,6 +295,20 @@ def Simulador.get_cache_size
return @tam_cache
end

def Simulador.cache_habilitado
return @@glade['cache_habilitado'].active?
end

def Simulador.get_clock
if (@@glade['clock_type'].active_text == "Automatico")
sleep @@glade['sleep_clock'].text.to_i
else
Processador.pause
end
@@count_clock += 1
@@glade['statusbar'].push(1,"Pulsos de clock: #{@@count_clock}")
end



def iniciar_simulacao
Expand Down
16 changes: 11 additions & 5 deletions lib/memoria.rb
Original file line number Diff line number Diff line change
@@ -1,19 +1,25 @@
require 'gui'
require 'processador'

class Memoria
# Retorna o valor contido em alguns endereços de memoria
# address - endereço inicial de memoria
# qtd - quantidade de registros que deve ser lidos a
# partir de address
def Memoria.get_value(address, qtd)
Processador.get_clock()
return Simulador.get_value_grid('mem', address,qtd)
def Memoria.get_value(address, qtd)
result = 0
case qtd
when 1
result = Simulador.get_value_grid('mem',address)
when 2
r1 = Simulador.get_value_grid('mem',address).to_i
r2 = Simulador.get_value_grid('mem',address.to_i + 1).to_i
result = r1*256 + r2
end
return result.to_s
end

# Armazena o valor de value na memoria no endereco address
def Memoria.set_value(address, value)
Processador.get_clock()
Simulador.set_value_grid('mem',address,value)
end
end
Loading

0 comments on commit cb46948

Please sign in to comment.