public void TestCopyCDFG() { DFG <Block> dfg1 = new DFG <Block>(); dfg1.AddNode(new Constant(3, "a", "", false)); dfg1.AddNode(new SetNumberVariable((VariableBlock)dfg1.Nodes[0].value, "b", "")); dfg1.AddNode(new Constant(6, "g", "", false)); dfg1.AddNode(new Constant(6, "h", "", false)); dfg1.AddNode(new BoolOP((VariableBlock)dfg1.Nodes[2].value, (VariableBlock)dfg1.Nodes[3].value, "i", BoolOPTypes.EQ, "", true)); dfg1.FinishDFG(); DFG <Block> dfg2 = new DFG <Block>(); dfg2.AddNode(new Constant(6, "c", "", false)); dfg2.AddNode(new GetNumberVariable("b", "d", "", false)); dfg2.AddNode(new ArithOP((VariableBlock)dfg2.Nodes[0].value, (VariableBlock)dfg2.Nodes[1].value, "e", ArithOPTypes.ADD, "", false)); dfg2.AddNode(new SetNumberVariable((VariableBlock)dfg2.Nodes[2].value, "f", "")); dfg2.FinishDFG(); CDFG original = new CDFG(); original.AddNode(new While(new Conditional((VariableBlock)dfg1.Nodes[4].value, dfg2, null)), dfg1); original.AddNode(null, dfg2); original.StartDFG = dfg1; CDFG copy1 = original.Copy(); CheckCopyCDFG(original, copy1); CDFG copy2 = original.Copy(); CheckCopyCDFG(original, copy2); }
public Direct GetProgram(XmlNode currentProgramXml, ParserInfo parserInfo) { string id = ParseTools.ParseID(currentProgramXml); InlineProgramInfo programInfo = GetInlineProgramInfo(currentProgramXml, parserInfo); CDFG newProgram = ProgramCDFG.Copy(); TransformCDFGToFunctionCDFG(newProgram, programInfo); TransformVariableNames(newProgram, programInfo, parserInfo.GetUniquePostFix()); ChangeIDs(newProgram, id); //Add new variables that this program added programInfo.OutputsFromTo.ForEach(x => parserInfo.AddVariable(string.Empty, VariableType.FLUID, x.Value)); DFG <Block> nextDFG = XmlParser.ParseNextDFG(currentProgramXml, parserInfo); DFG <Block> endDFG = newProgram.GetEndDFGInFirstScope(); int i = newProgram.Nodes.FindIndex(x => x.dfg == endDFG); if (newProgram.Nodes[i].control == null) { newProgram.Nodes[i] = (new Direct(nextDFG), endDFG); } else { newProgram.Nodes[i] = (newProgram.Nodes[i].control.GetNewControlWithNewEnd(nextDFG), endDFG); } //merge the programs together nd return the link between then parserInfo.cdfg.AddCDFG(newProgram); return(new Direct(newProgram.StartDFG)); }