mirror of https://github.com/llvm/circt.git
256 lines
8.1 KiB
C++
256 lines
8.1 KiB
C++
//===- RTG.cpp - C interface for the RTG dialect --------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "circt-c/Dialect/RTG.h"
|
|
#include "circt/Dialect/RTG/IR/RTGAttributes.h"
|
|
#include "circt/Dialect/RTG/IR/RTGDialect.h"
|
|
#include "circt/Dialect/RTG/IR/RTGTypes.h"
|
|
|
|
#include "mlir/CAPI/Registration.h"
|
|
|
|
using namespace circt;
|
|
using namespace circt::rtg;
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Dialect API.
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
MLIR_DEFINE_CAPI_DIALECT_REGISTRATION(RTG, rtg, RTGDialect)
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Type API.
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// SequenceType
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
bool rtgTypeIsASequence(MlirType type) {
|
|
return isa<SequenceType>(unwrap(type));
|
|
}
|
|
|
|
MlirType rtgSequenceTypeGet(MlirContext ctxt, intptr_t numElements,
|
|
MlirType const *elementTypes) {
|
|
SmallVector<Type> types;
|
|
for (unsigned i = 0; i < numElements; ++i)
|
|
types.emplace_back(unwrap(elementTypes[i]));
|
|
return wrap(SequenceType::get(unwrap(ctxt), types));
|
|
}
|
|
|
|
unsigned rtgSequenceTypeGetNumElements(MlirType type) {
|
|
return cast<SequenceType>(unwrap(type)).getElementTypes().size();
|
|
}
|
|
|
|
MlirType rtgSequenceTypeGetElement(MlirType type, unsigned i) {
|
|
return wrap(cast<SequenceType>(unwrap(type)).getElementTypes()[i]);
|
|
}
|
|
|
|
// RandomizedSequenceType
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
bool rtgTypeIsARandomizedSequence(MlirType type) {
|
|
return isa<RandomizedSequenceType>(unwrap(type));
|
|
}
|
|
|
|
MlirType rtgRandomizedSequenceTypeGet(MlirContext ctxt) {
|
|
return wrap(RandomizedSequenceType::get(unwrap(ctxt)));
|
|
}
|
|
|
|
// LabelType
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
bool rtgTypeIsALabel(MlirType type) { return isa<LabelType>(unwrap(type)); }
|
|
|
|
MlirType rtgLabelTypeGet(MlirContext ctxt) {
|
|
return wrap(LabelType::get(unwrap(ctxt)));
|
|
}
|
|
|
|
// SetType
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
bool rtgTypeIsASet(MlirType type) { return isa<SetType>(unwrap(type)); }
|
|
|
|
MlirType rtgSetTypeGet(MlirType elementType) {
|
|
auto ty = unwrap(elementType);
|
|
return wrap(SetType::get(ty.getContext(), ty));
|
|
}
|
|
|
|
MlirType rtgSetTypeGetElementType(MlirType type) {
|
|
return wrap(cast<SetType>(unwrap(type)).getElementType());
|
|
}
|
|
|
|
// BagType
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
bool rtgTypeIsABag(MlirType type) { return isa<BagType>(unwrap(type)); }
|
|
|
|
MlirType rtgBagTypeGet(MlirType elementType) {
|
|
auto ty = unwrap(elementType);
|
|
return wrap(BagType::get(ty.getContext(), ty));
|
|
}
|
|
|
|
MlirType rtgBagTypeGetElementType(MlirType type) {
|
|
return wrap(cast<BagType>(unwrap(type)).getElementType());
|
|
}
|
|
|
|
// DictType
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
bool rtgTypeIsADict(MlirType type) { return isa<DictType>(unwrap(type)); }
|
|
|
|
MlirType rtgDictTypeGet(MlirContext ctxt, intptr_t numEntries,
|
|
MlirAttribute const *entryNames,
|
|
MlirType const *entryTypes) {
|
|
SmallVector<DictEntry> entries;
|
|
for (unsigned i = 0; i < numEntries; ++i) {
|
|
DictEntry entry;
|
|
entry.name = cast<StringAttr>(unwrap(entryNames[i]));
|
|
entry.type = unwrap(entryTypes[i]);
|
|
entries.emplace_back(entry);
|
|
}
|
|
return wrap(DictType::get(unwrap(ctxt), entries));
|
|
}
|
|
|
|
// ArrayType
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
MlirType rtgArrayTypeGet(MlirType elementType) {
|
|
return wrap(
|
|
ArrayType::get(unwrap(elementType).getContext(), unwrap(elementType)));
|
|
}
|
|
|
|
bool rtgTypeIsAArray(MlirType type) { return isa<ArrayType>(unwrap(type)); }
|
|
|
|
MlirType rtgArrayTypeGetElementType(MlirType type) {
|
|
return wrap(cast<ArrayType>(unwrap(type)).getElementType());
|
|
}
|
|
|
|
// ImmediateType
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
bool rtgTypeIsAImmediate(MlirType type) {
|
|
return isa<ImmediateType>(unwrap(type));
|
|
}
|
|
|
|
MlirType rtgImmediateTypeGet(MlirContext ctx, uint32_t width) {
|
|
return wrap(ImmediateType::get(unwrap(ctx), width));
|
|
}
|
|
|
|
uint32_t rtgImmediateTypeGetWidth(MlirType type) {
|
|
return cast<ImmediateType>(unwrap(type)).getWidth();
|
|
}
|
|
|
|
// MemoryType
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
bool rtgTypeIsAMemory(MlirType type) { return isa<MemoryType>(unwrap(type)); }
|
|
|
|
MlirType rtgMemoryTypeGet(MlirContext ctxt, uint32_t addressWidth) {
|
|
return wrap(MemoryType::get(unwrap(ctxt), addressWidth));
|
|
}
|
|
|
|
uint32_t rtgMemoryTypeGetAddressWidth(MlirType type) {
|
|
return cast<MemoryType>(unwrap(type)).getAddressWidth();
|
|
}
|
|
|
|
// MemoryBlockType
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
bool rtgTypeIsAMemoryBlock(MlirType type) {
|
|
return isa<MemoryBlockType>(unwrap(type));
|
|
}
|
|
|
|
MlirType rtgMemoryBlockTypeGet(MlirContext ctxt, uint32_t addressWidth) {
|
|
return wrap(MemoryBlockType::get(unwrap(ctxt), addressWidth));
|
|
}
|
|
|
|
uint32_t rtgMemoryBlockTypeGetAddressWidth(MlirType type) {
|
|
return cast<MemoryBlockType>(unwrap(type)).getAddressWidth();
|
|
}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Attribute API.
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// DefaultContext
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
bool rtgAttrIsADefaultContextAttr(MlirAttribute attr) {
|
|
return isa<DefaultContextAttr>(unwrap(attr));
|
|
}
|
|
|
|
MlirAttribute rtgDefaultContextAttrGet(MlirContext ctxt, MlirType type) {
|
|
return wrap(DefaultContextAttr::get(unwrap(ctxt), unwrap(type)));
|
|
}
|
|
|
|
// Label Visibility
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
bool rtgAttrIsALabelVisibilityAttr(MlirAttribute attr) {
|
|
return isa<LabelVisibilityAttr>(unwrap(attr));
|
|
}
|
|
|
|
RTGLabelVisibility rtgLabelVisibilityAttrGetValue(MlirAttribute attr) {
|
|
auto convert = [](LabelVisibility visibility) {
|
|
switch (visibility) {
|
|
case LabelVisibility::local:
|
|
return RTG_LABEL_VISIBILITY_LOCAL;
|
|
case LabelVisibility::global:
|
|
return RTG_LABEL_VISIBILITY_GLOBAL;
|
|
case LabelVisibility::external:
|
|
return RTG_LABEL_VISIBILITY_EXTERNAL;
|
|
}
|
|
};
|
|
return convert(cast<LabelVisibilityAttr>(unwrap(attr)).getValue());
|
|
}
|
|
|
|
MlirAttribute rtgLabelVisibilityAttrGet(MlirContext ctxt,
|
|
RTGLabelVisibility visibility) {
|
|
auto convert = [](RTGLabelVisibility visibility) {
|
|
switch (visibility) {
|
|
case RTG_LABEL_VISIBILITY_LOCAL:
|
|
return LabelVisibility::local;
|
|
case RTG_LABEL_VISIBILITY_GLOBAL:
|
|
return LabelVisibility::global;
|
|
case RTG_LABEL_VISIBILITY_EXTERNAL:
|
|
return LabelVisibility::external;
|
|
}
|
|
};
|
|
return wrap(LabelVisibilityAttr::get(unwrap(ctxt), convert(visibility)));
|
|
}
|
|
|
|
// ImmediateAttr
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
bool rtgAttrIsAImmediate(MlirAttribute attr) {
|
|
return isa<ImmediateAttr>(unwrap(attr));
|
|
}
|
|
|
|
MlirAttribute rtgImmediateAttrGet(MlirContext ctx, uint32_t width,
|
|
uint64_t value) {
|
|
return wrap(rtg::ImmediateAttr::get(unwrap(ctx), APInt(width, value)));
|
|
}
|
|
|
|
uint32_t rtgImmediateAttrGetWidth(MlirAttribute attr) {
|
|
return cast<ImmediateAttr>(unwrap(attr)).getValue().getBitWidth();
|
|
}
|
|
|
|
uint64_t rtgImmediateAttrGetValue(MlirAttribute attr) {
|
|
return cast<ImmediateAttr>(unwrap(attr)).getValue().getZExtValue();
|
|
}
|
|
|
|
// AnyContexts
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
bool rtgAttrIsAAnyContextAttr(MlirAttribute attr) {
|
|
return isa<AnyContextAttr>(unwrap(attr));
|
|
}
|
|
|
|
MlirAttribute rtgAnyContextAttrGet(MlirContext ctxt, MlirType type) {
|
|
return wrap(AnyContextAttr::get(unwrap(ctxt), unwrap(type)));
|
|
}
|