16#include "mlir/CAPI/IR.h"
17#include "mlir/CAPI/Registration.h"
18#include "mlir/CAPI/Support.h"
19#include "llvm/ADT/PostOrderIterator.h"
49 return wrap(ArrayType::get(
unwrap(element), size));
53 return wrap(cast<ArrayType>(
unwrap(type)).getElementType());
57 return cast<ArrayType>(
unwrap(type)).getNumElements();
63 return wrap(IntType::get(cast<TypedAttr>(
unwrap(parameter))));
67 return wrap(cast<IntType>(
unwrap(type)).getWidth());
75 return wrap(cast<InOutType>(
unwrap(type)).getElementType());
81 return isa<ModuleType>(
unwrap(type));
86 SmallVector<ModulePort> modulePorts;
87 for (intptr_t i = 0; i < numPorts; ++i) {
92 case HWModulePortDirection::Input:
93 dir = ModulePort::Direction::Input;
95 case HWModulePortDirection::Output:
96 dir = ModulePort::Direction::Output;
98 case HWModulePortDirection::InOut:
99 dir = ModulePort::Direction::InOut;
103 StringAttr name = cast<StringAttr>(
unwrap(port.
name));
106 modulePorts.push_back(
ModulePort{name, type, dir});
109 return wrap(ModuleType::get(
unwrap(ctx), modulePorts));
113 return cast<ModuleType>(
unwrap(type)).getNumInputs();
117 return wrap(cast<ModuleType>(
unwrap(type)).getInputType(index));
121 return wrap(cast<ModuleType>(
unwrap(type)).getInputName(index));
125 return cast<ModuleType>(
unwrap(type)).getNumOutputs();
129 return wrap(cast<ModuleType>(
unwrap(type)).getOutputType(index));
133 return wrap(cast<ModuleType>(
unwrap(type)).getOutputName(index));
137 auto port = cast<ModuleType>(
unwrap(type)).getPorts()[index];
141 case ModulePort::Direction::Input:
142 dir = HWModulePortDirection::Input;
144 case ModulePort::Direction::Output:
145 dir = HWModulePortDirection::Output;
147 case ModulePort::Direction::InOut:
148 dir = HWModulePortDirection::InOut;
152 ret->
name =
wrap(
static_cast<Attribute
>(port.name));
158 return isa<StructType>(
unwrap(type));
163 SmallVector<StructType::FieldInfo> fieldInfos;
166 fieldInfos.push_back(StructType::FieldInfo{
167 cast<StringAttr>(
unwrap(elements[i].name)),
unwrap(elements[i].type)});
169 return wrap(StructType::get(
unwrap(ctx), fieldInfos));
173 StructType st = cast<StructType>(
unwrap(structType));
174 return wrap(st.getFieldType(
unwrap(fieldName)));
178 MlirStringRef fieldName) {
179 StructType st = cast<StructType>(
unwrap(structType));
180 if (
auto idx = st.getFieldIndex(
unwrap(fieldName)))
181 return wrap(IntegerAttr::get(IntegerType::get(st.getContext(), 32), *idx));
182 return wrap(UnitAttr::get(st.getContext()));
186 StructType st = cast<StructType>(
unwrap(structType));
187 return st.getElements().size();
191 StructType st = cast<StructType>(
unwrap(structType));
192 auto cppField = st.getElements()[idx];
203 SmallVector<UnionType::FieldInfo> fieldInfos;
206 fieldInfos.push_back(
207 UnionType::FieldInfo{cast<StringAttr>(
unwrap(elements[i].name)),
210 return wrap(UnionType::get(
unwrap(ctx), fieldInfos));
214 UnionType ut = cast<UnionType>(
unwrap(unionType));
215 return wrap(ut.getFieldType(
unwrap(fieldName)));
219 MlirStringRef fieldName) {
220 UnionType ut = cast<UnionType>(
unwrap(unionType));
221 if (
auto idx = ut.getFieldIndex(
unwrap(fieldName)))
222 return wrap(IntegerAttr::get(IntegerType::get(ut.getContext(), 32), *idx));
223 return wrap(UnitAttr::get(ut.getContext()));
227 UnionType ut = cast<UnionType>(
unwrap(unionType));
228 return ut.getElements().size();
232 UnionType ut = cast<UnionType>(
unwrap(unionType));
233 auto cppField = ut.getElements()[idx];
237 ret.
offset = cppField.offset;
242 return isa<TypeAliasType>(
unwrap(type));
246 MlirType cInnerType) {
247 StringRef scope =
unwrap(cScope);
248 StringRef name =
unwrap(cName);
249 Type innerType =
unwrap(cInnerType);
250 FlatSymbolRefAttr nameRef =
251 FlatSymbolRefAttr::get(innerType.getContext(), name);
253 SymbolRefAttr::get(innerType.getContext(), scope, {nameRef});
254 return wrap(TypeAliasType::get(ref, innerType));
258 TypeAliasType type = cast<TypeAliasType>(
unwrap(typeAlias));
259 return wrap(type.getCanonicalType());
263 TypeAliasType type = cast<TypeAliasType>(
unwrap(typeAlias));
264 return wrap(type.getInnerType());
268 TypeAliasType type = cast<TypeAliasType>(
unwrap(typeAlias));
269 return wrap(type.getRef().getLeafReference().getValue());
273 TypeAliasType type = cast<TypeAliasType>(
unwrap(typeAlias));
274 return wrap(type.getRef().getRootReference().getValue());
282 return isa<InnerSymAttr>(
unwrap(attr));
286 return wrap(InnerSymAttr::get(cast<StringAttr>(
unwrap(symName))));
294 return wrap((Attribute)cast<InnerSymAttr>(
unwrap(innerSymAttr)).getSymName());
298 return isa<InnerRefAttr>(
unwrap(attr));
302 MlirAttribute innerSym) {
303 auto moduleNameAttr = cast<StringAttr>(
unwrap(moduleName));
304 auto innerSymAttr = cast<StringAttr>(
unwrap(innerSym));
305 return wrap(InnerRefAttr::get(moduleNameAttr, innerSymAttr));
309 return wrap((Attribute)cast<InnerRefAttr>(
unwrap(innerRefAttr)).getName());
313 return wrap((Attribute)cast<InnerRefAttr>(
unwrap(innerRefAttr)).getModule());
317 return isa<ParamDeclAttr>(
unwrap(attr));
321 MlirAttribute cValue) {
322 auto type =
unwrap(cType);
323 auto name = StringAttr::get(type.getContext(),
unwrap(cName));
325 ParamDeclAttr::get(type.getContext(), name, type,
unwrap(cValue)));
328 return wrap(cast<ParamDeclAttr>(
unwrap(decl)).getName().getValue());
331 return wrap(cast<ParamDeclAttr>(
unwrap(decl)).getType());
334 return wrap(cast<ParamDeclAttr>(
unwrap(decl)).getValue());
338 return isa<ParamDeclRefAttr>(
unwrap(attr));
342 MlirStringRef cName) {
343 auto name = StringAttr::get(
unwrap(ctx),
unwrap(cName));
344 return wrap(ParamDeclRefAttr::get(
unwrap(ctx), name,
345 IntegerType::get(
unwrap(ctx), 32)));
349 return wrap(cast<ParamDeclRefAttr>(
unwrap(decl)).getName().getValue());
352 return wrap(cast<ParamDeclRefAttr>(
unwrap(decl)).getType());
356 return isa<ParamVerbatimAttr>(
unwrap(attr));
359 auto textAttr = cast<StringAttr>(
unwrap(text));
360 MLIRContext *ctx = textAttr.getContext();
361 auto type = NoneType::get(ctx);
362 return wrap(ParamVerbatimAttr::get(ctx, textAttr, type));
366 return isa<OutputFileAttr>(
unwrap(attr));
368MLIR_CAPI_EXPORTED MlirAttribute
370 bool includeReplicatedOp) {
371 auto fileNameStrAttr = cast<StringAttr>(
unwrap(fileName));
372 return wrap(OutputFileAttr::getFromFilename(
373 fileNameStrAttr.getContext(), fileNameStrAttr.getValue(),
374 excludeFromFileList, includeReplicatedOp));
378 auto outputFileAttr = cast<OutputFileAttr>(
unwrap(outputFile));
379 return wrap(outputFileAttr.getFilename().getValue());
387 delete unwrap(instanceGraph);
390MLIR_CAPI_EXPORTED HWInstanceGraphNode
392 return wrap(
unwrap(instanceGraph)->getTopLevelNode());
395MLIR_CAPI_EXPORTED
void
400 for (
const auto &inst : llvm::post_order(graph)) {
401 callback(
wrap(inst), userData);
406 HWInstanceGraphNode rhs) {
410MLIR_CAPI_EXPORTED MlirModule
412 return wrap(dyn_cast<ModuleOp>(
unwrap(node)->getModule().getOperation()));
415MLIR_CAPI_EXPORTED MlirOperation
return wrap(CMemoryType::get(unwrap(ctx), baseType, numElements))
MlirType uint64_t numElements
MLIR_DEFINE_CAPI_DIALECT_REGISTRATION(CHIRRTL, chirrtl, circt::chirrtl::CHIRRTLDialect) MlirType chirrtlTypeGetCMemory(MlirContext ctx
static void registerPasses()
MLIR_CAPI_EXPORTED MlirAttribute hwParamDeclAttrGet(MlirStringRef cName, MlirType cType, MlirAttribute cValue)
MlirAttribute hwInnerRefAttrGetModule(MlirAttribute innerRefAttr)
MLIR_CAPI_EXPORTED MlirType hwParamDeclAttrGetType(MlirAttribute decl)
MlirType hwUnionTypeGet(MlirContext ctx, intptr_t numElements, HWUnionFieldInfo const *elements)
Creates an HW union type in the context associated with the elements.
MlirType hwInOutTypeGet(MlirType element)
Creates an HW inout type in the context associated with element.
MlirType hwArrayTypeGet(MlirType element, size_t size)
Creates a fixed-size HW array type in the context associated with element.
intptr_t hwArrayTypeGetSize(MlirType type)
returns the size of an array type
MlirType hwStructTypeGet(MlirContext ctx, intptr_t numElements, HWStructFieldInfo const *elements)
Creates an HW struct type in the context associated with the elements.
MlirType hwArrayTypeGetElementType(MlirType type)
returns the element type of an array type
MLIR_CAPI_EXPORTED HWInstanceGraphNode hwInstanceGraphGetTopLevelNode(HWInstanceGraph instanceGraph)
intptr_t hwModuleTypeGetNumInputs(MlirType type)
Get an HW module type's number of inputs.
MLIR_CAPI_EXPORTED MlirOperation hwInstanceGraphNodeGetModuleOp(HWInstanceGraphNode node)
intptr_t hwStructTypeGetNumFields(MlirType structType)
bool hwTypeIsAArrayType(MlirType type)
If the type is an HW array.
bool hwTypeIsATypeAliasType(MlirType type)
If the type is an HW type alias.
MlirType hwTypeAliasTypeGetInnerType(MlirType typeAlias)
MlirStringRef hwOutputFileGetFileName(MlirAttribute outputFile)
MlirType hwTypeAliasTypeGetCanonicalType(MlirType typeAlias)
MlirType hwStructTypeGetField(MlirType structType, MlirStringRef fieldName)
MlirAttribute hwInnerRefAttrGet(MlirAttribute moduleName, MlirAttribute innerSym)
MLIR_CAPI_EXPORTED bool hwInstanceGraphNodeEqual(HWInstanceGraphNode lhs, HWInstanceGraphNode rhs)
MLIR_CAPI_EXPORTED MlirModule hwInstanceGraphNodeGetModule(HWInstanceGraphNode node)
MLIR_CAPI_EXPORTED HWInstanceGraph hwInstanceGraphGet(MlirOperation operation)
MlirType hwGetCanonicalType(MlirType type)
Recursively remove HW type aliases from a type and its subelements.
bool hwTypeIsAIntType(MlirType type)
If the type is an HW int.
void hwModuleTypeGetPort(MlirType type, intptr_t index, HWModulePort *ret)
Get an HW module type's port info at a specific index.
MlirType hwModuleTypeGetInputType(MlirType type, intptr_t index)
Get an HW module type's input type at a specific index.
bool hwTypeIsAInOut(MlirType type)
If the type is an HW inout.
MlirStringRef hwModuleTypeGetInputName(MlirType type, intptr_t index)
Get an HW module type's input name at a specific index.
MlirType hwModuleTypeGet(MlirContext ctx, intptr_t numPorts, HWModulePort const *ports)
Creates an HW module type.
MlirAttribute hwStructTypeGetFieldIndex(MlirType structType, MlirStringRef fieldName)
MLIR_CAPI_EXPORTED MlirAttribute hwParamDeclAttrGetValue(MlirAttribute decl)
MlirAttribute hwInnerSymAttrGetSymName(MlirAttribute innerSymAttr)
MlirAttribute hwInnerSymAttrGet(MlirAttribute symName)
intptr_t hwUnionTypeGetNumFields(MlirType unionType)
MLIR_CAPI_EXPORTED void hwInstanceGraphDestroy(HWInstanceGraph instanceGraph)
MLIR_CAPI_EXPORTED void hwInstanceGraphForEachNode(HWInstanceGraph instanceGraph, HWInstanceGraphNodeCallback callback, void *userData)
MlirStringRef hwTypeAliasTypeGetScope(MlirType typeAlias)
MlirType hwInOutTypeGetElementType(MlirType type)
Returns the element type of an inout type.
MlirType hwTypeAliasTypeGet(MlirStringRef cScope, MlirStringRef cName, MlirType cInnerType)
bool hwTypeIsAValueType(MlirType type)
Return true if the specified type can be used as an HW value type, that is the set of types that can ...
bool hwAttrIsAInnerSymAttr(MlirAttribute attr)
MLIR_CAPI_EXPORTED bool hwAttrIsAParamVerbatimAttr(MlirAttribute attr)
bool hwTypeIsAStructType(MlirType type)
If the type is an HW struct.
MLIR_CAPI_EXPORTED bool hwAttrIsAOutputFileAttr(MlirAttribute attr)
MlirType hwParamIntTypeGet(MlirAttribute parameter)
MlirStringRef hwModuleTypeGetOutputName(MlirType type, intptr_t index)
Get an HW module type's output name at a specific index.
MLIR_CAPI_EXPORTED MlirAttribute hwOutputFileGetFromFileName(MlirAttribute fileName, bool excludeFromFileList, bool includeReplicatedOp)
MlirAttribute hwInnerRefAttrGetName(MlirAttribute innerRefAttr)
MlirType hwUnionTypeGetField(MlirType unionType, MlirStringRef fieldName)
MlirAttribute hwInnerSymAttrGetEmpty(MlirContext ctx)
HWStructFieldInfo hwStructTypeGetFieldNum(MlirType structType, unsigned idx)
bool hwTypeIsAModuleType(MlirType type)
If the type is an HW module type.
MLIR_CAPI_EXPORTED bool hwAttrIsAParamDeclRefAttr(MlirAttribute attr)
HWUnionFieldInfo hwUnionTypeGetFieldNum(MlirType unionType, unsigned idx)
int64_t hwGetBitWidth(MlirType type)
Return the hardware bit width of a type.
MLIR_CAPI_EXPORTED MlirStringRef hwParamDeclRefAttrGetName(MlirAttribute decl)
MlirStringRef hwTypeAliasTypeGetName(MlirType typeAlias)
MlirAttribute hwUnionTypeGetFieldIndex(MlirType unionType, MlirStringRef fieldName)
bool hwAttrIsAInnerRefAttr(MlirAttribute attr)
MLIR_CAPI_EXPORTED MlirAttribute hwParamDeclRefAttrGet(MlirContext ctx, MlirStringRef cName)
MLIR_CAPI_EXPORTED bool hwAttrIsAParamDeclAttr(MlirAttribute attr)
bool hwTypeIsAUnionType(MlirType type)
If the type is an HW union.
MlirType hwModuleTypeGetOutputType(MlirType type, intptr_t index)
Get an HW module type's output type at a specific index.
MlirAttribute hwParamIntTypeGetWidthAttr(MlirType type)
intptr_t hwModuleTypeGetNumOutputs(MlirType type)
Get an HW module type's number of outputs.
MLIR_CAPI_EXPORTED MlirStringRef hwParamDeclAttrGetName(MlirAttribute decl)
MLIR_CAPI_EXPORTED MlirAttribute hwParamVerbatimAttrGet(MlirAttribute text)
MLIR_CAPI_EXPORTED MlirType hwParamDeclRefAttrGetType(MlirAttribute decl)
void(* HWInstanceGraphNodeCallback)(HWInstanceGraphNode, void *)
static EvaluatorValuePtr unwrap(OMEvaluatorValue c)
DEFINE_C_API_PTR_METHODS(SynthLongestPathHistory, llvm::ImmutableListImpl< DebugPoint >) llvm
HW-specific instance graph with a virtual entry node linking to all publicly visible modules.
This is a Node in the InstanceGraph.
bool isHWValueType(mlir::Type type)
Return true if the specified type can be used as an HW value type, that is the set of types that can ...
int64_t getBitWidth(mlir::Type type)
Return the hardware bit width of a type.
mlir::Type getCanonicalType(mlir::Type type)
Recursively remove HW type aliases from a type and its subelements.
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.
HWModulePortDirection dir