@@ -415,28 +415,6 @@ SparseTensorEncodingAttr::getStaticLvlSliceStride(Level lvl) const {
415415 return getStaticDimSliceStride (toOrigDim (*this , lvl));
416416}
417417
418- const static DimLevelType validDLTs[] = {DimLevelType::Dense,
419- DimLevelType::TwoOutOfFour,
420- DimLevelType::Compressed,
421- DimLevelType::CompressedNu,
422- DimLevelType::CompressedNo,
423- DimLevelType::CompressedNuNo,
424- DimLevelType::Singleton,
425- DimLevelType::SingletonNu,
426- DimLevelType::SingletonNo,
427- DimLevelType::SingletonNuNo,
428- DimLevelType::LooseCompressed,
429- DimLevelType::LooseCompressedNu,
430- DimLevelType::LooseCompressedNo,
431- DimLevelType::LooseCompressedNuNo};
432-
433- static std::optional<DimLevelType> parseDLT (StringRef str) {
434- for (DimLevelType dlt : validDLTs)
435- if (str == toMLIRString (dlt))
436- return dlt;
437- return std::nullopt ;
438- }
439-
440418Attribute SparseTensorEncodingAttr::parse (AsmParser &parser, Type type) {
441419#define RETURN_ON_FAIL (stmt ) \
442420 if (failed (stmt)) { \
@@ -459,8 +437,7 @@ Attribute SparseTensorEncodingAttr::parse(AsmParser &parser, Type type) {
459437 unsigned posWidth = 0 ;
460438 unsigned crdWidth = 0 ;
461439 StringRef attrName;
462- SmallVector<StringRef, 6 > keys = {" lvlTypes" , " dimToLvl" , " posWidth" ,
463- " crdWidth" , " dimSlices" , " map" };
440+ SmallVector<StringRef, 3 > keys = {" map" , " posWidth" , " crdWidth" };
464441 while (succeeded (parser.parseOptionalKeyword (&attrName))) {
465442 // Detect admissible keyword.
466443 auto *it = find (keys, attrName);
@@ -473,81 +450,16 @@ Attribute SparseTensorEncodingAttr::parse(AsmParser &parser, Type type) {
473450 RETURN_ON_FAIL (parser.parseEqual ())
474451 // Dispatch on keyword.
475452 switch (keyWordIndex) {
476- case 0 : { // lvlTypes
477- Attribute attr;
478- RETURN_ON_FAIL (parser.parseAttribute (attr));
479- auto arrayAttr = llvm::dyn_cast<ArrayAttr>(attr);
480- ERROR_IF (!arrayAttr, " expected an array for lvlTypes" )
481- for (auto i : arrayAttr) {
482- auto strAttr = llvm::dyn_cast<StringAttr>(i);
483- ERROR_IF (!strAttr, " expected a string value in lvlTypes" )
484- auto strVal = strAttr.getValue ();
485- if (auto optDLT = parseDLT (strVal)) {
486- lvlTypes.push_back (optDLT.value ());
487- } else {
488- parser.emitError (parser.getNameLoc (), " unexpected level-type: " )
489- << strVal;
490- return {};
491- }
492- }
493- break ;
494- }
495- case 1 : { // dimToLvl
496- Attribute attr;
497- RETURN_ON_FAIL (parser.parseAttribute (attr))
498- auto affineAttr = llvm::dyn_cast<AffineMapAttr>(attr);
499- ERROR_IF (!affineAttr, " expected an affine map for dimToLvl" )
500- dimToLvl = affineAttr.getValue ();
501- break ;
502- }
503- case 2 : { // posWidth
504- Attribute attr;
505- RETURN_ON_FAIL (parser.parseAttribute (attr))
506- auto intAttr = llvm::dyn_cast<IntegerAttr>(attr);
507- ERROR_IF (!intAttr, " expected an integral position bitwidth" )
508- posWidth = intAttr.getInt ();
509- break ;
510- }
511- case 3 : { // crdWidth
512- Attribute attr;
513- RETURN_ON_FAIL (parser.parseAttribute (attr))
514- auto intAttr = llvm::dyn_cast<IntegerAttr>(attr);
515- ERROR_IF (!intAttr, " expected an integral index bitwidth" )
516- crdWidth = intAttr.getInt ();
517- break ;
518- }
519- case 4 : { // dimSlices
520- RETURN_ON_FAIL (parser.parseLSquare ())
521- // Dispatches to DimSliceAttr to skip mnemonic
522- bool finished = false ;
523- while (auto attr = SparseTensorDimSliceAttr::parse (parser, nullptr )) {
524- auto sliceAttr = llvm::cast<SparseTensorDimSliceAttr>(attr);
525- dimSlices.push_back (sliceAttr);
526- if (parser.parseOptionalComma ().failed ()) {
527- finished = true ;
528- break ;
529- }
530- }
531- // Wrong when parsing slices
532- if (!finished)
533- return {};
534- RETURN_ON_FAIL (parser.parseRSquare ())
535- break ;
536- }
537- case 5 : { // map (new STEA surface syntax)
453+ case 0 : { // map
538454 ir_detail::DimLvlMapParser cParser (parser);
539455 auto res = cParser.parseDimLvlMap ();
540456 RETURN_ON_FAIL (res);
541- // TODO: use DimLvlMap directly as storage representation, rather
542- // than converting things over.
543457 const auto &dlm = *res;
544458
545- ERROR_IF (!lvlTypes.empty (), " Cannot mix `lvlTypes` with `map`" )
546459 const Level lvlRank = dlm.getLvlRank ();
547460 for (Level lvl = 0 ; lvl < lvlRank; lvl++)
548461 lvlTypes.push_back (dlm.getLvlType (lvl));
549462
550- ERROR_IF (!dimSlices.empty (), " Cannot mix `dimSlices` with `map`" )
551463 const Dimension dimRank = dlm.getDimRank ();
552464 for (Dimension dim = 0 ; dim < dimRank; dim++)
553465 dimSlices.push_back (dlm.getDimSlice (dim));
@@ -567,11 +479,26 @@ Attribute SparseTensorEncodingAttr::parse(AsmParser &parser, Type type) {
567479 dimSlices.clear ();
568480 }
569481
570- ERROR_IF (dimToLvl, " Cannot mix `dimToLvl` with `map`" )
571482 dimToLvl = dlm.getDimToLvlMap (parser.getContext ());
572483 lvlToDim = dlm.getLvlToDimMap (parser.getContext ());
573484 break ;
574485 }
486+ case 1 : { // posWidth
487+ Attribute attr;
488+ RETURN_ON_FAIL (parser.parseAttribute (attr))
489+ auto intAttr = llvm::dyn_cast<IntegerAttr>(attr);
490+ ERROR_IF (!intAttr, " expected an integral position bitwidth" )
491+ posWidth = intAttr.getInt ();
492+ break ;
493+ }
494+ case 2 : { // crdWidth
495+ Attribute attr;
496+ RETURN_ON_FAIL (parser.parseAttribute (attr))
497+ auto intAttr = llvm::dyn_cast<IntegerAttr>(attr);
498+ ERROR_IF (!intAttr, " expected an integral index bitwidth" )
499+ crdWidth = intAttr.getInt ();
500+ break ;
501+ }
575502 } // switch
576503 // Only last item can omit the comma.
577504 if (parser.parseOptionalComma ().failed ())
0 commit comments