docs: def pipeline_control_stop_tx():
      ''' Instantiates the arithmetic_mean4 pipeline, feeds it with data and drains its output '''
  
      clk = sim.Clock(val=0, period=10, units="ns")
      rst = sim.ResetSync(clk=clk, val=0, active=1)
  
      rx_rdy, rx_vld, tx_rdy, tx_vld = [Signal(bool(0)) for _ in range(4)]
      rx_dat = Signal(intbv(0)[8:])
      tx_dat = Signal(intbv(0)[8:])
  
      clkgen = clk.gen()
      dut = arithmetic_mean4(rst, clk, rx_rdy, rx_vld, rx_dat, tx_rdy, tx_vld, tx_dat)
  #     dut = traceSignals(arithmetic_mean4, rst, clk, rx_rdy, rx_vld, rx_dat, tx_rdy, tx_vld, tx_dat)
      drv = Driver(rst, clk, rx_rdy, rx_vld, rx_dat)
      cap = Capture(rst, clk, tx_rdy, tx_vld, tx_dat)
  
      data_in = []
      data_out = []
  
      def stim(GAP=0):
          ''' Stimulates the pipeline input '''
          @instance
          def _stim():
              yield rst.pulse(10)
              yield clk.posedge
              for i in range(5*4):
                  yield drv.write(i)
                  data_in.append(i)
                  for _ in range(GAP):
                      yield clk.posedge
              for _ in range(10):
                  yield clk.posedge
              raise StopSimulation
          return _stim
  
  
      def drain(GAP=0):
          ''' Drains the pipeline output '''
          @instance
          def _drain():
              yield clk.posedge
              while True:
                  yield cap.read()
                  data_out.append(cap.d)
                  for _ in range(GAP):
                      yield clk.posedge
          return _drain
  
      # You can play with the gap size at the input and at the output to see how the pipeline responds (see time diagrams)
      Simulation(clkgen, dut, stim(GAP=0), drain(GAP=0)).run()
  
      print "data_in ({}): {}".format(len(data_in), data_in)
      print "data_out ({}): {}".format(len(data_out), data_out)
  
      data_out_expected = [sum(data_in[i:i+4])//4 for i in range(0, len(data_in), 4)]
      assert cmp(data_out_expected, data_out)==0, "expected: data_out ({}): {}".format(len(data_out_expected), data_out_expected)