anchor.diff:      return True;
   endfunction
   
  +// 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) : '1, atomic_op: getAtomicOp(req), addr: getAddr(req), data: getData(req) };
  +endfunction
  +function Bool isMMIOReq(memReqT req) provisos (IsMemReq#(memReqT, memRespT, addrSz, logNumBytes));
  +    return True;
  +endfunction
  +
   //
   
   typeclass IsMemResp#(type memRespT, numeric type logNumBytes) dependencies (memRespT determines logNumBytes);
  
positive.code:     endmodule
  endinstance
  
  instance MkNarrowerMemServerPort#(ByteEnMemServerPort#(addrSz, inLogNumBytes), ByteEnMemServerPort#(addrSz, outLogNumBytes))
          provisos (Add#(logWidthFactor, outLogNumBytes, inLogNumBytes),
                    Add#(a__, logWidthFactor, addrSz));
  
negative.code: typedef AtomicMemServerPort#(addrSz, 3) AtomicMem64ServerPort#(numeric type addrSz);
  typedef AtomicMemClientPort#(addrSz, 3) AtomicMem64ClientPort#(numeric type addrSz);
  
  typedef MMIOReq#(addrSz, 3)        MMIO64Req#(numeric type addrSz);
  typedef MMIOResp#(3)               MMIO64Resp;
  typedef MMIOServerPort#(addrSz, 3) MMIO64ServerPort#(numeric type addrSz);
  typedef MMIOClientPort#(addrSz, 3) MMIO64ClientPort#(numeric type addrSz);
  
  ////////////////////////////////////////////////////////////////////////////////
  
  // Unifying Memory Types and Typeclasses
  