15#include "mlir/IR/Builders.h"
16#include "mlir/IR/PatternMatch.h"
17#include "llvm/ADT/APSInt.h"
24#include "circt/Dialect/HWArith/HWArithCanonicalizations.h.inc"
33LogicalResult CastOp::verify() {
34 auto inType = getIn().getType();
35 auto outType = getOut().getType();
39 if (isInSignless && isOutSignless)
40 return emitError(
"at least one type needs to carry sign semantics (ui/si)");
43 unsigned inBitWidth = inType.getIntOrFloatBitWidth();
44 unsigned outBitWidth = outType.getIntOrFloatBitWidth();
45 if (inBitWidth < outBitWidth)
46 return emitError(
"bit extension is undefined for a signless type");
52void CastOp::getCanonicalizationPatterns(RewritePatternSet &results,
53 MLIRContext *context) {
54 results.insert<EliminateCast>(context);
61APSInt ConstantOp::getConstantValue() {
return getRawValueAttr().getAPSInt(); }
63OpFoldResult ConstantOp::fold(FoldAdaptor adaptor) {
64 assert(adaptor.getOperands().empty() &&
"constant has no operands");
65 return getRawValueAttr();
68void ConstantOp::print(OpAsmPrinter &p) {
70 p.printAttribute(getRawValueAttr());
71 p.printOptionalAttrDict(getOperation()->getAttrs(),
72 {getRawValueAttrName()});
75ParseResult ConstantOp::parse(OpAsmParser &parser, OperationState &result) {
76 IntegerAttr valueAttr;
78 if (parser.parseAttribute(valueAttr, getRawValueAttrName(result.name),
80 parser.parseOptionalAttrDict(result.attributes))
83 result.addTypes(valueAttr.getType());
91LogicalResult AddOp::inferReturnTypes(MLIRContext *context,
92 std::optional<Location> loc,
93 ValueRange operands, DictionaryAttr attrs,
94 mlir::OpaqueProperties properties,
95 mlir::RegionRange regions,
96 SmallVectorImpl<Type> &results) {
97 auto lhs = cast<IntegerType>(operands[0].getType());
98 auto rhs = cast<IntegerType>(operands[1].getType());
99 IntegerType::SignednessSemantics signedness;
102 results.push_back(IntegerType::get(context, resultWidth, signedness));
110LogicalResult SubOp::inferReturnTypes(MLIRContext *context,
111 std::optional<Location> loc,
112 ValueRange operands, DictionaryAttr attrs,
113 mlir::OpaqueProperties properties,
114 mlir::RegionRange regions,
115 SmallVectorImpl<Type> &results) {
116 auto lhs = cast<IntegerType>(operands[0].getType());
117 auto rhs = cast<IntegerType>(operands[1].getType());
120 IntegerType::SignednessSemantics signedness;
122 signedness = IntegerType::Signed;
124 results.push_back(IntegerType::get(context, resultWidth, signedness));
132static IntegerType::SignednessSemantics
135 if (lhs.getSignedness() == rhs.getSignedness()) {
137 return lhs.getSignedness();
140 return IntegerType::Signed;
144LogicalResult MulOp::inferReturnTypes(MLIRContext *context,
145 std::optional<Location> loc,
146 ValueRange operands, DictionaryAttr attrs,
147 mlir::OpaqueProperties properties,
148 mlir::RegionRange regions,
149 SmallVectorImpl<Type> &results) {
150 auto lhs = cast<IntegerType>(operands[0].getType());
151 auto rhs = cast<IntegerType>(operands[1].getType());
153 unsigned resultWidth = lhs.getWidth() + rhs.getWidth();
154 IntegerType::SignednessSemantics signedness =
157 results.push_back(IntegerType::get(context, resultWidth, signedness));
165LogicalResult DivOp::inferReturnTypes(MLIRContext *context,
166 std::optional<Location> loc,
167 ValueRange operands, DictionaryAttr attrs,
168 mlir::OpaqueProperties properties,
169 mlir::RegionRange regions,
170 SmallVectorImpl<Type> &results) {
171 auto lhs = cast<IntegerType>(operands[0].getType());
172 auto rhs = cast<IntegerType>(operands[1].getType());
174 unsigned resultWidth = lhs.getWidth();
180 IntegerType::SignednessSemantics signedness =
183 results.push_back(IntegerType::get(context, resultWidth, signedness));
195 IntegerType lhs, IntegerType rhs) {
197 unsigned resultWidth = std::max(lhs.getWidth(), rhs.getWidth()) + 1;
199 if (lhs.getSignedness() == rhs.getSignedness()) {
202 signedness = lhs.getSignedness();
205 signedness = IntegerType::Signed;
208 if ((lhs.isUnsigned() && lhs.getWidth() >= rhs.getWidth()) ||
209 (rhs.isUnsigned() && rhs.getWidth() >= lhs.getWidth())) {
221 auto ops = binOp->getOperands();
223 return binOp->emitError() <<
"expected 2 operands but got " << ops.size();
236#define GET_OP_CLASSES
237#include "circt/Dialect/HWArith/HWArith.cpp.inc"
assert(baseType &&"element must be base type")
static IntegerType::SignednessSemantics getSignedInheritedSignedness(IntegerType lhs, IntegerType rhs)
static LogicalResult verifyBinOp(Operation *binOp)
bool isHWArithIntegerType(::mlir::Type type)
unsigned inferAddResultType(IntegerType::SignednessSemantics &signedness, IntegerType lhs, IntegerType rhs)
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.