CIRCT 20.0.0git
Loading...
Searching...
No Matches
CalyxHelpers.h
Go to the documentation of this file.
1//===- CalyxHelpers.h - Calyx helper methods --------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This header file defines various helper methods for building Calyx programs.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef CIRCT_DIALECT_CALYX_CALYXHELPERS_H
14#define CIRCT_DIALECT_CALYX_CALYXHELPERS_H
15
19#include "circt/Support/LLVM.h"
20#include "mlir/Dialect/Func/IR/FuncOps.h"
21
22#include <memory>
23
24namespace circt {
25namespace calyx {
26
27/// Creates a RegisterOp, with input and output port bit widths defined by
28/// `width`.
29calyx::RegisterOp createRegister(Location loc, OpBuilder &builder,
30 ComponentOp component, size_t width,
31 Twine prefix);
32
33/// A helper function to create constants in the HW dialect.
34hw::ConstantOp createConstant(Location loc, OpBuilder &builder,
35 ComponentOp component, size_t width,
36 size_t value);
37
38/// A helper function to create calyx.instance operation.
39calyx::InstanceOp createInstance(Location loc, OpBuilder &builder,
40 ComponentOp component,
41 SmallVectorImpl<Type> &resultTypes,
42 StringRef instanceName,
43 StringRef componentName);
44
45/// A helper function to get the instance name.
46std::string getInstanceName(mlir::func::CallOp callOp);
47
48// Returns whether this operation is a leaf node in the Calyx control.
49// TODO(github.com/llvm/circt/issues/1679): Add Invoke.
50bool isControlLeafNode(Operation *op);
51
52// Creates a DictionaryAttr containing a unit attribute 'name'. Used for
53// defining mandatory port attributes for calyx::ComponentOp's.
54DictionaryAttr getMandatoryPortAttr(MLIRContext *ctx, StringRef name);
55
56// Adds the mandatory Calyx component I/O ports (->[clk, reset, go], [done]->)
57// to ports.
58void addMandatoryComponentPorts(PatternRewriter &rewriter,
59 SmallVectorImpl<calyx::PortInfo> &ports);
60
61// Returns the bit width for the given dimension. This will always be greater
62// than zero. See: https://github.com/llvm/circt/issues/2660
63unsigned handleZeroWidth(int64_t dim);
64
65/// Updates the guard of each assignment within a group with `op`.
66template <typename Op>
67static void updateGroupAssignmentGuards(OpBuilder &builder, GroupOp &group,
68 Op &op) {
69 group.walk([&](AssignOp assign) {
70 if (assign.getGuard())
71 // If the assignment is guarded already, take the bitwise & of the current
72 // guard and the group's go signal.
73 assign->setOperand(2, builder.create<comb::AndOp>(
74 group.getLoc(), assign.getGuard(), op, false));
75 else
76 // Otherwise, just insert it as the guard.
77 assign->insertOperands(2, {op});
78 });
79}
80
81} // namespace calyx
82} // namespace circt
83
84#endif // CIRCT_DIALECT_CALYX_CALYXHELPERS_H
static void updateGroupAssignmentGuards(OpBuilder &builder, GroupOp &group, Op &op)
Updates the guard of each assignment within a group with op.
void addMandatoryComponentPorts(PatternRewriter &rewriter, SmallVectorImpl< calyx::PortInfo > &ports)
bool isControlLeafNode(Operation *op)
unsigned handleZeroWidth(int64_t dim)
hw::ConstantOp createConstant(Location loc, OpBuilder &builder, ComponentOp component, size_t width, size_t value)
A helper function to create constants in the HW dialect.
DictionaryAttr getMandatoryPortAttr(MLIRContext *ctx, StringRef name)
calyx::RegisterOp createRegister(Location loc, OpBuilder &builder, ComponentOp component, size_t width, Twine prefix)
Creates a RegisterOp, with input and output port bit widths defined by width.
calyx::InstanceOp createInstance(Location loc, OpBuilder &builder, ComponentOp component, SmallVectorImpl< Type > &resultTypes, StringRef instanceName, StringRef componentName)
A helper function to create calyx.instance operation.
std::string getInstanceName(mlir::func::CallOp callOp)
A helper function to get the instance name.
The InstanceGraph op interface, see InstanceGraphInterface.td for more details.