anchor.diff:      function Bit#(TMul#(8,TExp#(logNumBytes))) getData(memReqT req);
       function Bool                              isWrite(memReqT req);
       function Bit#(TExp#(logNumBytes))          getWriteEn(memReqT req);
  +    function Bit#(TExp#(logNumBytes))          getReadEn(memReqT req);
       function AtomicMemOp                       getAtomicOp(memReqT req);
       function Bool                              isAtomicOp(memReqT req);
       function memRespT                          getDefaultResp(memReqT req);
  
positive.code:     function Bit#(TMul#(8,TExp#(logNumBytes))) getData(MMIOReq#(addrSz, logNumBytes) req) = req.data;
      function Bool isWrite(MMIOReq#(addrSz, logNumBytes) req) = req.write;
      function Bit#(TExp#(logNumBytes)) getWriteEn(MMIOReq#(addrSz, logNumBytes) req) = req.write ? req.byte_en : 0;
      function AtomicMemOp getAtomicOp(MMIOReq#(addrSz, logNumBytes) req) = req.atomic_op;
      function Bool isAtomicOp(MMIOReq#(addrSz, logNumBytes) req) = req.atomic_op != None;
      function MMIOResp#(logNumBytes) getDefaultResp(MMIOReq#(addrSz, logNumBytes) req) = MMIOResp{ write: req.write, data: 0 };
  
negative.code: 
  // Assume reads try to read entire word
  function MMIOReq#(addrSz, logNumBytes) toMMIOReq(memReqT req) provisos (IsMemReq#(memReqT, memRespT, addrSz, logNumBytes));
      return MMIOReq { write: isWrite(req), byte_en: isWrite(req) ? getWriteEn(req) : getReadEn(req), atomic_op: getAtomicOp(req), addr: getAddr(req), data: getData(req) };
  endfunction
  function Bool isMMIOReq(memReqT req) provisos (IsMemReq#(memReqT, memRespT, addrSz, logNumBytes));
      return True;
  