private void BuildNextFunction() { foreach (CFGNode node in ListOfCfgNodes) { if (node is CFGNodeStatement) { CFGNodeStatement stmt = (CFGNodeStatement)node; CFGNode NextNode = null; CommonAST ASTwalker = stmt.GetAST(); ASTParentByASTNode.TryGetValue(ASTwalker, out ASTwalker); bool done = false; while (!done && ASTwalker != null) { #region STMT or LSTMT if (ASTwalker.Type == BoolParserTokenTypes.LITERAL_while) { done = true; ASTParentByASTNode.TryGetValue(ASTwalker, out ASTwalker); if (AstToCfgMapping.TryGetValue(ASTwalker, out NextNode)) { stmt.Next = NextNode; } else { stmt.Next = null; } } else if ((ASTwalker.Type == BoolParserTokenTypes.STMT || ASTwalker.Type == BoolParserTokenTypes.LSTMT) && (ASTwalker.getNextSibling() != null)) { CommonAST ASTwalkerSibling = (CommonAST)ASTwalker.getNextSibling(); if (ASTwalkerSibling.Type == BoolParserTokenTypes.STMT || ASTwalkerSibling.Type == BoolParserTokenTypes.LSTMT) { done = true; if (AstToCfgMapping.TryGetValue(ASTwalkerSibling, out NextNode)) { stmt.Next = NextNode; } else { stmt.Next = null; } } } #endregion #region PROC if (ASTwalker.Type == BoolParserTokenTypes.PROC) { done = true; if (AstToCfgMapping.TryGetValue(ASTwalker, out NextNode)) { stmt.Next = NextNode; } else { stmt.Next = null; } } #endregion if (!done) { ASTParentByASTNode.TryGetValue(ASTwalker, out ASTwalker); } } if (stmt is CFGNodeStmtProcCall) { if (NextNode is CFGNodeStmtSkip) { (NextNode as CFGNodeStmtSkip).setPreviousProcCall(stmt as CFGNodeStmtProcCall); } } } else //We use this pass trough the CFG nodes to build "First Statement Of Procedure" function if (node is CFGNodeProcedure) { CFGNodeProcedure proc = (CFGNodeProcedure)node; CommonAST ASTwalker = proc.GetAST(); ASTwalker = (CommonAST)ASTwalker.getFirstChild(); while (ASTwalker.Type != BoolParserTokenTypes.SSEQ) { ASTwalker = (CommonAST)ASTwalker.getNextSibling(); } ASTwalker = (CommonAST)ASTwalker.getFirstChild(); CFGNode FirstOf; if (AstToCfgMapping.TryGetValue(ASTwalker, out FirstOf)) { proc.FirstStmtOf = FirstOf; } } } }
public static Bdd buildProcCallTransfer(CommonAST procCall, CFGNodeProcedure procedureCalled, BddManager Manager, Dictionary <string, int> LocalVarToId, Dictionary <string, int> GlobalVarToId) { Bdd transfer = Manager.CreateBddOne(); CommonAST walkerExpr = procCall.getFirstChild().getFirstChild() as CommonAST; CommonAST walkerFormal = procedureCalled.GetAST().getFirstChild() as CommonAST; #region Build Bdd for FormalParameters = Call Expressions while (walkerExpr != null) { Bdd expr = HelperFunctions.ExprToBdd(walkerExpr, Manager, LocalVarToId, GlobalVarToId); int varID; if (!procedureCalled.FormalParameters.VariablesToId.TryGetValue(walkerFormal.getText(), out varID)) { System.Diagnostics.Debug.Assert(false); } Bdd formal = Manager.GetBddVariableWithID(varID + 2); Bdd tempBdd = Manager.LogicalXnor(formal, expr); Bdd tempBdd2 = transfer; transfer = Manager.LogicalAnd(transfer, tempBdd); expr.FreeBdd(); formal.FreeBdd(); tempBdd.FreeBdd(); tempBdd2.FreeBdd(); walkerExpr = walkerExpr.getNextSibling() as CommonAST; walkerFormal = walkerFormal.getNextSibling() as CommonAST; } #endregion #region And with an identity over Global variables and true Local variables(non Formals) /* int variableCount = procedureCalled.LocalVariables.VariablesToId.Values.Count - * procedureCalled.FormalParameters.VariablesToId.Values.Count; * int[] variableIDs = new int[variableCount]; * int index = 0; * Bdd identity; * foreach (int varID in procedureCalled.LocalVariables.VariablesToId.Values) * { * if (!(procedureCalled.FormalParameters.VariablesToId.ContainsValue(varID))) * { * variableIDs[index++] = varID; * } * } * * Bdd identNewLocals = HelperFunctions.BuildIdentityOverVariableIDs(Manager, variableIDs, variableCount);*/ Bdd identGlobals = HelperFunctions.BuildIdentityTransfer(Manager, null, GlobalVarToId); /* if (identNewLocals != null && identGlobals != null) * { * identity = Manager.LogicalAnd(identGlobals, identNewLocals); * identNewLocals.FreeBdd(); * identGlobals.FreeBdd(); * } * else if (identNewLocals != null) * { * identity = identNewLocals; * } * else * { * identity = identGlobals; * }*/ Bdd identity = identGlobals; Bdd temp = transfer; transfer = Manager.LogicalAnd(transfer, identity); //temp.FreeBdd(); #endregion return(transfer); }
private void ExtractCfgNodes(CommonAST SubAst, CommonAST ParentAST, CFGNodeProcedure ProcOf) { while (SubAst != null) { ASTParentByASTNode.Add(SubAst, ParentAST); #region AST Nodes of type Statement if (SubAst.Type == BoolParserTokenTypes.STMT || SubAst.Type == BoolParserTokenTypes.LSTMT) { if (!AstToCfgMapping.ContainsKey(SubAst)) { CFGNodeStatement NewStatementNode; if (SubAst.Type == BoolParserTokenTypes.STMT) { NewStatementNode = CFGStatementNodeFactory.Make((CommonAST)SubAst.getFirstChild()); } else { NewStatementNode = CFGStatementNodeFactory.Make( (CommonAST)SubAst.getFirstChild().getNextSibling()); NewStatementNode.setLabel(SubAst.getFirstChild().getText()); LabelToStatement.Add(SubAst.getFirstChild().getText(), NewStatementNode); } NewStatementNode.ProcOf = ProcOf; ListOfCfgNodes.Add(NewStatementNode); AstToCfgMapping.Add(SubAst, NewStatementNode); } } #endregion #region AST Nodes of type Procedure if (SubAst.Type == BoolParserTokenTypes.PROC) { if (!AstToCfgMapping.ContainsKey(SubAst)) { CFGNodeProcedure NewStatementNode = new CFGNodeProcedure((CommonAST)SubAst.getFirstChild()); ListOfCfgNodes.Add(NewStatementNode); AstToCfgMapping.Add(SubAst, NewStatementNode); ProcNameToNode.Add(SubAst.getFirstChild().getText(), NewStatementNode); ProcOf = NewStatementNode; //Inserting the function parameters into the procedure local variables list CommonAST walker = (CommonAST)SubAst.getFirstChild().getFirstChild(); while (walker.Type == BoolParserTokenTypes.ID) { int varID = ProcOf.LocalVariables.AddVar(walker.getText(), m_BddManager, m_BddVariableToName); ProcOf.FormalParameters.AddVar(walker.getText(), varID); walker = (CommonAST)walker.getNextSibling(); } } } #endregion #region AST Nodes of type Variable Declaration if (SubAst.Type == BoolParserTokenTypes.LITERAL_decl) { CommonAST walker = (CommonAST)SubAst.getFirstChild(); while (walker != null) { if (ProcOf != null) { ProcOf.LocalVariables.AddVar(walker.getText(), m_BddManager, m_BddVariableToName); } else { m_GlobalVariables.AddVar(walker.getText(), m_BddManager, m_BddVariableToName); } walker = (CommonAST)walker.getNextSibling(); } } #endregion ExtractCfgNodes((CommonAST)SubAst.getFirstChild(), SubAst, ProcOf); SubAst = (CommonAST)SubAst.getNextSibling(); } }
public CFGNodeStatement(CommonAST StatementAST) { NodeASTSubTree = StatementAST; m_ProcOf = null; }