public void InitializeVectorAndSumWithSliceIterator_Execute_CorrectSumValue() { DfirRoot function = DfirRoot.Create(); FunctionalNode initializeVector = CreateInitializeVectorWithIntegerConstants(function.BlockDiagram, 4, 4); FunctionalNode vectorToSlice = new FunctionalNode(function.BlockDiagram, Signatures.VectorToSliceType); Wire.Create(function.BlockDiagram, initializeVector.OutputTerminals[0], vectorToSlice.InputTerminals[0]); FunctionalNode sliceToIterator = new FunctionalNode(function.BlockDiagram, Signatures.SliceToIteratorType); Wire.Create(function.BlockDiagram, vectorToSlice.OutputTerminals[0], sliceToIterator.InputTerminals[0]); Loop loop = new Loop(function.BlockDiagram); CreateLoopConditionTunnel(loop); IterateTunnel iterateTunnel = CreateIterateTunnel(loop); BorrowTunnel borrowTunnel = CreateBorrowTunnel(loop, BorrowMode.Mutable); ConnectConstantToInputTerminal(borrowTunnel.InputTerminals[0], NITypes.Int32, 0, true); Wire.Create(function.BlockDiagram, sliceToIterator.OutputTerminals[0], iterateTunnel.InputTerminals[0]) .SetWireBeginsMutableVariable(true); FunctionalNode accumulateAdd = new FunctionalNode(loop.Diagrams[0], Signatures.DefineMutatingBinaryFunction("AccumulateAdd", NITypes.Int32)); Wire.Create(loop.Diagrams[0], borrowTunnel.OutputTerminals[0], accumulateAdd.InputTerminals[0]); Wire.Create(loop.Diagrams[0], iterateTunnel.OutputTerminals[0], accumulateAdd.InputTerminals[1]); FunctionalNode inspectNode = ConnectInspectToOutputTerminal(borrowTunnel.TerminateLifetimeTunnel.OutputTerminals[0]); TestExecutionInstance executionInstance = CompileAndExecuteFunction(function); byte[] inspectValue = executionInstance.GetLastValueFromInspectNode(inspectNode); AssertByteArrayIsInt32(inspectValue, 16); }
private static void HandleAddFlatSequenceBorrowTunnel(object parameter, IEnumerable <IViewModel> selection, ICompositionHost host, DocumentEditSite site) { var structureViewModels = selection.OfType <FlatSequenceEditor>().WhereNotNull(); if (structureViewModels.Any()) { using (var transaction = structureViewModels.First().TransactionManager.BeginTransaction("Add Borrow Tunnels", TransactionPurpose.User)) { foreach (var structureViewModel in structureViewModels) { SMRect leftRect, rightRect; BorderNodeViewModelHelpers.FindBorderNodePositions(structureViewModel, out leftRect, out rightRect); Structure model = (Structure)structureViewModel.Model; BorrowTunnel borrowTunnel = model.MakeTunnel <BorrowTunnel>(model.AncestorDiagram, model.NestedDiagrams.First()); FlatSequenceTerminateLifetimeTunnel flatSequenceTerminateLifetimeTunnel = model.MakeTunnel <FlatSequenceTerminateLifetimeTunnel>(model.AncestorDiagram, model.NestedDiagrams.First()); borrowTunnel.TerminateLifetimeTunnel = flatSequenceTerminateLifetimeTunnel; flatSequenceTerminateLifetimeTunnel.BeginLifetimeTunnel = borrowTunnel; // Set both as rules were not consistently picking right one to adjust to other. borrowTunnel.Top = leftRect.Y; borrowTunnel.Left = leftRect.X; flatSequenceTerminateLifetimeTunnel.Top = borrowTunnel.Top; flatSequenceTerminateLifetimeTunnel.Left = rightRect.X; } transaction.Commit(); } } }
public void SumItemsFromRangeIterator_Execute_CorrectFinalResult() { DfirRoot function = DfirRoot.Create(); Loop loop = new Loop(function.BlockDiagram); LoopConditionTunnel conditionTunnel = CreateLoopConditionTunnel(loop); IterateTunnel iterateTunnel = CreateIterateTunnel(loop); FunctionalNode range = new FunctionalNode(function.BlockDiagram, Signatures.RangeType); Wire rangeWire = Wire.Create(function.BlockDiagram, range.OutputTerminals[0], iterateTunnel.InputTerminals[0]); rangeWire.SetWireBeginsMutableVariable(true); Constant lowConstant = ConnectConstantToInputTerminal(range.InputTerminals[0], NITypes.Int32, 0, false); Constant highConstant = ConnectConstantToInputTerminal(range.InputTerminals[1], NITypes.Int32, 10, false); BorrowTunnel borrow = CreateBorrowTunnel(loop, BorrowMode.Mutable); Constant accumulateConstant = ConnectConstantToInputTerminal(borrow.InputTerminals[0], NITypes.Int32, 0, true); FunctionalNode accumulateAdd = new FunctionalNode(loop.Diagram, Signatures.DefineMutatingBinaryFunction("AccumulateAdd", NITypes.Int32)); Wire.Create(loop.Diagram, borrow.OutputTerminals[0], accumulateAdd.InputTerminals[0]); Wire.Create(loop.Diagram, iterateTunnel.OutputTerminals[0], accumulateAdd.InputTerminals[1]); FunctionalNode inspect = ConnectInspectToOutputTerminal(borrow.TerminateLifetimeTunnel.OutputTerminals[0]); TestExecutionInstance executionInstance = CompileAndExecuteFunction(function); byte[] inspectValue = executionInstance.GetLastValueFromInspectNode(inspect); AssertByteArrayIsInt32(inspectValue, 45); }
public void UnwrapOptionTunnelWithSomeInputAndYieldingFrameInterior_Execute_FrameExecutes() { DfirRoot function = DfirRoot.Create(); FunctionalNode some = new FunctionalNode(function.BlockDiagram, Signatures.SomeConstructorType); ConnectConstantToInputTerminal(some.InputTerminals[0], NITypes.Int32, 5, false); Frame frame = Frame.Create(function.BlockDiagram); UnwrapOptionTunnel unwrapOptionTunnel = new UnwrapOptionTunnel(frame); Wire.Create(function.BlockDiagram, some.OutputTerminals[0], unwrapOptionTunnel.InputTerminals[0]); BorrowTunnel borrowTunnel = CreateBorrowTunnel(frame, BorrowMode.Mutable); ConnectConstantToInputTerminal(borrowTunnel.InputTerminals[0], NITypes.Int32, 0, true); FunctionalNode assign = new FunctionalNode(frame.Diagram, Signatures.AssignType); var yieldNode = new FunctionalNode(frame.Diagram, Signatures.YieldType); Wire.Create(frame.Diagram, borrowTunnel.OutputTerminals[0], yieldNode.InputTerminals[0]); Wire.Create(frame.Diagram, yieldNode.OutputTerminals[0], assign.InputTerminals[0]); Wire.Create(frame.Diagram, unwrapOptionTunnel.OutputTerminals[0], assign.InputTerminals[1]); FunctionalNode inspect = ConnectInspectToOutputTerminal(borrowTunnel.TerminateLifetimeTunnel.OutputTerminals[0]); TestExecutionInstance executionInstance = CompileAndExecuteFunction(function); byte[] finalValue = executionInstance.GetLastValueFromInspectNode(inspect); AssertByteArrayIsInt32(finalValue, 5); }
bool IDfirNodeVisitor <bool> .VisitBorrowTunnel(BorrowTunnel borrowTunnel) { UnifyNodeInputTerminalTypes(borrowTunnel); Terminal inputTerminal = borrowTunnel.InputTerminals[0], outputTerminal = borrowTunnel.OutputTerminals[0]; OutputLifetimeInterruptsInputVariable(borrowTunnel.InputTerminals[0], borrowTunnel.OutputTerminals[0]); return(true); }
// This visitor implementation parallels that of SetVariableTypesTransform: // For each variable created by a visited node, this should determine the appropriate ValueSource for that variable. public bool VisitBorrowTunnel(BorrowTunnel borrowTunnel) { VariableReference inputVariable = borrowTunnel.InputTerminals[0].GetTrueVariable(), outputVariable = borrowTunnel.OutputTerminals[0].GetTrueVariable(); CreateReferenceValueSource(outputVariable, inputVariable); return(true); }
internal static BorrowTunnel CreateBorrowTunnel(Structure structure, BorrowMode borrowMode) { var borrowTunnel = new BorrowTunnel(structure, borrowMode); var terminateLifetimeDfir = new TerminateLifetimeTunnel(structure); borrowTunnel.TerminateLifetimeTunnel = terminateLifetimeDfir; terminateLifetimeDfir.BeginLifetimeTunnel = borrowTunnel; return(borrowTunnel); }
public bool VisitBorrowTunnel(BorrowTunnel borrowTunnel) { var validator = borrowTunnel.Terminals[0].GetValidator(); if (borrowTunnel.BorrowMode == BorrowMode.Mutable) { validator.TestVariableIsMutableType(); } return(true); }
public bool VisitBorrowTunnel(BorrowTunnel borrowTunnel) { VariableReference input = borrowTunnel.InputTerminals.ElementAt(0).GetTrueVariable(), output = borrowTunnel.OutputTerminals.ElementAt(0).GetTrueVariable(); if (_variableAllocations[output] is LocalAllocationValueSource) { BorrowFromVariableIntoVariable(input, output); } return(true); }
public void BorrowTunnelWithUnwiredOutput_AutomaticNodeInsertion_NoTerminateLifetimeInserted() { DfirRoot function = DfirRoot.Create(); Frame frame = Frame.Create(function.BlockDiagram); BorrowTunnel borrowTunnel = CreateBorrowTunnel(frame, BorrowMode.Immutable); FunctionalNode outputStringOwner = new FunctionalNode(function.BlockDiagram, _outputOwnerStringSignature); Wire.Create(function.BlockDiagram, outputStringOwner.OutputTerminals[0], borrowTunnel.InputTerminals[0]); RunCompilationUpToAutomaticNodeInsertion(function); Assert.IsFalse(frame.Diagram.Nodes.OfType <TerminateLifetimeNode>().Any()); }
public void TerminateLifetimeWithStructureBorderInputLifetimeWired_ValidateVariableUsages_LifetimeCannotBeTerminatedErrorMessageReported() { DfirRoot function = DfirRoot.Create(); Frame frame = Frame.Create(function.BlockDiagram); BorrowTunnel borrowTunnel = CreateBorrowTunnel(frame, BorrowMode.Immutable); ConnectConstantToInputTerminal(borrowTunnel.InputTerminals[0], PFTypes.Int32, false); TerminateLifetimeNode terminateLifetime = new TerminateLifetimeNode(frame.Diagram, 1, 1); Wire wire = Wire.Create(frame.Diagram, borrowTunnel.OutputTerminals[0], terminateLifetime.InputTerminals[0]); RunSemanticAnalysisUpToValidation(function); Assert.IsTrue(terminateLifetime.GetDfirMessages().Any(message => message.Descriptor == Messages.TerminateLifetimeInputLifetimeCannotBeTerminated.Descriptor)); }
bool IDfirNodeVisitor <bool> .VisitBorrowTunnel(BorrowTunnel borrowTunnel) { // T -> &'a (mode) T Terminal valueInput = borrowTunnel.InputTerminals.ElementAt(0), borrowOutput = borrowTunnel.OutputTerminals.ElementAt(0); TypeVariableReference dataTypeVariable = _typeVariableSet.CreateReferenceToNewTypeVariable(); Lifetime innerLifetime = borrowOutput.GetDiagramLifetime(); TypeVariableReference referenceType = _typeVariableSet.CreateReferenceToReferenceType( borrowTunnel.BorrowMode == BorrowMode.Mutable, dataTypeVariable, _typeVariableSet.CreateReferenceToLifetimeType(innerLifetime)); _nodeFacade[valueInput] = new SimpleTerminalFacade(valueInput, dataTypeVariable); _nodeFacade[borrowOutput] = new SimpleTerminalFacade(borrowOutput, referenceType); return(true); }
public void FillVectorEnoughToGrowItThenRemoveAllElements_Execute_AllElementsPreservedAndRemoved() { DfirRoot function = DfirRoot.Create(); var createVector = new FunctionalNode(function.BlockDiagram, Signatures.VectorCreateType); Loop firstLoop = new Loop(function.BlockDiagram); CreateLoopConditionTunnel(firstLoop); BorrowTunnel firstLoopBorrowTunnel = CreateBorrowTunnel(firstLoop, BorrowMode.Mutable); Wire.Create(function.BlockDiagram, createVector.OutputTerminals[0], firstLoopBorrowTunnel.InputTerminals[0]) .SetWireBeginsMutableVariable(true); IterateTunnel iterateTunnel = CreateRangeAndIterateTunnel(firstLoop, 1, 7); var appendToVector = new FunctionalNode(firstLoop.Diagram, Signatures.VectorAppendType); Wire.Create(firstLoop.Diagram, firstLoopBorrowTunnel.OutputTerminals[0], appendToVector.InputTerminals[0]); Wire.Create(firstLoop.Diagram, iterateTunnel.OutputTerminals[0], appendToVector.InputTerminals[1]); Loop secondLoop = new Loop(function.BlockDiagram); CreateLoopConditionTunnel(secondLoop); BorrowTunnel secondLoopBorrowTunnel = CreateBorrowTunnel(secondLoop, BorrowMode.Mutable); Wire.Create(function.BlockDiagram, firstLoopBorrowTunnel.TerminateLifetimeTunnel.OutputTerminals[0], secondLoopBorrowTunnel.InputTerminals[0]); CreateRangeAndIterateTunnel(secondLoop, 1, 7); var removeLastFromVector = new FunctionalNode(secondLoop.Diagram, Signatures.VectorRemoveLastType); Wire.Create(secondLoop.Diagram, secondLoopBorrowTunnel.OutputTerminals[0], removeLastFromVector.InputTerminals[0]); BorrowTunnel resultBorrowTunnel = CreateBorrowTunnel(secondLoop, BorrowMode.Mutable); ConnectConstantToInputTerminal(resultBorrowTunnel.InputTerminals[0], NITypes.Int32, 0, true); Frame unwrapFrame = Frame.Create(secondLoop.Diagram); UnwrapOptionTunnel unwrapTunnel = CreateUnwrapOptionTunnel(unwrapFrame); Wire.Create(secondLoop.Diagram, removeLastFromVector.OutputTerminals[1], unwrapTunnel.InputTerminals[0]); Tunnel inputTunnel = CreateInputTunnel(unwrapFrame); Wire.Create(secondLoop.Diagram, resultBorrowTunnel.OutputTerminals[0], inputTunnel.InputTerminals[0]); var accumulateAdd = new FunctionalNode(unwrapFrame.Diagram, Signatures.DefineMutatingBinaryFunction("AccumulateAdd", NITypes.Int32)); Wire.Create(unwrapFrame.Diagram, inputTunnel.OutputTerminals[0], accumulateAdd.InputTerminals[0]); Wire.Create(unwrapFrame.Diagram, unwrapTunnel.OutputTerminals[0], accumulateAdd.InputTerminals[1]); FunctionalNode inspect = ConnectInspectToOutputTerminal(resultBorrowTunnel.TerminateLifetimeTunnel.OutputTerminals[0]); TestExecutionInstance executionInstance = CompileAndExecuteFunction(function); byte[] inspectValue = executionInstance.GetLastValueFromInspectNode(inspect); AssertByteArrayIsInt32(inspectValue, 21); }
public void LoopFollowedByLoop_GroupAsyncStates_SubsequentLoopStartsInPredecessorLoopTerminalGroup() { DfirRoot function = DfirRoot.Create(); Loop firstLoop = new Loop(function.BlockDiagram); BorrowTunnel firstLoopBorrow = CreateBorrowTunnel(firstLoop, BorrowMode.Immutable); ConnectConstantToInputTerminal(firstLoopBorrow.InputTerminals[0], NITypes.Int32, false); TerminateLifetimeTunnel firstLoopTerminate = firstLoopBorrow.TerminateLifetimeTunnel; Loop secondLoop = new Loop(function.BlockDiagram); Tunnel loopTunnel = CreateInputTunnel(secondLoop); Wire.Create(function.BlockDiagram, firstLoopTerminate.OutputTerminals[0], loopTunnel.InputTerminals[0]); IEnumerable <AsyncStateGroup> asyncStateGroups = GroupAsyncStates(function); string terminalGroupName = $"loop{firstLoop.UniqueId}_terminalGroup"; AsyncStateGroup firstLoopTerminalGroup = asyncStateGroups.First(g => g.Label == terminalGroupName); AsyncStateGroup secondLoopInitialGroup = asyncStateGroups.First(g => g.GroupContainsStructureTraversalPoint(secondLoop, secondLoop.Diagram, StructureTraversalPoint.BeforeLeftBorderNodes)); Assert.AreEqual(firstLoopTerminalGroup, secondLoopInitialGroup); }
public void UnwrapOptionTunnelWithNoneInput_Execute_FrameDoesNotExecute() { DfirRoot function = DfirRoot.Create(); FunctionalNode none = new FunctionalNode(function.BlockDiagram, Signatures.NoneConstructorType); Frame frame = Frame.Create(function.BlockDiagram); UnwrapOptionTunnel unwrapOptionTunnel = new UnwrapOptionTunnel(frame); Wire.Create(function.BlockDiagram, none.OutputTerminals[0], unwrapOptionTunnel.InputTerminals[0]); BorrowTunnel borrowTunnel = CreateBorrowTunnel(frame, BorrowMode.Mutable); ConnectConstantToInputTerminal(borrowTunnel.InputTerminals[0], NITypes.Int32, true); FunctionalNode assign = new FunctionalNode(frame.Diagram, Signatures.AssignType); Wire.Create(frame.Diagram, borrowTunnel.OutputTerminals[0], assign.InputTerminals[0]); Wire.Create(frame.Diagram, unwrapOptionTunnel.OutputTerminals[0], assign.InputTerminals[1]); FunctionalNode inspect = ConnectInspectToOutputTerminal(borrowTunnel.TerminateLifetimeTunnel.OutputTerminals[0]); TestExecutionInstance executionInstance = CompileAndExecuteFunction(function); byte[] finalValue = executionInstance.GetLastValueFromInspectNode(inspect); AssertByteArrayIsInt32(finalValue, 0); }
public BorrowTunnelViewModel(BorrowTunnel element) : base(element) { }
bool IDfirNodeVisitor <bool> .VisitBorrowTunnel(BorrowTunnel borrowTunnel) { MarkFacadeVariableOfTerminalInterrupted(borrowTunnel.InputTerminals[0]); MarkFacadeVariableOfTerminalLive(borrowTunnel.OutputTerminals[0]); return(true); }