@@ -727,6 +727,111 @@ ParseResult TraceEdgeEventOp::parse(OpAsmParser &parser,
727727 return success ();
728728}
729729
730+ // ===----------------------------------------------------------------------===//
731+ // TraceHostConfigOp
732+ // ===----------------------------------------------------------------------===//
733+
734+ void TraceHostConfigOp::print (OpAsmPrinter &p) {
735+ p << " buffer_size = " << getBufferSize ();
736+
737+ // Only print non-default values
738+ if (getArgIdx () != 4 )
739+ p << " arg_idx = " << getArgIdx ();
740+
741+ if (getRouting () != TraceShimRouting::Single)
742+ p << " routing = " << stringifyTraceShimRouting (getRouting ());
743+
744+ if (getTraceAfterLastTensor ())
745+ p << " trace_after_last_tensor = true" ;
746+
747+ p.printOptionalAttrDict ((*this )->getAttrs (),
748+ /* elidedAttrs=*/ {" buffer_size" , " arg_idx" , " routing" ,
749+ " trace_after_last_tensor" });
750+ }
751+
752+ ParseResult TraceHostConfigOp::parse (OpAsmParser &parser,
753+ OperationState &result) {
754+ // Parse required buffer_size
755+ IntegerAttr bufferSize;
756+ if (parser.parseKeyword (" buffer_size" ) || parser.parseEqual () ||
757+ parser.parseAttribute (bufferSize, parser.getBuilder ().getI32Type (),
758+ " buffer_size" , result.attributes ))
759+ return failure ();
760+
761+ // Parse arg_idx (default: 4)
762+ int32_t argIdxVal = 4 ;
763+ if (succeeded (parser.parseOptionalKeyword (" arg_idx" ))) {
764+ IntegerAttr argIdx;
765+ if (parser.parseEqual () ||
766+ parser.parseAttribute (argIdx, parser.getBuilder ().getI32Type (),
767+ " arg_idx" , result.attributes ))
768+ return failure ();
769+ } else {
770+ result.attributes .set (" arg_idx" ,
771+ parser.getBuilder ().getI32IntegerAttr (argIdxVal));
772+ }
773+
774+ // Parse routing (default: single)
775+ TraceShimRouting routingVal = TraceShimRouting::Single;
776+ if (succeeded (parser.parseOptionalKeyword (" routing" ))) {
777+ if (parser.parseEqual ())
778+ return failure ();
779+ StringRef routingStr;
780+ if (failed (parser.parseKeyword (&routingStr)))
781+ return failure ();
782+ auto routing = symbolizeTraceShimRouting (routingStr);
783+ if (!routing)
784+ return parser.emitError (parser.getCurrentLocation (),
785+ " unknown routing strategy: " )
786+ << routingStr;
787+ routingVal = *routing;
788+ }
789+ result.attributes .set (
790+ " routing" , TraceShimRoutingAttr::get (parser.getContext (), routingVal));
791+
792+ // Parse trace_after_last_tensor (default: false)
793+ bool traceAfterVal = false ;
794+ if (succeeded (parser.parseOptionalKeyword (" trace_after_last_tensor" ))) {
795+ if (parser.parseEqual ())
796+ return failure ();
797+ StringRef boolStr;
798+ if (failed (parser.parseKeyword (&boolStr)))
799+ return failure ();
800+ if (boolStr == " true" )
801+ traceAfterVal = true ;
802+ else if (boolStr != " false" )
803+ return parser.emitError (parser.getCurrentLocation (),
804+ " expected 'true' or 'false'" );
805+ }
806+ result.attributes .set (" trace_after_last_tensor" ,
807+ parser.getBuilder ().getBoolAttr (traceAfterVal));
808+
809+ if (parser.parseOptionalAttrDict (result.attributes ))
810+ return failure ();
811+
812+ return success ();
813+ }
814+
815+ LogicalResult TraceHostConfigOp::verify () {
816+ bool useTraceAfterLastTensor = getTraceAfterLastTensor ();
817+
818+ // Appending trace data after the last tensor only works with single shim
819+ if (useTraceAfterLastTensor) {
820+ if (getRouting () != TraceShimRouting::Single) {
821+ return emitOpError (" appending trace data to the last tensor argument "
822+ " only works with single shim destination strategy "
823+ " (routing=single)" );
824+ }
825+ }
826+
827+ // Validate buffer_size is positive
828+ if (getBufferSize () <= 0 ) {
829+ return emitOpError (" buffer_size must be positive" );
830+ }
831+
832+ return success ();
833+ }
834+
730835// ===----------------------------------------------------------------------===//
731836// TraceStartConfigOp
732837// ===----------------------------------------------------------------------===//
0 commit comments