BOAST 1.0.9 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f1f417ec1022cee6a5ad855a971bae916070a0b4
4
- data.tar.gz: 02ef656f592cf02b330a3a1253fd2e44cd2b6d61
3
+ metadata.gz: 59589a610dd30134353d9aa38e9ea1de00b43a9a
4
+ data.tar.gz: 4eec51beee55795b76432c1c4b12502113a7fe3f
5
5
  SHA512:
6
- metadata.gz: 618ca53b9609f6120a117de27f8cb37575873f1cb12d048f8b7f953a26b04d6f599535d532c906bb830a9e2ff3e2e448c1f6a88e7e3f07ee69f25da61f049f9d
7
- data.tar.gz: 296b7c4d45369c31120c07cf171f54074e3983bdf6fdbc02fae893414d646f63a6fa9b635f5612927ae905947da7e5d53c6799b8b9e5f7ae73f0fdc1146c4f4e
6
+ metadata.gz: a190b47611875b112f027e5b3e4bf292d331f4029ee47d581493fd6d3d4c88d807f98b91887f7602a9e922a2744f48d5965de4f5ce7103597b52886a5eea6f02
7
+ data.tar.gz: 24c85287f04dae5ce701e11099ef562fb97e81f89fc7ca15105593dee7746a141d1124ab7e1d593193e63f5aeb56bb598a2c986f6c470a91b4fe6b8cfd4c5527
data/BOAST.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'BOAST'
3
- s.version = "1.0.9"
3
+ s.version = "1.1.0"
4
4
  s.author = "Brice Videau"
5
5
  s.email = "brice.videau@imag.fr"
6
6
  s.homepage = "https://github.com/Nanosim-LIG/boast"
data/lib/BOAST.rb CHANGED
@@ -1,6 +1,9 @@
1
+ require 'BOAST/Language/Error.rb'
1
2
  require 'BOAST/Language/State.rb'
2
3
  require 'BOAST/Language/Functors.rb'
3
4
  require 'BOAST/Language/Inspectable.rb'
5
+ require 'BOAST/Language/Comment.rb'
6
+ require 'BOAST/Language/Annotation.rb'
4
7
  require 'BOAST/Language/Transitions.rb'
5
8
  require 'BOAST/Language/Arithmetic.rb'
6
9
  require 'BOAST/Language/Architectures.rb'
@@ -15,6 +18,7 @@ require 'BOAST/Language/Slice.rb'
15
18
  require 'BOAST/Language/FuncCall.rb'
16
19
  require 'BOAST/Language/Procedure.rb'
17
20
  require 'BOAST/Language/Algorithm.rb'
21
+ require 'BOAST/Language/CodeBlock.rb'
18
22
  require 'BOAST/Language/ControlStructure.rb'
19
23
  require 'BOAST/Language/OpenMP.rb'
20
24
  require 'BOAST/Language/If.rb'
@@ -37,5 +41,5 @@ require 'BOAST/Runtime/CKernel.rb'
37
41
  require 'BOAST/Runtime/NonRegression.rb'
38
42
  require 'BOAST/Language/Parens.rb'
39
43
  require 'BOAST/Language/BOAST_OpenCL.rb'
40
- require 'BOAST/Language/Optimization.rb'
44
+ require 'BOAST/Optimization/Optimization.rb'
41
45
  require 'BOAST/Language/Print.rb'
@@ -17,6 +17,10 @@ module BOAST
17
17
  private_state_accessor :default_align
18
18
  private_state_accessor :array_start
19
19
  private_state_accessor :indent_level, :indent_increment
20
+ private_state_accessor :annotate_list
21
+ private_state_accessor :annotate_indepth_list
22
+ private_state_accessor :annotate_level
23
+ private_state_accessor :optimizer_log_file
20
24
 
21
25
  private_boolean_state_accessor :replace_constants
22
26
  private_boolean_state_accessor :default_int_signed
@@ -24,6 +28,8 @@ module BOAST
24
28
  private_boolean_state_accessor :debug
25
29
  private_boolean_state_accessor :use_vla
26
30
  private_boolean_state_accessor :decl_module
31
+ private_boolean_state_accessor :annotate
32
+ private_boolean_state_accessor :optimizer_log
27
33
 
28
34
  private
29
35
  def push_env(*args)
@@ -46,6 +52,18 @@ module BOAST
46
52
  BOAST::indent
47
53
  end
48
54
 
55
+ def get_architecture_name
56
+ BOAST::get_architecture_name
57
+ end
58
+
59
+ def get_lang_name
60
+ BOAST::get_lang_name
61
+ end
62
+
63
+ def annotate_number(*args)
64
+ BOAST::annotate_number(*args)
65
+ end
66
+
49
67
  end
50
68
 
51
69
  state_accessor :output, :lang, :architecture, :model, :address_size
@@ -53,6 +71,10 @@ module BOAST
53
71
  state_accessor :default_align
54
72
  state_accessor :array_start
55
73
  state_accessor :indent_level, :indent_increment
74
+ state_accessor :annotate_list
75
+ state_accessor :annotate_indepth_list
76
+ state_accessor :annotate_level
77
+ state_accessor :optimizer_log_file
56
78
 
57
79
  boolean_state_accessor :replace_constants
58
80
  boolean_state_accessor :default_int_signed
@@ -60,20 +82,28 @@ module BOAST
60
82
  boolean_state_accessor :debug
61
83
  boolean_state_accessor :use_vla
62
84
  boolean_state_accessor :decl_module
63
-
64
- default_state_getter :address_size, OS.bits/8
65
- default_state_getter :lang, FORTRAN, '"const_get(#{envs})"', :BOAST_LANG
66
- default_state_getter :model, "native"
67
- default_state_getter :debug, false
68
- default_state_getter :use_vla, false
69
- default_state_getter :replace_constants, true
70
- default_state_getter :default_int_signed, true
71
- default_state_getter :default_int_size, 4
72
- default_state_getter :default_real_size, 8
73
- default_state_getter :default_align, 1
74
- default_state_getter :indent_level, 0
75
- default_state_getter :indent_increment, 2
76
- default_state_getter :array_start, 1
85
+ boolean_state_accessor :annotate
86
+ boolean_state_accessor :optimizer_log
87
+
88
+ default_state_getter :address_size, OS.bits/8
89
+ default_state_getter :lang, FORTRAN, '"const_get(#{envs})"', :BOAST_LANG
90
+ default_state_getter :model, "native"
91
+ default_state_getter :debug, false
92
+ default_state_getter :use_vla, false
93
+ default_state_getter :replace_constants, true
94
+ default_state_getter :default_int_signed, true
95
+ default_state_getter :default_int_size, 4
96
+ default_state_getter :default_real_size, 8
97
+ default_state_getter :default_align, 1
98
+ default_state_getter :indent_level, 0
99
+ default_state_getter :indent_increment, 2
100
+ default_state_getter :array_start, 1
101
+ default_state_getter :annotate, false
102
+ default_state_getter :annotate_list, ["For"], '"#{envs}.split(\",\").collect { |arg| YAML::load(arg) }"'
103
+ default_state_getter :annotate_indepth_list, ["For"], '"#{envs}.split(\",\").collect { |arg| YAML::load(arg) }"'
104
+ default_state_getter :annotate_level, 0
105
+ default_state_getter :optimizer_log, false
106
+ default_state_getter :optimizer_log_file, nil
77
107
 
78
108
  alias use_vla_old? use_vla?
79
109
  class << self
@@ -97,10 +127,39 @@ module BOAST
97
127
  return X86
98
128
  end
99
129
 
130
+ def get_architecture_name
131
+ case architecture
132
+ when X86
133
+ return :X86
134
+ when ARM
135
+ return :ARM
136
+ when MPPA
137
+ return :MPPA
138
+ else
139
+ return nil
140
+ end
141
+ end
142
+
143
+ def get_lang_name
144
+ case lang
145
+ when C
146
+ return :C
147
+ when FORTRAN
148
+ return :FORTRAN
149
+ when CL
150
+ return :CL
151
+ when CUDA
152
+ return :CUDA
153
+ else
154
+ nil
155
+ end
156
+ end
157
+
100
158
  @@output = STDOUT
101
159
  @@chain_code = false
102
160
  @@architecture = get_default_architecture
103
161
  @@decl_module = false
162
+ @@annotate_numbers = Hash::new { |h,k| h[k] = 0 }
104
163
 
105
164
  @@env = Hash::new{|h, k| h[k] = []}
106
165
 
@@ -108,12 +167,12 @@ module BOAST
108
167
  vars.each { |key,value|
109
168
  var = nil
110
169
  begin
111
- var = class_variable_get("@@"+key.to_s)
170
+ var = BOAST::class_variable_get("@@"+key.to_s)
112
171
  rescue
113
172
  raise "Unknown module variable #{key}!"
114
173
  end
115
174
  @@env[key].push(var)
116
- class_variable_set("@@"+key.to_s, value)
175
+ BOAST::class_variable_set("@@"+key.to_s, value)
117
176
  }
118
177
  end
119
178
 
@@ -122,7 +181,7 @@ module BOAST
122
181
  raise "Unknown module variable #{key}!" unless @@env.has_key?(key)
123
182
  ret = @@env[key].pop
124
183
  raise "No stored value for #{key}!" if ret.nil?
125
- class_variable_set("@@"+key.to_s, ret)
184
+ BOAST::class_variable_set("@@"+key.to_s, ret)
126
185
  }
127
186
  end
128
187
 
@@ -134,12 +193,31 @@ module BOAST
134
193
  set_indent_level( get_indent_level - increment )
135
194
  end
136
195
 
196
+ def annotate_number(name)
197
+ num = @@annotate_numbers[name]
198
+ @@annotate_numbers[name] = num + 1
199
+ return num
200
+ end
201
+
137
202
  def indent
138
203
  return " "*get_indent_level
139
204
  end
140
205
 
141
- def pr(a)
142
- a.pr
206
+ def pr_annotate(a)
207
+ name = a.class.name.gsub("BOAST::","")
208
+ if annotate_list.include?(name) then
209
+ description = nil
210
+ if a.is_a?(Annotation) and a.annotate_indepth?(0) then
211
+ description = a.annotation(0)
212
+ end
213
+ annotation = { "#{name}#{annotate_number(name)}" => description }
214
+ Comment(YAML::dump(annotation)).pr
215
+ end
216
+ end
217
+
218
+ def pr(a, *args)
219
+ pr_annotate(a) if annotate?
220
+ a.pr(*args)
143
221
  end
144
222
 
145
223
  def decl(*a)
@@ -185,16 +263,20 @@ ConvolutionGenerator = BOAST
185
263
  class Integer
186
264
  def to_var
187
265
  if self < 0 then
188
- return BOAST::Variable::new("#{self}", BOAST::Int, :signed => true, :constant => self )
266
+ v = BOAST::Variable::new("#{self}", BOAST::Int, :signed => true, :constant => self )
189
267
  else
190
- return BOAST::Variable::new("#{self}", BOAST::Int, :signed => false, :constant => self )
268
+ v = BOAST::Variable::new("#{self}", BOAST::Int, :signed => false, :constant => self )
191
269
  end
270
+ v.force_replace_constant = true
271
+ return v
192
272
  end
193
273
  end
194
274
 
195
275
  class Float
196
276
  def to_var
197
- return BOAST::Variable::new("#{self}", BOAST::Real, :constant => self )
277
+ v = BOAST::Variable::new("#{self}", BOAST::Real, :constant => self )
278
+ v.force_replace_constant = true
279
+ return v
198
280
  end
199
281
  end
200
282
 
@@ -0,0 +1,55 @@
1
+ module BOAST
2
+
3
+ module Annotation
4
+ include PrivateStateAccessor
5
+
6
+ def annotate_indepth?(level)
7
+ return false if level > annotate_level
8
+ return false unless annotate_indepth_list.include?(self.class.name.gsub("BOAST::", ""))
9
+ return true
10
+ end
11
+
12
+ def annotation_identifier
13
+ name = self.class.name.gsub("BOAST::", "")
14
+ return "#{name}#{annotate_number(name)}"
15
+ end
16
+
17
+ def annotate_scalar(s, level)
18
+ if s.is_a?(Annotation) and s.annotate_indepth?(level + 1) then
19
+ return { s.annotation_identifier => s.annotation(level + 1) }
20
+ elsif s.is_a?(Numeric)
21
+ return s
22
+ else
23
+ str = s.to_s
24
+ str = nil if str == ''
25
+ return str
26
+ end
27
+ end
28
+
29
+ def annotate_array(a, level)
30
+ return a.collect { |e|
31
+ annotate_var(e, level)
32
+ }
33
+ end
34
+
35
+ def annotate_var(v, level)
36
+ if v.is_a?(Array) then
37
+ return annotate_array(v, level)
38
+ else
39
+ return annotate_scalar(v, level)
40
+ end
41
+ end
42
+
43
+ def annotation(level)
44
+ anns = {}
45
+ self.class.const_get(:ANNOTATIONS).each { |a|
46
+ var_sym = ("@" + a.to_s).to_sym
47
+ var = self.instance_variable_get(var_sym)
48
+ anns[a] = annotate_var(var, level)
49
+ }
50
+ return anns
51
+ end
52
+
53
+ end
54
+
55
+ end
@@ -1,6 +1,25 @@
1
1
  module BOAST
2
+
3
+ module_function
4
+
5
+ def Return(value)
6
+ return Expression::new("return",nil, value)
7
+ end
8
+
9
+ def And(a, b)
10
+ return Expression::new(And, a, b)
11
+ end
12
+
13
+ def Or(a, b)
14
+ return Expression::new(Or, a, b)
15
+ end
16
+
2
17
  module Arithmetic
3
18
 
19
+ def **(x)
20
+ return Expression::new(Exponentiation,self,x)
21
+ end
22
+
4
23
  def ===(x)
5
24
  return Expression::new(Affectation,self,x)
6
25
  end
@@ -10,7 +29,7 @@ module BOAST
10
29
  end
11
30
 
12
31
  def ==(x)
13
- return Expression::new("==",self,x)
32
+ return Expression::new(Equal,self,x)
14
33
  end
15
34
 
16
35
  def !=(x)
@@ -18,19 +37,19 @@ module BOAST
18
37
  end
19
38
 
20
39
  def >(x)
21
- return Expression::new(">",self,x)
40
+ return Expression::new(Greater,self,x)
22
41
  end
23
42
 
24
43
  def <(x)
25
- return Expression::new("<",self,x)
44
+ return Expression::new(Less,self,x)
26
45
  end
27
46
 
28
47
  def >=(x)
29
- return Expression::new(">=",self,x)
48
+ return Expression::new(GreaterOrEqual,self,x)
30
49
  end
31
50
 
32
51
  def <=(x)
33
- return Expression::new("<=",self,x)
52
+ return Expression::new(LessOrEqual,self,x)
34
53
  end
35
54
 
36
55
  def +(x)
@@ -53,20 +72,35 @@ module BOAST
53
72
  return Expression::new(Minus,nil,self)
54
73
  end
55
74
 
56
- def address
57
- return Expression::new("&",nil,self)
75
+ def +@
76
+ return Expression::new(Plus,nil,self)
77
+ end
78
+
79
+ def reference
80
+ return Expression::new(Reference,nil,self)
58
81
  end
82
+
83
+ alias address reference
59
84
 
60
85
  def dereference
61
- return Expression::new("*",nil,self)
86
+ return Index::new(self, *(self.dimension.collect(&:start))) if lang == FORTRAN
87
+ return Expression::new(Dereference,nil,self)
62
88
  end
63
89
 
64
90
  def and(x)
65
- return Expression::new("&&", self, x)
91
+ return Expression::new(And, self, x)
66
92
  end
67
93
 
94
+ alias & and
95
+
68
96
  def or(x)
69
- return Expression::new("||", self, x)
97
+ return Expression::new(Or, self, x)
98
+ end
99
+
100
+ alias | or
101
+
102
+ def cast(type)
103
+ return type.copy("(#{type.type.decl} *)#{self}")
70
104
  end
71
105
 
72
106
  def components( range )
@@ -1,43 +1,97 @@
1
1
  module BOAST
2
2
 
3
+ class CaseCondition < ControlStructure
4
+ attr_reader :block
5
+ attr_reader :constants
6
+
7
+ def initialize(constants = nil, &block)
8
+ @constants = constants
9
+ @block = block
10
+ end
11
+
12
+ def get_c_strings
13
+ return { :case => '"case #{constants.join(" : case ")} :"',
14
+ :default => '"default :"',
15
+ :break => '"break;"' }
16
+ end
17
+
18
+ def get_fortran_strings
19
+ return { :case => '"case (#{constants.join(", ")})"',
20
+ :default => '"case default"',
21
+ :break => 'nil' }
22
+ end
23
+
24
+ alias get_cl_strings get_c_strings
25
+ alias get_cuda_strings get_c_strings
26
+
27
+ eval token_string_generator( * %w{case constants})
28
+ eval token_string_generator( * %w{default})
29
+ eval token_string_generator( * %w{break})
30
+
31
+ def to_s
32
+ s = ""
33
+ if @constants then
34
+ s += case_string(@constants)
35
+ else
36
+ s += default_string
37
+ end
38
+ return s
39
+ end
40
+
41
+ def open
42
+ s = ""
43
+ s += indent
44
+ s += to_s
45
+ output.puts s
46
+ increment_indent_level
47
+ return self
48
+ end
49
+
50
+ def close
51
+ if @constants and break_string then
52
+ s = ""
53
+ s += indent
54
+ s += break_string
55
+ output.puts s
56
+ end
57
+ decrement_indent_level
58
+ return self
59
+ end
60
+
61
+ def pr(*args)
62
+ args = @args if args.length == 0 and @args
63
+ open
64
+ if @block then
65
+ @block.call(*args)
66
+ close
67
+ end
68
+ return self
69
+ end
70
+
71
+ end
72
+
3
73
  class Case < ControlStructure
4
74
 
5
75
  attr_reader :expression
6
- attr_reader :constants_list
76
+ attr_reader :case_conditions
7
77
 
8
- def initialize(expression, *control)
78
+ def initialize(expression, *control, &block)
9
79
  @expression = expression
10
- @constants_list = []
11
- @blocks = []
12
- if control.size < 1 then
13
- raise "No block given!"
14
- elsif control.size.even? then
15
- (0..control.size-1).step(2) { |i|
16
- @constants_list[i/2] = [control[i]].flatten
17
- @blocks[i/2] = control[i+1]
18
- }
19
- else
20
- (0..control.size-2).step(2) { |i|
21
- @constants_list[i/2] = [control[i]].flatten
22
- @blocks[i/2] = control[i+1]
23
- }
24
- @blocks.push(control.last)
80
+ @case_conditions = []
81
+ control.push(block) if block
82
+ while control.size >= 2 do
83
+ @case_conditions.push CaseCondition::new([control.shift].flatten, &(control.shift))
25
84
  end
85
+ @case_conditions.push CaseCondition::new(&(control.shift)) if control.size > 0
26
86
  end
27
87
 
28
88
  def get_c_strings
29
89
  return { :switch => '"switch (#{expr}) {"',
30
- :case => '"case #{constants.join(" : case")} :"',
31
- :default => '"default :"',
32
- :break => '"break;"',
33
90
  :end => '"}"' }
34
91
  end
35
92
 
36
93
  def get_fortran_strings
37
94
  return { :switch => '"select case (#{expr})"',
38
- :case => '"case (#{constants.join(" : ")})"',
39
- :default => '"case default"',
40
- :break => 'nil',
41
95
  :end => '"end select"' }
42
96
  end
43
97
 
@@ -45,44 +99,29 @@ module BOAST
45
99
  alias get_cuda_strings get_c_strings
46
100
 
47
101
  eval token_string_generator( * %w{switch expr})
48
- eval token_string_generator( * %w{case constants})
49
- eval token_string_generator( * %w{default})
50
- eval token_string_generator( * %w{break})
51
102
  eval token_string_generator( * %w{end})
52
103
 
53
- def to_s(block_number = nil)
104
+ def to_s
54
105
  s = ""
55
- if block_number then
56
- if block_number != 0 then
57
- s += indent + break_string + "\n" if break_string
58
- decrement_indent_level
59
- end
60
- s += indent
61
- if @constants_list[block_number] and @constants_list[block_number].size > 0 then
62
- s += case_string(@constants_list[block_number])
63
- else
64
- s += default_string
65
- end
66
- else
67
- s += indent
68
- s += switch_string(@expression)
69
- end
70
- increment_indent_level
106
+ s += switch_string(@expression)
71
107
  return s
72
108
  end
73
109
 
74
110
  def open
75
- output.puts to_s
111
+ s = ""
112
+ s += indent
113
+ s += to_s
114
+ output.puts s
115
+ increment_indent_level
76
116
  return self
77
117
  end
78
118
 
79
119
  def pr(*args)
120
+ args = @args if args.length == 0 and @args
80
121
  open
81
- if @blocks.size > 0 then
82
- @blocks.each_index { |indx|
83
- s = to_s(indx)
84
- output.puts s
85
- @blocks[indx].call(*args)
122
+ if @case_conditions.size > 0 then
123
+ @case_conditions.each { |cond|
124
+ cond.pr(*args)
86
125
  }
87
126
  close
88
127
  end
@@ -90,12 +129,10 @@ module BOAST
90
129
  end
91
130
 
92
131
  def close
132
+ decrement_indent_level
93
133
  s = ""
94
- s += indent + break_string + "\n" if break_string
95
- decrement_indent_level
96
134
  s += indent
97
135
  s += end_string
98
- decrement_indent_level
99
136
  output.puts s
100
137
  return self
101
138
  end