Beispiel #1
0
        protected virtual string Translate(Computation.IncrementDelayedCounters node, Context context)
        {
            StringBuilder ret = new StringBuilder();

            ret.AppendFormat("for ({0} = 0; i < {1}; ++i)",
                             context.DeclareValueVariable("int", "i"),
                             node.Counters.Count);

            ret.AppendLine();
            ret.AppendLine("{");
            ret.AppendFormat("\tif ({0}[i] == {1}[i] - 1)", context.This(node.Counters), context.This(node.CountersSize));
            ret.AppendLine();
            ret.AppendLine("\t{");
            ret.AppendFormat("\t\t{0}[i] = 0;", context.This(node.Counters));
            ret.AppendLine();
            ret.AppendLine("\t}");
            ret.AppendLine("\telse");
            ret.AppendLine("\t{");
            ret.AppendFormat("\t\t++{0}[i];", context.This(node.Counters));
            ret.AppendLine();
            ret.AppendLine("\t}");
            ret.Append("}");

            Dictionary <DataTable, bool> seen = new Dictionary <DataTable, bool>();
            bool first = true;

            // Update counter loop indices
            foreach (Computation.Loop loop in context.Program.Loops)
            {
                DataTable table = loop.IndexTable;

                if (seen.ContainsKey(table))
                {
                    continue;
                }

                for (int i = 0; i < table.Count; ++i)
                {
                    DataTable.DataItem item = table[i];

                    if (item.HasType(DataTable.DataItem.Flags.Delayed))
                    {
                        int r = i % table.Columns;
                        int c = i / table.Columns;
                        Computation.Loop.Index sidx = (Computation.Loop.Index)item.Key;

                        DataTable.DataItem state   = context.Program.StateTable[(int)sidx.Value];
                        DelayedState.Key   delayed = (DelayedState.Key)state.Key;
                        DataTable.DataItem idx     = context.Program.DelayedCounters[delayed.Size];

                        if (first)
                        {
                            ret.AppendLine();
                            first = false;
                        }

                        ret.AppendLine();
                        ret.AppendFormat("{0}[{1}][{2}] = {3} + {4}[{5}];",
                                         context.This(table), r, c,
                                         sidx.Value,
                                         context.This(context.Program.DelayedCounters), idx.DataIndex);
                    }
                }

                seen[table] = true;
            }

            return(ret.ToString());
        }
Beispiel #2
0
 protected virtual string Translate(Computation.Loop.Index val)
 {
     return(val.DataItem.AliasOrIndex);
 }