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