   "splitter": RW.visitSplitterChip
   "emitter": RW.visitEmitterChip
   "circuit": RW.visitCircuitChip
+  "pipe": RW.visitPipeChip
 
 # The path is an array of the indices necessary to access the children
-RW.visitChip = (circuitMeta, path, chip, constants, circuitData, bindings) ->
+RW.visitChip = (circuitMeta, path, chip, constants, circuitData, scratchData, bindings) ->
   # TODO: defer processor and call execution until whole tree is evaluated?
   if chip.muted then return new RW.ChipVisitorResult()
 
   # Dispatch to correct function
   for chipType, visitor of RW.chipVisitors
     if chipType of chip
-      return visitor(circuitMeta, path, chip, constants, circuitData, bindings)
+      return visitor(circuitMeta, path, chip, constants, circuitData, scratchData, bindings)
 
   # Signal error
   result = new RW.ChipVisitorResult()

RW.getChildCircuitId = (circuitId) -> _.last(circuitId.split("."))

# Used to evaluate expressions against with RW.evaluateExpressionFunction
RW.makeEvaluationContext = (circuitMeta, constants, circuitData, bindings) ->
  context = 
    memory: constants.memoryData[circuitMeta.id]
    io: constants.ioData[circuitMeta.id]
    assets: constants.assets
    transformers: constants.transformers
    circuit: circuitData
    bindings: {}
  # Setup bindings
  for bindingName, bindingValue of bindings


  return result

RW.visitPipeChip = (circuitMeta, path, chip, constants, circuitData, oldScratchData, oldBindings) ->
  # Create new scratch data
  scratchKey = _.unique("scratch")

  # Put new scratch data in an object to use applyPatches() later
  scratchParent =
    scratch: RW.addToObject(oldScratchData, scratchKey, chip.pipe.initialValue or null)

  # Create new bindings, pointing to the scratch data
  newBindings = Object.create(oldBindings)
  newBindings[chip.pipe.bindTo] = new RW.BindingReference("scratch.#{scratchKey}")

  # Prepare result and logger
  result = new RW.ChipVisitorResult()
