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"
95 if (isa<UnknownLoc>(
loc))
125 value = std::move(newValue);
134 llvm::SmallPtrSet<ReferenceValue *, 4> visited;
135 auto currentValue =
value;
136 while (
auto *v = dyn_cast<ReferenceValue>(currentValue.get())) {
138 if (!visited.insert(v).second)
140 currentValue = v->getValue();
142 return success(currentValue);
154 template <
typename AttrTy>
156 return dyn_cast<AttrTy>(
attr);
171 static std::shared_ptr<EvaluatorValue>
get(Attribute
attr,
172 LocationAttr
loc = {});
173 static std::shared_ptr<EvaluatorValue>
get(Type
type, LocationAttr
loc = {});
194 friend std::shared_ptr<EvaluatorValue>
get(Attribute
attr, LocationAttr
loc);
195 friend std::shared_ptr<EvaluatorValue>
get(Type
type, LocationAttr
loc);
200 if (failed(value->finalize()))
202 if (
auto *ref = llvm::dyn_cast<ReferenceValue>(value.get())) {
203 auto v = ref->getStrippedValue();
265 fields = std::move(newFields);
271 auto clsNonConst =
const_cast<om::ClassLike &
>(
cls);
272 return ClassType::get(clsNonConst.getContext(),
273 FlatSymbolRefAttr::get(clsNonConst.getSymNameAttr()));
284 FailureOr<EvaluatorValuePtr>
getField(StringAttr field);
285 FailureOr<EvaluatorValuePtr>
getField(StringRef field) {
369SmallVector<EvaluatorValuePtr>
371 ArrayRef<Attribute> attributes);
381 FailureOr<evaluator::EvaluatorValuePtr>
382 instantiate(StringAttr className, ArrayRef<EvaluatorValuePtr> actualParams);
387 FailureOr<evaluator::EvaluatorValuePtr>
391 SmallVectorImpl<std::shared_ptr<evaluator::EvaluatorValue>> *;
401 auto val =
objects.lookup(key);
402 return val && val->isFullyEvaluated();
405 FailureOr<EvaluatorValuePtr>
407 FailureOr<EvaluatorValuePtr>
413 FailureOr<EvaluatorValuePtr>
421 FailureOr<EvaluatorValuePtr>
424 FailureOr<EvaluatorValuePtr>
429 FailureOr<EvaluatorValuePtr>
431 Location loc,
ObjectKey instanceKey = {});
432 FailureOr<EvaluatorValuePtr>
434 FailureOr<EvaluatorValuePtr>
443 FailureOr<evaluator::EvaluatorValuePtr>
446 FailureOr<evaluator::EvaluatorValuePtr>
449 FailureOr<evaluator::EvaluatorValuePtr>
452 FailureOr<evaluator::EvaluatorValuePtr>
455 FailureOr<ActualParameters>
465 std::unique_ptr<SmallVector<std::shared_ptr<evaluator::EvaluatorValue>>>>
473 DenseMap<ObjectKey, std::shared_ptr<evaluator::EvaluatorValue>>
objects;
477static inline mlir::Diagnostic &
480 if (
auto *attr = llvm::dyn_cast<evaluator::AttributeValue>(&evaluatorValue))
481 diag << attr->getAttr();
482 else if (
auto *
object =
483 llvm::dyn_cast<evaluator::ObjectValue>(&evaluatorValue))
484 diag <<
"Object(" <<
object->getType() <<
")";
485 else if (
auto *list = llvm::dyn_cast<evaluator::ListValue>(&evaluatorValue))
486 diag <<
"List(" << list->getType() <<
")";
487 else if (llvm::isa<evaluator::BasePathValue>(&evaluatorValue))
488 diag <<
"BasePath()";
489 else if (llvm::isa<evaluator::PathValue>(&evaluatorValue))
492 assert(
false &&
"unhandled evaluator value");
496 diag <<
" [unknown]";
501static inline mlir::Diagnostic &
503 return diag << *evaluatorValue.get();
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)
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.
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.
FailureOr< evaluator::EvaluatorValuePtr > evaluateUnknownValue(UnknownValueOp op, Location loc)
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 > 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)
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.