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 , :object
    def initialize(object,from , size)
      @object = object
      @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)
      _set(index,value)
    end
    alias :[]=  :set
    def _set(index , value)
      @memory[index] = value
      value
    end
    def get(index)
      range_check(index)
      _get(index)
    end
    alias :[] :get

    def _get(index)
      @memory[index]
    end

    def size
      @memory.length
    end

    def range_check(index)
      raise "index too low #{index} < #{min} in #{object.class}" if index < 0
      raise "index too big #{index} >= #{size} #{object.class}" if index >= size
    end
  end
end