32 #include <util/visitors/eval_init_exp.hpp>
33 #include <util/visitors/get_index_usage.hpp>
34 #include <util/visitors/is_constant_index.hpp>
35 #include <util/visitors/parse_index.hpp>
36 #include <util/visitors/partial_eval_exp.hpp>
37 #include <util/visitors/replace_index.hpp>
38 #include <util/visitors/revert_index.hpp>
62 AST_Expression_ComponentReference ref = exp->getAsComponentReference();
64 if (ref->hasIndexes()) {
65 AST_ExpressionList indexes = ref->firstIndex();
66 AST_ExpressionListIterator it;
67 foreach (it, indexes) {
68 ParseIndex parse_index;
70 PartialEvalExp partial_eval;
80 vector<int> init_values;
83 init_values.push_back(0);
86 for (
size_t i = 0; i < size; i++) {
87 IndexDefinition idx_def =
_indexes[i];
88 init_values.push_back(idx_def.constant());
92 for (
size_t i = 0; i < size; i++) {
93 IndexDefinition idx_def =
_indexes[i];
94 if (idx_def.variable().empty()) {
95 init_values.push_back(idx_def.constant());
100 init_values.push_back(idx_def.constant() + idx_def.factor() * dim_range->begin());
122 CheckIndexExpression constant_index;
136 buffer <<
"_eval" <<
_exp;
178 if (!usage_exp.empty()) {
179 buffer <<
"[" << usage_exp <<
"]";
188 PartialEvalExp partial_eval;
190 buffer <<
"_idx" << exp;
197 for (
unsigned int i = 0; i <
_indexes.size(); i++) {
223 std::ostream&
operator<<(std::ostream& out,
const Index& i)
232 : _begin(begin), _end(end), _step(step), _begin_exp(begin_exp), _end_exp(end_exp)
247 if (convert_params) {
248 index = index.replace();
250 code << index.expression();
265 Range::Range() : _ranges(), _index_pos(), _size(1), _type(RANGE::
For), _fixed(true), _merged_dims(false) {}
267 Range::Range(AST_Equation_For eqf,
RANGE::Type type) : _ranges(), _index_pos(), _size(1), _type(type), _fixed(true), _merged_dims(false)
269 AST_ForIndexList fil = eqf->forIndexList();
270 setRangeDefinition(fil);
274 : _ranges(), _index_pos(), _size(1), _type(type), _fixed(true), _merged_dims(false)
276 AST_ForIndexList fil = stf->forIndexList();
277 setRangeDefinition(fil, from_event);
285 Range::Range(AST_Expression exp) : _ranges(), _index_pos(), _size(1), _type(RANGE::
For), _fixed(true), _merged_dims(false)
291 : _ranges(), _index_pos(), _size(1), _type(RANGE::
For), _fixed(true), _merged_dims(false)
293 generate(set, offset, vars, orig_range);
311 AST_Expression_ComponentReference cr = exp->getAsComponentReference();
317 if (var->isParameter()) {
327 AST_ForIndexListIterator filit;
329 foreach (filit, fil) {
331 AST_Expression
in = fi->in_exp();
332 AST_ExpressionList el =
in->getAsRange()->expressionList();
334 int size = el->size();
344 begin = eval.apply(ast_begin_exp);
349 end = eval.apply(ast_end_exp);
352 end = eval.apply(ast_end_exp) - begin + 1;
358 string index = fi->variable()->c_str();
360 (
size == 2 ? RangeDefinition(begin_exp, end_exp, begin,
end)
361 : RangeDefinition(begin_exp, end_exp, begin,
end, eval.apply(
AST_ListAt(el, 1)))),
369 for (
unsigned int i = 0; i < var.dimensions(); i++) {
372 int end = var.size(i);
380 CheckIndexExpression constant_index;
381 assert(constant_index.apply(exp));
382 AST_Expression_ComponentReference ref = exp->getAsComponentReference();
383 assert(ref->hasIndexes());
384 AST_ExpressionList
indexes = ref->firstIndex();
385 AST_ExpressionListIterator it;
391 EvalInitExp eval_exp;
392 int scalar_value = eval_exp.apply(index_exp);
399 bool not_number =
true;
403 }
catch (
const std::exception&) {
408 Expression
Range::getExp(std::vector<Expression> exps,
size_t pos)
413 assert(exps.size() >
pos);
420 unsigned int pos = 0;
421 const bool MAP_RANGE = orig_range.has_value();
422 SB::UnordAtomSet a_sets = set.atomicSets();
423 for (SB::AtomSet a_set : a_sets) {
424 SB::MultiInterval intervals = a_set.atomicSets();
426 for (SB::Interval interval : intervals.intervals()) {
427 int begin = interval.lo() - offset + 1;
428 int end = begin + interval.hi() - interval.lo();
429 int step = interval.step();
432 begin = orig_def.
begin() + (begin - 1) * orig_def.
step();
448 void Range::generate(SB::Set set,
int offset, vector<string> vars, std::vector<Expression> begin_exps, std::vector<Expression> end_exps)
450 unsigned int pos = 0;
451 SB::UnordAtomSet a_sets = set.atomicSets();
452 for (SB::AtomSet a_set : a_sets) {
453 SB::MultiInterval intervals = a_set.atomicSets();
455 for (SB::Interval interval : intervals.intervals()) {
456 int begin = interval.lo() - offset + 1;
457 int end = begin + interval.hi() - interval.lo();
477 if (ip.second ==
dim) {
490 if (ip.first == var) {
503 for (
int i = 1; i <=
size; i++) {
504 buffer <<
"%d" << (i + 1 <=
size ?
"," :
"");
513 for (
int i = 1; i <=
size; i++) {
521 vector<string> buffer;
523 for (
int i = 1; i <=
size; i++) {
546 for (
int i =
size; i > 0; i--) {
547 buffer <<
block(i - 1) <<
"}" << (i - 1 > 0 ?
"\n" :
"");
552 string Range::print(
bool range,
bool c_index,
bool convert_params)
const
565 string idx = idxs[idx_count];
566 buffer <<
block <<
"for(" << idx <<
" = " << r.beginExp(convert_params, c_index) <<
"; ";
567 buffer << idx <<
"<=" << r.endExp(convert_params, c_index) <<
"; ";
568 buffer << idx <<
"+=" << r.step() <<
") {" << endl;
587 buffer << index << (++i <
size ?
"," :
"");
597 for (RangeDefinition r = ranges.begin(it); !ranges.end(it); r = ranges.next(it)) {
611 string var = ranges.
key(it);
623 string var = ranges.
key(it);
662 for (
int i = 0; i <
size; i++) {
672 return boost::get<int>(p);
679 int dimension =
usage.dimension();
684 if (
usage.hasVariable(i)) {
685 int new_begin = r.begin() *
usage.factor(i) +
usage.constant(i);
686 int new_end = r.end() *
usage.factor(i) +
usage.constant(i);
697 map<string, RangeDefinition> updated_ranges;
699 int new_begin = r.begin() + offset;
700 int new_end = r.end() + offset;
704 for (
auto update_range : updated_ranges) {
715 map<string, RangeDefinition> updated_ranges;
718 int new_begin = r.begin() + other_def.
begin() - 1;
719 int new_end = r.end() + other_def.
begin() - 1;
723 for (
auto update_range : updated_ranges) {
732 assert(
usage.isConstant());
739 int usage_val =
usage.constant(i);
740 if (usage_val < new_begin || usage_val > new_end) {
750 vector<string> str_exps;
751 for (
auto e : exps) {
752 str_exps.push_back(e.print());
768 int exps_size = exps.size();
772 code <<
"(" << r.begin() <<
" <= " << exp_str <<
" && " << exp_str <<
" <= " << r.end() <<
")";
773 code << ((i + 1 <
size) ?
" && " :
"");
784 map<string, AST_Expression> init_exps;
795 if (added_vars.find(var) == added_vars.end()) {
801 old_keys.push_back(var);
829 vector<string> max_usage = (SELECT_IFE_USAGE) ? ife_usage.
variables() : ifr_usage.
variables();
830 vector<string> min_usage = (!SELECT_IFE_USAGE) ? ife_usage.
variables() : ifr_usage.
variables();
831 vector<pair<string, string>> used_variables;
833 int min_usage_idx = 0;
834 int min_usage_size = min_usage.size();
835 for (
string max_usage_str : max_usage) {
836 string min_usage_str =
"";
837 if (min_usage_idx < min_usage_size) {
838 min_usage_str = min_usage[min_usage_idx];
840 used_variables.push_back(make_pair(max_usage_str, min_usage_str));
859 if (used_variables.empty()) {
861 for (
string max_usage_str : max_usage) {
862 string min_usage_str =
"";
863 used_variables.push_back(make_pair(max_usage_str, min_usage_str));
866 set<string> added_vars;
867 vector<string> old_keys;
869 for (pair<string, string> vars : used_variables) {
872 for (
string key : old_keys) {
883 for (RangeDefinition r = other._ranges.begin(it); !other._ranges.end(it); r = other._ranges.next(it)) {
893 std::ostream&
operator<<(std::ostream& out,
const Range& r) {
return out << r.print(); }