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