@@ -415,28 +415,6 @@ SparseTensorEncodingAttr::getStaticLvlSliceStride(Level lvl) const {
415
415
return getStaticDimSliceStride (toOrigDim (*this , lvl));
416
416
}
417
417
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
-
440
418
Attribute SparseTensorEncodingAttr::parse (AsmParser &parser, Type type) {
441
419
#define RETURN_ON_FAIL (stmt ) \
442
420
if (failed (stmt)) { \
@@ -459,8 +437,7 @@ Attribute SparseTensorEncodingAttr::parse(AsmParser &parser, Type type) {
459
437
unsigned posWidth = 0 ;
460
438
unsigned crdWidth = 0 ;
461
439
StringRef attrName;
462
- SmallVector<StringRef, 6 > keys = {" lvlTypes" , " dimToLvl" , " posWidth" ,
463
- " crdWidth" , " dimSlices" , " map" };
440
+ SmallVector<StringRef, 3 > keys = {" map" , " posWidth" , " crdWidth" };
464
441
while (succeeded (parser.parseOptionalKeyword (&attrName))) {
465
442
// Detect admissible keyword.
466
443
auto *it = find (keys, attrName);
@@ -473,81 +450,16 @@ Attribute SparseTensorEncodingAttr::parse(AsmParser &parser, Type type) {
473
450
RETURN_ON_FAIL (parser.parseEqual ())
474
451
// Dispatch on keyword.
475
452
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
538
454
ir_detail::DimLvlMapParser cParser (parser);
539
455
auto res = cParser.parseDimLvlMap ();
540
456
RETURN_ON_FAIL (res);
541
- // TODO: use DimLvlMap directly as storage representation, rather
542
- // than converting things over.
543
457
const auto &dlm = *res;
544
458
545
- ERROR_IF (!lvlTypes.empty (), " Cannot mix `lvlTypes` with `map`" )
546
459
const Level lvlRank = dlm.getLvlRank ();
547
460
for (Level lvl = 0 ; lvl < lvlRank; lvl++)
548
461
lvlTypes.push_back (dlm.getLvlType (lvl));
549
462
550
- ERROR_IF (!dimSlices.empty (), " Cannot mix `dimSlices` with `map`" )
551
463
const Dimension dimRank = dlm.getDimRank ();
552
464
for (Dimension dim = 0 ; dim < dimRank; dim++)
553
465
dimSlices.push_back (dlm.getDimSlice (dim));
@@ -567,11 +479,26 @@ Attribute SparseTensorEncodingAttr::parse(AsmParser &parser, Type type) {
567
479
dimSlices.clear ();
568
480
}
569
481
570
- ERROR_IF (dimToLvl, " Cannot mix `dimToLvl` with `map`" )
571
482
dimToLvl = dlm.getDimToLvlMap (parser.getContext ());
572
483
lvlToDim = dlm.getLvlToDimMap (parser.getContext ());
573
484
break ;
574
485
}
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
+ }
575
502
} // switch
576
503
// Only last item can omit the comma.
577
504
if (parser.parseOptionalComma ().failed ())
0 commit comments