@@ -135,6 +135,36 @@ def Xls_TranslationLinkage : Xls_Attr<"TranslationLinkage"> {
135135 let attrName = "xls.translation_linkage";
136136}
137137
138+ def Xls_FlopKindNone : I32EnumAttrCase<"kNone", 0, "none">;
139+ def Xls_FlopKindFlop : I32EnumAttrCase<"kFlop", 1, "flop">;
140+ def Xls_FlopKindSkid : I32EnumAttrCase<"kSkid", 2, "skid">;
141+ def Xls_FlopKindZeroLatency : I32EnumAttrCase<"kZeroLatency", 3, "zero-latency">;
142+ def Xls_FlopKind : I32EnumAttr<"FlopKind", "XLS flop kind",
143+ [Xls_FlopKindNone, Xls_FlopKindFlop, Xls_FlopKindSkid, Xls_FlopKindZeroLatency]> {
144+ let genSpecializedAttr = 0;
145+ let cppNamespace = "::mlir::xls";
146+ }
147+ def Xls_FlopKindAttr : EnumAttr<Xls_Dialect, Xls_FlopKind, "flop_kind">;
148+
149+ def Xls_FifoConfig : Xls_Attr<"FifoConfig"> {
150+ let summary = "FIFO Configuration Attribute";
151+ let description = [{
152+ Definies the properties of the physical FIFO to be instantiated from
153+ an (internal) channel.
154+ }];
155+
156+ let parameters = (ins
157+ "int64_t":$fifo_depth,
158+ "bool":$bypass,
159+ "bool":$register_push_outputs,
160+ "bool":$register_pop_outputs
161+ );
162+
163+ let mnemonic = "fifo_config";
164+
165+ let assemblyFormat = "`<` struct(params) `>`";
166+ }
167+
138168class GetShapeSplat<string name> :
139169 StrFunc<"getShapeSplat($" # name # ".getType())">;
140170
@@ -1626,6 +1656,9 @@ def Xls_ChanOp : Xls_Op<"chan", [
16261656 let arguments = (ins
16271657 SymbolNameAttr:$sym_name,
16281658 TypeAttr:$type,
1659+ OptionalAttr<Xls_FifoConfig>: $fifo_config,
1660+ OptionalAttr<Xls_FlopKindAttr>: $input_flop_kind,
1661+ OptionalAttr<Xls_FlopKindAttr>: $output_flop_kind,
16291662 DefaultValuedAttr<BoolAttr, "true">:$send_supported,
16301663 DefaultValuedAttr<BoolAttr, "true">:$recv_supported
16311664 );
@@ -1653,7 +1686,6 @@ def Xls_ChanOp : Xls_Op<"chan", [
16531686 void setArgAttrsAttr(ArrayAttr) { return; }
16541687 void setResAttrsAttr(ArrayAttr) { return; }
16551688 }];
1656-
16571689}
16581690
16591691def Xls_InstantiateEprocOp : Xls_Op<"instantiate_eproc", [DeclareOpInterfaceMethods<SymbolUserOpInterface>]> {
@@ -1763,7 +1795,10 @@ def Xls_SchanOp : Xls_Op<"schan", [Pure, HasParent<"SprocOp">]> {
17631795 }];
17641796 let arguments = (ins
17651797 StrAttr:$name,
1766- TypeAttr:$type
1798+ TypeAttr:$type,
1799+ OptionalAttr<Xls_FifoConfig>: $fifo_config,
1800+ OptionalAttr<Xls_FlopKindAttr>: $input_flop_kind,
1801+ OptionalAttr<Xls_FlopKindAttr>: $output_flop_kind
17671802 );
17681803 let results = (outs
17691804 Xls_SchanType:$out,
@@ -1774,7 +1809,8 @@ def Xls_SchanOp : Xls_Op<"schan", [Pure, HasParent<"SprocOp">]> {
17741809 OpBuilder<(ins "::mlir::StringRef":$name, "::mlir::Type":$element_type), [{
17751810 auto inChanTy = SchanType::get($_builder.getContext(), element_type, /*isInput=*/true);
17761811 auto outChanTy = SchanType::get($_builder.getContext(), element_type, /*isInput=*/false);
1777- build($_builder, $_state, ::mlir::TypeRange{outChanTy, inChanTy}, name, element_type);
1812+ // TODO(jpienaar): Remove unecessary default args once they are generated automatically.
1813+ build($_builder, $_state, ::mlir::TypeRange{outChanTy, inChanTy}, name, element_type, /*fifo_config=*/nullptr, /*input_flop_kind=*/nullptr, /*output_flop_kind=*/nullptr);
17781814 }]>
17791815 ];
17801816}
0 commit comments