CIRCT  18.0.0git
FIRRTL.cpp
Go to the documentation of this file.
1 //===- FIRRTL.cpp - C Interface for the FIRRTL Dialect --------------------===//
2 //
3 //===----------------------------------------------------------------------===//
4 
9 #include "mlir/CAPI/IR.h"
10 #include "mlir/CAPI/Registration.h"
11 #include "mlir/CAPI/Support.h"
12 
13 using namespace circt;
14 using namespace firrtl;
15 
16 //===----------------------------------------------------------------------===//
17 // Dialect API.
18 //===----------------------------------------------------------------------===//
19 
21  circt::firrtl::FIRRTLDialect)
22 
23 //===----------------------------------------------------------------------===//
24 // Type API.
25 //===----------------------------------------------------------------------===//
26 
27 MlirType firrtlTypeGetUInt(MlirContext ctx, int32_t width) {
28  return wrap(UIntType::get(unwrap(ctx), width));
29 }
30 
31 MlirType firrtlTypeGetSInt(MlirContext ctx, int32_t width) {
32  return wrap(SIntType::get(unwrap(ctx), width));
33 }
34 
35 MlirType firrtlTypeGetClock(MlirContext ctx) {
36  return wrap(ClockType::get(unwrap(ctx)));
37 }
38 
39 MlirType firrtlTypeGetReset(MlirContext ctx) {
40  return wrap(ResetType::get(unwrap(ctx)));
41 }
42 
43 MlirType firrtlTypeGetAsyncReset(MlirContext ctx) {
44  return wrap(AsyncResetType::get(unwrap(ctx)));
45 }
46 
47 MlirType firrtlTypeGetAnalog(MlirContext ctx, int32_t width) {
48  return wrap(AnalogType::get(unwrap(ctx), width));
49 }
50 
51 MlirType firrtlTypeGetVector(MlirContext ctx, MlirType element, size_t count) {
52  auto baseType = unwrap(element).cast<FIRRTLBaseType>();
53  assert(baseType && "element must be base type");
54 
55  return wrap(FVectorType::get(baseType, count));
56 }
57 
58 MlirType firrtlTypeGetBundle(MlirContext ctx, size_t count,
59  const FIRRTLBundleField *fields) {
60  SmallVector<BundleType::BundleElement, 4> bundleFields;
61  bundleFields.reserve(count);
62 
63  for (size_t i = 0; i < count; i++) {
64  auto field = fields[i];
65 
66  auto baseType = unwrap(field.type).dyn_cast<FIRRTLBaseType>();
67  assert(baseType && "field must be base type");
68 
69  bundleFields.emplace_back(unwrap(field.name), field.isFlip, baseType);
70  }
71  return wrap(BundleType::get(unwrap(ctx), bundleFields));
72 }
73 
74 //===----------------------------------------------------------------------===//
75 // Attribute API.
76 //===----------------------------------------------------------------------===//
77 
78 MlirAttribute firrtlAttrGetConvention(MlirContext ctx,
79  FIRRTLConvention convention) {
80  Convention value;
81 
82  switch (convention) {
84  value = Convention::Internal;
85  break;
87  value = Convention::Scalarized;
88  break;
89  }
90 
91  return wrap(ConventionAttr::get(unwrap(ctx), value));
92 }
93 
94 MlirAttribute firrtlAttrGetPortDirs(MlirContext ctx, size_t count,
95  const FIRRTLPortDir *dirs) {
97  static_cast<std::underlying_type_t<Direction>>(Direction::In));
99  static_cast<std::underlying_type_t<Direction>>(Direction::Out));
100 
101  // FIXME: The `reinterpret_cast` here may voilate strict aliasing rule. Is
102  // there a better way?
104  unwrap(ctx), ArrayRef(reinterpret_cast<const Direction *>(dirs), count)));
105 }
106 
107 MlirAttribute firrtlAttrGetParamDecl(MlirContext ctx, MlirIdentifier name,
108  MlirType type, MlirAttribute value) {
109  return wrap(ParamDeclAttr::get(unwrap(ctx), unwrap(name), unwrap(type),
110  unwrap(value)));
111 }
112 
113 MlirAttribute firrtlAttrGetNameKind(MlirContext ctx, FIRRTLNameKind nameKind) {
114  NameKindEnum value;
115 
116  switch (nameKind) {
118  value = NameKindEnum::DroppableName;
119  break;
121  value = NameKindEnum::InterestingName;
122  break;
123  }
124 
125  return wrap(NameKindEnumAttr::get(unwrap(ctx), value));
126 }
127 
128 MlirAttribute firrtlAttrGetRUW(MlirContext ctx, FIRRTLRUW ruw) {
129  RUWAttr value;
130 
131  switch (ruw) {
133  value = RUWAttr::Undefined;
134  break;
135  case FIRRTL_RUW_OLD:
136  value = RUWAttr::Old;
137  break;
138  case FIRRTL_RUW_NEW:
139  value = RUWAttr::New;
140  break;
141  }
142 
143  return wrap(RUWAttrAttr::get(unwrap(ctx), value));
144 }
145 
146 MlirAttribute firrtlAttrGetMemInit(MlirContext ctx, MlirIdentifier filename,
147  bool isBinary, bool isInline) {
148  return wrap(
149  MemoryInitAttr::get(unwrap(ctx), unwrap(filename), isBinary, isInline));
150 }
151 
152 MlirAttribute firrtlAttrGetMemDir(MlirContext ctx, FIRRTLMemDir dir) {
153  MemDirAttr value;
154 
155  switch (dir) {
157  value = MemDirAttr::Infer;
158  break;
159  case FIRRTL_MEM_DIR_READ:
160  value = MemDirAttr::Read;
161  break;
163  value = MemDirAttr::Write;
164  break;
166  value = MemDirAttr::ReadWrite;
167  break;
168  }
169 
170  return wrap(MemDirAttrAttr::get(unwrap(ctx), value));
171 }
172 
173 MlirAttribute firrtlAttrGetEventControl(MlirContext ctx,
174  FIRRTLEventControl eventControl) {
175  EventControl value;
176 
177  switch (eventControl) {
179  value = EventControl::AtPosEdge;
180  break;
182  value = EventControl::AtNegEdge;
183  break;
185  value = EventControl::AtEdge;
186  break;
187  }
188 
189  return wrap(EventControlAttr::get(unwrap(ctx), value));
190 }
lowerAnnotationsNoRefTypePorts FirtoolPreserveValuesMode value
Definition: Firtool.cpp:95
assert(baseType &&"element must be base type")
return wrap(CMemoryType::get(unwrap(ctx), baseType, numElements))
MlirAttribute firrtlAttrGetMemDir(MlirContext ctx, FIRRTLMemDir dir)
Definition: FIRRTL.cpp:152
MlirType firrtlTypeGetAsyncReset(MlirContext ctx)
Definition: FIRRTL.cpp:43
MlirType firrtlTypeGetAnalog(MlirContext ctx, int32_t width)
Definition: FIRRTL.cpp:47
MlirAttribute firrtlAttrGetConvention(MlirContext ctx, FIRRTLConvention convention)
Definition: FIRRTL.cpp:78
int32_t width
Definition: FIRRTL.cpp:27
MlirType firrtlTypeGetClock(MlirContext ctx)
Definition: FIRRTL.cpp:35
MlirType firrtlTypeGetReset(MlirContext ctx)
Definition: FIRRTL.cpp:39
MlirType firrtlTypeGetVector(MlirContext ctx, MlirType element, size_t count)
Definition: FIRRTL.cpp:51
MlirType firrtlTypeGetSInt(MlirContext ctx, int32_t width)
Definition: FIRRTL.cpp:31
MlirType firrtlTypeGetBundle(MlirContext ctx, size_t count, const FIRRTLBundleField *fields)
Definition: FIRRTL.cpp:58
MlirAttribute firrtlAttrGetEventControl(MlirContext ctx, FIRRTLEventControl eventControl)
Definition: FIRRTL.cpp:173
MlirAttribute firrtlAttrGetParamDecl(MlirContext ctx, MlirIdentifier name, MlirType type, MlirAttribute value)
Definition: FIRRTL.cpp:107
MlirAttribute firrtlAttrGetMemInit(MlirContext ctx, MlirIdentifier filename, bool isBinary, bool isInline)
Definition: FIRRTL.cpp:146
MLIR_DEFINE_CAPI_DIALECT_REGISTRATION(FIRRTL, firrtl, circt::firrtl::FIRRTLDialect) MlirType firrtlTypeGetUInt(MlirContext ctx
MlirAttribute firrtlAttrGetRUW(MlirContext ctx, FIRRTLRUW ruw)
Definition: FIRRTL.cpp:128
MlirAttribute firrtlAttrGetNameKind(MlirContext ctx, FIRRTLNameKind nameKind)
Definition: FIRRTL.cpp:113
MlirAttribute firrtlAttrGetPortDirs(MlirContext ctx, size_t count, const FIRRTLPortDir *dirs)
Definition: FIRRTL.cpp:94
FIRRTLPortDir
Definition: FIRRTL.h:34
@ FIRRTL_PORT_DIR_OUTPUT
Definition: FIRRTL.h:36
@ FIRRTL_PORT_DIR_INPUT
Definition: FIRRTL.h:35
FIRRTLNameKind
Definition: FIRRTL.h:40
@ FIRRTL_NAME_KIND_DROPPABLE_NAME
Definition: FIRRTL.h:41
@ FIRRTL_NAME_KIND_INTERESTING_NAME
Definition: FIRRTL.h:42
FIRRTLMemDir
Definition: FIRRTL.h:53
@ FIRRTL_MEM_DIR_INFER
Definition: FIRRTL.h:54
@ FIRRTL_MEM_DIR_READ
Definition: FIRRTL.h:55
@ FIRRTL_MEM_DIR_READ_WRITE
Definition: FIRRTL.h:57
@ FIRRTL_MEM_DIR_WRITE
Definition: FIRRTL.h:56
MLIR_CAPI_EXPORTED MlirType firrtlTypeGetUInt(MlirContext ctx, int32_t width)
FIRRTLEventControl
Definition: FIRRTL.h:61
@ FIRRTL_EVENT_CONTROL_AT_POS_EDGE
Definition: FIRRTL.h:62
@ FIRRTL_EVENT_CONTROL_AT_NEG_EDGE
Definition: FIRRTL.h:63
@ FIRRTL_EVENT_CONTROL_AT_EDGE
Definition: FIRRTL.h:64
FIRRTLRUW
Definition: FIRRTL.h:46
@ FIRRTL_RUW_OLD
Definition: FIRRTL.h:48
@ FIRRTL_RUW_UNDEFINED
Definition: FIRRTL.h:47
@ FIRRTL_RUW_NEW
Definition: FIRRTL.h:49
FIRRTLConvention
Definition: FIRRTL.h:28
@ FIRRTL_CONVENTION_SCALARIZED
Definition: FIRRTL.h:30
@ FIRRTL_CONVENTION_INTERNAL
Definition: FIRRTL.h:29
static EvaluatorValuePtr unwrap(OMEvaluatorValue c)
Definition: OM.cpp:100
Direction get(bool isOutput)
Returns an output direction if isOutput is true, otherwise returns an input direction.
Definition: CalyxOps.cpp:53
IntegerAttr packAttribute(MLIRContext *context, ArrayRef< Direction > directions)
Return a IntegerAttr containing the packed representation of an array of directions.
Direction
This represents the direction of a single port.
This file defines an intermediate representation for circuits acting as an abstraction for constraint...
Definition: DebugAnalysis.h:21