1- // ===- SystolicArray .cc ----------------------------------------------------===//
1+ // ===- SystolicArrayTimeLoop .cc ----------------------------------------------------===//
22//
33// This file implements passes that TODO
44//
@@ -38,15 +38,15 @@ using namespace mlir;
3838using namespace llvm ;
3939using namespace phism ;
4040
41- #define DEBUG_TYPE " systolic-array"
41+ #define DEBUG_TYPE " systolic-array-time-loop "
4242
4343// ----------------------------------------------------------------------------//
44- // SystolicArrayPass :
44+ // SystolicArrayTimeLoopPass :
4545// * TODO
4646// ----------------------------------------------------------------------------//
4747
4848namespace {
49- struct SystolicArrayPipelineOptions : public mlir ::PassPipelineOptions<SystolicArrayPipelineOptions > {
49+ struct SystolicArrayTimeLoopPipelineOptions : public mlir ::PassPipelineOptions<SystolicArrayTimeLoopPipelineOptions > {
5050 Option<std::string> fileName{
5151 *this , " file-name" ,
5252 llvm::cl::desc (" The output HLS code" )
@@ -90,35 +90,69 @@ static int countSubstring(std::string pat, std::string txt) {
9090 return res;
9191}
9292
93+ static mlir::FuncOp createPE (AffineForOp affine_for_op) {
94+ LLVM_DEBUG (dbgs () << " op name to create PE from: " << affine_for_op << " \n " );
95+
96+ // mlir::FuncOp PE_func_op = mlir::FuncOp
97+
98+ // return PE_func_op
99+ }
100+
101+ template <typename OpType>
102+ static bool contains (Block &block) {
103+ for (auto &op : block) {
104+ if (dyn_cast<OpType>(op)) {
105+ return true ;
106+ }
107+ }
108+ return false ;
109+ }
110+
93111
94112namespace {
95- class SystolicArrayPass : public phism ::SystolicArrayPassBase<SystolicArrayPass > {
113+ class SystolicArrayTimeLoopPass : public phism ::SystolicArrayTimeLoopPassBase<SystolicArrayTimeLoopPass > {
96114public:
97115
98116 std::string fileName = " " ;
99117
100- SystolicArrayPass () = default ;
101- SystolicArrayPass (const SystolicArrayPipelineOptions & options)
118+ SystolicArrayTimeLoopPass () = default ;
119+ SystolicArrayTimeLoopPass (const SystolicArrayTimeLoopPipelineOptions & options)
102120 : fileName(!options.fileName.hasValue() ? " " : options.fileName.getValue()){
103121 }
104122
105123 void runOnOperation () override {
106124 ModuleOp m = getOperation ();
107- // TODO
125+
126+ SmallVector<mlir::AffineForOp> to_create_PE;
127+ m.walk ([&](mlir::AffineForOp op) {
128+ LLVM_DEBUG (dbgs () << " op name: " << op << " \n " );
129+ // TODO find a proper way of determining time loops from polyhedral analysis
130+ bool contains_affine_for = contains<AffineForOp>(*op.getBody ());
131+ LLVM_DEBUG (dbgs () << " Op contains more AffineForOp inside?: " << contains_affine_for << " \n " );
132+ if (!contains_affine_for) {
133+ to_create_PE.push_back (op);
134+ }
135+ });
136+
137+ for (mlir::AffineForOp op : to_create_PE) {
138+ createPE (op);
139+ }
140+
141+
108142 }
109143};
110144} // namespace
111145
112146std::unique_ptr<mlir::OperationPass<mlir::ModuleOp>>
113- phism::createSystolicArraySPass () {
114- return std::make_unique<SystolicArrayPass >();
147+ phism::createSystolicArrayTimeLoopPass () {
148+ return std::make_unique<SystolicArrayTimeLoopPass >();
115149}
116150
117- void phism::registerSystolicArrayPass () {
118- PassPipelineRegistration<SystolicArrayPipelineOptions >(
119- " systolic-array" , " Systolic array TODO." ,
120- [](OpPassManager &pm, const SystolicArrayPipelineOptions &options) {
121- pm.addPass (std::make_unique<SystolicArrayPass >(options));
151+ void phism::registerSystolicArrayTimeLoopPass () {
152+ PassPipelineRegistration<SystolicArrayTimeLoopPipelineOptions >(
153+ " systolic-array-time-loop " , " Systolic array time loop TODO." ,
154+ [](OpPassManager &pm, const SystolicArrayTimeLoopPipelineOptions &options) {
155+ pm.addPass (std::make_unique<SystolicArrayTimeLoopPass >(options));
122156 }
123157 );
124158}
0 commit comments