Example #1
0
void parseTupleElementType(){
    pos++;
    char* type = argv[pos];
    std::cout << "Type: " << type << std::cout;

    pos++;
    char* rawValue = argv[pos];
    stringstream ss;
    ss << rawValue;
    cout << "RawValue: " << rawValue << std::cout;

    if(strcmp(type, "i") == 0) {
        int intValue;
        ss >> intValue;
        tuple.append(intValue);
    } else if(strcmp(type, "s") == 0) {
int main() {

  // Transformation or Data Flow
  Relation dataFlow(2,2); // [i,j] -> [i,j]
  dataFlow.name_input_var(1, "i");
  dataFlow.name_input_var(2, "j");
  Variable_ID i = dataFlow.input_var(1);
  Variable_ID j = dataFlow.input_var(2);

  dataFlow.name_output_var(1, "I");
  dataFlow.name_output_var(2, "J");
  Variable_ID I = dataFlow.output_var(1);
  Variable_ID J = dataFlow.output_var(2);

  F_And *root = dataFlow.add_and();
  EQ_Handle ieq = root->add_EQ();
  ieq.update_coef(i,1);
  ieq.update_coef(I,-1);
  EQ_Handle jeq = root->add_EQ();
  jeq.update_coef(j,1);
  jeq.update_coef(J,-1);

  //  dataFlow.prefix_print();
  cout << "Data Flow:\t";
  dataFlow.print_with_subs(stdout);
  RelTuple R;
  R.append(dataFlow);

  Relation IS(2);
  IS.name_set_var(1, "i");
  IS.name_set_var(2, "j");
  
  Free_Var_Decl n("n");
  Variable_ID IS_n = IS.get_local(&n);

  Variable_ID IS_i = IS.set_var(1);
  Variable_ID IS_j = IS.set_var(2);

  F_And *IS_root = IS.add_and();
  GEQ_Handle imin = IS_root->add_GEQ();
  imin.update_coef(IS_i, 1);
  imin.update_const(-1);
  GEQ_Handle imax = IS_root->add_GEQ();
  imax.update_coef(IS_n,1);
  imax.update_coef(IS_i, -1);

  GEQ_Handle jmin = IS_root->add_GEQ();
  jmin.update_coef(IS_j, 1);
  jmin.update_const(-1);
  GEQ_Handle jmax = IS_root->add_GEQ();
  jmax.update_coef(IS_n,1);
  jmax.update_coef(IS_j, -1);

  cout << "IS:\t\t";
  IS.print_with_subs(stdout);
  SetTuple S;
  S.append(IS);

  Relation norm(2);
  norm.name_set_var(1, "i");
  norm.name_set_var(2, "j");
  i = norm.set_var(1);
  j = norm.set_var(2);

  F_And *norm_root = norm.add_and();
  EQ_Handle equal = norm_root->add_EQ();
  equal.update_const(0);

  cout << "Relation:\t";
  norm.print_with_subs(stdout);

  // creating MMaps
  MMap mmtest;		// { [t,i] -> [i,j] , "a" }
  //defining mmtest
  Relation map(2,2);  // making it output 2 vars

  map.name_input_var(1, "i");
  map.name_input_var(2, "j");
  Variable_ID t1 = map.input_var(1);
  Variable_ID i1 = map.input_var(2);

  map.name_output_var(1, "i");
  map.name_output_var(2, "j");  // output var 2
  Variable_ID x1 = map.output_var(1);
  Variable_ID y1 = map.output_var(2);  // output var 2

  F_And *map_root = map.add_and();
  EQ_Handle map_xeq = map_root->add_EQ();  // x=i  === x-i = 0
  map_xeq.update_coef(x1,1);
  map_xeq.update_coef(t1,-1);

  EQ_Handle map_yeq = map_root->add_EQ();  // y=t  === y-t = 0
  map_yeq.update_coef(y1,1);
  map_yeq.update_coef(i1,-1);

  mmtest.mapping = map;
  mmtest.var = "a";
  cout << "Memory Map:\t";
  map.print_with_subs(stdout);

  MMap mmtest2;
  Relation map2(2,1);  // making it output 2 vars
  map2.name_input_var(1, "i");
  map2.name_input_var(2, "j");
  t1 = map2.input_var(1);
  i1 = map2.input_var(2);

  map2.name_output_var(1, "i");
  x1 = map2.output_var(1);
  
  F_And *map2_root = map2.add_and();
  EQ_Handle map2_xeq = map2_root->add_EQ();  // x=i+j  === x-i-j = 0
  map2_xeq.update_coef(x1,1);
  map2_xeq.update_coef(t1,-1);
  map2_xeq.update_coef(i1,-1);

  mmtest2.mapping = map2;
  mmtest2.var = "b";
  cout << "Memory Map 2:\t";
  map2.print_with_subs(stdout);

#if 0  // NO LONGER IMPLEMENTED
  Tuple<MMap> tests;
  tests.append(mmtest);
  tests.append(mmtest2);

  cout << list(tests,"0");
#endif

  cout << MMGenerateCode(R,S,norm,0);
  //  CG_funkyStringBuilder x;
  //  MMGenerateCode(&x, R, S, norm, 0)->Dump();

  /* Example of output function:  for i=2 to N
                                    a[i] = a[i-1] + 2
     IS : 2 <= i <= N
     MMap : "a", [i]->[i]
     Reads : 0, [i]->[i+1]
     Stmt : "w = r1 + 2"
     */
  
  Relation IS2(1);
  IS2.name_set_var(1, "i");
  
  IS_n = IS2.get_local(&n);
  IS_i = IS2.set_var(1);

  F_And *IS2_root = IS2.add_and();
  imin = IS2_root->add_GEQ();
  imin.update_coef(IS_i, 1);
  imin.update_const(-2);
  imax = IS2_root->add_GEQ();
  imax.update_coef(IS_n,1);
  imax.update_coef(IS_i, -1);

  cout << "IS:\t\t";
  IS2.print_with_subs(stdout);

  MMap mmtest3;
  Relation map3(1,1);  // making it output 2 vars

  map3.name_input_var(1, "i");
  i1 = map3.input_var(1);

  map3.name_output_var(1, "i");
  x1 = map3.output_var(1);

  F_And *map3_root = map3.add_and();
  EQ_Handle map3_xeq = map3_root->add_EQ();  // x=i  === x-i = 0
  map3_xeq.update_coef(x1,1);
  map3_xeq.update_coef(t1,-1);

  mmtest3.mapping = map3;
  mmtest3.var = "a";
  cout << "Memory Map 3:\t";
  map3.print_with_subs(stdout);

  PartialRead readTest;
  Relation df(1,1);
  df.name_input_var(1, "i");
  i1 = df.input_var(1);
  x1 = df.output_var(1);
  F_And *df_root = df.add_and();
  EQ_Handle df_eq = df_root->add_EQ();
  df_eq.update_coef(x1,1);
  df_eq.update_coef(i1,-1);
  df_eq.update_const(-1);

  readTest.from = 1;
  readTest.dataFlow = df;
  Read oneReadTest;
  oneReadTest.partials.append(readTest);

  Tuple<Read> readTuple;
  readTuple.append(oneReadTest);
  cout << "Data Flow:\t";
  df.print_with_subs(stdout);

  String stmtTest = "w = r1 + 2";
  
  stm_info testing;
  testing.IS = IS2;
  testing.map = mmtest3;
  testing.read = readTuple;
  testing.stm = stmtTest;
  Tuple<stm_info> example;
  example.append(testing);
  cout << output(example);
} // Main