anchor.diff:     FloatAlu#(FP_MUL_DEPTH) mul   <- mkFloatMultiplier(defaultValue);
      FloatAlu#(FP_ADD_DEPTH) adder <- mkFloatAdder(defaultValue);
   
  -   // This could be done in fewer steps
  -   FIFOF#(Vector#(N,Float)) afifo <- mkFIFOF();
  -   Vector#(K, PipeOut#(Vector#(N,Float))) aPipesN <- mkForkVector(toPipeOut(afifo));
  -   Vector#(K, PipeOut#(Vector#(1,Float))) aPipes  = aPipesN; //<- mapM(mkFunnel, aPipesN);
  -   PipeOut#(Vector#(K,Float))             aPipe   <- mkJoinVector(id, map(unvectorPipeOut, aPipes));
  -   PipeOut#(Vector#(1,Float))             aFunnelV <- mkFunnel(aPipe);
  -   PipeOut#(Float)                        aFunnel = unvectorPipeOut(aFunnelV);
  -
  -   Vector#(K, FIFOF#(Vector#(N,Float)))   bfifos <- replicateM(mkFIFOF());
  -   Vector#(K, PipeOut#(Vector#(N,Float))) bPipesN = map(toPipeOut,bfifos);
  -   Vector#(K, PipeOut#(Vector#(1,Float))) bPipes = bPipesN; //<- mapM(mkFunnel, bPipesN);
  -   PipeOut#(Vector#(K,Float))             bPipe  <- mkJoinVector(id, map(unvectorPipeOut, bPipes));
  -   PipeOut#(Vector#(1,Float))             bFunnelV <- mkFunnel(bPipe);
  -   PipeOut#(Float)                        bFunnel = unvectorPipeOut(bFunnelV);
  -
  -   Vector#(K,FIFOF#(Vector#(N,Bool))) firstFifos <- replicateM(mkSizedFIFOF(valueOf(K)));
  -   Vector#(K,FIFOF#(Vector#(N,Bool))) lastFifos <- replicateM(mkSizedFIFOF(valueOf(K)));
  -   Vector#(K,PipeOut#(Vector#(N,Bool))) firstPipesN = map(toPipeOut, firstFifos);
  -   Vector#(K,PipeOut#(Vector#(N,Bool))) lastPipesN = map(toPipeOut, lastFifos);
  -   Vector#(K,PipeOut#(Vector#(1,Bool))) firstPipes1 = firstPipesN; //<- mapM(mkFunnel, firstPipesN);
  -   Vector#(K,PipeOut#(Bool))            firstPipes = map(unvectorPipeOut, firstPipes1);
  -   Vector#(K,PipeOut#(Vector#(1,Bool))) lastPipes1 = lastPipesN; //<- mapM(mkFunnel, lastPipesN);
  -   Vector#(K,PipeOut#(Bool))            lastPipes = map(unvectorPipeOut, lastPipes1);
  -
  -   Vector#(N, Reg#(Bit#(TAdd#(TLog#(FP_ADD_DEPTH),1)))) drainCnts <- replicateM(mkReg(0));
  -   Vector#(N, Reg#(Bool)) drained <- replicateM(mkReg(False));
  -
  -   Vector#(K, FIFOF#(Float))  accumFifos <- replicateM(mkFIFOF);
  +   FIFOF#(Float)                          afifo   <- mkFIFOF();
  +   PipeOut#(Float)                        aFunnel <- mkRepeat(repetitions, toPipeOut(afifo));
  +
  +   Vector#(K, FIFOF#(Float))              bfifos <- replicateM(mkFIFOF());
  +   Vector#(K, PipeOut#(Float))            bPipes = map(toPipeOut,bfifos);
  +   PipeOut#(Float)                        bFunnel <- mkFunnelPipes1(bPipes);
  +
  +   FIFOF#(Bool) firstFifo <- mkSizedFIFOF(valueOf(K));
  +   FIFOF#(Bool) lastFifo  <- mkSizedFIFOF(valueOf(K));
  +   PipeOut#(Bool) firstPipe <- mkRepeat(repetitions, toPipeOut(firstFifo));
  +   PipeOut#(Bool) lastPipe <- mkRepeat(repetitions,  toPipeOut(lastFifo));
  +
  +   Vector#(K,FIFOF#(Float))  accumFifos <- replicateM(mkFIFOF);
      Vector#(K,FIFOF#(Float)) dotfifos <- replicateM(mkFIFOF);
   
      Reg#(Bit#(TLog#(K))) chanReg <- mkReg(0);
  
positive.code:    Vector#(K,PipeOut#(Float)) dotpipes = map(toPipeOut, dotfifos);
  
     interface Put aInput;
        method Action put(Vector#(N,Float) avec);
  
     	 afifo.enq(avec);
  
  	 let c = countReg+fromInteger(valueOf(N));
  	 Bool isFirst = (countReg == 0);
  	 Bool isLast = (countReg == lastCountReg);
  	 if (isLast) begin
  
negative.code:    rule accout;
        let chan <- toGet(chanFifos[1]).get();
        //if (label == 0) $display("%08d label=%d accout chan=%d", cycles, label, chan);
        let last <- toGet(lastPipe).get;
        match {.acc,.*} <- adder.response.get();
        if (last)
  	 dotfifos[chan].enq(acc);
  