13#ifndef CIRCT_DIALECT_OM_EVALUATOR_EVALUATOR_H
14#define CIRCT_DIALECT_OM_EVALUATOR_EVALUATOR_H
18#include "mlir/IR/BuiltinOps.h"
19#include "mlir/IR/Diagnostics.h"
20#include "mlir/IR/Location.h"
21#include "mlir/IR/MLIRContext.h"
22#include "mlir/IR/SymbolTable.h"
23#include "mlir/Support/LogicalResult.h"
24#include "llvm/ADT/SmallPtrSet.h"
25#include "llvm/ADT/SmallString.h"
26#include "llvm/Support/Debug.h"
96 if (isa<UnknownLoc>(
loc))
126 value = std::move(newValue);
135 llvm::SmallPtrSet<ReferenceValue *, 4> visited;
136 auto currentValue =
value;
137 while (
auto *v = dyn_cast<ReferenceValue>(currentValue.get())) {
139 if (!visited.insert(v).second)
141 currentValue = v->getValue();
143 return success(currentValue);
155 template <
typename AttrTy>
157 return dyn_cast<AttrTy>(
attr);
172 static std::shared_ptr<EvaluatorValue>
get(Attribute
attr,
173 LocationAttr
loc = {});
174 static std::shared_ptr<EvaluatorValue>
get(Type
type, LocationAttr
loc = {});
195 friend std::shared_ptr<EvaluatorValue>
get(Attribute
attr, LocationAttr
loc);
196 friend std::shared_ptr<EvaluatorValue>
get(Type
type, LocationAttr
loc);
201 if (failed(value->finalize()))
203 if (
auto *ref = llvm::dyn_cast<ReferenceValue>(value.get())) {
204 auto v = ref->getStrippedValue();
266 fields = std::move(newFields);
272 auto clsNonConst =
const_cast<om::ClassLike &
>(
cls);
273 return ClassType::get(clsNonConst.getContext(),
274 FlatSymbolRefAttr::get(clsNonConst.getSymNameAttr()));
285 FailureOr<EvaluatorValuePtr>
getField(StringAttr field);
286 FailureOr<EvaluatorValuePtr>
getField(StringRef field) {
370SmallVector<EvaluatorValuePtr>
372 ArrayRef<Attribute> attributes);
382 FailureOr<evaluator::EvaluatorValuePtr>
383 instantiate(StringAttr className, ArrayRef<EvaluatorValuePtr> actualParams);
388 FailureOr<evaluator::EvaluatorValuePtr>
392 SmallVectorImpl<std::shared_ptr<evaluator::EvaluatorValue>> *;
402 auto val =
objects.lookup(key);
403 return val && val->isFullyEvaluated();
406 FailureOr<EvaluatorValuePtr>
408 FailureOr<EvaluatorValuePtr>
414 FailureOr<EvaluatorValuePtr>
422 FailureOr<EvaluatorValuePtr>
425 FailureOr<EvaluatorValuePtr>
430 FailureOr<EvaluatorValuePtr>
432 Location loc,
ObjectKey instanceKey = {});
433 FailureOr<EvaluatorValuePtr>
435 FailureOr<EvaluatorValuePtr>
444 FailureOr<EvaluatorValuePtr>
447 FailureOr<EvaluatorValuePtr>
450 FailureOr<evaluator::EvaluatorValuePtr>
453 FailureOr<evaluator::EvaluatorValuePtr>
456 FailureOr<evaluator::EvaluatorValuePtr>
459 FailureOr<evaluator::EvaluatorValuePtr>
468 FailureOr<ActualParameters>
478 std::unique_ptr<SmallVector<std::shared_ptr<evaluator::EvaluatorValue>>>>
493 DenseMap<ObjectKey, std::shared_ptr<evaluator::EvaluatorValue>>
objects;
506 raw_ostream &
dbgs(
unsigned extra = 0) {
507 return llvm::dbgs().indent(
debugNesting * 2 + extra * 2);
510 llvm::indent
indent(
unsigned extra = 0) {
517static inline mlir::Diagnostic &
520 if (
auto *attr = llvm::dyn_cast<evaluator::AttributeValue>(&evaluatorValue))
521 diag << attr->getAttr();
522 else if (
auto *
object =
523 llvm::dyn_cast<evaluator::ObjectValue>(&evaluatorValue))
524 diag <<
"Object(" <<
object->getType() <<
")";
525 else if (
auto *list = llvm::dyn_cast<evaluator::ListValue>(&evaluatorValue))
526 diag <<
"List(" << list->getType() <<
")";
528 llvm::dyn_cast<evaluator::ReferenceValue>(&evaluatorValue))
529 diag <<
"Reference(" << ref->getValueType() <<
")";
530 else if (llvm::isa<evaluator::BasePathValue>(&evaluatorValue))
531 diag <<
"BasePath()";
532 else if (llvm::isa<evaluator::PathValue>(&evaluatorValue))
535 assert(
false &&
"unhandled evaluator value");
539 diag <<
" [unknown]";
544static inline mlir::Diagnostic &
546 return diag << *evaluatorValue.get();
552static inline llvm::raw_ostream &
556 llvm::raw_string_ostream ss(buf);
557 mlir::Diagnostic diag(UnknownLoc::get(evaluatorValue.
getContext()),
558 mlir::DiagnosticSeverity::Note);
559 diag << evaluatorValue;
561 return os << ss.str();
564static inline llvm::raw_ostream &
567 return os << *evaluatorValue.get();
568 return os <<
"<null>";
assert(baseType &&"element must be base type")
static std::unique_ptr< Context > context
An Evaluator, which is constructed with an IR module and can instantiate Objects.
FailureOr< evaluator::EvaluatorValuePtr > evaluateBasePathCreate(FrozenBasePathCreateOp op, ActualParameters actualParams, Location loc)
FailureOr< evaluator::EvaluatorValuePtr > evaluateEmptyPath(FrozenEmptyPathOp op, ActualParameters actualParams, Location loc)
SymbolTable symbolTable
The symbol table for the IR module the Evaluator was constructed with.
FailureOr< evaluator::EvaluatorValuePtr > getPartiallyEvaluatedValue(Type type, Location loc)
FailureOr< EvaluatorValuePtr > evaluateValue(Value value, ActualParameters actualParams, Location loc)
Evaluate a Value in a Class body according to the small expression grammar described in the rationale...
FailureOr< EvaluatorValuePtr > evaluateConstant(ConstantOp op, ActualParameters actualParams, Location loc)
Evaluator dispatch function for constants.
FailureOr< EvaluatorValuePtr > evaluateIntegerBinaryArithmetic(IntegerBinaryArithmeticOp op, ActualParameters actualParams, Location loc)
FailureOr< EvaluatorValuePtr > evaluateStringConcat(StringConcatOp op, ActualParameters actualParams, Location loc)
Evaluator dispatch function for String concatenation.
LogicalResult evaluatePropertyAssert(PropertyAssertOp op, ActualParameters actualParams)
Evaluator dispatch function for property assertions.
mlir::ModuleOp getModule()
Get the Module this Evaluator is built from.
FailureOr< EvaluatorValuePtr > evaluateObjectField(ObjectFieldOp op, ActualParameters actualParams, Location loc)
Evaluator dispatch function for Object fields.
FailureOr< evaluator::EvaluatorValuePtr > createUnknownValue(Type type, Location loc)
Create an unknown value of the specified type.
SmallVector< std::unique_ptr< SmallVector< std::shared_ptr< evaluator::EvaluatorValue > > > > actualParametersBuffers
This uniquely stores vectors that represent parameters.
bool isFullyEvaluated(Value value, ActualParameters key)
FailureOr< EvaluatorValuePtr > allocateObjectInstance(StringAttr clasName, ActualParameters actualParams)
std::queue< ObjectKey > worklist
A worklist that tracks values which needs to be fully evaluated.
llvm::indent indent(unsigned extra=0)
unsigned debugNesting
Current nesting depth for debug output indentation.
FailureOr< evaluator::EvaluatorValuePtr > evaluateUnknownValue(UnknownValueOp op, Location loc)
Evaluate an unknown value.
raw_ostream & dbgs(unsigned extra=0)
FailureOr< evaluator::EvaluatorValuePtr > instantiate(StringAttr className, ArrayRef< EvaluatorValuePtr > actualParams)
Instantiate an Object with its class name and actual parameters.
FailureOr< EvaluatorValuePtr > getOrCreateValue(Value value, ActualParameters actualParams, Location loc)
SmallVectorImpl< std::shared_ptr< evaluator::EvaluatorValue > > * ActualParameters
DenseMap< ObjectKey, std::shared_ptr< evaluator::EvaluatorValue > > objects
Evaluator value storage.
FailureOr< EvaluatorValuePtr > evaluateBinaryEquality(BinaryEqualityOp op, ActualParameters actualParams, Location loc)
FailureOr< EvaluatorValuePtr > evaluateListCreate(ListCreateOp op, ActualParameters actualParams, Location loc)
Evaluator dispatch function for List creation.
FailureOr< EvaluatorValuePtr > evaluateListConcat(ListConcatOp op, ActualParameters actualParams, Location loc)
Evaluator dispatch function for List concatenation.
std::pair< Value, ActualParameters > ObjectKey
FailureOr< EvaluatorValuePtr > evaluateParameter(BlockArgument formalParam, ActualParameters actualParams, Location loc)
Evaluator dispatch functions for the small expression grammar.
FailureOr< EvaluatorValuePtr > evaluateObjectInstance(StringAttr className, ActualParameters actualParams, Location loc, ObjectKey instanceKey={})
Instantiate an Object with its class name and actual parameters.
FailureOr< evaluator::EvaluatorValuePtr > evaluatePathCreate(FrozenPathCreateOp op, ActualParameters actualParams, Location loc)
FailureOr< ActualParameters > createParametersFromOperands(ValueRange range, ActualParameters actualParams, Location loc)
Evaluator dispatch function for Object instances.
bool isFullyEvaluated(ObjectKey key)
std::queue< std::pair< PropertyAssertOp, ActualParameters > > pendingAsserts
A queue of pending property assertions to be evaluated after the worklist is fully drained.
Values which can be directly representable by MLIR attributes.
LogicalResult setAttr(Attribute attr)
LogicalResult finalizeImpl()
friend std::shared_ptr< EvaluatorValue > get(Attribute attr, LocationAttr loc)
static bool classof(const EvaluatorValue *e)
Attribute getAttr() const
AttributeValue(PrivateTag, Attribute attr, Location loc)
friend std::shared_ptr< EvaluatorValue > get(Type type, LocationAttr loc)
AttributeValue(PrivateTag, Type type, Location loc)
static bool classof(const EvaluatorValue *e)
Implement LLVM RTTI.
LogicalResult finalizeImpl()
Finalize the evaluator value.
void setBasepath(const BasePathValue &basepath)
Set the basepath which this path is relative to.
om::PathAttr getPath() const
BasePathValue(om::PathAttr path, Location loc)
Create a path value representing a basepath.
Base class for evaluator runtime values.
bool isFullyEvaluated() const
EvaluatorValue(MLIRContext *ctx, Kind kind, Location loc)
void markUnknown()
Mark this value as unknown.
MLIRContext * getContext()
Return the associated MLIR context.
bool isUnknown() const
Return true if the value is unknown (has unknown in its fan-in).
void setLocIfUnknown(Location l)
MLIRContext * getContext() const
void markFullyEvaluated()
A List which contains variadic length of elements with the same type.
static bool classof(const EvaluatorValue *e)
Implement LLVM RTTI.
const auto & getElements() const
ListValue(om::ListType type, Location loc)
void setElements(SmallVector< EvaluatorValuePtr > newElements)
SmallVector< EvaluatorValuePtr > elements
LogicalResult finalizeImpl()
ListValue(om::ListType type, SmallVector< EvaluatorValuePtr > elements, Location loc)
om::ListType getListType() const
Return the type of the value, which is a ListType.
A composite Object, which has a type and fields.
LogicalResult finalizeImpl()
om::ClassType getObjectType() const
Return the type of the value, which is a ClassType.
FailureOr< EvaluatorValuePtr > getField(StringAttr field)
Get a field of the Object by name.
const auto & getFields() const
FailureOr< EvaluatorValuePtr > getField(StringRef field)
ArrayAttr getFieldNames()
Get all the field names of the Object.
static bool classof(const EvaluatorValue *e)
Implement LLVM RTTI.
void setFields(llvm::SmallDenseMap< StringAttr, EvaluatorValuePtr > newFields)
ObjectValue(om::ClassLike cls, Location loc)
om::ClassLike getClassOp() const
llvm::SmallDenseMap< StringAttr, EvaluatorValuePtr > fields
ObjectValue(om::ClassLike cls, ObjectFields fields, Location loc)
StringAttr getModule() const
StringAttr StringAttr ref
StringAttr getAsString() const
LogicalResult finalizeImpl()
om::TargetKindAttr getTargetKind() const
StringAttr getField() const
om::TargetKindAttr targetKind
void setBasepath(const BasePathValue &basepath)
om::PathAttr getPath() const
static bool classof(const EvaluatorValue *e)
Implement LLVM RTTI.
static PathValue getEmptyPath(Location loc)
StringAttr getRef() const
Values which can be used as pointers to different values.
EvaluatorValuePtr getValue() const
LogicalResult finalizeImpl()
static bool classof(const EvaluatorValue *e)
ReferenceValue(Type type, Location loc)
FailureOr< EvaluatorValuePtr > getStrippedValue() const
Type getValueType() const
void setValue(EvaluatorValuePtr newValue)
static LogicalResult finalizeEvaluatorValue(EvaluatorValuePtr &value)
std::shared_ptr< EvaluatorValue > EvaluatorValuePtr
A value of an object in memory.
evaluator::EvaluatorValuePtr EvaluatorValuePtr
static mlir::Diagnostic & operator<<(mlir::Diagnostic &diag, const evaluator::EvaluatorValue &evaluatorValue)
Helper to enable printing objects in Diagnostics.
SmallVector< EvaluatorValuePtr > getEvaluatorValuesFromAttributes(MLIRContext *context, ArrayRef< Attribute > attributes)
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.
RAII helper to increment/decrement debugNesting.
DebugNesting(unsigned &depth)