1010#include " mlir/Dialect/Quant/IR/QuantTypes.h"
1111#include " mlir/IR/BuiltinTypes.h"
1212#include " mlir/IR/DialectImplementation.h"
13+ #include " mlir/IR/QuantizationInterface.h"
1314#include " mlir/IR/Types.h"
1415#include " llvm/ADT/APFloat.h"
1516
1617using namespace mlir ;
1718using namespace quant ;
1819
19- static IntegerType parseStorageType (DialectAsmParser &parser, bool &isSigned) {
20+ static Type parseStorageType (DialectAsmParser &parser, bool &isSigned) {
2021 auto typeLoc = parser.getCurrentLocation ();
21- IntegerType type;
22+ Type type;
2223
2324 // Parse storage type (alpha_ident, integer_literal).
2425 StringRef identifier;
@@ -27,20 +28,28 @@ static IntegerType parseStorageType(DialectAsmParser &parser, bool &isSigned) {
2728 if (result.has_value ()) {
2829 if (!succeeded (*result))
2930 return nullptr ;
30- isSigned = !type.isUnsigned ();
31- storageTypeWidth = type.getWidth ();
32- } else if (succeeded (parser.parseKeyword (&identifier))) {
33- // Otherwise, this must be an unsigned integer (`u` integer-literal).
34- if (!identifier.consume_front (" u" )) {
35- parser.emitError (typeLoc, " illegal storage type prefix" );
31+
32+ if (auto quantizationInterface =
33+ llvm::dyn_cast<QuantizationInterface>(type)) {
34+ isSigned = quantizationInterface.isStorageSigned ();
35+ storageTypeWidth = quantizationInterface.getStorageWidth ();
36+ } else {
37+ parser.emitError (typeLoc, " illegal quantized storage type alias" );
3638 return nullptr ;
3739 }
38- if (identifier.getAsInteger (10 , storageTypeWidth)) {
39- parser.emitError (typeLoc, " expected storage type width" );
40+ } else if (succeeded (parser.parseKeyword (&identifier))) {
41+ // Otherwise, this must be an unsigned integer (`u` integer-literal)
42+ if (identifier.consume_front (" u" )) {
43+ if (identifier.getAsInteger (10 , storageTypeWidth)) {
44+ parser.emitError (typeLoc, " expected storage type width" );
45+ return nullptr ;
46+ }
47+ isSigned = false ;
48+ type = parser.getBuilder ().getIntegerType (storageTypeWidth);
49+ } else {
50+ parser.emitError (typeLoc, " illegal quantized storage type alias" );
4051 return nullptr ;
4152 }
42- isSigned = false ;
43- type = parser.getBuilder ().getIntegerType (storageTypeWidth);
4453 } else {
4554 return nullptr ;
4655 }
@@ -55,17 +64,19 @@ static IntegerType parseStorageType(DialectAsmParser &parser, bool &isSigned) {
5564 return type;
5665}
5766
58- static ParseResult parseStorageRange (DialectAsmParser &parser,
59- IntegerType storageType, bool isSigned,
67+ static ParseResult parseStorageRange (DialectAsmParser &parser, Type storageType,
6068 int64_t &storageTypeMin,
6169 int64_t &storageTypeMax) {
62- int64_t defaultIntegerMin = QuantizedType::getDefaultMinimumForInteger (
63- isSigned, storageType.getWidth ());
64- int64_t defaultIntegerMax = QuantizedType::getDefaultMaximumForInteger (
65- isSigned, storageType.getWidth ());
70+ int64_t defaultMin, defaultMax;
71+ if (auto quantizationInterface =
72+ llvm::dyn_cast<QuantizationInterface>(storageType)) {
73+ defaultMin = quantizationInterface.getDefaultMinimum ();
74+ defaultMax = quantizationInterface.getDefaultMaximum ();
75+ }
76+
6677 if (failed (parser.parseOptionalLess ())) {
67- storageTypeMin = defaultIntegerMin ;
68- storageTypeMax = defaultIntegerMax ;
78+ storageTypeMin = defaultMin ;
79+ storageTypeMax = defaultMax ;
6980 return success ();
7081 }
7182
@@ -75,11 +86,11 @@ static ParseResult parseStorageRange(DialectAsmParser &parser,
7586 parser.getCurrentLocation (&maxLoc) ||
7687 parser.parseInteger (storageTypeMax) || parser.parseGreater ())
7788 return failure ();
78- if (storageTypeMin < defaultIntegerMin ) {
89+ if (storageTypeMin < defaultMin ) {
7990 return parser.emitError (minLoc, " illegal storage type minimum: " )
8091 << storageTypeMin;
8192 }
82- if (storageTypeMax > defaultIntegerMax ) {
93+ if (storageTypeMax > defaultMax ) {
8394 return parser.emitError (maxLoc, " illegal storage type maximum: " )
8495 << storageTypeMax;
8596 }
@@ -113,7 +124,7 @@ static FloatType parseExpressedTypeAndRange(DialectAsmParser &parser,
113124// / storage-type ::= (`i` | `u`) integer-literal
114125// / expressed-type-spec ::= `:` `f` integer-literal
115126static Type parseAnyType (DialectAsmParser &parser) {
116- IntegerType storageType;
127+ Type storageType;
117128 FloatType expressedType;
118129 unsigned typeFlags = 0 ;
119130 int64_t storageTypeMin;
@@ -134,8 +145,7 @@ static Type parseAnyType(DialectAsmParser &parser) {
134145 }
135146
136147 // Storage type range.
137- if (parseStorageRange (parser, storageType, isSigned, storageTypeMin,
138- storageTypeMax)) {
148+ if (parseStorageRange (parser, storageType, storageTypeMin, storageTypeMax)) {
139149 return nullptr ;
140150 }
141151
@@ -322,7 +332,7 @@ parseQuantParamListUntilRBrace(DialectAsmParser &parser, Type expressedType,
322332// / scale-zero-tensor (`,` scale-zero-tensor)*
323333// / `}`
324334static Type parseUniformType (DialectAsmParser &parser) {
325- IntegerType storageType;
335+ Type storageType;
326336 FloatType expressedType;
327337 unsigned typeFlags = 0 ;
328338 int64_t storageTypeMin;
@@ -350,8 +360,7 @@ static Type parseUniformType(DialectAsmParser &parser) {
350360 }
351361
352362 // Storage type range.
353- if (parseStorageRange (parser, storageType, isSigned, storageTypeMin,
354- storageTypeMax)) {
363+ if (parseStorageRange (parser, storageType, storageTypeMin, storageTypeMax)) {
355364 return nullptr ;
356365 }
357366
@@ -487,12 +496,9 @@ Type QuantDialect::parseType(DialectAsmParser &parser) const {
487496
488497static void printStorageType (QuantizedType type, DialectAsmPrinter &out) {
489498 // storage type
490- unsigned storageWidth = type.getStorageTypeIntegralWidth ();
491- bool isSigned = type.isSigned ();
492- if (isSigned) {
493- out << " i" << storageWidth;
494- } else {
495- out << " u" << storageWidth;
499+ if (auto quantizationInterface =
500+ llvm::dyn_cast<QuantizationInterface>(type.getStorageType ())) {
501+ out << quantizationInterface.getStorageType ();
496502 }
497503
498504 // storageTypeMin and storageTypeMax if not default.
0 commit comments