53 if (llvm::dyn_cast<int8Type>(type))
54 return int8Type::getMnemonic();
55 if (llvm::dyn_cast<int16Type>(type))
56 return int16Type::getMnemonic();
57 if (llvm::dyn_cast<int32Type>(type))
58 return int32Type::getMnemonic();
59 if (llvm::dyn_cast<int64Type>(type))
60 return int64Type::getMnemonic();
61 if (llvm::dyn_cast<uint8Type>(type))
62 return uint8Type::getMnemonic();
63 if (llvm::dyn_cast<uint16Type>(type))
64 return uint16Type::getMnemonic();
65 if (llvm::dyn_cast<uint32Type>(type))
66 return uint32Type::getMnemonic();
67 if (llvm::dyn_cast<uint64Type>(type))
68 return uint64Type::getMnemonic();
69 if (llvm::dyn_cast<floatType>(type))
70 return floatType::getMnemonic();
71 llvm::report_fatal_error(
"unknown type");
75 if (
auto window = llvm::dyn_cast<WindowType>(type))
76 return (direction +
"_window_" +
getCTypeString(window.getType()) +
" *")
78 if (
auto stream = llvm::dyn_cast<StreamType>(type))
79 return (direction +
"_stream_" +
getCTypeString(stream.getType()) +
" *")
81 if (
auto stream = llvm::dyn_cast<ParameterType>(type))
84 llvm::report_fatal_error(
"unknown kernel type");
88 if (
auto windowType = llvm::dyn_cast<WindowType>(type))
89 return std::string(
"window<") + std::to_string(windowType.getSize()) +
91 if (llvm::dyn_cast<StreamType>(type))
93 if (llvm::dyn_cast<ParameterType>(type))
95 llvm::report_fatal_error(
"unknown connection type");
105 for (
auto indexedResult : llvm::enumerate(driverOp->getResults())) {
106 Value result = indexedResult.value();
107 for (OpOperand &userOperand : result.getUses()) {
108 Operation *userOp = userOperand.getOwner();
109 int targetIndex = userOperand.getOperandNumber();
110 if (
auto kernel = dyn_cast<KernelOp>(userOp)) {
111 auto funcOp = SymbolTable::lookupNearestSymbolFrom<func::FuncOp>(
112 driverOp, kernel.getCalleeAttr());
113 Type opType = funcOp.getFunctionType().getInput(targetIndex);
118 << targetKernelName <<
".in[" << targetIndex <<
"]);\n";
130 unsigned sourceIndex = 0;
131 for (
auto indexedResult : llvm::enumerate(source->getResults())) {
132 Value result = indexedResult.value();
133 for (OpOperand &userOperand : result.getUses()) {
134 Operation *userOp = userOperand.getOwner();
135 int targetIndex = userOperand.getOperandNumber();
136 if (
auto kernel = dyn_cast<KernelOp>(userOp)) {
137 auto funcOp = SymbolTable::lookupNearestSymbolFrom<func::FuncOp>(
138 kernel, kernel.getCalleeAttr());
139 Type opType = funcOp.getFunctionType().getInput(targetIndex);
144 << sourceIndex <<
"], " << targetKernelName <<
".in["
145 << targetIndex <<
"]);\n";
146 }
else if (
auto outputOp = dyn_cast<GraphOutputOp>(userOp)) {
147 auto funcOp = SymbolTable::lookupNearestSymbolFrom<func::FuncOp>(
148 source, source.getCalleeAttr());
149 Type opType = funcOp.getFunctionType().getInput(sourceIndex);
153 << sourceIndex <<
"], " << outputOp.getName() <<
");\n";
163 output <<
"#include <adf.h>\n";
164 output <<
"#ifndef FUNCTION_KERNELS_H\n";
165 output <<
"#define FUNCTION_KERNELS_H\n\n";
167 for (Block &block :
module.getBodyRegion())
168 for (auto funcOp : block.getOps<func::FuncOp>()) {
169 output << "void " << funcOp.getSymName() << "(";
170 FunctionType type = funcOp.getFunctionType();
171 for (
unsigned i = 0; i < type.getNumInputs(); i++)
175 for (
unsigned i = 0; i < type.getNumResults(); i++) {
178 if (i < type.getNumResults() - 1)
188 output <<
"#include <adf.h>\n";
189 output <<
"using namespace adf;\n";
190 output <<
"class " << graph.getName() <<
" : public graph {\n";
191 output <<
"private:\n";
195 for (Region ®ion : graph->getRegions())
196 for (Block &block : region.getBlocks())
197 for (
const auto kernel : block.getOps<KernelOp>()) {
199 std::string varName =
"k" + std::to_string(kCnt);
200 output << indent <<
"kernel " << varName <<
";\n";
201 kernelOp2VarName[kernel] = varName;
206 output <<
"\npublic:\n";
208 for (
auto op : graph.getBody()->getOps<GraphInputOp>())
209 output << indent <<
"input_port " << op.getName() <<
";\n";
210 for (
auto op : graph.getBody()->getOps<GraphOutputOp>())
211 output << indent <<
"output_port " << op.getName() <<
";\n";
212 for (
auto op : graph.getBody()->getOps<GraphInOutOp>())
213 output << indent <<
"inout_port " << op.getName() <<
";\n";
215 output <<
"\n" << indent << graph.getName() <<
"() {\n";
219 for (Region ®ion : graph->getRegions())
220 for (Block &block : region.getBlocks())
221 for (
auto kernel : block.getOps<KernelOp>()) {
222 output << indent << kernelOp2VarName[kernel] <<
" = kernel::create("
223 << kernel.getCallee().str() <<
");\n";
229 for (Region ®ion : graph->getRegions()) {
230 for (Block &block : region.getBlocks()) {
231 for (Operation &op : block.getOperations()) {
232 if (
auto port = dyn_cast<GraphInputOp>(op)) {
233 visitOpResultUsers(port);
234 }
else if (
auto graph = dyn_cast<KernelOp>(op)) {
235 visitOpResultUsers(graph);
236 }
else if (
auto graph = dyn_cast<GraphOutputOp>(op)) {
245 for (Region ®ion : graph->getRegions())
246 for (Block &block : region.getBlocks())
247 for (
auto kernel : block.getOps<KernelOp>()) {
248 output << indent <<
"source(" << kernelOp2VarName[kernel] <<
") = "
249 <<
"\"kernels.cc\";\n";
250 output << indent <<
"runtime<ratio>(" << kernelOp2VarName[kernel]
256 output << indent <<
"}\n";