class BOAST::Index

Attributes

alignment[RW]
indexes[R]
source[R]
vector_index[RW]

Public Class Methods

new(source, *indexes) click to toggle source
# File lib/BOAST/Language/Index.rb, line 28
def initialize(source, *indexes)
  @source = source
  @indexes = indexes
  @vector_index = nil
end

Public Instance Methods

align?() click to toggle source
# File lib/BOAST/Language/Index.rb, line 34
def align?
  return @alignment
end
copy(*args) click to toggle source
# File lib/BOAST/Language/Index.rb, line 54
def copy(*args)
  return to_var.copy(*args)
end
method_missing(m, *a, &b) click to toggle source
Calls superclass method BOAST::Expression#method_missing
# File lib/BOAST/Language/Index.rb, line 9
def method_missing(m, *a, &b)
  var = to_var
  if var.type.kind_of?(CStruct) and var.type.members[m.to_s] then
    return struct_reference(type.members[m.to_s])
  elsif var.vector? and m.to_s[0] == 's' and lang != CUDA then
    required_set = m.to_s[1..-1].chars.to_a
    existing_set = [*('0'..'9'),*('a'..'z')].first(var.type.vector_length)
    if required_set.length == required_set.uniq.length and (required_set - existing_set).empty? then
      return var.copy(var.name+"."+m.to_s, :vector_length => m.to_s[1..-1].length) if lang == CL
      @vector_index = existing_set.index(required_set[0])
      return self
    else
      return super
    end
  else
    return super
  end
end
pr() click to toggle source
# File lib/BOAST/Language/Index.rb, line 84
def pr
  s=""
  s << indent
  s << to_s
  s << ";" if [C, CL, CUDA].include?( lang )
  output.puts s
  return self
end
set(x) click to toggle source
# File lib/BOAST/Language/Index.rb, line 50
def set(x)
  return to_var === Set(x,to_var)
end
set_align(align) click to toggle source
# File lib/BOAST/Language/Index.rb, line 38
def set_align(align)
  @alignment = align
  return self
end
to_s() click to toggle source
# File lib/BOAST/Language/Index.rb, line 62
def to_s
  if get_replace_constants and @source.constant? then
    begin
      const = @source.constant
      indxs = @indexes.reverse
      dims = @source.dimension.reverse
      (0...dims.length).each { |indx|
        dim = dims[indx]
        s = "#{indxs[indx]}"
        s << " - (#{dim.start})" unless 0.equal?(dim.start)
        ind = Empty.empty_binding.eval(s)
        ind = ind.to_i
        const = const[ind]
      }
      return "#{const}#{@source.type.suffix}"
    rescue Exception
    end
  end
  return to_s_fortran if lang == FORTRAN
  return to_s_c if [C, CL, CUDA].include?( lang )
end
to_var() click to toggle source
# File lib/BOAST/Language/Index.rb, line 43
def to_var
  options = { :const => nil, :constant => nil, :dim => nil, :dimension => nil, :direction => nil, :dir => nil, :align => alignment }
  options[:vector_length] = 1 if @vector_index
  var = @source.copy("#{self}", options)
  return var
end
type() click to toggle source
# File lib/BOAST/Language/Index.rb, line 58
def type
  return to_var.type
end

Private Instance Methods

to_s_c() click to toggle source
# File lib/BOAST/Language/Index.rb, line 189
def to_s_c
  return to_s_texture if @source.texture
  if use_vla? then
    sub = to_s_use_vla
  else
    sub = to_s_c_reversed
  end
  s = "#{@source}[" + sub + "]"
  if @vector_index then
    s << "[#{@vector_index}]"
  end
  return s
end
to_s_c_reversed() click to toggle source
# File lib/BOAST/Language/Index.rb, line 167
def to_s_c_reversed
  indxs = @indexes.reverse
  dims = @source.dimension.reverse
  ss = nil
  (0...dims.length).each { |indx|
    s = ""
    dim = dims[indx]
    s << "#{indxs[indx]}"
    s << " - (#{dim.start})" unless 0.equal?(dim.start)
    if ss then
      if dim.size then
        s << " + (#{dim.size}) * "
      else
        raise "Unkwown dimension size!"
      end
      s << "(#{ss})"
    end
    ss = s
  }
  return ss
end
to_s_fortran() click to toggle source
# File lib/BOAST/Language/Index.rb, line 95
def to_s_fortran
  indexes_dup = []
  @source.dimension.each_with_index { |d,i|
    if d.size.nil? and get_array_start != 1 then
       indexes_dup.push( (@indexes[i] - d.start + 1).to_s )
    else
       indexes_dup.push( (@indexes[i]).to_s )
    end
  }
  s = ""
  s << "#{@source}(#{@source.vector? ? (@vector_index ? "#{@vector_index+1}, " : ":, ") : "" }#{indexes_dup.join(", ")})"
  return s
end
to_s_texture() click to toggle source
# File lib/BOAST/Language/Index.rb, line 109
def to_s_texture
  raise LanguageError, "Unsupported language #{lang} for texture!" unless [CL, CUDA].include?( lang )
  raise "Write is unsupported for textures!" unless ( @source.constant or @source.direction == :in )
  dim_number = 1
  if @source.dimension then
    dim_number == @source.dimension.size
  end
  raise "Unsupported number of dimension: #{dim_number}!" if dim_number > 3
  s = ""
  if lang == CL then
    s << "as_#{@source.type.decl}("
    s << "read_imageui(#{@source}, #{@source.sampler}, "
    if dim_number == 1 then
      s << "int2(#{@indexes[0]},0)"
    else
      if dim_number == 2 then
        s << "int2("
      else
        s << "int3("
      end
      s << "#{@indexes.join(", ")})"
    end
    s << ")"
    if @source.type.size == 4 then
      s << ".x"
    elsif @source.type.size == 8 then
      s << ".xy"
    end
    s << ")"
  else
    s << "tex#{dim_number}Dfetch(#{@source},"
    if dim_number == 1 then
      s << "#{@indexes[0]}"
    else
      if dim_number == 2 then
        s << "int2("
      else
        s << "int3("
      end
      s << "#{@indexes.join(", ")})"
    end
    s << ")"
  end
  return s
end
to_s_use_vla() click to toggle source
# File lib/BOAST/Language/Index.rb, line 155
def to_s_use_vla
  indxs = @indexes.reverse
  dims = @source.dimension.reverse
  t = (0...dims.length).collect { |indx|
    s = "#{indxs[indx]}"
    dim = dims[indx]
    s << " - (#{dim.start})" unless 0.equal?(dim.start)
    s
  }
  return t.join("][")
end