// 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() ); } }
// 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); }
} // disable ctor for convinience public void addSubprogram(SubprogramWithMetaInfo subprogram) { subprograms.Add(subprogram); }
public ProgramGroup(SubprogramWithMetaInfo subprogram) { addSubprogram(subprogram); }