class Emfrp::AllocRequirement

Public Class Methods

new(top) click to toggle source
# File lib/emfrp/compile/c/alloc.rb, line 3
def initialize(top)
  @top = top
  @alloc_table = AllocTable.new(top)
  @sorted_nodes = @top[:dict][:sorted_nodes].map{|x| x.get}
end

Public Instance Methods

data_requirement(sorted_datas, max_amount) click to toggle source
# File lib/emfrp/compile/c/alloc.rb, line 19
def data_requirement(sorted_datas, max_amount)
  retains = []
  sorted_datas.each do |d|
    max_amount |= type_alloc_sum(retains) & exp_alloc(d[:exp])
  end
  return max_amount
end
exp_alloc(exp) click to toggle source
# File lib/emfrp/compile/c/alloc.rb, line 101
def exp_alloc(exp)
  @alloc_table.exp_alloc(exp)
end
life_point(node) click to toggle source
# File lib/emfrp/compile/c/alloc.rb, line 72
def life_point(node)
  self_position = @sorted_nodes.index{|x| x == node}
  distance_to_end = @sorted_nodes.size - self_position
  res = []
  @sorted_nodes.each_with_index do |x, i|
    x[:params].each do |param|
      if param[:name] == node[:name]
        if param[:last]
          res << distance_to_end + i
        else
          res << i - self_position
        end
      end
    end
  end
  if res == []
    raise "Assertion error"
  else
    return res.max
  end
end
node_init_requirement(init_nodes, max_amount, datas) click to toggle source
# File lib/emfrp/compile/c/alloc.rb, line 27
def node_init_requirement(init_nodes, max_amount, datas)
  retains = datas.clone
  init_nodes.each do |n|
    max_amount |= type_alloc_sum(retains) & exp_alloc(n[:init_exp])
    retains << n
  end
  return max_amount
end
node_loop_requirement(max_amount, init_nodes, datas) click to toggle source
# File lib/emfrp/compile/c/alloc.rb, line 36
def node_loop_requirement(max_amount, init_nodes, datas)
  lrefs = init_nodes
  crefs = []
  @sorted_nodes.each_with_index do |n, i|
    max_amount |= type_alloc_sum(datas + lrefs + crefs) & exp_alloc(n[:exp])
    crefs << n
    lrefs.reject! do |x|
      i >= ref_pos_last(x)
    end
    crefs.reject! do |x|
      ref_pos_last(x) == -1 and i >= ref_pos_current(x)
    end
  end
  return max_amount
end
ref_pos_current(node) click to toggle source
# File lib/emfrp/compile/c/alloc.rb, line 62
def ref_pos_current(node)
  res = -1
  @sorted_nodes.each_with_index do |n, i|
    if n[:params].any?{|param| !param[:last] && param[:name] == node[:name]}
      res = i
    end
  end
  return res
end
ref_pos_last(node) click to toggle source
# File lib/emfrp/compile/c/alloc.rb, line 52
def ref_pos_last(node)
  res = -1
  @sorted_nodes.each_with_index do |n, i|
    if n[:params].any?{|param| param[:last] && param[:name] == node[:name]}
      res = i
    end
  end
  return res
end
requirement() click to toggle source
# File lib/emfrp/compile/c/alloc.rb, line 9
def requirement
  sorted_datas = @top[:dict][:sorted_datas].map{|x| x.get}
  init_nodes = @sorted_nodes.select{|n| n[:init_exp]}
  max_amount = Alloc.empty
  max_amount = data_requirement(sorted_datas, max_amount)
  max_amount = node_init_requirement(init_nodes, max_amount, sorted_datas)
  max_amount = node_loop_requirement(max_amount, init_nodes, sorted_datas)
  return max_amount
end
type_alloc_sum(defs) click to toggle source
# File lib/emfrp/compile/c/alloc.rb, line 94
def type_alloc_sum(defs)
  defs.inject(Alloc.empty) do |acc, d|
    type_def = @alloc_table.utype_to_type_def(d[:typing])
    acc & @alloc_table.type_alloc(type_def)
  end
end