1 // Copyright (C) 2009 Free Software Foundation, Inc.
2 // Contributed by Jan Sjodin <jan.sjodin@amd.com>.
4 // This file is part of the Polyhedral Compilation Package Library (libpcp).
6 // Libpcp is free software; you can redistribute it and/or modify it
7 // under the terms of the GNU Lesser General Public License as published by
8 // the Free Software Foundation; either version 2.1 of the License, or
9 // (at your option) any later version.
11 // Libpcp is distributed in the hope that it will be useful, but WITHOUT ANY
12 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13 // FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
16 // You should have received a copy of the GNU Lesser General Public License
17 // along with libpcp; see the file COPYING.LIB. If not, write to the
18 // Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19 // MA 02110-1301, USA.
21 // As a special exception, if you link this library with other files, some
22 // of which are compiled with GCC, to produce an executable, this library
23 // does not by itself cause the resulting executable to be covered by the
24 // GNU General Public License. This exception does not however invalidate
25 // any other reasons why the executable file might be covered by the GNU
26 // General Public License.
28 #ifndef _PCP_SCATTERING_
29 #define _PCP_SCATTERING_
34 #include "pcp_stack.h"
35 #include "pcp_visitor.h"
36 #include "pcp_expr_canonicalizer.h"
41 PcpPolyPointsetPowerset
* scattering
;
43 void setScattering(PcpPolyPointsetPowerset
* scattering
);
44 PcpPolyPointsetPowerset
* getScattering();
48 PcpScattering(PcpPolyPointsetPowerset
* scattering
);
51 class PcpScatteringMap
: public PcpTreeMap
<PcpStmt
*, PcpScattering
*>
57 PcpScalarContextStack
* scalarContextStack
;
58 PcpStack
<int>* sequenceStack
;
61 void setScalarContextStack(PcpScalarContextStack
* scalarContextStack
);
62 PcpScalarContextStack
* getScalarContextStack();
64 void setSequenceStack(PcpStack
<int>* sequenceStack
);
65 PcpStack
<int>* getSequenceStack();
67 void setOnSequence(bool onSequence
);
70 void pushSequence(int sequenceNumber
);
72 int peekSequenceStack(int index
);
73 int getSequenceStackSize();
74 void incrementSequenceTop();
76 void pushIv(PcpIv
* iv
);
78 PcpExpr
* peekScalarStack(int index
);
79 int getScalarStackSize();
81 void createIdentityScattering();
82 const char* toString();
83 ScheduleStack(PcpScop
* scop
);
87 class Visitor
: public PcpVisitor
90 ScheduleStack
* scheduleStack
;
91 PcpScatteringMap
* scatteringMap
;
93 void setScatteringMap(PcpScatteringMap
* scatteringMap
);
94 PcpScatteringMap
* getScatteringMap();
96 void setScheduleStack(ScheduleStack
* scheduleStack
);
97 ScheduleStack
* getScheduleStack();
100 virtual void visit(PcpScop
* scop
);
101 virtual void visit(PcpLoop
* loop
);
102 virtual void visit(PcpSequence
* sequence
);
103 virtual void visit(PcpGuard
* guard
);
104 virtual void visit(PcpCopy
* copy
);
105 virtual void visit(PcpUserStmt
* userStmt
);
107 Visitor(PcpScatteringMap
* scatteringMap
);
110 void buildScatteringMap(PcpScop
* scop
);
112 PcpScatteringMap(PcpScop
* scop
);
115 #endif // _PCP_SCATTERING_