rlm@8: rlm@8: import ClientServer::*; rlm@8: import GetPut::*; rlm@8: rlm@8: //---------------------------------------------------------------------- rlm@8: // ToString typeclass rlm@8: //---------------------------------------------------------------------- rlm@8: rlm@8: typeclass Traceable#( type item_t ); rlm@8: function Action traceTiny( String loc, String traceTag, item_t item ); rlm@8: function Action traceFull( String loc, String traceTag, item_t item ); rlm@8: endtypeclass rlm@8: rlm@8: instance Traceable#(String); rlm@8: rlm@8: function Action traceTiny( String loc, String ttag, String str ); rlm@8: $fdisplay(stderr, " => %s:%s %s", loc, ttag, str ); rlm@8: endfunction rlm@8: rlm@8: function Action traceFull( String loc, String ttag, String str ); rlm@8: $fdisplay(stderr, " => %s:%s %s", loc, ttag, str ); rlm@8: endfunction rlm@8: rlm@8: endinstance rlm@8: rlm@8: instance Traceable#(Bit#(n)); rlm@8: rlm@8: function Action traceTiny( String loc, String ttag, Bit#(n) b ); rlm@8: $fdisplay(stderr, " => %s:%s %x", loc, ttag, b ); rlm@8: endfunction rlm@8: rlm@8: function Action traceFull( String loc, String ttag, Bit#(n) b ); rlm@8: $fdisplay(stderr, " => %s:%s %x", loc, ttag, b ); rlm@8: endfunction rlm@8: rlm@8: endinstance rlm@8: rlm@8: //---------------------------------------------------------------------- rlm@8: // Tracing interface wrappers rlm@8: //---------------------------------------------------------------------- rlm@8: rlm@8: function Get#(item_t) traceGet( String locStr, String tagStr, Get#(item_t) g ) rlm@8: provisos ( Traceable#(item_t) ); rlm@8: return rlm@8: ( rlm@8: interface Get rlm@8: method ActionValue#(item_t) get(); rlm@8: item_t item <- g.get(); rlm@8: traceTiny(locStr, tagStr,item); rlm@8: return item; rlm@8: endmethod rlm@8: endinterface rlm@8: ); rlm@8: endfunction rlm@8: rlm@8: function Put#(item_t) tracePut( String locStr, String tagStr, Put#(item_t) p ) rlm@8: provisos ( Traceable#(item_t) ); rlm@8: return rlm@8: ( rlm@8: interface Put rlm@8: method Action put( item_t item ); rlm@8: traceTiny(locStr, tagStr,item); rlm@8: p.put(item); rlm@8: endmethod rlm@8: endinterface rlm@8: ); rlm@8: endfunction rlm@8: rlm@8: function Client#(req_t,resp_t) traceClient( String locStr, String reqTagStr, String respTagStr, rlm@8: Client#(req_t,resp_t) c ) rlm@8: provisos ( Traceable#(req_t), Traceable#(resp_t) ); rlm@8: return rlm@8: ( rlm@8: interface Client rlm@8: interface Get request = traceGet(locStr, reqTagStr,c.request); rlm@8: interface Put response = tracePut(locStr, respTagStr,c.response); rlm@8: endinterface rlm@8: ); rlm@8: endfunction rlm@8: rlm@8: function Server#(req_t,resp_t) traceServer( String locStr, String reqTagStr, String respTagStr, rlm@8: Server#(req_t,resp_t) c ) rlm@8: provisos ( Traceable#(req_t), Traceable#(resp_t) ); rlm@8: return rlm@8: ( rlm@8: interface Server rlm@8: interface Put request = tracePut(locStr, reqTagStr,c.request); rlm@8: interface Get response = traceGet(locStr, respTagStr,c.response); rlm@8: endinterface rlm@8: ); rlm@8: endfunction rlm@8: