11 #include "llvm/Support/KnownBits.h"
13 using namespace circt;
23 Operation *op = v.getDefiningOp();
24 if (!op || depth == 5)
25 return KnownBits(v.getType().getIntOrFloatBitWidth());
28 if (
auto constant = dyn_cast<hw::ConstantOp>(op))
29 return KnownBits::makeConstant(constant.getValue());
32 if (
auto concatOp = dyn_cast<ConcatOp>(op)) {
34 for (
size_t i = 1, e = concatOp.getNumOperands(); i != e; ++i) {
36 unsigned width = otherBits.getBitWidth();
37 unsigned newWidth = result.getBitWidth() +
width;
39 (result.Zero.zext(newWidth) <<
width) | otherBits.Zero.zext(newWidth);
41 (result.One.zext(newWidth) <<
width) | otherBits.One.zext(newWidth);
47 if (
auto andOp = dyn_cast<AndOp>(op)) {
49 for (
size_t i = 1, e = andOp.getNumOperands(); i != e; ++i)
55 if (
auto orOp = dyn_cast<OrOp>(op)) {
57 for (
size_t i = 1, e = orOp.getNumOperands(); i != e; ++i)
63 if (
auto xorOp = dyn_cast<XorOp>(op)) {
65 for (
size_t i = 1, e = xorOp.getNumOperands(); i != e; ++i) {
67 if (result.isUnknown())
75 if (
auto muxOp = dyn_cast<MuxOp>(op)) {
78 return lhs.intersectWith(rhs);
81 return KnownBits(v.getType().getIntOrFloatBitWidth());
static KnownBits computeKnownBits(Value v, unsigned depth)
Given an integer SSA value, check to see if we know anything about the result of the computation.
KnownBits computeKnownBits(Value value)
Compute "known bits" information about the specified value - the set of bits that are guaranteed to a...
This file defines an intermediate representation for circuits acting as an abstraction for constraint...