Beispiel #1
0
        // checks for the existence of a subprogram by the pattern and adds it if it matches up or if it is completely novel
        void addToProgramsByPatternIfNotExistOrPatternMatches(bool[] pattern, SubprogramWithMetaInfo subprogram)
        {
            if (programsWithIdByPattern.ContainsKey(pattern))
            {
                var subprogramsByPattern = programsWithIdByPattern[pattern].Item1;

                ProgramGroup matchingProgramGroup = null;
                foreach (ProgramGroup iProgramGroup in subprogramsByPattern)
                {
                    if (iProgramGroup.checkMatchesSubprogram(pattern, subprogram))
                    {
                        matchingProgramGroup = iProgramGroup;
                        break;
                    }
                }
                bool existsSame = matchingProgramGroup != null;

                if (existsSame)
                {
                    // add a count to the ProgramGroup
                    matchingProgramGroup.incrementMatchCounter();
                }
                else
                {
                    // add it
                    subprogramsByPattern.Add(new ProgramGroup(subprogram));
                }
            }
            else
            {
                programsWithIdByPattern[pattern] =
                    new Tuple <IList <ProgramGroup>, uint>(
                        new List <ProgramGroup> {
                    new ProgramGroup(subprogram)
                },
                        returnNewPatternId()
                        );
            }
        }
Beispiel #2
0
            // checks if the masked instructions match up with the subprogram(s)
            public bool checkMatchesSubprogram(bool[] instructionEnablingMask, SubprogramWithMetaInfo other)
            {
                SubprogramWithMetaInfo anySubprogram = subprograms[0]; // it is valid to match up to the first subprogram

                Debug.Assert(instructionEnablingMask.Length == other.subProgram.Length);
                Debug.Assert(anySubprogram.subProgram.Length == other.subProgram.Length);

                int patternIdx;

                for (patternIdx = 0; patternIdx < instructionEnablingMask.Length; patternIdx++)
                {
                    if (!instructionEnablingMask[patternIdx])
                    {
                        continue;                                       // ignore disabled instructions
                    }
                    if (anySubprogram.subProgram[patternIdx] != other.subProgram[patternIdx])
                    {
                        break;
                    }
                }
                bool isSamePattern = patternIdx == instructionEnablingMask.Length;

                return(isSamePattern);
            }
Beispiel #3
0
            }                         // disable ctor for convinience

            public void addSubprogram(SubprogramWithMetaInfo subprogram)
            {
                subprograms.Add(subprogram);
            }
Beispiel #4
0
 public ProgramGroup(SubprogramWithMetaInfo subprogram)
 {
     addSubprogram(subprogram);
 }