anchor.diff:     mkAutoFSM (cmdFetch);
      mkAutoFSM (cmdDispatch);
      mkAutoFSM (cmdCompletion);
  +   mkAutoFSM (responseArbiter);
   
   
         // to start a command, doCommand fires off a memory read to the
  
positive.code:    Reg#(Bit#(4)) ii <- mkReg(0);
     Reg#(Bit#(4)) respCtr <- mkReg(0);
     Reg#(Bit#(4)) dispCtr <- mkReg(0);
     
     let engineselect = pack(cmd)[63:56];
     function ServerF#(Bit#(64), Bit#(64)) cmdifc();
        if (engineselect == zeroExtend(pack(CmdNOP))) 
  
negative.code:       while(True) seq
  	 if (statusRing.notFull() && copyEngine.response.notEmpty())
  	    seq
  	       $display("responseArbiter copyEngine completion");
  	       status_write_chan.writeReq.put(
  		  DMAAddressRequest{handle: statusRing.memhandle, 
  		     address: statusRing.bufferfirst, burstLen: 8, tag: 0});
  	       for (respCtr <= 0; respCtr < 8; respCtr <= respCtr + 1)
  		  action
  		     let rv <- copyEngine.response.get();
  		     status_write_chan.writeData.put(DMAData{data: rv, tag: 0});
  		  endaction
  	       statusRing.push(64);
  	    endseq
  
  	 if (statusRing.notFull() && echoEngine.response.notEmpty())
  	    seq
  	       $display("responseArbiter echoEngine completion");
  	       status_write_chan.writeReq.put(
  		  DMAAddressRequest{handle: statusRing.memhandle, 
  		     address: statusRing.bufferfirst, burstLen: 8, tag: 0});
  	       for (respCtr <= 0; respCtr < 8; respCtr <= respCtr + 1)
  		  action
  		     let rv <- echoEngine.response.get();
  		     status_write_chan.writeData.put(DMAData{data: rv, tag: 0});
  		  endaction
  	       statusRing.push(64);
  	    endseq
  
        endseq
  