rubyx/lib/risc/fake_memory.rb
Torsten Ruger f9a89db10c use fake memory
fix integer offset bug
(which only didn’t cause errors as fixnums are still an order too big
and the famous +1 error hit the empty space)
2018-05-28 15:09:59 +03:00

41 lines
1.1 KiB
Ruby

module Risc
# simulate memory during compile time.
#
# Memory comes in chunks, power of 2 chunks actually.
#
# Currently typed instance variables map to ruby instance variables and so do not
# end up in memory. Memory being only for indexed word aligned access.
#
# Parfait really does everything else, apart from the internal_get/set
# And our fake memory (other than hte previously used array, does bound check)
class FakeMemory
attr_reader :min
def initialize(from , size)
@min = from
@memory = Array.new(size)
raise "only multiples of 2 !#{size}" unless size == 2**(Math.log2(size).to_i)
end
def set(index , value)
range_check(index)
@memory[index] = value
value
end
alias :[]= :set
def get(index)
range_check(index)
@memory[index]
end
alias :[] :get
def size
@memory.length
end
def range_check(index)
raise "index too low #{index} < #{min}" if index < min
raise "index too big #{index} >= #{size}" if index >= size
end
end
end